大大维的游戏机计划2--一个自制的类似2048的小游戏

Posted 大大维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大大维的游戏机计划2--一个自制的类似2048的小游戏相关的知识,希望对你有一定的参考价值。

本文为大大维原创,最早于博客园发表,转载请注明出处!!!

 

承接上篇,这几日,笔者本来打算写一个2048的,但写着写着,突然有个想法,能不能搞一个将2048和消消乐结合起来的游戏,于是,笔者便写出了如下这个小游戏。

值得一提的是,整个游戏完全由笔者独自写成,并没有参考任何网上的代码,这跟上次写贪吃蛇前学了老半天网上已有代码就显得独立了很多。看来贪食蛇的书写还是让笔者受益匪浅

定义的游戏规则如下:

1.采用类似2048的游戏规则合成数字

2.加入消消乐的点选作用(类似于在PC端模拟了一下触摸屏)

3.加入地图压缩规则

4.由于游戏像2048,就叫他NEW2048吧

虽然笔者将游戏按照所想做了出来,但笔者玩了一下,可玩性并不高。甚至十分枯燥!!!

尽管如此,这个游戏还是笔者完全独立书写的第一个游戏,意义还是蛮大的,因此笔者还是在此记录一笔。日后再翻出来改改,说不定能更好玩些。

大家可以试试这个游戏,并提提意见,可能有些bug,也请指正。

以后还是接着计划写剩余的游戏,加油。

  1 #include<iostream>
  2 #include<string>
  3 #include<cmath>
  4 #include<ctime>
  5 #include<cstdlib>
  6 #include<conio.h>
  7 using namespace std;
  8 constexpr unsigned HIGH=4;
  9 constexpr unsigned LENG=4;
 10 ///当前地图状态:READY,即(),可以进行moveAndAddData()操作;WAIT,即[],可以进行chooseMapSpace()操作
 11 enum state {READY,WAIT};
 12 ///当前操作块的移动方向及操作:UP,上;DOWN,下;LEFT,左;RIGHT,右;CHANGE,改变状态;DEFAULT,其他
 13 enum dir {UP,DOWN,LEFT,RIGHT,CHANGE,DEFAULT};
 14 class MapNew2048
 15 {
 16 public:
 17     MapNew2048();///构造函数,初始化数据
 18     void printMap();///地图打印
 19     void chooseMapSpace();///操作块移动,选择想要处理的地图块
 20     void moveAndAddData();///移动和相加选中块的数据
 21     ///压缩地图,将有意义的数值向左(上)角靠拢
 22     void mapSortToUp();
 23     void mapSortToLeft();
 24     ///当一行(一列)完全为空时,随机生成一个数加入地图(这个数不能大于当前所合成的最大数的一半)
 25     void dataCreate();
 26     void stateChange();///状态切换函数
 27     bool isLive();///是否存活判断
 28     state getState();///获取当前地图状态
 29     dir setDir();///输入操作块的移动方向
 30     unsigned getMaxData();
 31     string dataToPrintData(int n);///data到printData的转换函数
 32 private:
 33     unsigned data[HIGH][LENG];///设要显示数据为x,data=log2(x),空白时,data=0
 34     string printData[HIGH][LENG];///存储规范化的输出数据
 35     int nowX;///记录当前操作块的位置
 36     int nowY;
 37     state sta;///记录当前地图状态,确定执行chooseMapSpace()还是moveAndAddData()
 38     bool flag;///记录上次moveAndAddData()操作是否成功
 39 };
 40 
 41 MapNew2048::MapNew2048()
 42 {
 43     for(int i=0; i<HIGH; i++)
 44         for(int j=0; j<LENG; j++)
 45         {
 46             data[i][j]=1;
 47             srand((unsigned)time(NULL)+(2*i+3*j));///确保每一次,地图的每一格生成的data都是随机的
 48             unsigned p=rand()%5;
 49             if(p!=0)
 50                 data[i][j]=p;
 51         }
 52     for(int i=0; i<HIGH; i++)
 53         for(int j=0; j<LENG; j++)
 54             printData[i][j]=dataToPrintData(data[i][j]);
 55     nowX=nowY=0;
 56     printData[nowX][nowY][0]=\'[\';
 57     printData[nowX][nowY][7]=\']\';
 58     sta=WAIT;
 59 }
 60 
 61 state MapNew2048::getState()
 62 {
 63     return sta;
 64 }
 65 
 66 dir MapNew2048::setDir()
 67 {
 68     char keydown=getch();///读取按键
 69     switch(keydown)
 70     {
 71     case \'w\':
 72         return UP;
 73         break;
 74     case \'W\':
 75         return UP;
 76         break;
 77     case \'s\':
 78         return DOWN;
 79         break;
 80     case \'S\':
 81         return DOWN;
 82         break;
 83     case \'a\':
 84         return LEFT;
 85         break;
 86     case \'A\':
 87         return LEFT;
 88         break;
 89     case \'d\':
 90         return RIGHT;
 91         break;
 92     case \'D\':
 93         return RIGHT;
 94         break;
 95     case \' \':
 96         return CHANGE;
 97         break;
 98     default:
 99         return DEFAULT;
100         break;
101     }
102 }
103 unsigned MapNew2048::getMaxData()
104 {
105     unsigned temp=data[0][0];
106     for(int i=0; i<HIGH; i++)
107         for(int j=0; j<LENG; j++)
108         {
109             temp=temp>data[i][j]?temp:data[i][j];
110         }
111     return temp;
112 }
113 void MapNew2048::printMap()
114 {
115     cout<<"            NEW   2    0    4    8"<<endl;
116     cout<<"-----------------------------------------------------"<<endl;
117     for(int i=0; i<HIGH; i++)
118     {
119         for(int j=0; j<LENG; j++)
120         {
121             if(data[i][j]!=0)
122                 cout<<"|  "<<printData[i][j]<<"  ";
123             else
124                 cout<<"|  "<<printData[i][j][0]<<"      "<<printData[i][j][7]<<"  ";
125         }
126         cout<<"|"<<endl<<"-----------------------------------------------------"<<endl;
127     }
128 }
129 
130 string MapNew2048::dataToPrintData(int n)
131 {
132 
133     int count=0;
134     int m=pow(2,n);
135     ///str的初始化基于如下数学关系:4*4的地图下,2048游戏能合成数,理论上最大值131072(2^17),即data最大为17
136     string str {\' \',m/100000+48,(m/10000)%10+48,(m/1000)%10+48,(m/100)%10+48,(m/10)%10+48,m%10+48,\' \'};
137     ///对冗余0的处理
138     for(int i=1; i<7; i++)
139     {
140         if(str[i]==\'0\')
141         {
142             count++;
143             str[i]=\' \';
144         }
145         else
146             break;
147     }
148     switch(count)///格式调整
149     {
150     case 2:///不加break会在执行完第一条语句后自动执行break
151     {
152         str[2]=str[3];
153         str[3]=str[4];
154         str[4]=str[5];
155         str[5]=str[6];
156         str[6]=\' \';
157         break;
158     }
159     case 3:
160     {
161         str[3]=str[4];
162         str[4]=str[5];
163         str[5]=str[6];
164         str[6]=\' \';
165         break;
166     }
167     case 4:
168     {
169         str[3]=str[5];
170         str[4]=str[6];
171         str[5]=\' \';
172         str[6]=\' \';
173         break;
174     }
175     case 5:
176     {
177         str[4]=str[6];
178         str[6]=\' \';
179         break;
180     }
181     }
182     return str;
183 }
184 void MapNew2048::chooseMapSpace()
185 {
186 
187     if(sta==WAIT)
188     {
189         printData[nowX][nowY][0]=printData[nowX][nowY][7]=\' \';
190         dir DIR=setDir();
191         switch(DIR)
192         {
193         case LEFT:
194         {
195             nowY--;
196             if(nowY<0)
197                 nowY=LENG-1;
198             printData[nowX][nowY][0]=\'[\';
199             printData[nowX][nowY][7]=\']\';
200             break;
201         }
202         case RIGHT:
203         {
204             nowY++;
205             if(nowY>LENG-1)
206                 nowY=0;
207             printData[nowX][nowY][0]=\'[\';
208             printData[nowX][nowY][7]=\']\';
209             break;
210         }
211         case UP:
212         {
213             nowX--;
214             if(nowX<0)
215                 nowX=HIGH-1;
216             printData[nowX][nowY][0]=\'[\';
217             printData[nowX][nowY][7]=\']\';
218             break;
219         }
220         case DOWN:
221         {
222             nowX++;
223             if(nowX>HIGH-1)
224                 nowX=0;
225             printData[nowX][nowY][0]=\'[\';
226             printData[nowX][nowY][7]=\']\';
227             break;
228         }
229         case CHANGE:
230             stateChange();
231             break;
232         case DEFAULT:
233         {
234             printData[nowX][nowY][0]=\'[\';
235             printData[nowX][nowY][7]=\']\';
236             break;
237         }
238         }
239     }
240 }
241 void MapNew2048::moveAndAddData()
242 {
243     if(sta==READY)
244     {
245         printData[nowX][nowY][0]=printData[nowX][nowY][7]=\' \';
246         dir DIR=setDir();
247         switch(DIR)
248         {
249         case LEFT:
250         {
251             if((data[nowX][nowY]==data[nowX][nowY-1])&&(nowY>0)&&(data[nowX][nowY-1]>0))
252             {
253                 data[nowX][nowY]=0;
254                 nowY--;
255                 data[nowX][nowY]++;
256                 printData[nowX][nowY]=dataToPrintData(data[nowX][nowY]);
257                 printData[nowX][nowY][0]=\'(\';
258                 printData[nowX][nowY][7]=\')\';
259             }
260             else
261             {
262                 printData[nowX][nowY][0]=\'(\';
263                 printData[nowX][nowY][7]=\')\';
264             }
265             mapSortToLeft();
266             mapSortToUp();
267             break;
268         }
269         case RIGHT:
270         {
271             if((data[nowX][nowY]==data[nowX][nowY+1])&&(nowY<LENG-1)&&(data[nowX][nowY+1]>0))
272             {
273                 data[nowX][nowY]=0;
274                 nowY++;
275                 data[nowX][nowY]++;
276                 printData[nowX][nowY]=dataToPrintData(data[nowX][nowY]);
277                 printData[nowX][nowY][0]=\'(\';
278                 printData[nowX][nowY][7]=\')\';
279             }
280             else
281             {
282                 printData[nowX][nowY][0]=\'(\';
283                 printData[nowX][nowY][7]=\')\';
284             }
285             mapSortToLeft();
286             mapSortToUp();
287             break;
288         }
289         case UP:
290         {
291             if((data[nowX][nowY]==data[nowX-1][nowY])&&(nowX>0)&&(data[nowX-1][nowY]>0))
292             {
293                 data[nowX][nowY]=0;
294                 nowX--;
295                 data[nowX][nowY]++;
296                 printData[nowX][nowY]=dataToPrintData(data[nowX][nowY]);
297                 printData[nowX][nowY][0]=\'(\';
298                 printData[nowX][nowY][7]=\')\';
299             }
300             else
301             {
302                 printData[nowX][nowY][0]=\'(\';
303                 printData[nowX][nowY][7]=\')\';
304             }
305             mapSortToUp();
306             mapSortToLeft();
307             break;
308         }
309         case DOWN:
310         {
311             if((data[nowX][nowY]==data[nowX+1][nowY])&&(nowX<HIGH-1)&&(data[nowX+1][nowY]>0))
312             {
313                 data[nowX][nowY]=0;
314                 nowX++;
315                 data[nowX][nowY]++;
316                 printData[nowX][nowY]=dataToPrintData(data[nowX][nowY]);
317                 printData[nowX][nowY][0]=\'(\';
318                 printData[nowX][nowY][7]=\')\';
319             }
320             else
321             {
322                 printData[nowX][nowY][0]=\'(\';
323                 printData[nowX][nowY][7]=\')\';
324             }
325             mapSortToUp();
326             mapSortToLeft();
327             break;
328         }
329         case CHANGE:
330             stateChange();
331             break;
332         case DEFAULT:
333         {
334             printData[nowX][nowY][0]=\'(\';
335             printData[nowX][nowY][7]=\')\';
336             break;
337         }
338         }
339     }
340 }
团队项目第二周-需求分析(五饭来了吗队)

如何自制游戏?

Unity手撸2048小游戏——背景文字控制

我也来开发2048之方块设计

瓦片合并算法2048游戏

Unity3D游戏开发实战Unity3D实现休闲类游戏《2048》——算法源代码