C语言课程设计报告-游戏2048_第1页
C语言课程设计报告-游戏2048_第2页
C语言课程设计报告-游戏2048_第3页
C语言课程设计报告-游戏2048_第4页
C语言课程设计报告-游戏2048_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、东华理工大学C语言课程设计_扌艮告学院:国际教育学院学院专业:电子信息工程班级:1420606学号:201420060638姓名:钟天运一、课程设计题目:游戏2048二、课程设计要求:a)使用C语言编写2048这款游戏b)能够正常运行,拥有游戏界面。c)能正常进行游戏从开始到结束。d)用户操作方便三、设计思路:a)游戏介绍:i. 2048是一款简单的数字类游戏,界面是一个 4*4的方形格子。每个格子里可以为空或者有 一个2An的数值。ii. 用户可以输入4种指令,分别是:上下左 右,游戏会根据用户的指定的方向,将格子中 的数值向对应方向进行移动,直至移动到最边 上的格子或者有其他数值占用,如果

2、碰到等大 数值,将会进行合并。此外,成功移动后,会 在一个空格子随机生成一个2或者4iii. 游戏目标是合成2048这个数值或者更大的 数值。b)实现思路:i. 可以使用二维数组来保存4*4格子中的数值ii. 指令,可以通过输入字符函数,读取用户在键盘上的方向键,进行判断执行对应的代 码。iii. 游戏界面,可以使用简单的特殊制表符, 来实现,并通过清屏函数来进行反复同位置打 印界面。iv. 需要判断游戏结束的函数,以及记录游戏 分数和步骤的变量V.当游戏结束时,能够询问用户是否重新开始 Vi. 随机生成一个新数,可以调用随机函数, 使用时间做种子。c)实现难点:i. 打印游戏界面,要实现灵活

3、能根据棋盘数组里 面的数据灵活打印。ii. 执行操作时,数值的移动和合并。1F1Fintpln44他1吧int惟pi: /煽tlong int on: /Sffij® lone谕ti鮒”跚删fljnt dtk:/dirffitipn key就帕;潮軽否賺mt揃倆;取辭理iss?n五、C语言源代码/ 游戏 2048.C #i nclude "wi ndows.h"#i nclude "time.h"#i nclude "stdio.h"#i nclude "coni o.h"#i nclude "

4、stri ng.h"/宏定义常量方向键值/const int LEFT = 75, UP = 72, RIGHT = 77, DOWN = 80;#defi ne LEFT 75#defi ne UP 72#defi ne RIGHT 77#defi ne DOWN 80const char error_str="您上次输入的指令无法识别,请重新输入struct board/存储游戏分数/directi on key记录方向键,及操作方向in t place44; long int step n; long int num; long int time; int dtk;i

5、nt over;int zeronum;/该函数为游戏运行函数,当只是玩游戏的时候。进入该函数,游戏控制函数。int main()/place数组为棋盘,其中为零代表空,-1代表不能合并的牌,其他2的倍 数值为本身含义,初始化为全0。struct board board1, board_backup;int n ewgame(struct board *, in t), show(struct board *), operate(struct board *);char str100="首次运行游戏"/用于记录系统返回给用户的信息,例如:上一步执行向左合并,按键有误等n e

6、wgame(&board1, 0);/调用函数为新局初始化,第二个参数为初始化方式show(&board1);prin tf("n%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)n", str);doswitch (_getch()case 224:switch (board1.dtk = _getch()case LEFT: strcpy_s(str,sizeof(str),"您上次输入的方向键为:J,已执行左向合并。");board_backup = board1; operate(&board1);break

7、;case UP:strcpy_s(str,sizeof(str),"您上次输入的方向键为:T,已执行上向合并。");board_backup = board1; operate(&board1);break;case RIGHT: strcpy_s(str, sizeof(str),"您上次输入的方向键为:f,已执行右向合并。");board_backup = board1; operate(&board1);break;case DOWN strcpy_s(str,sizeof(str),"您上次输入的方向键为:J,已执行下

8、向合并。");board_backup = board1; operate(&board1);break;default:strcpy_s(str, sizeof(str), error_str); 一 一break;case 27:exit(27);default:strcpy_s(str, sizeof(str), error_str); 一 一system("cls");show(&board1);prin tf("n%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)n", str);if (board1.o

9、ver)printf("n游戏结束,是否重新开始? (y重新开始/n或ECS退出/其他键无效)");while (1)str99 = _getch();if (str99 = 'y')n ewgame(&board1,0); show(&board1);break;else if (str99 = 'c')cha nge(&board1, &board_backup); break;else if (str99 = 'n' | str99 = 27) break; while (!board1.

10、over);printf("n 按任意键退出");_getch();return 0;/该函数为主要打印函数,包括棋盘的打印,分数,等信息int show(struct board * pboard)int i, j, x, le n,nu mle n(i nt);printf(" 游戏 2048游戏运行时间:%ld Sn", time(NULL)- (*pboard).time);prin tf("游戏分数:%ld", (*pboard). nu m);printf("已执行步骤数:ldn", (*pboard)

11、.stepn);/开始绘制棋盘printf(" i1111 n |II n");for (i = 0; i < 7; +i)if (i % 2 = 0)printf("I ");for (j = 0; j < 8; +j)if (j % 2 = 0)/如果值/打印值6,若为奇if (*pboard).placei / 2j / 2 = 0) printf("");为0,输入六个空格else时。调用numlen判断值的位数,控制数值前后的空格数量,最长为 数,前面空格比后面多一个。len = numle n(*pboard)

12、.placei / 2j / 2); for (x = 0; x < (6 - len + 1) / 2; +x) printf("");prin tf("%d", (*pboard).placei / 2j / 2); for (x = 0; x < (6 - len) / 2; +x) printf("");elseprintf("| "); else| n F| ")n Li prin tf("|H!1 n |prin tf("n");printf(&quo

13、t; |11 n");return 0; /这是show函数的附属函数,用于求一个整数长度 int nu mle n(i nt a)int i, n = 1;for (i = 1; i < 11; +i)n *= 10;if (a = a%n)return i;return 0;/开始新的游戏,将棋盘和数据初始化,或者载入棋盘,第二个参数决定初始化 方案,默认0int n ewgame(struct board * pboard, int project) int i, j, t;(*pboard).step n = 0;(*pboard). num = 0;(*pboard)

14、.time = (long int)time(NULL);/ 取当前时间为开始时间(*pboard).dtk = 0;(*pboard).over = 0;(*pboard).zero num = 14;for (i = 0; i < 4; +i)for (j = 0; j < 4; +j)(*pboard).placeij = 0;doi = (in t)(ra nd() / 32768.0 * 4);j = (in t)(ra nd() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (i nt)(ra nd() / 32768

15、.0 * 2) + 1);(*pboard).placeij = t;doi = (in t)(ra nd() / 32768.0 * 4);j = (in t)(ra nd() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (i nt)(ra nd() / 32768.0 * 2) + 1);(*pboard).placeij = t;return 0;/主要操作函数,调用该函数,将执行结构体中对应按键值的方向的操作,并增加分数和操作次数。int operate(struct board * pboard)int i, j, t, shu

16、n = -1, alter = 0,/alter 变量是用来判断执行步骤的时候是否改变了棋局。shun用来记录已经进行合并的值对应的I或J, 用来避免该值再次合并ran dget(struct board *), calczero nu m(struct board *);switch (*pboard).dtk)case UP:for (j = 0; j < 4; +j, shun = -1)for (i = 1; i < 4; +i)if (*pboard).placeij != 0)for (t = i - 1; t >= 0; -t)if (*pboard).plac

17、etj != 0)if (*pboard).placetj= (*pboard).placeij && shu n != t)(*pboard). num += (*pboard).placetj *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t + 1 != i)(*pboard).placet + 1j= (*pboard).placeij;(*pboard).placeij = 0; alter = 1;break;else if (t = 0)(*pboard).placetj=(*pboard).plac

18、eij;(*pboard).placeij = 0;alter = 1;break;break;case DOWN:for (j = 0; j < 4; +j, shun = -1)for (i = 2; i >= 0; -i)if (*pboard).placeij != 0)for (t = i + 1; t < 4; +t)if (*pboard).placetj != 0)if (*pboard).placetj= (*pboard).placeij && shu n != t)(*pboard). num += (*pboard).placetj *

19、= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t - 1 != i)(*pboard).placet - 1j= (*pboard).placeij;(*pboard).placeij = 0; alter = 1;break;else if (t = 3)(*pboard).placetj=case RIGHT:for (i = 0; i < 4; +i, shun = _1)for (j = 2; j >= 0; -j)if (*pboard).placeij != 0)for (t = j + 1; t <

20、4; +t)if (*pboard).placeit != 0)if (*pboard).placeit= (*pboard).placeij && shu n != t)(*pboard). num += (*pboard).placeit *= 2;(*pboard).placeij = 0;shun = t;alter = 1;else if (t - 1 != j)(*pboard).placeit - 1= (*pboard).placeij;(*pboard).placeij = 0; alter = 1;break;else if (t = 3)(*pboard)

21、.placeit=case LEFT:for (i = 0; i < 4; +i, shun = _1)for (j = 1; j < 4; +j)if (*pboard).placeij != 0)for (t = j - 1; t >= 0; -t)if (*pboard).placeit != 0)if (*pboard).placeit= (*pboard).placeij && shu n != t)(*pboard). num += (*pboard).placeit *= 2;(*pboard).placeij = 0;shun = t;alte

22、r = 1;else if (t + 1 != j)(*pboard).placeit + 1= (*pboard).placeij;(*pboard).placeij = 0; alter = 1;break;else if (t = 0)(*pboard).placeit=(*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;default:retur n -1;if (alter)+(*pboard).step n;retur n ran dget(pboard);return 1;/计算place数组中有多少个零,即

23、多少个空位,返回值等同于board1.zeronum int calczer onu m(struct board * pboard)int i, j;for (*pboard).zero num = 0, i = 0; i < 4; +i)for (j = 0; j < 4; +j)if (*pboard).placeij = 0)+(*pboard).zero num;return (*pboard).zero num;/新数生成函数。每次有效执行操作函数时,进行新的数生成int ran dget(struct board * pboard)int i, j, t, x, if

24、over(struct board *);calczero nu m(pboard);t = (in t)(ra nd() / 32768.0 * (*pboard).zero num) + 1; for (x = 0, i = 0; i < 4; +i)for (j = 0; j < 4; +j)if (*pboard).placeij = 0)if (+x = t)(*pboard).placeij = 2 * (i nt)(ra nd() / 32768.0 2) + 1);if (!(-(*pboard).zeronum)| (*pboard).zeronum<= 0)ifover(pboard);return 0;return -1;/用来判断游戏是否结束,当board.zeronum的值为零的时候,调用该函数进 行判断。游戏结束时返回1, over值为1,否

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论