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

📄 game.cpp

📁 这是一个俄罗斯方块的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void GAME::DrawMoveBox()
{
 SelectObject(m_hDC,brush[GetBrushCode(MoveBox[GAME::BoxNum][GAME::BoxPosition].color)]);
 if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].width+GAME::Movexy.x>16) GAME::Movexy.x=16-GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].width;
 for(int i=0;i<=3;i++)
 for(int j=0;j<=3;j++)
 {
 if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].box[i][j]==TRUE)
 {
 GAME::BoxRgb[GAME::Movexy.x+i][GAME::Movexy.y+j]=GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].color;
 GAME::BoxStyle[GAME::Movexy.x+i][GAME::Movexy.y+j]=TRUE;
 Rectangle(m_hDC,(GAME::Movexy.x+i)*15,(GAME::Movexy.y+j)*15,(GAME::Movexy.x+i+1)*15,(GAME::Movexy.y+j+1)*15);
 }
 }
}

void GAME::DelMoveBox()
{
 SelectObject(m_hDC,bkbrush);
 for(int i=0;i<=3;i++)
 for(int j=0;j<=3;j++)
 {
 if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].box[i][j]==TRUE)
 {
 GAME::BoxStyle[GAME::Movexy.x+i][GAME::Movexy.y+j]=FALSE;
 GAME::BoxRgb[GAME::Movexy.x+i][GAME::Movexy.y+j]=GAME::BackColor;
 Rectangle(m_hDC,(GAME::Movexy.x+i)*15,(GAME::Movexy.y+j)*15,(GAME::Movexy.x+i+1)*15,(GAME::Movexy.y+j+1)*15);
 }
 }
}

void GAME::DrawDAt()
{
 SetTextColor(m_hDC,RGB(0,0,255));
 SetBkColor(m_hDC,RGB(192,192,192));
 char temp[10]="";
 sprintf(temp,"%d",Score);
 TextOut(m_hDC,285,100,temp,strlen(temp));
 strcpy(temp,"");
 sprintf(temp,"%d",DelBoxNum);
 TextOut(m_hDC,290,130,temp,strlen(temp));
 strcpy(temp,"");
 sprintf(temp,"%d",Level);
 TextOut(m_hDC,290,160,temp,strlen(temp));
}

void GAME::LoadDat()
{
	CFile LoadWord;
    if (LoadWord.Open("jimu.xgp",CFile::modeRead,NULL))
    {
    static char *Buffer;
    LoadWord.SeekToEnd();
    int Length=LoadWord.GetLength();
    Buffer=new char[Length+1];
    LoadWord.SeekToBegin();
    LoadWord.Read(Buffer,Length);
    Buffer[Length]='\0';
    LoadWord.Close();
	//以下从Buffer指针获取数据
	int i=0,m=0,n=0;
	for(m=0;m<5 && i<Length+1;m++)
	{
	if (Buffer[i]==' ' || Buffer[i]=='\0' || Buffer[i]=='\n') break;
    do                        //读取名字
	{   
		Order[m].Name[n++]=Buffer[i++];
        if (i>Length) break;
	}
	while (Buffer[i]!='*');
	if (strlen(Order[m].Name)%2==1) Order[m].Name[n]=' ';
	Order[m].Name[n+1]='\0';

	i++;n=0;
    if (i>Length) break;
	do                        //读取层数
	{
		Order[m].Floor[n++]=Buffer[i++];
        if (i>Length) break;
	}
	while (Buffer[i]!='*');
	Order[m].Floor[n]='\0';

	i++;n=0;
    if (i>Length) break;
	do                        //读取分数
	{
		Order[m].Score[n++]=Buffer[i++];
        if (i>Length) break;
	}
	while (Buffer[i]!='#');
	Order[m].Score[n]='\0';

	i++;n=0;
    if (i>Length) break;
    } 
	GAME::OrderNum=m;
  
	delete Buffer;
	}
    //冒泡排序
	ORDER temp;
    for(int i=1;i<=4;i++)
	{
	for(int j=4;j>=i;j--)
    if (atoi(Order[j].Score)>atoi(Order[j-1].Score))
	{
		strcpy(temp.Name,Order[j].Name);
		strcpy(Order[j].Name,Order[j-1].Name);
		strcpy(Order[j-1].Name,temp.Name);

		strcpy(temp.Floor,Order[j].Floor);
		strcpy(Order[j].Floor,Order[j-1].Floor);
		strcpy(Order[j-1].Floor,temp.Floor);

		strcpy(temp.Score,Order[j].Score);
        strcpy(Order[j].Score,Order[j-1].Score);
		strcpy(Order[j-1].Score,temp.Score);
	}
	}
}

void GAME::SaveDat()
{

    if (GAME::Standard==FALSE)
		GAME::Score=GAME::Score*2;
	sprintf(PlayDat.Floor,"%d",GAME::DelBoxNum);
	sprintf(PlayDat.Score,"%d",GAME::Score);
	for(int i=0;i<GAME::OrderNum;i++)
    if (strcmp(PlayDat.Score,Order[i].Score)>0) break;

    int SaveCode=i;
    if (SaveCode<5 && strcmp(PlayDat.Score,"0")!=0)
	{
    if(::MessageBox(NULL,"您的战绩已进入前五名,要保存吗?","龙虎榜",MB_YESNO)==IDYES)
	{
	List list;
	CString text="";
	list.DoModal();
    text.Format(list.Name);
	strcpy(PlayDat.Name,text);
	
	//插入新名次
    if (OrderNum>=5)
	{
	strcpy(Order[4].Name,PlayDat.Name);
	strcpy(Order[4].Floor,PlayDat.Floor);
	strcpy(Order[4].Score,PlayDat.Score);
	}
	else
	{
	strcpy(Order[OrderNum].Name,PlayDat.Name);
	strcpy(Order[OrderNum].Floor,PlayDat.Floor);
	strcpy(Order[OrderNum].Score,PlayDat.Score);
	OrderNum++;
	}
    

	CFile SaveFile;
    CString GameDat="";
	int seek=0;
	for(int i=0;i<OrderNum;i++)
	{
    GameDat.Insert(seek,Order[i].Name);
	seek+=strlen(Order[i].Name);
	GameDat.Insert(seek,"*");
	seek++;
	GameDat.Insert(seek,Order[i].Floor);
	seek+=strlen(Order[i].Floor);
	GameDat.Insert(seek,"*");
	seek++;
	GameDat.Insert(seek,Order[i].Score);
	seek+=strlen(Order[i].Score);
	GameDat.Insert(seek,"#");
	seek++;
	}
    SaveFile.Open("jimu.xgp",CFile::modeReadWrite|CFile::modeCreate,NULL);
    SaveFile.Write(GameDat,GameDat.GetLength());
    SaveFile.Close();
	}
	}
	if (GAME::Standard==FALSE)
		GAME::Score=GAME::Score/2;
}


void GAME::InitGame()
{
    if (GAME::Standard)
		GAME::MaxNum=8;
	else GAME::MaxNum=12;
	BackMid=FALSE;
    JoySpeed=50;
	GAME::IsDroping=TRUE;
	GAME::Score=0;
	OldScore=0;
    DelBoxNum=0;
	NextBoxNum=0;
	GAME::Speed=(9-Level)*30+30;
	GamePause=FALSE;
	GAME::BackColor=RGB(0,0,0);
	GAME::PassStage=FALSE;
    Movexy.x=7;Movexy.y=0;
	GAME::BoxNum=Count%MaxNum;
	GAME::BoxPosition=0;
	for(int i=0;i<16;i++)
	for(int j=0;j<25;j++)
	{

	if (j<25-GAME::Floor)
	*(*(BoxStyle+i)+j)=FALSE;

	else

	{
	if((i+Count%5)%(2+(25-j)%4)==0)
	*(*(BoxStyle+i)+j)=FALSE;
	else 
	{
	GAME::BoxRgb[i][j]=RGB_2;
	*(*(BoxStyle+i)+j)=TRUE;
	}
	}

	}
    StartGame=TRUE;

}


BOOL GAME::MoveDown()
{
if(GAME::Movexy.y+GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].heigh>=25) return FALSE;
for(int i=0;i<=3;i++)
for(int j=3;j>=0;j--)
{
	if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].box[i][j]==TRUE)
	{
	if (GAME::BoxStyle[GAME::Movexy.x+i][GAME::Movexy.y+j+1]==TRUE)
        return FALSE;
	else j=-1;
	}
}
	return TRUE;
}

BOOL GAME::MoveLeft()
{
if(GAME::Movexy.x<=0) return FALSE;
for(int j=0;j<=3;j++)
for(int i=0;i<=3;i++)
{
	if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].box[i][j]==TRUE) 
	{
	if (GAME::BoxStyle[GAME::Movexy.x+i-1][GAME::Movexy.y+j]==TRUE)
    return FALSE;
	else i=4;
	}
}
	return TRUE;
}


BOOL GAME::MoveRight()
{
if (GAME::Movexy.x+GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].width>=16) return FALSE;
for(int j=0;j<=3;j++)
for(int i=3;i>=0;i--)
{
	if (GAME::MoveBox[GAME::BoxNum][GAME::BoxPosition].box[i][j]==TRUE)
	{
	if (GAME::BoxStyle[GAME::Movexy.x+i+1][GAME::Movexy.y+j]==TRUE)
     return FALSE;
	else i=-1;
	}
}
	return TRUE;
}

BOOL GAME::CanDelRow(const int Row)
{
	BOOL Result=TRUE;
	for(int i=0;i<16;i++)
		if (GAME::BoxStyle[i][Row]==FALSE)
		{
			Result=FALSE;
			break;
		}
		return Result;
}

BOOL GAME::CanChange()
{
int code1=GAME::BoxPosition,code2=code1+1;
if (code2>3) code2=0;


if (GAME::MoveBox[GAME::BoxNum][code2].width+GAME::Movexy.y>=25) return FALSE;
int MAX=GAME::MoveBox[GAME::BoxNum][code1].width>GAME::MoveBox[GAME::BoxNum][code1].heigh?GAME::MoveBox[GAME::BoxNum][code1].width:GAME::MoveBox[GAME::BoxNum][code1].heigh;
for(int i=0;i<MAX && i+GAME::Movexy.x<16;i++)
for(int j=0;j<MAX;j++)
{
//以后再加入
	if (GAME::MoveBox[GAME::BoxNum][code1].box[i][j]==FALSE && GAME::BoxStyle[GAME::Movexy.x+i][GAME::Movexy.y+j]==TRUE)
		return FALSE;
}
	return TRUE;
}

//判断是否GAMEOVER

BOOL GAME::GameOver()
{
	return 1-GAME::MoveDown();
}
//
void GAME::DelRowBox()
{
 int RowNum=0;
 SelectObject(m_hDC,bkbrush);
	for(int i=GAME::BeginRow;i<=GAME::EndRow;i++)
	{
		if (GAME::CanDelRow(i))
		{
		if (GAME::MoveWave)
		{
			GAME::PlayWave.Close();
			GAME::PlayWave.Load("delrow.wav");
			GAME::PlayWave.Play();
		}

        RowNum++;
        for(int j=i;j>=1;j--)
		for(int ii=0;ii<16;ii++)
		{
			GAME::BoxStyle[ii][j]=GAME::BoxStyle[ii][j-1];
			GAME::BoxRgb[ii][j]=GAME::BoxRgb[ii][j-1];
		}
        	for(int ii=0;ii<16;ii++)
			{
				GAME::BoxRgb[ii][0]=GAME::BackColor;
            GAME::BoxStyle[ii][0]=FALSE;
			}
		}
	}
    switch(RowNum)
	{
	case 1:
		Score+=10+Level*5;
		break;
	case 2:
	 	Score+=30+Level*5;
		break;
	case 3:
	    Score+=50+Level*5;
		break;
	case 4:
   	    Score+=80+Level*5;
		break;
	default:
		break;
	}


	DelBoxNum+=RowNum;
	//重画方块
    for(i=0;i<16;i++)
	for(int j=0;j<=GAME::EndRow;j++)
	{
		if (GAME::BoxStyle[i][j]==TRUE)
		GAME::DrawBox(i,j);
		else
		GAME::DelBox(i,j);
	}

	GAME::DrawDAt();

	if (Score>=OldScore+PASSSCORE) 
	{
		OldScore=Score/PASSSCORE*PASSSCORE;
		Level++;
		Speed=(9-Level)*30+20;
	    SetTextColor(m_hDC,RGB(255,0,0));
        SetBkColor(m_hDC,RGB(0,0,0));
		
        switch(Level)
		{
		case 2:
			TextOut(m_hDC,60,150,"首战告捷,祝贺您!",strlen("首战告捷,祝贺您!"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 3:
            TextOut(m_hDC,60,150,"再接再励,祝贺您!",strlen("再接再励,祝贺您!"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 4:
	        TextOut(m_hDC,60,150,"困难重重,努力啊!",strlen("困难重重,努力啊!"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 5:
	        TextOut(m_hDC,60,150,"保持冷静最重要",strlen("保持冷静最重要"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 6:
	        TextOut(m_hDC,60,150,"保持水平,继续吧!",strlen("保持水平,继续吧!")); 
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 7:
	        TextOut(m_hDC,60,150,"快近尾声了,加油啊!",strlen("快近尾声了,加油啊!"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 8:
	        TextOut(m_hDC,60,150,"最后一关了,挑战吧!",strlen("最后一关了,挑战吧!"));
	        TextOut(m_hDC,60,180,"按暂停键继续...",strlen("按暂停键继续..."));
			break;
		case 9:
	        ::KillTimer(NULL,IDT_DROP);
		    GAME::StartGame=FALSE;
        	GAME::SaveDat();
			GAME::InitGame();
			GAME::StartGame=FALSE;
	        TextOut(m_hDC,60,150,"您已通关,帅呆了!",strlen("您已通关,帅呆了!"));
            TextOut(m_hDC,60,180,"游戏结束",strlen("游戏结束"));
	        TextOut(m_hDC,60,210,"按暂停键返回...",strlen("按暂停键返回..."));
           
		    PlayMidi.Close();
		    PlayMidi.Open("win.mid");
			strcpy(MidName,"");
		    PlayMidi.Play();
		
            break;
		default:
			break;
		}
		GAME::GamePause=TRUE;
	
        
		if (Level<9) 
		{
            PlayMidi.Close();
		    PlayMidi.Open("pass.mid");
		    PlayMidi.Play();
		}
	    
	
       	GAME::PassStage=TRUE;
	}
	GAME::BeginRow=0;
	GAME::EndRow=0;
}


void GAME::DrawNextMoveBox()
{

	GAME::BoxNum=GAME::NextBoxNum;
	GAME::BoxPosition=GAME::NextBoxPosition;
	//得到下一个
	GAME::NextBoxNum=Count%MaxNum;
	GAME::NextBoxPosition=Count%4;
  
	for(int i=17;i<=20;i++)
	for(int j=1;j<=4;j++)
    {
		if (GAME::MoveBox[GAME::NextBoxNum][GAME::NextBoxPosition].box[i-17][j-1])
		{
			GAME::BoxRgb[i][j]=MoveBox[GAME::NextBoxNum][GAME::NextBoxPosition].color;
			GAME::DrawBox(i,j);
		}
		else GAME::DelBox(i,j);
	}

}

⌨️ 快捷键说明

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