📄 game.cpp
字号:
#include "stdafx.h"
#include "game.h"
//-------------------------------------------------------------------//
game::game(HWND hwnd,HDC memdc,HMENU hmenu)
{
m_hwnd=hwnd;
m_memdc=memdc;
m_hmenu=hmenu;
m_timerID=1;
game_screen=new screen(70,2,200,400,10,20,hwnd,memdc,BLUECOLOR);
game_previewscreen=new screen(5,2,60,30,4,2,hwnd,memdc,BLACKCOLOR);
game_previewdiamond=new diamond;
game_diamond=new diamond;
game_map=new map(10,20);
EnableMenuItem(m_hmenu,IDM_PAUSE,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_START,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_STOP,MF_DISABLED|MF_GRAYED);
m_game_state=STATE_STOP;
}
//-------------------------------------------------------------------//
game::~game()
{
delete game_screen;
delete game_map;
delete game_diamond;
delete game_previewscreen;
delete game_previewdiamond;
if(m_game_state!=STATE_STOP)
KillTimer(m_hwnd,m_timerID);
}
//-------------------------------------------------------------------//
void game::game_newgame() //新游戏
{
m_game_state=STATE_RUNNING;
EnableMenuItem(m_hmenu,IDM_NEWGAME,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_START,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_PAUSE,MF_ENABLED);
EnableMenuItem(m_hmenu,IDM_STOP,MF_ENABLED);
SetTimer(m_hwnd,m_timerID,600,gametimer);
game_diamond->selectdiamond();
game_previewdiamond->selectdiamond();
game_screen->drawdiamond(*game_diamond);
game_previewscreen->drawdiamond(*game_previewdiamond);
}
//-------------------------------------------------------------------//
void game::game_start() //开始命令
{
m_game_state=STATE_RUNNING;
EnableMenuItem(m_hmenu,IDM_START,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_PAUSE,MF_ENABLED);
EnableMenuItem(m_hmenu,IDM_STOP,MF_ENABLED);
}
//-------------------------------------------------------------------//
void game::game_pause() //暂停命令
{
switch(m_game_state)
{
case STATE_RUNNING:
m_game_state=STATE_PAUSE;
break;
case STATE_PAUSE:
game_start();
return;
break;
case STATE_STOP:
return;
break;
}
EnableMenuItem(m_hmenu,IDM_START,MF_ENABLED);
EnableMenuItem(m_hmenu,IDM_PAUSE,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_STOP,MF_ENABLED);
}
//-------------------------------------------------------------------//
void game::game_stop()//停止命令
{
m_game_state=STATE_STOP;
EnableMenuItem(m_hmenu,IDM_NEWGAME,MF_ENABLED);
EnableMenuItem(m_hmenu,IDM_START,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_PAUSE,MF_DISABLED|MF_GRAYED);
EnableMenuItem(m_hmenu,IDM_STOP,MF_DISABLED|MF_GRAYED);
KillTimer(m_hwnd,m_timerID);
MessageBox(NULL,"游戏结束! ","提示",MB_ICONWARNING);
game_screen->clear();
game_previewscreen->clear();
game_map->init();
}
//-------------------------------------------------------------------//
void game::game_pressdown()//向下键
{
if(m_game_state!=STATE_RUNNING)
return;
game_control(DIAMOND_ACTION_DOWN);
}
//-------------------------------------------------------------------//
void game::game_pressleft()//向左键
{
if(m_game_state!=STATE_RUNNING)
return;
game_control(DIAMOND_ACTION_LEFT);
}
//-------------------------------------------------------------------//
void game::game_pressright()//向右键
{
if(m_game_state!=STATE_RUNNING)
return;
game_control(DIAMOND_ACTION_RIGHT);
}
//-------------------------------------------------------------------//
void game::game_pressrotate()//旋转键
{
if(m_game_state!=STATE_RUNNING)
return;
game_control(DIAMOND_ACTION_ROTATE);
}
//-------------------------------------------------------------------//
void game::game_pressfall()//下落键
{
int refresh_top,refresh_bottom;
if(m_game_state!=STATE_RUNNING)
return;
//下底
while(game_map->checkaction(DIAMOND_ACTION_DOWN,*game_diamond)!=CHECK_RESULT_FREEZE)
{
game_screen->cleardiamond(*game_diamond);
game_diamond->movedowndiamond();
game_screen->drawdiamond(*game_diamond);
}
game_screen->drawfreezediamond(*game_diamond);//变色
//检查删除已满的行
switch(game_map->checkanddel(*game_diamond,refresh_top,refresh_bottom))//记录进地图
{
case MAP_CHECK_NOPROGRAM:
break;
case MAP_CHECK_NEEDREFRESH:
game_screen->refresh(*game_map,refresh_top,refresh_bottom);
break;
}
//选择并产生另一个方块
*game_diamond=*game_previewdiamond;
game_previewdiamond->selectdiamond();
game_previewscreen->clear();
game_previewscreen->drawdiamond(*game_previewdiamond);
//看死了没
switch(game_map->checkaction(DIAMOND_ACTION_CREATE,*game_diamond))//再次检查
{
case CHECK_RESULT_DEAD://产生的方块没地方放“死了“调用gameover
game_gameover();
break;
case CHECK_RESULT_OK://没有问题即画出这个新方块
game_screen->drawdiamond(*game_diamond);
break;
}
}
//-------------------------------------------------------------------//
void game::game_control(int diamondaction)
{
int refresh_bottom,refresh_top;
switch(game_map->checkaction(diamondaction,*game_diamond))//检测方块行动后会有什么结果
{
case CHECK_RESULT_BUTT: //和墙壁或别的方块发生左右碰撞
break;
case CHECK_RESULT_FREEZE://方块定格
game_screen->drawfreezediamond(*game_diamond); //重画定格方块
//把定格方块记录进地图,并检测是否有删除发生,有则取得更新区域更新屏幕
switch(game_map->checkanddel(*game_diamond,refresh_top,refresh_bottom))//记录进地图
{
case MAP_CHECK_NOPROGRAM:
break;
case MAP_CHECK_NEEDREFRESH:
game_screen->refresh(*game_map,refresh_top,refresh_bottom);
break;
}
//选择并产生另一个方块
*game_diamond=*game_previewdiamond;
game_previewdiamond->selectdiamond();
game_previewscreen->clear();
game_previewscreen->drawdiamond(*game_previewdiamond);
switch(game_map->checkaction(DIAMOND_ACTION_CREATE,*game_diamond))//再次检查
{
case CHECK_RESULT_DEAD://产生的方块没地方放“死了“调用gameover
game_gameover();
break;
case CHECK_RESULT_OK://没有问题即画出这个新方块
game_screen->drawdiamond(*game_diamond);
break;
}
break;
case CHECK_RESULT_FREE://方块无需定格--行动被允许,进行方块操作
game_screen->cleardiamond(*game_diamond);
switch(diamondaction)
{
case DIAMOND_ACTION_DOWN:
game_diamond->movedowndiamond();
break;
case DIAMOND_ACTION_LEFT:
game_diamond->moveleftdiamond();
break;
case DIAMOND_ACTION_RIGHT:
game_diamond->moverightdiamond();
break;
case DIAMOND_ACTION_ROTATE:
game_diamond->rotatediamond();
break;
}
game_screen->drawdiamond(*game_diamond);
break;
}
}
//-------------------------------------------------------------------//
void game::game_timer_run()
{
if(m_game_state==STATE_STOP)
return;
game_pressdown();
}
//-------------------------------------------------------------------//
void game::game_gameover()
{
game_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -