📄 game.cpp
字号:
}
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 + -