C++基于EasyX图形库实现2048小游戏分享!

C++ 和 EasyX 图形库,实现2048小游戏,供大家参考,具体内容如下

C++基于EasyX图形库实现2048小游戏

MainGame2048.cpp

  /** Name: Game2048CoreClass*/  #include<iostream>  #include<graphics.h>  #include<stdio.h>  #include<windows.h>  #include<conio.h>  #include<stdio.h>  #include"Game2048.h"  #define BLOCK_SIZE 60  #define SIZE_COL 10  #define SIZE_ROW 10  using namespace std;  void DisplayMap(Game2048& mygame);  int GetMove();  int main(int argc, char * argv[])  {   HWND hwnd=initgraph(SIZE_COL*BLOCK_SIZE, SIZE_ROW*BLOCK_SIZE);   setbkmode(TRANSPARENT);   setbkcolor(RGB(180,180,180));   settextcolor(RGB(0,180,80));   cleardevice();   while (1)   {   Game2048 mygame(SIZE_ROW, SIZE_COL);   while (1)   {   DisplayMap(mygame);   int mov = GetMove();   cout << mov << endl;   if (!mygame.Run(mov))   break;   }   if (MessageBox(hwnd, "游戏结束,是否重玩?", "Tips", MB_YESNO) == IDNO)   break;   }      return 0;  }  int GetMove()  {   char move = '';   move = getch();   if (move == 'w' || move == '8' || move == 'W')   return MOV_UP;   if (move == 's' || move == '5' || move == 'S')   return MOV_DOWN;   if (move == 'a' || move == '4' || move == 'A')   return MOV_LEFT;   if (move == 'd' || move == '6' || move == 'D')   return MOV_RIGHT;   if (move == '*')   return MOV_NULL;   return 0;  }  void DisplayMap(Game2048& mygame)  {   BeginBatchDraw();   cleardevice();   char temp[20] = { 0 };   system("cls");   cout << mygame.GetScore() << " " << mygame.GetStep() << " " << mygame.GetUsedTime()<<" " << mygame.GetMaxNum() << endl;   for (int i = 0; i<mygame.GetLines(); i++)   {   for (int j = 0; j<mygame.GetCols(); j++)   {   cout.width(4);   cout << mygame.MapAt(i,j);   if (mygame.MapAt(i, j) == 0)   {   setfillcolor(RGB(220,220,220));   solidcircle(j*BLOCK_SIZE + BLOCK_SIZE / 2, i*BLOCK_SIZE + BLOCK_SIZE / 2, BLOCK_SIZE / 2);   }   else   {   int size=mygame.MapAt(i, j);   sprintf(temp, "%d",size );   size /= 2;   setfillcolor(RGB(200, 255-size*20, 0+size*20));   solidcircle(j*BLOCK_SIZE + BLOCK_SIZE / 2, i*BLOCK_SIZE + BLOCK_SIZE / 2, BLOCK_SIZE / 2);   outtextxy(j*BLOCK_SIZE, i*BLOCK_SIZE,temp);   }     }   printf("n");   }   cout << "-------" << endl;   sprintf(temp,"Score : %d",mygame.GetScore());   outtextxy(0, 1*BLOCK_SIZE/3, temp);   sprintf(temp, "Step : %d", mygame.GetStep());   outtextxy(0, 2 * BLOCK_SIZE / 3, temp);   sprintf(temp, "Time : %d", mygame.GetUsedTime());   outtextxy(0, 3 * BLOCK_SIZE / 3, temp);   sprintf(temp, "MAX : %d", mygame.GetMaxNum());   outtextxy(0, 4 * BLOCK_SIZE / 3, temp);   EndBatchDraw();  }

Game2048.h

  #ifndef _GAME2048_H_  #define _GAME2048_H_  /*For example:  Game2048 mygame(10,10);  int main(int argc, char * argv[])  {   while (1)   {   DisplayMap();   int mov = GetMove();   cout << mov << endl;   if (!mygame.Run(mov))   break;  }  system("pause");  return 0;  }  */  #include<stdlib.h>  #include<time.h>  typedef int MoveDirect;  #define MOV_NULL 0  #define MOV_UP 8  #define MOV_DOWN 5  #define MOV_LEFT 4  #define MOV_RIGHT 6  class Game2048  {  public:   Game2048(int line=5,int col=5);   ~Game2048();   bool Run(MoveDirect mov);   int GetCols();   int GetLines();   int MapAt(int rindex, int cindex);//return >=0 is true,-1 is bad index,0 mean space,other mean number.   int GetStep();   int GetScore();   int GetUsedTime();   int GetMaxNum();   void clear();  private:   void CreateNew();   void MoveAndResult(MoveDirect mov);   bool IsDead();   //运行图和运行时环境   int * Map;   int lines;   int cols;   int step;   int core;   long runtime;   int usetime;   int maxnum;    };    #endif // _GAME2048_H_

Game2048.cpp

  #include"Game2048.h"  Game2048::Game2048(int line,int col)  {   this->lines = line;   this->cols = col;   this->step=0;   this->core=0;   this->runtime=0;   this->usetime=0;   this->maxnum=2;   this->Map=(int *)malloc(sizeof(int)*(this->lines)*(this->cols));   runtime = time(NULL); //记录开始时间,用于算总时长   srand((unsigned)time(NULL));   for (int i = 0; i<this->lines; i++)   {   for (int j = 0; j<this->cols; j++)   {   Map[i*this->cols+j] = 0;   }   }   CreateNew();  }  Game2048::~Game2048()  {   free(this->Map);  }  void Game2048::clear()  {   this->step = 0;   this->core = 0;   this->runtime = 0;   this->usetime = 0;   this->maxnum = 2;   runtime = time(NULL); //记录开始时间,用于算总时长   srand((unsigned)time(NULL));   for (int i = 0; i<this->lines; i++)   {   for (int j = 0; j<this->cols; j++)   {   Map[i*this->cols + j] = 0;   }   }   CreateNew();  }  bool Game2048::Run(MoveDirect mov)  {   CreateNew();   MoveAndResult(mov);   if (step > (lines*cols * 2))   if (IsDead() == 1)   return false;   usetime = time(NULL) - runtime;   return true;  }  int Game2048::GetCols()  {   return this->cols;  }  int Game2048::GetLines()  {   return this->lines;  }  int Game2048::MapAt(int rindex, int cindex)  {   if (rindex<0||cindex<0||rindex >= this->lines || cindex >= this->cols)   return -1;   return Map[rindex*this->cols+cindex];  }  int Game2048::GetStep()  {   return this->step;  }  int Game2048::GetScore()  {   return this->core;  }  int Game2048::GetUsedTime()  {   return this->usetime;  }  int Game2048::GetMaxNum()  {   return this->maxnum;  }  void Game2048::CreateNew()  {   int hasfull = 1;   for (int i = 0; i<lines; i++)   {   for (int j = 0; j<cols; j++)   {   if (Map[i*this->cols+j] == 0)   hasfull = 0; //判断是否满了,不满才创建   }   }   if (hasfull == 1)   return;   int si, sj;   si = rand() % lines;   sj = rand() % cols;   while (Map[si*this->cols+sj] != 0)   {   si = rand() % lines;   sj = rand() % cols;   }   Map[si*this->cols+sj] = 2;  }  bool Game2048::IsDead()  {   for (int i = 0; i<lines; i++)   {   for (int j = 0; j<cols; j++)   {   if (Map[i*this->lines + j] == 0)   return false; //如果存在空的格则肯定不结束   int up, down, right, left;   up = i - 1;   down = i + 1;   right = j + 1;   left = j - 1; //四个方向进行判定   while (up >= 0 && Map[up*this->lines + j] == 0)   up--;   if (Map[up*this->lines + j] == Map[i*this->lines + j] && up != -1) //只要一个方向可以合并则不结束   return false;   while (down<lines&&Map[down*this->lines + j] == 0)   down--;   if (Map[down*this->lines + j] == Map[i*this->lines + j] && down != lines)   return false;   while (right<cols&&Map[i*this->lines + right] == 0)   right++;   if (Map[i*this->lines + right] == Map[i*this->lines + j] && right != cols)   return false;   while (left >= 0 && Map[i*this->lines + left] == 0)   left--;   if (Map[i*this->lines + left] == Map[i*this->lines + j] && left != -1)   return false;   }   }   return true; //排除所有情况不结束,肯定结束了  }  void Game2048::MoveAndResult(MoveDirect mov)  {   if (mov == MOV_NULL)   return;   step++; //步数增加   int ffind, nfind;   if (mov == MOV_UP)   {   for (int i = 0; i<cols; i++)   {   ffind = -1;   nfind = -1;   for (int j = 0; j<lines; j++)   {   int k = j;   while (k<lines&&Map[k*this->cols+i] == 0)   k++;   if (k != lines)   ffind = k;   k++;   while (k<lines&&Map[k*this->lines + i] == 0)   k++;   if (k != lines)   nfind = k; //获取第一个不为零和下一个不为零   if (ffind != -1 && nfind != -1)   {   if (ffind != nfind)   {   if (Map[ffind*this->lines + i] == Map[nfind*this->lines + i]) //两个获取相等则叠加   {   Map[ffind*this->lines + i] *= 2;   if (Map[ffind*this->lines + i]>maxnum)   maxnum = Map[ffind*this->lines + i];   Map[nfind*this->lines + i] = 0;   core++; //分数增加   }   }   }     }   int count = 0;   for (int j = 0; j<lines; j++) //单边对齐   {   if (Map[j*this->lines + i] != 0)   {   int temp = Map[j*this->lines + i];   Map[j*this->lines + i] = 0;   Map[count*this->lines + i] = temp;   count++;   }     }     }   }   else if (mov == MOV_DOWN)   {   for (int i = 0; i<cols; i++)   {   ffind = -1;   nfind = -1;   for (int j = lines; j >= 0; j--)   {   int k = j;   while (k >= 0 && Map[k*this->cols+i] == 0)   k--;   if (k != -1)   ffind = k;   k--;   while (k >= 0 && Map[k*this->cols+i] == 0)   k--;   if (k != -1)   nfind = k;   if (ffind != -1 && nfind != -1)   {   if (ffind != nfind)   {   if (Map[ffind*this->cols+i] == Map[nfind*this->cols+i])   {   Map[ffind*this->cols+i] *= 2;   if (Map[ffind*this->cols+i]>maxnum)   maxnum = Map[ffind*this->cols+i];   Map[nfind*this->cols+i] = 0;   core++;   }   }   }     }   int count = lines - 1;   for (int j = lines - 1; j >= 0; j--)   {   if (Map[j*this->cols+i] != 0)   {   int temp = Map[j*this->cols+i];   Map[j*this->cols+i] = 0;   Map[count*this->cols+i] = temp;   count--;   }     }   }   }   else if (mov == MOV_LEFT)   {   for (int i = 0; i<lines; i++)   {   ffind = -1;   nfind = -1;   for (int j = 0; j<cols; j++)   {   int k = j;   while (k<cols&&Map[i*this->cols+k] == 0)   k++;   if (k != cols)   ffind = k;   k++;   while (k<cols&&Map[i*this->cols+k] == 0)   k++;   if (k != cols)   nfind = k;   if (ffind != -1 && nfind != -1)   {   if (ffind != nfind)   {   if (Map[i*this->cols+ffind] == Map[i*this->cols+nfind])   {   Map[i*this->cols+ffind] *= 2;   if (Map[i*this->cols+ffind]>maxnum)   maxnum = Map[i*this->cols+ffind];   Map[i*this->cols+nfind] = 0;   core++;   }   }   }     }   int count = 0;   for (int j = 0; j<cols; j++)   {   if (Map[i*this->cols+j] != 0)   {   int temp = Map[i*this->cols+j];   Map[i*this->cols+j] = 0;   Map[i*this->cols+count] = temp;   count++;   }     }   }   }   else if (mov == MOV_RIGHT)   {   for (int i = 0; i<lines; i++)   {   ffind = -1;   nfind = -1;   for (int j = cols; j >= 0; j--)   {   int k = j;   while (k >= 0 && Map[i*this->cols+k] == 0)   k--;   if (k != -1)   ffind = k;   k--;   while (k >= 0 && Map[i*this->cols+k] == 0)   k--;   if (k != -1)   nfind = k;   if (ffind != -1 && nfind != -1)   {   if (ffind != nfind)   {   if (Map[i*this->cols+ffind] == Map[i*this->cols+nfind])   {   Map[i*this->cols+ffind] *= 2;   if (Map[i*this->cols+ffind]>maxnum)   maxnum = Map[i*this->cols+ffind];   Map[i*this->cols+nfind] = 0;   core++;   }   }   }     }   int count = cols - 1;   for (int j = cols - 1; j >= 0; j--)   {   if (Map[i*this->cols+j] != 0)   {   int temp = Map[i*this->cols+j];   Map[i*this->cols+j] = 0;   Map[i*this->cols+count] = temp;   count--;   }     }   }   }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解C++基于EasyX图形库实现2048小游戏分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/484007.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐