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

付费下载

下载本文档

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

文档简介

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

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

3、时间 做种子。c)实现难点:i.打印游戏界面, 要实现灵活能根据棋盘数组里面的数 据灵活打印。ii.执行操作时,数值的移动和合并。四、流程图4/28五、C语言源代码/ 游戏2048. cinclude windows, h5/28include time, hincludenstdio.hinclude conio.hinclude string, h宏定义常量方向键值/const int LEFT二75, UP二72, RIGHT二77, DOWN二80;define LEFT 75define UP 72 define RIGHT 77define DOWN 80 const char e

4、rror_str=您上次输入的指令无法识别,请重新输入。”;struct boardint place44;long int stepn;long int num;/存储游戏分数long int time;int dtk;/direction key记录方向键,及操作方向int over;int zeronum;6/28 该函数为游戏运行函数, 当只是玩游戏的时候。 进入该函数,游戏控制函数。int main ()/place数组为棋盘,其中为零代表空,-1代表不能合并的 牌,其他2的倍数值为本身含义,初始化为全0。struct board board1, board backup;int n

5、ewgame(struct board *, int),show (struct board *),operate (struct board *);char st讥100二首次运行游戏;/用于记录系统返回给用户的信息, 例如: 上一步执行向左合并, 按键有误 等newgame(&boardl, 0);/调用函数为新局初始化,第二个参数为初始化方式show(&boardl);printf (nn%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)n”,str);7/28switch ( get ch () case 224:switch (boardl. dtk二_

6、getch()case LEFT:strcpy_s (str, sizeof (str),您上次输 入的方向键为:,已执行左向合并。”);board_backup = boardl;operate(&boardl);break;case UP:strcpy_s(str, sizeof (str),您上次输入的方向键为:t ,已执行上向合并。”);board_backup = boardl;operate(&boardl);break;入的方向键为:f,已执行右向合并。);board_backup = boardl;operate(&boardl);break;strcp

7、y_s (str,sizeof (str),您上次输入的方向键为:I ,已执行下向合并。);board_backup = boardl;operate(&boardl);break;default:strcpy_s(stt, sizeof(str), errorstr);docase RIGHT:strcpy_s (str, sizeof (str),您上次输case DOWN:8/28break;case 27:exit(27);default:strcpy_s(str, sizeof(str), error_str);system(cls);show(&boardl);pr

8、intf (Mn%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏).n, str);if (board1. over)printf (,rn游戏结束,是否重新开始?(y重新开始/n或ECS退出/其他键无效)”);while (1)str 99 = _getch ();if (str99 = y)newgame(&board1, 0);show(&boardl);break;9/28else if (str99二二c)change (&bo8Tdl, &board backup);break;else if (str99 = n1| str99 =

9、27) break; while (!board1. over);printf (Mn按任意键退出.”);_getch();return 0; 该函数为主要打印函数, 包括棋盘的打印, 分数, 等信息intshow(struct board * pboard)int i, j, x, len,numlen(int);printfC游戏2048游戏运行时间:ld SnM, time (NULL)一(*pboard). time);10/ 28printf (M游戏分数:ld, (*pboard). num);printf已执行步骤数:%ldnH, (*pboard). stepn);/开始绘制棋

10、盘printf (nr=-iiii_ii- n n II II I IW);for (i = 0;i 7;+i)if (i % 2二二0)printf (n| );for (j = 0;j 8;+j)if (j % 2二二0)if (*pboard). placei / 2j / 2 = 0) printf (n”);/如果值为0,输入六个空格else/打印11/ 28值时。调用numlen判断值的位数,控制数值前后的空格数量,最长为6,若为奇数,前面空格比后面多一个。12/ 28len = numlen(*pboard).placei / 2j /2);for (x = 0;x (6 - l

11、en +1)/2;+x) printf(M”);printf(n%d, (*pboard). placei / 2j /2);for (x = 0;x (6 - len) / 2;+x) printf(M”);elseprintf (,r| );elseprintf (,r|ln |_=!-I II);printf (HIIIIIII n -u-!W);return 0;13/ 28这是show函数的附属函数,用于求一个整数长度。int numlen(int a)int i, n = 1;for (i = 1;i 11;+i)n *= 10;if (a = a%n)return i;retur

12、n 0;开始新的游戏,将棋盘和数据初始化,或者载入棋盘,第二个参数决定初始化方案,默认0int newgame(struct board * pboard, int project)int i, j, t;(*pboard). stepn = 0;(*pboard). num = 0;14/ 28(*pboard). time = (long int)time(NULL);间为开始时间(*pboard). dtk = 0;(*pboard). over = 0;(*pboard). zeronum = 14;for (i = 0;i 4;+i)for (j = 0;j 4;+j)(*pboar

13、d).placeij = 0;doi = (int) (rand () / 32768. 0 * 4);j = (int) (rand () / 32768. 0 * 4); while (*pboard). placeij);t = 2 * (int) (rand() / 32768. 0 * 2) +(*pboard). placeij = t;doi = (int) (rand () / 32768. 0 * 4);/取当前时15/ 28j = (int) (rand () / 32768. 0 * 4); while (*pboard). placeij);t = 2 * (int)

14、(randO / 32768. 0 * 2) + 1);(*pboard). placeij = t;return 0;主要操作函数,调用该函数,将执行结构体中对应按键值的方向的操作,并增加分数和操作次数。int operate (struct board * pboard)int i, j, t, shun二 T,alter = 0,/alter $量是用来判断执行步骤的时候是否改变了棋局。shun用来记录已经进行合并的值对应的I或J,用来避免该值再次合并randget (struct board *),calczeronum (struct board *);switch (*pboard

15、). dtk)case UP:for (j = 0;j 4;+j, shun = -1)16/ 28for (i = 1;i = 0;-t)if (*pboard). placetj != 0)if (*pboard)placetj二二(*pboard). placeij & shun!二t)(*pboard). num+二(*pboard). placetj *= 2;(*pboard). placeij = 0;shun = t;alter = 1;else if (t + 1 != i)(*pboard). placet + 1 j=(*pboard). placeij;(*pb

16、oard). placeij = 0;17/ 28alter二1;break;else if (t = 0)(*pboard). placet j=(*pboard). placei j;(*pboard).placei j = 0;alter = 1;break;break;case DOWN:for (j = 0;j = 0;一一i)if (*pboard). placeij != 0)for (t二i + 1; t 4;+t)if (*pboard). placetj != 0)if (*pboard)placetj二二(*pboard). placeij & shun!二t)(

17、*pboard). num+二(*pboard). placetj *= 2;(*pboard). placeEi j二0;shun二t;alter二1;else if (t - 1 != i)(*pboard). placet - 1 j二(*pboard). placeij;(*pboard). placeEij二0;alter二1;19/ 28break;else if (t = 3)(*pboard). placet j=(*pboard). placei j;(*pboard).placei j = 0;alter = 1;break;break;case RIGHT:for (i

18、= 0;i = 0;j)if (*pboard). placeij != 0)20/ 28for (t二j + 1;t 4;+t)if (*pboard). placeit != 0)if (*pboard). placeit二二(*pboard). placeij & shun != t)(*pboard). num+二(*pboard). placeit *= 2;(*pboard). placeEi j二0;shun二t;alter二1;else if (t - 1 != j)(*pboard). placeEi t - 1二(*pboard). placeij;(*pboard

19、). placeEij二0;alter二1;break;else if (t = 3)21/ 28(*pboard). placei t=(*pboard). placei j;(*pboard).placei j = 0;alter = 1;break;break;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)22/ 28if (*pboard). placeit != 0)if (*pboard). placeit二二(*pboar

20、d). placeij & shun!二t)(*pboard). num+二(*pboard). placeit*= 2;(*pboard). placeEi j二0;shun二t;alter二1;else if (t + 1 != j)(*pboard). placei t + 1二(*pboard).placeij;(*pboard). placeEij二0;alter二1;break;else if (t = 0)23/ 28(*pboard). placei t二(*pboard). placeij;(*pboard). placeij二0;alter二1;break;brea

21、k;default:return -1;if (alter)+ (*pboard). stepn;return randget(pboard);return 1;24/ 28计算place数组中有多少个零,即多少个空位,返回值等同于board1. zeronumint calczeronum(struet board * pboard)int i, j;for (*pboard). zeronum = 0, i二0;i 4;+i)for (j = 0;j 4;+j)if (*pboard).placei j = 0) +(*pboard). zeronum;return (*pboard).

22、zeronum;新数生成函数。每次有效执行操作函数时,进行新的数生成intrandget (struct board * pboard)int i, j, t, x,ifover(struct board *);calczeronum(pboard);t = (int) (rand () / 32768.0 * (*pboard). zeronum) + 1;for (x二0, i = 0;i 4;+i)for (j = 0;j 4;+j)25/ 28if (*pboard).placei j = 0)if (+x二二t)(*pboard). placeij二2 * (int)(rand ()

23、 /32768. 0 * 2) + 1);if (! (-(*pboard). zeronum) |(*pboard). zeronum = 0)ifover (pboard);return 0;return -1;/用来判断游戏是否结束, 当board, zeronum的值为零的时候, 调用该函数进行判断。游戏结束时返回1, over值为1,否则返 回可操作方向值,DOWN或RIGHTint ifover(struct board * pboard)int i;for (i = 0;i 4;+i)if (*pboard). placei 0二二(*pboard). placei126/ 28I (*pboard). placei1 = (*pboard). placei2 | (*pboard).placei 2二二(*pboard). placei3)(*pboard). over = 0;return DOWN;if (*pboard).place0 i二二(*pboard). place1iI (*pboard). place1i =

温馨提示

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

最新文档

评论

0/150

提交评论