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

下载本文档

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

文档简介

东华理工大学 C语言课程设计 报告学院: 国际教育学院学院 专业: 电子信息工程 班级: 学号: 8 姓名: 钟天运 1、 课程设计题目:游戏20482、 课程设计要求:a) 使用C语言编写2048这款游戏b) 能够正常运行,拥有游戏界面。c) 能正常进行游戏从开始到结束。d) 用户操作方便3、 设计思路:a) 游戏介绍:i. 2048是一款简单的数字类游戏,界面是一个4*4的方形格子。每个格子里可以为空或者有一个2n的数值。ii. 用户可以输入4种指令,分别是:上下左右,游戏会根据用户的指定的方向,将格子中的数值向对应方向进行移动,直至移动到最边上的格子或者有其他数值占用,如果碰到等大数值,将会进行合并。此外,成功移动后,会在一个空格子随机生成一个2或者4iii. 游戏目标是合成2048这个数值或者更大的数值。b) 实现思路:i. 可以使用二维数组来保存4*4格子中的数值ii. 指令,可以通过输入字符函数,读取用户在键盘上的方向键,进行判断执行对应的代码。iii. 游戏界面,可以使用简单的特殊制表符,来实现,并通过清屏函数来进行反复同位置打印界面。iv. 需要判断游戏结束的函数,以及记录游戏分数和步骤的变量v. 当游戏结束时,能够询问 用户是否重新开始。vi. 随机生成一个新数,可以调用随机函数,使用时间做种子。c) 实现难点:i. 打印游戏界面,要实现灵活能根据棋盘数组里面的数据灵活打印。ii. 执行操作时,数值的移动和合并。4、 流程图5、 C语言源代码/ 游戏2048.c#include windows.h#include time.h#include stdio.h#include conio.h#include string.h/宏定义常量 方向键值/const int LEFT = 75, UP = 72, RIGHT = 77, DOWN = 80;#define LEFT 75#define UP 72#define RIGHT 77#define DOWN 80const char error_str = 您上次输入的指令无法识别,请重新输入。;struct boardint place44;long int stepn;long int num;/存储游戏分数long int time;int dtk;/direction key 记录方向键,及操作方向int over;int zeronum;/该函数为游戏运行函数,当只是玩游戏的时候。进入该函数,游戏控制函数。int main()/place数组为棋盘,其中为零代表空,-1代表不能合并的牌,其他2的倍数值为本身含义,初始化为全0。struct board board1, board_backup;int newgame(struct board *, int),show(struct board *),operate(struct board *);char str100 = 首次运行游戏;/用于记录系统返回给用户的信息,例如:上一步执行向左合并,按键有误等newgame(&board1, 0);/调用函数为新局初始化,第二个参数为初始化方式show(&board1);printf(n%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)n, str);doswitch (_getch()case 224:switch (board1.dtk = _getch()case LEFT:strcpy_s(str, sizeof(str), 您上次输入的方向键为:,已执行左向合并。); board_backup = board1; operate(&board1); break;case UP:strcpy_s(str, sizeof(str), 您上次输入的方向键为:,已执行上向合并。); board_backup = board1; operate(&board1); break;case RIGHT:strcpy_s(str, sizeof(str), 您上次输入的方向键为:,已执行右向合并。); board_backup = board1; operate(&board1); break;case DOWN:strcpy_s(str, sizeof(str), 您上次输入的方向键为:,已执行下向合并。); 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);printf(n%snn请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)n, str);if (board1.over)printf(n游戏结束,是否重新开始?(y重新开始/n或ECS退出/其他键无效);while (1)str99 = _getch();if (str99 = y)newgame(&board1, 0);show(&board1);break;else if (str99 = c)change(&board1, &board_backup);break;else if (str99 = n | str99 = 27)break; while (!board1.over);printf(n按任意键退出);_getch();return 0;/该函数为主要打印函数,包括棋盘的打印,分数,等信息int show(struct board * pboard)int i, j, x, len,numlen(int);printf(游戏2048游戏运行时间:%ld Sn, time(NULL) - (*pboard).time);printf(游戏分数:%ld, (*pboard).num);printf( 已执行步骤数:%ldn, (*pboard).stepn);/开始绘制棋盘printf(n n);for (i = 0; i 7; +i)if (i % 2 = 0)printf();for (j = 0; j 8; +j)if (j % 2 = 0)if (*pboard).placei / 2j / 2 = 0)printf( );/如果值为0,输入六个空格else/打印值时。调用numlen判断值的位数,控制数值前后的空格数量,最长为6,若为奇数,前面空格比后面多一个。len = numlen(*pboard).placei / 2j / 2);for (x = 0; x (6 - len + 1) / 2; +x)printf( );printf(%d, (*pboard).placei / 2j / 2);for (x = 0; x (6 - len) / 2; +x)printf( );elseprintf();elseprintf( nn );printf(n);printf( nn);return 0;/这是show函数的附属函数,用于求一个整数长度。int numlen(int a)int i, n = 1;for (i = 1; i 11; +i)n *= 10;if (a = a%n)return i;return 0;/开始新的游戏,将棋盘和数据初始化,或者载入棋盘,第二个参数决定初始化方案,默认0int newgame(struct board * pboard, int project)int i, j, t;(*pboard).stepn = 0;(*pboard).num = 0;(*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)(*pboard).placeij = 0;doi = (int)(rand() / 32768.0 * 4);j = (int)(rand() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (int)(rand() / 32768.0 * 2) + 1);(*pboard).placeij = t;doi = (int)(rand() / 32768.0 * 4);j = (int)(rand() / 32768.0 * 4); while (*pboard).placeij);t = 2 * (int)(rand() / 32768.0 * 2) + 1);(*pboard).placeij = t;return 0;/主要操作函数,调用该函数,将执行结构体中对应按键值的方向的操作,并增加分数和操作次数。int operate(struct board * pboard)int i, j, t, shun = -1, alter = 0,/alter变量是用来判断执行步骤的时候是否改变了棋局。shun用来记录已经进行合并的值对应的I或J,用来避免该值再次合并randget(struct board *),calczeronum(struct board *);switch (*pboard).dtk)case UP:for (j = 0; j 4; +j, shun = -1)for (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 + 1j = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;else if (t = 0)(*pboard).placetj = (*pboard).placeij;(*pboard).placeij = 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)(*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 = 3)(*pboard).placetj = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;case RIGHT:for (i = 0; i = 0; -j)if (*pboard).placeij != 0)for (t = j + 1; t 4; +t)if (*pboard).placeit != 0)if (*pboard).placeit = (*pboard).placeij & shun != 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).placeit = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;case LEFT:for (i = 0; i 4; +i, shun = -1)for (j = 1; j = 0; -t)if (*pboard).placeit != 0)if (*pboard).placeit = (*pboard).placeij & shun != 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 = 0)(*pboard).placeit = (*pboard).placeij;(*pboard).placeij = 0;alter = 1;break;break;default:return -1;if (alter)+(*pboard).stepn;return randget(pboard);return 1;/计算place数组中有多少个零,即多少个空位,返回值等同于 board1.zeronumint calczeronum(struct board * pboard)int i, j;for (*pboard).zeronum = 0, i = 0; i 4; +i)for (j = 0; j 4; +j)if (*pboard).placeij = 0)+(*pboard).zeronum;return (*pboard).zeronum;/新数生成函数。每次有效执行 操作函数 时,进行新的数生成int randget(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)if (*pboard).placeij = 0)if (+x = t)(*pboard).placeij = 2 * (int)(rand() / 3

温馨提示

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

评论

0/150

提交评论