2048小游戏(C语言版)

  1 #include <climits>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <stack>
  5 #include <string>
  6 #include <map>
  7 #include <vector>
  8 #include <cmath>
  9
 10
 11 /*
 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。
 13
 14 游戏开始后a s d w表示方向左 下 右 上四个方向。
 15
 16 正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格
 17 */
 18 using namespace std;
 19
 20 const int MAXX = 10;
 21
 22 int box[MAXX][MAXX];
 23
 24 void moveLeft(int n, bool &ret){
 25     for (int i = 0; i < n; ++i){
 26         for (int j = 0; j < n; ++j){
 27             int k;
 28             for (k = j - 1; k >= 0; --k){
 29                 if (box[i][k] != -1){
 30                     break;
 31                 }
 32             }
 33             box[i][k + 1] = box[i][j];
 34
 35             if ((k + 1) != j){
 36                 box[i][j] = -1;
 37                 ret = true;
 38             }
 39         }
 40     }
 41 }
 42
 43 void mergeLeft(int n, bool &ret){
 44     for (int i = 0; i < n; ++i){
 45         for (int j = 0; j < n - 1; ++j){
 46             if (box[i][j] == -1)continue;
 47
 48             if (box[i][j] == box[i][j + 1]){
 49                 box[i][j] *= 2;
 50                 box[i][j + 1] = -1;
 51                 ret = true;
 52                 ++j;
 53             }
 54         }
 55     }
 56 }
 57
 58 bool left(int n){
 59     bool ret = false;
 60     moveLeft(n, ret);
 61     mergeLeft(n, ret);
 62     moveLeft(n, ret);
 63     return ret;
 64 }
 65
 66 void moveRight(int n, bool &ret){
 67     for (int i = 0; i < n; ++i){
 68         for (int j = n - 1; j >= 0; --j){
 69             if (box[i][j] == -1)continue;
 70
 71             int k;
 72             for (k = j + 1; k < n; ++k){
 73                 if (box[i][k] != -1){
 74                     break;
 75                 }
 76             }
 77
 78             box[i][k - 1] = box[i][j];
 79             if ((k - 1) != j){
 80                 box[i][j] = -1;
 81                 ret = true;
 82             }
 83         }
 84     }
 85 }
 86
 87 void mergeRight(int n, bool &ret){
 88     for (int i = 0; i < n; ++i){
 89         for (int j = n - 1; j >0; --j){
 90             if (box[i][j] == -1)continue;
 91
 92             if (box[i][j] == box[i][j - 1]){
 93                 box[i][j] *= 2;
 94                 box[i][j - 1] = -1;
 95                 ret = true;
 96                 --j;
 97             }
 98         }
 99     }
100 }
101
102 bool right(int n){
103     bool ret = false;
104     moveRight(n, ret);
105     mergeRight(n, ret);
106     moveRight(n, ret);
107     return ret;
108 }
109
110 void moveUp(int n, bool &ret){
111     for (int j = 0; j < n; ++j){
112         for (int i = 0; i < n; ++i){
113             int k;
114             for (k = i - 1; k >= 0; --k){
115                 if (box[k][j] != -1){
116                     break;
117                 }
118             }
119             box[k + 1][j] = box[i][j];
120
121             if ((k + 1) != i){
122                 box[i][j] = -1;
123                 ret = true;
124             }
125         }
126     }
127 }
128
129 void mergeUp(int n, bool &ret){
130     for (int j = 0; j < n; ++j){
131         for (int i = 0; i < n - 1; ++i){
132             if (box[i][j] == -1)continue;
133
134             if (box[i][j] == box[i + 1][j]){
135                 box[i][j] *= 2;
136                 box[i + 1][j] = -1;
137                 ret = true;
138                 ++i;
139             }
140         }
141     }
142 }
143
144 bool up(int n){
145     bool ret = false;
146     moveUp(n, ret);
147     mergeUp(n, ret);
148     moveUp(n, ret);
149     return ret;
150 }
151
152 void moveDown(int n, bool &ret){
153     for (int j = 0; j < n; ++j){
154         for (int i = n - 1; i >= 0; --i){
155             if (box[i][j] == -1)continue;
156
157             int k;
158             for (k = i + 1; k < n; ++k){
159                 if (box[k][j] != -1)break;
160             }
161
162             box[k - 1][j] = box[i][j];
163
164             if ((k - 1) != i){
165                 box[i][j] = -1;
166                 ret = true;
167             }
168         }
169     }
170 }
171
172 void mergeDown(int n, bool &ret){
173     for (int j = 0; j < n; ++j){
174         for (int i = n - 1; i > 0; --i){
175             if (box[i][j] == -1)continue;
176
177             if (box[i][j] == box[i - 1][j]){
178                 box[i][j] *= 2;
179                 box[i - 1][j] = -1;
180                 ret = true;
181                 --i;
182             }
183         }
184     }
185 }
186
187 bool down(int n){
188     bool ret = false;
189     moveDown(n, ret);
190     mergeDown(n, ret);
191     moveDown(n, ret);
192     return ret;
193 }
194
195 void line(int n){
196     for (int i = 0; i < n; ++i){
197         printf("--------");
198     }
199     printf("-");
200     printf("\n");
201 }
202
203 void print(int n){
204     for (int i = 0; i < n; ++i){
205         line(n);
206         for (int j = 0; j < n; ++j){
207             printf("|");
208             if (box[i][j] == -1){
209                 printf("\t");
210                 continue;
211             }
212
213             printf("%2d\t", box[i][j]);
214         }
215         printf("|");
216         printf("\n");
217     }
218     line(n);
219 }
220
221 bool isFull(int n){
222     bool mark = true;
223     for (int i = 0; i < n; ++i){
224         for (int j = 0; j < n; ++j){
225             if (box[i][j] == -1){
226                 mark = false;
227                 return mark;
228             }
229         }
230     }
231     return mark;
232 }
233
234 bool isOver(int n){
235     if (!isFull(n)){
236         return false;
237     }
238     for (int i = 0; i < n; ++i){
239         for (int j = 0; j < n; ++j){
240             if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
241                 return false;
242             }
243         }
244     }
245     return true;
246 }
247
248 void fillBox(int n){
249     int i, j, num;
250
251     if (isFull(n)){
252         return;
253     }
254
255     while (true){
256         i = rand() % n;
257         j = rand() % n;
258         num = rand() % 2 == 0 ? 2 : 4;
259
260         if (box[i][j] == -1){
261             box[i][j] = num;
262             break;
263         }
264     }
265 }
266
267 int main(){
268     //freopen("in.txt", "r", stdin);
269     memset(box, -1, sizeof(box));
270
271     int n;
272     bool mark;
273     scanf("%d%*c", &n);
274
275     fillBox(n);
276     fillBox(n);
277     print(n);
278
279     while (true){
280         char ch;
281         scanf("%c%*c", &ch);
282         if (ch == ‘a‘){
283             mark = left(n);
284         }
285         else if (ch == ‘d‘){
286             mark = right(n);
287         }
288         else if (ch == ‘w‘){
289             mark = up(n);
290         }
291         else if (ch == ‘s‘){
292             mark = down(n);
293         }
294         else{
295             continue;
296         }
297         system("cls");
298         printf("Move:\n");
299         print(n);
300         if (!mark){
301             continue;
302         }
303         fillBox(n);
304         printf("Fill:\n");
305         print(n);
306
307         if (isOver(n)){
308             printf("\n\nGame Over!\n\n");
309             break;
310         }
311     }
312
313
314     return 0;
315 }

2048小游戏(C语言版),布布扣,bubuko.com

时间: 2024-10-27 01:39:16

2048小游戏(C语言版)的相关文章

2048小游戏(变态版哦)

近日,由于博主同学暑假有个作业是写个2048小游戏,我一听挺好玩的..然后就开始了.. 首先,2048在移动过程中的规则其实也没有特别难,但是感觉也不是一句话就能说完的.(不过玩的多--感觉总是有的) 废话不多说,其实博主同学提供了pdf描述了2048的算法. 各位筒子入坑前请先过几眼这个规则,以及其算法(当然我觉得算法第二点有点问题,后述) 那么在游戏的编写前,可以先对细枝末节做一些准备. 1.出现数字2/4的概率 int getRand() { int i = rand() % 10; if

2048小游戏4X4C语言

不好意思,不知道怎样添加附件,原本想将写的源代码(.c)文件上传的. 找了半天没有找到,只能将源程序写到一个文件中,粘贴到这里. 有感兴趣的朋友们,可以拷贝下面的代码运行一下,格式需要自己调整. 也可以访问百度云盘http://pan.baidu.com/s/1hsa675M下载源文件. /*2048*/ #include<stdio.h>#include<stdlib.h>#include<conio.h>#include<time.h> void pri

如何在CentOS上安装一个2048小游戏

如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由于我个人的编程能力不强,所以我就在网上找到了一个C语言版的2048游戏小程序,我把它放到我的百度网盘上,可以供大家下载(链接:http://pan.baidu.com/s/1jIutb3g 密码:mu9z),然后我们把这个程序给复制到CentOS系统下,在进行下一步的工作.我们可以在CentOS上安

Swift实战之2048小游戏

上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完善,就这么整理一下过程中一些值得记录的点吧. 用的Swift版本是2.0,原书中的Swift版本会低一些,所以实践起来有些地方语法并不一样. 一.开始页面   在程序的第一张页面(Main.storyboard)上,只放了一个“开始游戏”按钮,点击按钮,弹出一个提示对话框,确认后,进入游戏页面. 1

js、jQuery实现2048小游戏

一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合并,组成更大的数字,每次移动或合并后会增加一个数字. 当16宫格中没有空格子,且四个方向都无法操作时,游戏结束. 三. 游戏目的: 目的是合并出2048这个数字,获得更高的分数. 四. 游戏截图:  五.先来玩一下: 开始游戏 查看源码 六.游戏实现原理: 使用js.jQuery实现了PC版及手机版,实现原理是一样

.NET手撸2048小游戏

.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEngine,从空白窗口开始,演示如何"手撸"2048小游戏,并在编码过程中感受C#的魅力和.NET编程的快乐. 说明:FlysEngine是封装于Direct2D,重复本文示例,只需在.NET Core 3.0下安装NuGet包FlysEngine.Desktop即可. 并不一定非要做一层封装

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

Pascal小游戏 俄罗斯方块怀旧版

俄罗斯方块怀旧版(注释版) {$APPTYPE GUI}{$MODE DELPHI}program WinPiece; usesWindows; constAppName = 'WinPiece';pm = 25; vardc : hdc;AMessage : Msg;hWindow: HWnd;hPen ,hBrush : longword;intNextPiece, intCurPiece,intTempPiece : longint;BigMap : array [0..11,-4..20

canvas随笔之2048小游戏

HTML: <!DOCTYPE HTML> <html> <head> <title>2048小游戏</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, u