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

📄 game.cpp

📁 俄罗斯方块,适于sdk初学者参考学习
💻 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 + -