2048之cmd


 1 /***************************************************************
2 *程序名称:2048
3 *内容摘要:练习
4 *其它说明:无
5 *当前版本:V1.0
6 *作 者:tbz
7 *完成日期:2014年5月8日
8 ***************************************************************/
9
10 #ifndef _GIRD_H_
11 #define _GIRD_H_
12
13 //实现4X4的方格,并提供移动、检测输赢等操作
14 class Grid
15 {
16 public:
17 explicit Grid();
18
19 void print();
20
21 void move(char action);
22
23 bool isWon();
24 bool isLost();
25
26 private:
27 int position[4][4];
28
29 //这四个函数原理一致
30 bool moveLeft();
31 bool moveRight();
32 bool moveUp();
33 bool moveDown();
34
35 //辅助函数
36 bool isExistEqual(int row, int column);
37 void generateEntry(int count);
38 int& at(int row, int column);
39 int random(int min, int max);
40 };
41
42 #endif

Grid.h


  1 /***************************************************************
2 *程序名称:2048
3 *内容摘要:练习
4 *其它说明:无
5 *当前版本:V1.0
6 *作 者:tbz
7 *完成日期:2014年5月8日
8 ***************************************************************/
9
10 #include <iostream>
11 #include <cstdlib>
12 #include <ctime>
13 #include <iomanip>
14 #include "Grid.h"
15 using namespace std;
16
17 //从1开始计数
18 int& Grid::at(int row, int column)
19 {
20 return position[row-1][column-1];
21 }
22
23 //生成某范围的随机数
24 int Grid::random(int min, int max)
25 {
26 return ((rand() % (max-min+1)) + min);
27 }
28
29 //建立4X4表格,并初始化
30 Grid::Grid()
31 {
32 srand(time(0));
33 for (int row = 1; row <= 4; ++row)
34 for (int column = 1; column <= 4; ++column)
35 {
36 at(row, column) = 0;
37 }
38
39 //放置2个数
40 generateEntry(2);
41 }
42
43 //生成几个数,不重复
44 void Grid::generateEntry(int count)
45 {
46 int x = 0, y = 0, value = 0;
47 for (int i = 0; i < count; ++i)
48 {
49 bool valid = false;
50 while(!valid)
51 {
52 x = random(1, 4);
53 y = random(1, 4);
54 value = random(1, 2) * 2;
55 if (!at(x, y))
56 {
57 valid = true;
58 at(x, y) = value;
59 }
60 }
61 }
62 }
63
64 //视图绘制
65 void Grid::print()
66 {
67 cout << " ------------2048------------" << endl;
68 cout << " ____________________________" << endl;
69 for (int i = 1; i <= 4; ++i)
70 {
71 cout << "|";
72 for (int j = 1; j <= 4; ++j)
73 {
74 int temp = at(i, j);
75 if (temp)
76 cout << " " << setw(4) << temp << ". ";
77 else
78 cout << " " << setw(4) << ‘ ‘ << ". ";
79 }
80
81 cout << "|" << endl;
82 }
83 cout << " ----------------------------" << endl;
84 }
85
86 //按动作移动
87 void Grid::move(char action)
88 {
89 bool moved = false;
90 switch(action)
91 {
92 case ‘a‘:
93 case ‘A‘:
94 moved = moveLeft();
95 break;
96 case ‘d‘:
97 case ‘D‘:
98 moved = moveRight();
99 break;
100 case ‘w‘:
101 case ‘W‘:
102 moved = moveUp();
103 break;
104 case ‘s‘:
105 case ‘S‘:
106 moved = moveDown();
107 break;
108 }
109 if (moved)
110 generateEntry(1);
111 }
112
113 //检测
114 bool Grid::isWon()
115 {
116 for (int i = 1; i <= 4; ++i)
117 {
118 for (int j = 1; j <= 4; ++j)
119 {
120 if (at(i, j) == 2048)
121 return true;
122 }
123 }
124 return false;
125 }
126
127 bool Grid::isExistEqual(int row, int column)
128 {
129 bool ret = false;
130
131 //行检测
132 if (row == 1)
133 {
134 ret = (at(row, column) == at(row+1, column));
135 }
136 else if (row == 4)
137 {
138 ret = (at(row, column) == at(row-1, column));
139 }
140 else
141 {
142 ret = (at(row, column) == at(row-1, column)) && (at(row, column) == at(row+1, column));
143 }
144
145 //列检测
146 if (column == 1)
147 {
148 ret = (at(row, column) == at(row, column+1));
149 }
150 else if (column == 4)
151 {
152 ret = (at(row, column) == at(row, column-1));
153 }
154 else
155 {
156 ret = (at(row, column) == at(row, column-1)) && (at(row, column) == at(row, column+1));
157 }
158 return ret;
159 }
160
161 bool Grid::isLost()
162 {
163 for (int i = 1; i <= 4; ++i)
164 {
165 for (int j = 1; j <= 4; ++j)
166 {
167 if (!at(i, j))
168 return false;
169 else
170 {
171 if (isExistEqual(i, j))
172 return false;
173 }
174 }
175 }
176
177 return true;
178 }
179
180 //下
181 bool Grid::moveDown()
182 {
183 int top = 1, bottom = 4;
184 bool moved = false;
185
186 for (int column = 1; column <= 4; ++column)
187 {
188 //相同的数字合并
189 int last = 0, pos = 0;
190 for (int work = bottom; work >= top; --work)
191 {
192 if (at(work, column))
193 {
194 if (last)
195 if (at(work, column) == last)
196 {
197 at(work, column) = 0;
198 at(pos, column) *= 2;
199 moved = true;
200 last = 0;
201 pos = 0;
202 }
203 else
204 {
205 last = at(work, column);
206 pos = work;
207 }
208 else if (!last)
209 {
210 last = at(work, column);
211 pos = work;
212 }
213 }
214 }
215
216 //将数字往栈底挤
217 for (int work = bottom; work >= top; --work)
218 {
219 if (at(work, column))
220 {
221 for (int i = work; i <= bottom-1; ++i)
222 {
223 if (!at(i+1, column))
224 {
225 swap(at(i, column), at(i+1, column));
226 moved = true;
227 }
228 else break;
229 }
230 }
231 }
232 }
233
234 return moved;
235 }
236
237 //上
238 bool Grid::moveUp()
239 {
240 int top = 4, bottom = 1;
241 bool moved = false;
242
243 for (int column = 1; column <= 4; ++column)
244 {
245 //相同的数字合并
246 int last = 0, pos = 0;
247 for (int work = bottom; work <= top; ++work)
248 {
249 if (at(work, column))
250 {
251 if (last)
252 if (at(work, column) == last)
253 {
254 at(work, column) = 0;
255 at(pos, column) *= 2;
256 moved = true;
257 last = 0;
258 pos = 0;
259 }
260 else
261 {
262 last = at(work, column);
263 pos = work;
264 }
265 else if (!last)
266 {
267 last = at(work, column);
268 pos = work;
269 }
270 }
271 }
272
273 //将数字往底挤
274 for (int work = bottom; work <= top; ++work)
275 {
276 if (at(work, column))
277 {
278 for (int i = work; i >= bottom+1; --i)
279 {
280 if (!at(i-1, column))
281 {
282 swap(at(i, column), at(i-1, column));
283 moved = true;
284 }
285 else break;
286 }
287 }
288 }
289 }
290
291 return moved;
292 }
293
294 //左
295 bool Grid::moveLeft()
296 {
297 int top = 4, bottom = 1;
298 bool moved = false;
299
300 for (int row = 1; row <= 4; ++row)
301 {
302 //相同的数字合并
303 int last = 0, pos = 0;
304 for (int work = bottom; work <= top; ++work)
305 {
306 if (at(row, work))
307 {
308 if (last)
309 if (at(row, work) == last)
310 {
311 at(row, work) = 0;
312 at(row,pos) *= 2;
313 moved = true;
314 last = 0;
315 pos = 0;
316 }
317 else
318 {
319 last = at(row, work);
320 pos = work;
321 }
322 else if (!last)
323 {
324 last = at(row, work);
325 pos = work;
326 }
327 }
328 }
329
330 //将数字往底挤
331 for (int work = bottom; work <= top; ++work)
332 {
333 if (at(row, work))
334 {
335 for (int i = work; i >= bottom+1; --i)
336 {
337 if (!at(row, i-1))
338 {
339 swap(at(row, i), at(row, i-1));
340 moved = true;
341 }
342 else break;
343 }
344 }
345 }
346 }
347
348 return moved;
349 }
350
351
352 //右
353 bool Grid::moveRight()
354 {
355 int top = 1, bottom = 4;
356 bool moved = false;
357
358 for (int row = 1; row <= 4; ++row)
359 {
360 //相同的数字合并
361 int last = 0, pos = 0;
362 for (int work = bottom; work >= top; --work)
363 {
364 if (at(row, work))
365 {
366 if (last)
367 if (at(row, work) == last)
368 {
369 at(row, work) = 0;
370 at(row,pos) *= 2;
371 moved = true;
372 last = 0;
373 pos = 0;
374 }
375 else
376 {
377 last = at(row, work);
378 pos = work;
379 }
380 else if (!last)
381 {
382 last = at(row, work);
383 pos = work;
384 }
385 }
386 }
387
388 //将数字往底挤
389 for (int work = bottom; work >= top; --work)
390 {
391 if (at(row, work))
392 {
393 for (int i = work; i <= bottom-1; ++i)
394 {
395 if (!at(row, i+1))
396 {
397 swap(at(row, i), at(row, i+1));
398 moved = true;
399 }
400 else break;
401 }
402 }
403 }
404 }
405
406 return moved;
407 }

Grid.cpp


 1 /***************************************************************
2 *程序名称:2048
3 *内容摘要:练习
4 *其它说明:无
5 *当前版本:V1.0
6 *作 者:tbz
7 *完成日期:2014年5月8日
8 ***************************************************************/
9
10 #include <cstdlib>
11 #include <conio.h>
12 #include "Grid.h"
13 #include <iostream>
14 using namespace std;
15
16 bool isNeed(char c)
17 {
18 switch (c)
19 {
20 case ‘a‘:case ‘s‘:case ‘d‘:case ‘w‘:
21 case ‘A‘:case ‘S‘:case ‘D‘:case ‘W‘:
22 return true;
23 }
24 return false;
25 }
26
27 int main(int argc, char const *argv[])
28 {
29 Grid game;
30
31 //game flow control
32 while (true)
33 {
34 system("cls");
35 game.print();
36 if (game.isWon())
37 {
38 cout << endl << "Congratulation! You won!" << endl;
39 cout << "Press any key to exit." << endl;
40 int pause;
41 cin >> pause;
42 return 0;
43 }
44
45 if (game.isLost())
46 break;
47
48 //Promt
49 cout << endl;
50 cout << "A -> Left, D -> Right, W -> Up, S -> Down. (K -> Exit)" << endl;
51 char input = getch();
52
53 if (input == ‘k‘)
54 return 0;
55 if (!isNeed(input)) continue;
56
57 game.move(input);
58 }
59
60 cout << "Sorry! You lose." << endl;
61 int pause;
62 cin >> pause;
63 return 0;
64 }

main.cpp

2048之cmd,布布扣,bubuko.com

时间: 2024-10-14 14:46:09

2048之cmd的相关文章

2048游戏逻辑

math.randomseed(os.time()) local function printGrid(grid) local celllen = 8 -- one cell have character count local gridStrLines = {} table.insert(gridStrLines,"\n-------------------------------------") for i,row in ipairs(grid) do local line = {

游戏2048源代码 - C语言控制台界面版

完整源代码如下,敬请读者批评指正: 1 /* 2 * Copyright (C) Judge Young 3 * E-mail: [email protected] 4 * Version: 1.0 5 */ 6 7 #include <stdio.h> 8 #include <time.h> /* 包含设定随机数种子所需要的time()函数 */ 9 #include <conio.h> /* 包含Windows平台上完成输入字符不带回显和回车确认的getch()函数

cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发

 第一讲 游戏的演示和工具介绍...1 第二讲 创建项目...2 第三讲 界面显示...3 第四讲 数字2的产生...7 第五讲 输入操作的推断...9 第六讲 输入操作的反应...13 第七讲 分数的累加.游戏结束检測...18 第八讲 界面美化...22 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622 或者:http://www.iqiyi.com/u/1058663622 持续更新中~~~~~~~~~~~~~~. 第一讲 

Cocos2d-x 个人笔记 《2048》(4)

忧伤的Android移植之路. 1)首先得安装eclipse,android-sdk,android-ndk-r9d,Java.eclipse 还的安装插件ADT 插件,各种环境变量.反正能保证第一个Android HelloWorld能成功就好.这就不详细说了. 2)我的这些全部放在D盘根目录下,如果有变化,请找到相应安装目录. 3) 打开Eclipse 开始导入包. 4)导入一个Android包 5)选择你的项目下的proj.android 6)复制Cocos2d相关的库文件到自己的项目下面

Python入门 —— 2048实战(字符界面和图形界面)

2048 game (共4种实现方法) 目录: .. 图形界面 ... pygame 和 numpy .. 字符界面 ... 第一种 ... curses ... wxpython ... 第二种 ... 极简 代码后面附有效果图. 图形界面 用python的pygame库写的2048游戏 程序目前在python3环境下运行,首先安装pygame库和numpy库,pip install pygame和pip install numpy 安装模块完成后,进入终端来到目录,执行python box.

游戏系列~2048(2)

#include <stdio.h>#include <time.h> /* 包含设定随机数种子所需要的time()函数 */#include <conio.h> /* 包含Windows平台上完成输入字符不带回显和回车确认的getch()函数 */#include <windows.h> /* 包含Windows平台上完成设定输出光标位置达到清屏功能的函数 */ #include <bits/stdc++.h>using namespace s

[Qt 5.6.2] 利用Qt实现一个难度可变的2048小游戏

利用Qt实现一个难度随时可调的2048小游戏 一.游戏简介 1.规则创新 胜利条件:达成2048 难度变化:玩家可以通过调整难度条来控制随机池(2.4.8.16)中各个数出现的概率,同时也会改变分数的加成比例 移动触发:每次移动后会从随机池中按照概率随机选取一个数,将其随机放置在一个空余位置上 分数计算:总分=基础分+加成分,基础分+=合并的数值,加成分+=随机生成的数值*加成比例 2.游戏效果 二.设计思路 先将该项目分为游戏入口.主窗口设计与游戏逻辑三个主要模块,再在这三个模块的基础上继续细

windows下cmd命令行显示UTF8字符设置(CHCP命令)

在中文windows系统中,如果一个文本文件是utf-8编码的,那么在cmd.exe命令行窗口(所谓的dos窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即编码是中文字符集或者西文字符集. 如果想正确显示UTF-8字符,可以按照以下步骤操作: 1.打开CMD.exe命令行窗口 2.通过 chcp命令改变代码页,UTF-8的代码页为65001 1 chcp 65001 执行该操作后,代码页就被变成UTF-8了.但是,在窗口中仍旧不能正确显示UTF-8字符

定制windows环境下cmd替代软件ConEmu

定制windows环境下cmd替代软件ConEmu 公认的是Windows环境下命令行界面太难用. 不管是cmd还是powershell都不顺手!!窗口宽度不能全屏,字体太难看还不能调整,窗口背景不能更换,永远的黑白配,最痛苦的是复制和粘贴.都不知道MS是怎么想的?搞个这么个反人类的东西出来,还万年不变,从Windows诞生到Windows7不论是桌面版还是服务器版都一样,到了windows8/windows10换成powershell一样的鸡肋. 在百度搜了一下,找到cmd的替代软件conem