⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fangkuai.cpp

📁 用VC7.0 开发的俄罗斯方块游戏
💻 CPP
字号:
// Fangkuai.cpp : 实现文件
//

#include "stdafx.h"
#include "fangk.h"
#include "Fangkuai.h"

#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
// Fangkuai

IMPLEMENT_DYNAMIC(Fangkuai, CStatic)
Fangkuai::Fangkuai()
{
	srand((unsigned)time(NULL));//初始化种子
	Posx=4;
	Posy=-1;
	Mark=0;
}

Fangkuai::~Fangkuai()
{
}


BOOL Fangkuai::CanMove(int dir)//dir:0:上1:右2:下3:左
{
	int id;
	switch(dir)
	{
	case UP:
		if(ID==3)
			id=0;
		else
			id=ID+1;
		if(ShapeValid(Shape,id,Posx,Posy))
			return true;
		break;
	case RIGHT:
		if(ShapeValid(Shape,ID,Posx+1,Posy))
			return true;
		break;
	case DOWN:
		if(ShapeValid(Shape,ID,Posx,Posy+1))
			return true;
		break;
	case LEFT:
		if(ShapeValid(Shape,ID,Posx-1,Posy))
			return true;
		break;
	}
	return false;
}

void Fangkuai::MoveDown()
{
	if(CanMove(DOWN))
	{
		CClientDC pDC(this);
		draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
		Posy++;
		draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
	}
	else
	{
		EndStep();
		StepNext();
	}
}

void Fangkuai::Move()
{
	CClientDC pDC(this);
	DrawNextShape(&pDC);
	draw.drawmark(&pDC,Mark,false);
	int speed = 400-Mark*0.03;  //速度函数
	SetTimer(1,speed,0);//下落速度
}
BEGIN_MESSAGE_MAP(Fangkuai, CStatic)

	ON_WM_TIMER()
END_MESSAGE_MAP()

void Fangkuai::StartGame()
{
	//重画窗口,初始化数据
	Invalidate();
	Shape = GetNext();  //得到方块---------------------------------------------------------------
	Next = GetNext();
	ID = 0;      //得到形状变化---------------------------------------------------------------
	Move();
}

int Fangkuai::GetNext()
{
	int next = rand()%7;
	return next;
}

bool Fangkuai::ShapeValid(int sv_shape,int sv_id,int sv_x,int sv_y)
{
	//-----------------------------------------------------------------------------------------
	//存放颜色和变化的中间数据
	//重新计算m_nData
	int m_nData[3][3];
	int nData[][4] = {
			{ 0x038, 0x092, 0x038, 0x092 },
			{ 0x093, 0x03c, 0x192, 0x078 },
			{ 0x096, 0x138, 0x0d2, 0x039 },
			{ 0x1b0, 0x1b0, 0x1b0, 0x1b0 },
			{ 0x198, 0x05a, 0x198, 0x05a },
			{ 0x0f0, 0x099, 0x0f0, 0x099 },
			{ 0x03a, 0x0b2, 0x0b8, 0x09a }
		};
	int Data = nData[sv_shape][sv_id];
	//取得形状数组
	m_nData[0][0] = (Data&0x100)>>8;
	m_nData[0][1] = (Data&0x80)>>7;
	m_nData[0][2] = (Data&0x40)>>6;
	m_nData[1][0] = (Data&0x20)>>5;
	m_nData[1][1] = (Data&0x10)>>4;
	m_nData[1][2] = (Data&0x8)>>3;
	m_nData[2][0] = (Data&0x4)>>2;
	m_nData[2][1] = (Data&0x2)>>1;
	m_nData[2][2] = (Data&0x1)>>0;
	//-----------------------------------------------------------------------------------------
	//是否有东西卡住
	int sRow,sCol;
	for(sRow=0;sRow<3;sRow++)
	{
		for(sCol=0;sCol<3;sCol++)
			if(m_nData[sRow][sCol])
			{
				if(sv_x+sCol<0||sv_x+sCol>=10||sv_y+sRow<0||sv_y+sRow>=22)//越界
					return false;
				else
					if(draw.Datas[sv_y+sRow][sv_x+sCol]==false)     //两组数据同为1的时候,不能放
						return false;;
			}
	}
	//问题:
	//柱形问题:在3×3的数组中不能解决
	//解决计算错误
	sRow--;
	sCol--;
	//////////////////////////
	if(sv_shape==0)
	{
		if(sv_id==1||sv_id==3)//竖条  额外方块加在上面,所以什么都不检查
		{
		}
		else //横条
		{
			if(sv_x+sCol+1<0||sv_x+sCol+1>=10||sv_y+sRow-1<0||sv_y+sRow-1>=22)
				return false;
			else
				if(draw.Datas[sv_y+sRow-1][sv_x+sCol+1]==false)
					return false;
		}
	}
	return true;
}

void Fangkuai::EndStep()
{
	int nRow,nCol;
	for(nRow=0;nRow<3;nRow++)
		for(nCol=0;nCol<3;nCol++)
			if(draw.m_nData[nRow][nCol])
			{
				draw.Datas[Posy+nRow][Posx+nCol]=false;
				draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
			}
	//解决计算错误
	nRow--;  
	nCol--;   
	//////////////////////////
	if(Shape==0)
	{
		if(ID==1||ID==3) //竖条
		{
			nRow-=3;
			nCol--;
			draw.Datas[Posy+nRow][Posx+nCol]=false;
			draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
		}
		else           //横条
		{
			nRow--;
			nCol++;
			draw.Datas[Posy+nRow][Posx+nCol]=false;
			draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
		}
	}
}

void Fangkuai::StepNext()
{
	if(Posy<0) //游戏结束
	{
		KillTimer(1);
		EndGame();
	}
	else
	{
		///////////////////////////////////////////////////////////////
		//检验是否清除行
		bool clear=true;
		for(int row=21;row>=0;row--)
		{
			for(int line=0;line<10;line++)
			{
				if(draw.Datas[row][line]==true)
				{
					clear=false;
					break;
				}
			}
			if(clear==true)
			{
				DelLine(row);	
				Mark+=100;
				row++;
			}
			clear=true;
		}
		///////////////////////////////////////////////////////////////
		Posx = 4;
		Posy = -1;
		Shape = Next;
		Next = GetNext();
		ID = 0;
		Move();
	}
}

void Fangkuai::EndGame()
{
	MessageBox("end");
}
// Fangkuai 消息处理程序

void Fangkuai::MoveDir(int dir)
{
	CClientDC pDC(this);
	int id;
	switch(dir)
	{
	case UP:
		if(CanMove(UP))
		{
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
			if(ID==3)
				id=0;
			else
				id=ID+1;    //nextid
			ID = id;
			draw.drawshape(&pDC,Posx,Posy,Shape,id,false);
		}
		break;
	case DOWN:
		if(CanMove(DOWN))
		{
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
			draw.drawshape(&pDC,Posx,++Posy,Shape,ID,false);
		}
		break;
	case LEFT:
		if(CanMove(LEFT))
		{
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
			Posx--;
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
		}
		break;
	case RIGHT:
		if(CanMove(RIGHT))
		{
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
			Posx++;
			draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
		}
		break;
	}
}

void Fangkuai::DelLine(int row)
{
	CClientDC pDC(this);
	//flashline
	for(int j=0;j<3;j++)
	{
		for(int i=0;i<10;i++)
		{
			draw.drawcell(&pDC,row,i,RGB(0,0,0));
		}
		_sleep(100);
		for(int i=0;i<10;i++)
			draw.drawcell(&pDC,row,i,draw.Cor[row][i]);
		_sleep(100);
	}
	//delline
	CPoint nullpoint;
	for(int mrow=row;mrow>=0;mrow--)
		for(int mline=0;mline<10;mline++)
		{
			if(mrow==0)
			{
				draw.Cor[mrow][mline]=GetSysColor(COLOR_3DFACE);
				draw.drawnull(&pDC,mrow,mline);
				draw.Datas[mrow][mline]=true;
			}
			else
			{
				if(draw.Cor[mrow-1][mline]==GetSysColor(COLOR_3DFACE))
				{
					draw.drawnull(&pDC,mrow,mline);
				}
				else
				{
					draw.drawcell(&pDC,mrow,mline,draw.Cor[mrow-1][mline]);
				}
				draw.Datas[mrow][mline] = draw.Datas[mrow-1][mline];
				draw.Cor[mrow][mline] = draw.Cor[mrow-1][mline];
			}
		}
}

void Fangkuai::DrawNextShape(CDC *pDC)
{
	draw.drawshape(pDC,13,2,Shape,0,true);
	draw.drawshape(pDC,13,2,Next,0,false);
}


void Fangkuai::OnTimer(UINT nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	MoveDown();
	CStatic::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -