C语言课程设计报告-游戏2048

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

东华理工大学C语言课程设计报告

学院:国际教育学院学院专业:电子信息工程

班级:1420606

学号:************

姓名:***

一、课程设计题目:游戏2048

二、课程设计要求:

a)使用C语言编写2048这款游戏

b)能够正常运行,拥有游戏界面。

c)能正常进行游戏从开始到结束。

d)用户操作方便

三、设计思路:

a)游戏介绍:

i.2048是一款简单的数字类游戏,界面是一个

4*4的方形格子。每个格子里可以为空或者有

一个2^n的数值。

ii.用户可以输入4种指令,分别是:上下左右,游戏会根据用户的指定的方向,将格子中

的数值向对应方向进行移动,直至移动到最边

上的格子或者有其他数值占用,如果碰到等大

数值,将会进行合并。此外,成功移动后,会

在一个空格子随机生成一个2或者4 iii.游戏目标是合成2048这个数值或者更大的数值。

b)实现思路:

i.可以使用二维数组来保存4*4格子中的数值

ii.指令,可以通过输入字符函数,读取用户

在键盘上的方向键,进行判断执行对应的代

码。

iii.游戏界面,可以使用简单的特殊制表符,来实现,并通过清屏函数来进行反复同位置打

印界面。

iv.需要判断游戏结束的函数,以及记录游戏分数和步骤的变量

v.当游戏结束时,能够询问用户是否重新开始。

vi.随机生成一个新数,可以调用随机函数,使用时间做种子。

c)实现难点:

i.打印游戏界面,要实现灵活能根据棋盘数组里

面的数据灵活打印。

ii.执行操作时,数值的移动和合并。

四、流程图

五、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 80

const char error_str[] = "您上次输入的指令无法识别,请重新输入。";

struct board

{

int place[4][4];

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 str[100] = "首次运行游戏"; //用于记录系统返回给用户的信息,例如:上一步执行向左合并,按键有误等

newgame(&board1, 0); //调用函数为新局初始化,第二个

参数为初始化方式

show(&board1);

printf("\n%s\n\n请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)……\n", str);

do

{

switch (_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%s\n\n请从键盘上单击方向键,指定下一步操作(ESC键退出游戏)……\n", str);

if (board1.over)

{

printf("\n游戏结束,是否重新开始?(y重新开始/n或ECS退出/其他键无效)");

while (1)

{

str[99] = _getch();

if (str[99] == 'y')

{

相关文档
最新文档