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

东华理工大学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 80const char error_str[] = "您上次输入的指令无法识别,请重新输入。
C语言课程设计报告-游戏2048

东华理工大学C语言课程设计报告学院:国际教育学院学院专业:电子信息工程班级:1420606学号:201420060638姓名:钟天运一、课程设计题目:游戏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 80const char error_str[] = "您上次输入的指令无法识别,请重新输入。
2048小游戏代码解析C语言版

2048⼩游戏代码解析C 语⾔版2048⼩游戏,也算是风靡⼀时的益智游戏。
其背后实现的逻辑⽐较简单,代码量不算多,⽽且趣味性强,适合作为有语⾔基础的童鞋来加强编程训练。
本篇分析2048⼩游戏的C 语⾔实现代码。
前⾔游戏截图:游戏实现原理:使⽤终端图形库⽂件curses 绘制终端⾥的图形。
使⽤⼀个⼆维数组保存4 x 4 空格中的变量。
键盘输⼊控制移动,经过逻辑判断,⼆维数组数据变化。
⼆维数组数据变化后交给图形函数显⽰出来。
库⽂件curses 介绍:curses 是⼀种终端图形绘制库,利⽤curses 可以在终端中绘制多种图形。
简单demo深⼊学习请查询相关资料。
#include <stdio.h>#include <curses.h>int main(){initscr();border(0,0,0,0,0,0,0,0);move(5,15);printw("%s","hello world");refresh();char ch=getch();endwin();return 0;}编译:gcc curses_demo.c -lcurses2048实现代码分析根据2048实现原理,代码要实现的主要有三件事:图形绘制游戏逻辑操作图形加载逻辑结果主程序代码如下:2048 C语⾔版代码分析//-------------头⽂件--------------------//#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <time.h>#include <unistd.h>#include <signal.h>//--------------------------------------////------------------全局变量-------------------------------// 游戏主界⾯是⼀个 4*4 的 16 宫格,使⽤⼆维数组进⾏表⽰,⽤ 0 表⽰空格int a[4][4] = {0};// 16 宫格中空格的个数int empty;// 涉及到新产⽣的数字的位置的两个变量int old_y, old_x;//所有的C语⾔代码就是在这三个函数中int main(){//初始化函数init();//游戏运⾏时函数play();//结束函数,清屏//endwin()来关闭 curses 模式.endwin();return0;}main()函数代码分析头⽂件+全局变量头⽂件中包含的库⽂件如下:<stdio.h> 标准输⼊输出<stdlib.h> 设计到内存操作函数<curses.h> 绘制图形库⽂件<time.h> 时间函数<unistd.h> 睡眠函数库⽂件<signal.h> 信号相关操作库⽂件主函数代码主函数中共有三个⼦函数,其中复杂的为前两个,第三个为curses关闭的函数,没有任何逻辑。
c语言课程设计2048

c语言课程设计2048一、教学目标本课程的目标是让学生掌握C语言的基本知识,能够运用C语言编写简单的程序。
通过学习2048游戏的设计与实现,使学生了解并掌握C语言的语法、数据结构、算法等基本知识,提高学生的编程能力和逻辑思维能力。
同时,培养学生独立思考、合作学习的精神,增强学生对计算机科学的兴趣和热情。
具体来说,知识目标包括:1.掌握C语言的基本语法和数据类型。
2.了解函数、数组、指针等基本概念。
3.学习常用的数据结构和算法。
4.理解2048游戏的设计原理和实现方法。
技能目标包括:1.能够使用C语言编写简单的程序。
2.学会使用调试工具,能够发现并修复程序错误。
3.能够独立完成2048游戏的编写和调试。
情感态度价值观目标包括:1.培养学生对计算机科学的兴趣和热情。
2.培养学生独立思考、合作学习的精神。
3.培养学生勇于挑战、不断探索的精神。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、函数、数组、指针等基本概念,以及常用的数据结构和算法。
通过学习2048游戏的设计与实现,使学生能够将所学的知识运用到实际编程中,提高编程能力和逻辑思维能力。
具体的教学大纲如下:1.C语言的基本语法和数据类型。
2.函数、数组、指针等基本概念。
3.常用的数据结构和算法。
4.2048游戏的设计原理和实现方法。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法、实验法等。
通过多样化的教学方法,激发学生的学习兴趣和主动性。
1.讲授法:用于讲解C语言的基本语法、数据类型、函数、数组、指针等基本概念,以及常用的数据结构和算法。
2.讨论法:通过小组讨论,让学生深入理解2048游戏的设计原理和实现方法。
3.案例分析法:分析经典的编程案例,使学生能够将所学的知识运用到实际编程中。
4.实验法:让学生动手编写和调试程序,提高编程能力和逻辑思维能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《C程序设计语言》(K&R)2.参考书:《C Primer Plus》、《C和指针》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程软件(如Visual Studio、Code::Blocks等)以上教学资源将帮助学生更好地学习C语言,掌握2048游戏的设计与实现,提高编程能力和逻辑思维能力。
程序设计报告——控制台游戏2048

入口参数:int a[4][4]
出口参数:a[4][4]为游戏数据数组
算法描述:首先一个while(1)循环,出口为找到值为0的位置。再利用随机数决定产生的是2还是4。
函数原型16int update_menu(int step,int grade,int a[4][4])
函数原型10int judge(int a[4][4],int flag[5])
函数功能:判断游戏是否可以继续进行
入口参数:int a[4][4],int flag[5]
出口参数:a[4][4]为当前游戏数据,flag[5]保存判断信息的数组
算法描述:首先将判断数组flag[5]置0,再遍历二维数组元素,如果有0,将flag置1;如果有2048的出现,return 2结束;如果既不为0也不为2048,则判断其上下左右是否有相邻相等的元素或者为0的元素,flag[1]~flag[4]表示是否可以进行上下左右四个操作,如果满足上述条件就将相应的flag置1。最后只要flag数组中有一个元素为1,游戏便可继续,返回0;否则返回1。
使用API函数。比如SetConsoleTextAttribute设置字体颜色、SetConsoleCursorPosition移动光标、GetStdHandle获取标准输出设备句柄等。
三、
(原程序是彩色的,报告需要打印时打成黑白的)
四、
最深的体会就是学到的知识要学会用,比如数据结构与算法中的查找算法、队列等等完全可以运用在平时的程序中提高效率;还有就是要不断的学习,这个2048我几个月前就开始写的,但之前的版本中游戏算法中一直有bug并且屏幕有闪烁界面。学习就是需要这样,在完善中进步。还有这个报告真心没办法在五页内完成,请老师谅解。
2048游戏C语言实验报告

嘉应学院计算机学院实验报告课程名称:C程序设计开课学期:2015—2016学年第1学期班级:计算机1505指导老师:陈广明设计题目:游戏2048第3组:钟瞻宇15111025梁佳151110233学生姓名(学号):房嘉泽151110240陈祺151110249目录一、实验目的和要求 (3)二、实验环境、内容和方法 (3)三、程序设计 (3)四、源代码 (5)五、调试与运行结果 (17)六、总结 (17)一、实验目的和要求(1)使用C语言编写2048这款游戏。
(2)能够正常运行,拥有游戏界面。
(3)能正常进行游戏从开始到结束。
(4)用户操作方便。
二、实验环境、内容和方法实验内容:1、游戏开始时随机产生两个数值为2/4的方格,其中一个方格置于4个角中的一个位置,另一个方格随机的置于其他位置,其他方格置于0。
2、每次按方向键(w,s,a,d)后,逐行计算移动后的方格值。
每行移动的算法是:先将所有值为0的数移至行首。
能后从行尾开始逐一和前一个数比较,如果相等则合并这2个格子。
3、每合并一次格子,将其值累计到游戏总分中。
4、一次移动结束后,在所有值为0的方格中随机的分配一个2/4的值。
5、所有方格值不为0且上下、左右相邻的方格都不相等,则游戏结束。
6、2出现的概率为70%,4出现的概率为30%。
实验方法:通过上机操作完成各内容。
实验环境:实验用PC机一台,使用操作系统为Windows 7/ Windows 8/ Windows10,安装vc++或v2008等编译软件三、程序设计四、源代码#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#define M 2048void up(); //上操作。
void down(); //下操作。
void right(); //右操作。
基于C语言实现2048游戏

基于C语⾔实现2048游戏本⽂实例为⼤家分享了C语⾔实现2048游戏的具体代码,供⼤家参考,具体内容如下#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <windows.h>#define ROW 4#define COL ROW#define KEY1 224#define KEY_LEFT 75#define KEY_UP 72#define KEY_RIGHT 77#define KEY_DOWN 80int g_sgap = 0;/*应⽤市场下载2048如果需要图形界⾯,需要加界⾯库*///在数组arr产⽣⼀个新的数字void GetNewVal(int arr[ROW][COL]){srand( (unsigned)time( NULL ) + g_sgap++);int x = rand()%ROW;//⾏下标,保证不越界int y = rand()%COL;//列下标,保证不越界int newval = 2;if(x == 0)//75%的概率为2,25%的概率为4{newval = 4;}//找到空闲的格⼦while(arr[x][y] != 0)//该格⼦已经有值,todo有可能死循环{y++;if(y == COL)//{y = 0;x = (x+1)%ROW;//下⼀⾏}}arr[x][y] = newval;}//打印void Show(int arr[ROW][COL]){system("cls");for(int i=0; i<ROW;i++){for(int j=0;j<COL;j++){printf("%4d",arr[i][j]);}printf("\n");}}//显⽰开始界⾯void Start(int arr[ROW][COL]){//获取两个数字,然后显⽰界⾯GetNewVal(arr);GetNewVal(arr);Show(arr);}//获取键值,左:1,上:2,右:3,下:4,其它:0int GetButton(){int key1 = 0;//第⼀个键值int key2 = 0;//第⼆个键值while(1){if(_kbhit()){key1 = _getch();//获得第⼀个键值if(key1 == KEY1)//0xE0{key2 = _getch();//获取第⼆个键值if(key2 == KEY_LEFT){return 1;}else if(key2 == KEY_UP){return 2;}else if(key2 == KEY_RIGHT){return 3;}else if(key2 == KEY_DOWN){return 4;}}}Sleep(100);//睡眠,让出CPU,避免忙等待}}//向左合并bool MergeLeft(int arr[ROW][COL]){int x1 = -1;//第⼀个需要合并的数字下标bool flg = false;//当前没有有效合并(没有数据合并,也没有数据移动) for(int i=0;i<ROW;i++){x1 = -1;//第⼀步,合并相同的数字for(int j=0;j<COL;j++){if(arr[i][j]!=0){if(x1 == -1)//该⾏第⼀个⾮0的值{x1 = j;}else//当前第⼆个需要处理的值{if(arr[i][j] == arr[i][x1])//合并,将x1下标的值*2,j下标的值置为0{arr[i][x1] *= 2;arr[i][j] = 0;x1 = -1;flg = true;}else//第⼀个值和第⼆个值不等,{x1 = j;}}}}//第⼆步,移动数字int index = 0;//当前可以放数据的下标for(int j=0;j<COL;j++){if(arr[i][j]!=0)//需要移动数据{if(index != j){arr[i][index] = arr[i][j];arr[i][j] = 0;index++;flg = true;}else{index++;}}}}return flg;}//游戏是否结束//1.没有空闲单元格//2.相邻没有相同的数字bool IsGameOver(int arr[ROW][COL]){//判断有没有空闲单元格int activeCell = 0;//统计空闲单元格数量for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){if(arr[i][j] == 0){activeCell++;}}}if(activeCell != 0){return false;}//相邻是否有相同的数字,只需要判断右边和下边for(int i=0;i<ROW;i++){for(int j=0;j<COL;j++){//if(arr[i][j]==arr[i][j+1] || arr[i][j] == arr[i+1][j])if(j+1<COL&&arr[i][j]==arr[i][j+1] || i+1<ROW&&arr[i][j]==arr[i+1][j]) {return false;}}}return true;}void Run(int arr[ROW][COL]){int bt;bool rt = false;while(1){bt = GetButton();if(bt == 1)//⽅向键左{rt = MergeLeft(arr);if(rt){GetNewVal(arr);Show(arr);if(IsGameOver(arr)){return ;}}}}}int main(){int arr[ROW][COL] = {0};Start(arr);Run(arr);return 0;}int main1(){int a = 0;while(1){if(_kbhit()){a = _getch();//getchar();printf("键值是:%d\n",a);}}return 0;}/*int main(){srand( (unsigned)time( NULL ) );for(int i=0;i<10;i++){printf("%d ",rand());}printf("\n");return 0;}*/运⾏画⾯以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C语言——2048

作品简介:本程序一共500行左右,实现的功能是用按键代表方向实现2048游戏,本游戏可以设置峰值(是1024、2048、4096或9999?全都由你设置)、可以设置棋盘大小(4x4不爽?8X8欢迎你),此外还可以设置按键和闪灭时间。
代码为本人早年所写,很抱歉不能对代码一一注释,写的时候没怎么注释,现在也不想加,抱歉。
目前我在写一本C语言入门至半步进阶的书,低至初中生都能看懂,高至大学毕业仍可一学,讲了很多C语言相关但一般书籍都不会讲的东西。
出版时间应该会在2019年之前,有兴趣可以关注我的微博:天狼啸幽月(不知道以后会不会改),想找书的话可以搜我的名字(朱劲松)。
/* Note:Your choice is C IDE */#include "stdio.h"#include "windows.h"#include "stdlib.h"#include "time.h"#include "conio.h"#define N 4 // 间距#define Y0 2 //前空#define X0 4#define bei 13 //初始界面宽度#define bej 40int Gamenum=1024;int startime=300;int Y=4;int X=4;char a='1';//左char b='2';//下char c='3';//右char d='5';char f;int Ga=0;int score=0;/*-----------| 定位|------------*/void GotoXY(short y,short x){HANDLE app=GetStdHandle(STD_OUTPUT_HANDLE);COORD t;t.Y=y;t.X=x*2;SetConsoleCursorPosition(app,t);}void begin(){int i,j;char ch=0;while(1){system("cls");printf("\n\n\t"); //(1,3)for(i=0;i<bei;i++){for(j=0;j<bej;j++){if(i==0||j==0||i==bei-1||j==bej-1)printf("*");else printf(" ");}printf("\n\t");}GotoXY(3,5); printf("\t\t【1 0 2 4】");GotoXY(4,5); printf("\t1.开始游戏");GotoXY(5,5); printf("\t2.游戏说明");GotoXY(6,5); printf("\t3.设置按键");GotoXY(7,5); printf("\t4.设置峰值");GotoXY(8,5); printf("\t5.设置棋盘大小");GotoXY(9,5); printf("\t6.设置星星闪灭时间");GotoXY(10,5); printf("\t0.回到主菜单");GotoXY(12,5); printf("\t请选择:");ch=getch();if(ch=='1'){system("cls");break;}/*---------| 游戏说明|----------*/else if(ch=='2'){system("cls");printf("\n\n");printf(" 【1】点击即可开始1024游戏\n");printf(" 【3】点击即可设置按键,按顺序分别设置方向左、下、右\n (只可字母键或数字键),默认为1,2,3\n");printf(" 【4】设置峰值,即游戏为1024,2048,还是512等等\n");printf(" 【5】点击即可设置游戏棋盘规格(2-8),默认4 x 4\n");printf(" 【6】当达到峰值时该数会消失,消失时该处会闪烁一颗星星,设置该时间,毫秒为单位\n");printf(" 【0】在游戏说明设置界面,按0随时返回主菜单,\n 在游戏进行时只可点“x”退出\n");printf(" 【游戏规则如下】\n");printf(" \ta.通过“左,下,右”的方式移动所有数字\n");printf(" \tb.相同的数字在某操作下会重叠相加\n");printf(" \tc.当有数字达到1024时,该数字会消失\n");printf(" \td.当最上一层填满或按下“*”时游戏结束\n");printf(" \tf.界面中所有的数字包括消失的数的总和即为分数\n");if(getch()) continue;}/*---------| 按键设置|----------*/else if(ch=='3'){system("cls");GotoXY(1,2);printf("仅支持字母和数字,设置成功会有提示");for(i=0;i<4;i++){GotoXY(i+2,2);if(i==0){printf("请设置左键:");for(f=getch();!('0'<=f&&f<='9'||'a'<=f&&f<='z'||'A'<=f&&f<='Z');f=getch());a=f;printf("%c (设置成功)",a);}if(i==1){printf("请设置下键:");for(f=getch();!('0'<=f&&f<='9'||'a'<=f&&f<='z'||'A'<=f&&f<='Z');f=getch());b=f;printf("%c (设置成功)",b);}if(i==2){printf("请设置右键:");for(f=getch();!('0'<=f&&f<='9'||'a'<=f&&f<='z'||'A'<=f&&f<='Z');f=getch());c=f;printf("%c (设置成功)",c);}if(i==3){printf("请设置上键:");for(f=getch();!('0'<=f&&f<='9'||'a'<=f&&f<='z'||'A'<=f&&f<='Z');f=getch());d=f;printf("%c (设置成功)",d);}}if(getch()) continue;}/*---------| 峰值设定|-----------*/else if(ch=='4'){system("cls");GotoXY(1,2);printf("峰值设置范围为2-9999,设置成功会有提示");GotoXY(2,2);printf("设置为:");for(scanf("%d",&Ga);Ga<2||Ga>9999;scanf("%d",&Ga)){ GotoXY(2,6); printf("\b\t\t\t\t"); GotoXY(2,6); }Gamenum=Ga;GotoXY(2,9);printf("(设置成功)");if(getch()) continue;}/*---------| 棋盘设置|----------*/else if(ch=='5'){system("cls");GotoXY(1,2);printf("设置棋盘按键,仅2-8(包含),设置成功会有提示");GotoXY(2,2);printf("请设置棋盘的高:");for(f=getch();!('2'<=f&&f<='8');f=getch());Y=f-'0';printf("%d\t(设置成功)",Y);GotoXY(3,2);printf("请设置棋盘的宽:");for(f=getch();!('2'<=f&&f<='8');f=getch());X=f-'0';printf("%d\t(设置成功)",X);if(getch()) continue;}/*------------| 星星时间设置|---------------*/else if(ch=='6'){system("cls");GotoXY(1,2);printf("时间单位为毫秒,设置范围为10-5000,设置成功会有提示");GotoXY(2,2);printf("设置为:");for(scanf("%d",&Ga);Ga<10||Ga>5000;scanf("%d",&Ga)){ GotoXY(2,6); printf("\b\t\t\t\t"); GotoXY(2,6); }startime=Ga;GotoXY(2,9);printf("(设置成功)");if(getch()) continue;}else if(ch=='0') { system("cls"); continue;}else { system("cls"); continue; }}}int ing(void){int ch,i=0,j=0,k=0,temp,geti=0,getj=0,getrand=0,yes=0,ok=1,time0;/*---------| 表格区|-----------*/GotoXY(Y0-1,X0);for(j=0;j<X;j++)for(k=0;k<N*2;k++)printf("_");printf("_");for(i=0;i<Y;i++){for(k=0;k<2;k++){for(j=0;j<X;j++){GotoXY(Y0+i*3+k,X0+j*N);printf("|");}GotoXY(Y0+i*3+k,X0+X*N);printf("|");}for(j=0;j<X;j++){GotoXY(Y0+i*3+2,X0+j*N);printf("|");for(k=0;k<N*2;k++)printf("_");}GotoXY(Y0+i*3+2,X0+X*N);printf("|");}GotoXY(0,0);printf("分数:");/*------------| 内容区|-------------*/int youxi[Y][X];for(i=0;i<Y;i++)for(j=0;j<X;j++)youxi[i][j]=0;do{srand(clock());getrand=rand()%(Y*Y); //概率算法,p1:p2:p3=1:3:5 for(i=1;i<Y+1;i++)if(getrand<i*i){geti=Y-i;getj=rand()%X;break;}}while(youxi[geti][getj]!=0);getrand=rand()%5;if(getrand<3)youxi[geti][getj]=2;elseyouxi[geti][getj]=4;GotoXY(Y0+geti*3+1,X0+getj*N+1);printf("%3d",youxi[geti][getj]);score+=youxi[geti][getj];GotoXY(0,3);printf("%-6d",score);while((ch=getch())!='*'){/*----------| 左|------------*/if(ch==a){for(i=0;i<Y;i++){for(j=0;j<X;j++)if(youxi[i][j]!=0){for(k=j+1;k<X &&youxi[i][k]==0;k++);if(k<X && youxi[i][j]==youxi[i][k]){youxi[i][j]*=2;youxi[i][k]=0;}}for(j=0;j<X;j++)if(youxi[i][j]==0){for(k=j;k<X;k++)if(youxi[i][k]!=0){youxi[i][j]=youxi[i][k];youxi[i][k]=0;break;}}}}/*----------| 下|------------*/else if(ch==b){for(j=0;j<X;j++){for(i=Y-1;i>=0;i--)if(youxi[i][j]!=0){for(k=i-1;k>=0 &&youxi[k][j]==0 ;k--);if(k>=0 && youxi[i][j]==youxi[k][j]){youxi[i][j]*=2;youxi[k][j]=0;}}for(i=Y-1;i>0;i--)if(youxi[i][j]==0){for(k=i;k>=0;k--)if(youxi[k][j]!=0){youxi[i][j]=youxi[k][j];youxi[k][j]=0;break;}}}}/*----------| 右|------------*/else if(ch==c){for(i=Y-1;i>=0;i--){for(j=X-1;j>=0;j--)if(youxi[i][j]!=0){for(k=j-1;k>=0 &&youxi[i][k]==0 ;k--);if(k>=0 && youxi[i][j]==youxi[i][k]){youxi[i][j]*=2;youxi[i][k]=0;}}for(j=X-1;j>=0;j--)if(youxi[i][j]==0){for(k=j;k>=0;k--)if(youxi[i][k]!=0){youxi[i][j]=youxi[i][k];youxi[i][k]=0;break;}}}}/*------| 上|--------*/else if(ch==d){for(j=0;j<X;j++){for(i=0;i<Y;i++)if(youxi[i][j]!=0){for(k=i+1;k<Y &&youxi[k][j]==0 ;k++);if(k<Y && youxi[i][j]==youxi[k][j]){youxi[i][j]*=2;youxi[k][j]=0;}}for(i=0;i<Y;i++)if(youxi[i][j]==0){for(k=i;k<Y;k++)if(youxi[k][j]!=0){youxi[i][j]=youxi[k][j];youxi[k][j]=0;break;}}}}else ok=0;if(ok){/*--------| ★的检测|---------*/for(i=Y-1;i>=0;i--)for(j=X-1;j>=0;j--){if(youxi[i][j]>=Gamenum){youxi[i][j]=0;GotoXY(Y0+i*3+1,X0+j*N+1); printf(" ★");time0=clock();while(clock()-time0<startime);GotoXY(Y0+i*N,X0+j*N+1); printf(" ");}}do{srand(clock());getrand=rand()%(Y*Y); //概率算法,p1:p2:p3=1:3:5for(i=1;i<Y+1;i++)if(getrand<i*i){geti=Y-i;getj=rand()%X;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嘉应学院计算机学院实验报告课程名称:C程序设计开课学期:2015—2016学年第1学期班级:计算机1505指导老师:陈广明设计题目:游戏2048第3组:钟瞻宇15111025梁佳151110233学生姓名(学号):房嘉泽151110240陈祺151110249目录一、实验目的和要求 (3)二、实验环境、内容和方法 (3)三、程序设计 (3)四、源代码 (5)五、调试与运行结果 (17)六、总结 (17)一、实验目的和要求(1)使用C语言编写2048这款游戏。
(2)能够正常运行,拥有游戏界面。
(3)能正常进行游戏从开始到结束。
(4)用户操作方便。
二、实验环境、内容和方法实验内容:1、游戏开始时随机产生两个数值为2/4的方格,其中一个方格置于4个角中的一个位置,另一个方格随机的置于其他位置,其他方格置于0。
2、每次按方向键(w,s,a,d)后,逐行计算移动后的方格值。
每行移动的算法是:先将所有值为0的数移至行首。
能后从行尾开始逐一和前一个数比较,如果相等则合并这2个格子。
3、每合并一次格子,将其值累计到游戏总分中。
4、一次移动结束后,在所有值为0的方格中随机的分配一个2/4的值。
5、所有方格值不为0且上下、左右相邻的方格都不相等,则游戏结束。
6、2出现的概率为70%,4出现的概率为30%。
实验方法:通过上机操作完成各内容。
实验环境:实验用PC机一台,使用操作系统为Windows 7/ Windows 8/ Windows10,安装vc++或v2008等编译软件三、程序设计四、源代码#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#define M 2048void up(); //上操作。
void down(); //下操作。
void right(); //右操作。
void left(); //左操作。
void play(); //操作函数。
void random(); //随机函数。
void integral(int x);//积分函数。
void all_printf(); //输出图像函数。
int A[4][4]={0};int C=0; //得分的最终数值。
void main(){printf(" 游戏规则很简单:\n");printf(" 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4.\n");printf(" 玩家可以选择上(w)下(s)左(a)右(d)四个方向,若棋盘内的数字出现位移或合并,视为有效移动.\n");printf(" 若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并.\n");printf(" 合并所得的所有新生成数字想加即为该步的有效得分.\n");printf(" 玩家选择的方向行或列前方有空格则出现位移.\n");printf(" 每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4).\n");printf(" 棋盘被数字填满,无法进行有效移动,判负,游戏结束.\n");printf(" 棋盘上出现2048,判胜,游戏结束");printf("\n\n\n");printf(" \t\t\t按回车开始游戏.\n");getchar(\n);system("cls");system("color 70");random();random();all_printf();int flag=1,i,j;char judge;for(;flag==1;){play();for(i=0,flag=0;i<=3;i++){for(j=0;j<=3;j++)if(A[i][j]==0&&(flag==0||flag==1))flag=1;else if(A[i][j]==M)flag=2;}if(flag==0){system("color c7");printf("\n\t\t\t任务失败 !你总共获得%d分!\n",C);}else if(flag==2)printf("\n\t\t\t恭喜你获得胜利 !你总共获得%d分!\n",C);if(flag==0||flag==2){printf("是否重新开始?(y or n):");judge=getch();if(judge=='y'){system("cls");C=0;for(i=0;i<=3;i++)for(j=0;j<=3;j++)A[i][j]=0;random();random();all_printf();flag=1;system("color 70");}else break;}else{random();system("cls");all_printf();printf("\n");printf("\t分数为:%6d\t\t",C);}}}void play() /* 操作函数*/{char direction;direction=getch();switch(direction){case 'w':up();break;case 's':down();break;case 'a':left();break;case 'd':right();break;default: printf("输入错误!\n");}}void up(){int a[4][4]={0},i,j,m;for(j=0;j<=3;j++)for(i=0,m=0;i<=3;i++)if(A[i][j]==0)continue;else a[m++][j]=A[i][j];//A[i][j]的有效值赋给a[i][j],所有有效值向上靠拢。
for(i=0;i<=3;i++)for(j=0;j<=3;j++)A[i][j]=0; //对整个A数组赋0。
for(j=0;j<=3;j++)for(i=0,m=0;i<=3;i++){if(i==3&&a[i][j]!=0)A[m][j]=a[i][j];else if(a[i][j]==0)continue;else if(a[i][j]==a[i+1][j]){A[m++][j]=a[i][j]*2;a[i+1][j]=0;integral(a[i][j]*2);}else if(a[i][j]!=a[i+1][j]){A[m++][j]=a[i][j];}}//分析计算回归赋值。
}// 向上。
void down(){int a[4][4]={0},i,j,m;for(j=0;j<=3;j++)for(i=3,m=3;i>=0;i--)if(A[i][j]==0)continue;else a[m--][j]=A[i][j];//A[i][j]的有效值赋给a[i][j],所有有效值向下靠拢。
for(i=0;i<=3;i++)for(j=0;j<=3;j++)A[i][j]=0;//对整个A数组赋0。
for(j=0;j<=3;j++)for(i=3,m=3;i>=0;i--){if(i==0&&a[i][j]!=0)A[m][j]=a[i][j];else if(a[i][j]==0)continue;else if(a[i][j]==a[i-1][j]){A[m--][j]=a[i][j]*2;a[i-1][j]=0;integral(a[i][j]*2);}else if(a[i][j]!=a[i-1][j]){A[m--][j]=a[i][j];}}//分析计算回归赋值。
}// 向下。
void left(){int a[4][4]={0},i,j,m;for(i=0;i<=3;i++)for(j=0,m=0;j<=3;j++)if(A[i][j]==0)continue;else a[i][m++]=A[i][j];//A[i][j]的有效值赋给a[i][j],所有有效值向左靠拢。
for(i=0;i<=3;i++)for(j=0;j<=3;j++)A[i][j]=0;//对整个A数组赋0。
for(i=0;i<=3;i++)for(j=0,m=0;j<=3;j++){if(j==3&&a[i][j]!=0)A[i][m]=a[i][j];else if(a[i][j]==0)continue;else if(a[i][j]==a[i][j+1]){A[i][m++]=a[i][j]*2;a[i][j+1]=0;integral(a[i][j]*2);}else if(a[i][j]!=a[i][j+1]){A[i][m++]=a[i][j];}}//分析计算回归赋值。
}// 向左。
void right(){int a[4][4]={0},i,j,m;for(i=0;i<=3;i++)for(j=3,m=3;j>=0;j--)if(A[i][j]==0)continue;else a[i][m--]=A[i][j];//A[i][j]的有效值赋给a[i][j],所有有效值向右靠拢。
for(i=0;i<=3;i++)for(j=0;j<=3;j++)A[i][j]=0;//对整个A数组赋0。
for(i=0;i<=3;i++)for(j=3,m=3;j>=0;j--){if(j==0&&a[i][j]!=0)A[i][m]=a[i][j];else if(a[i][j]==0)continue;else if(a[i][j]==a[i][j-1]){A[i][m--]=a[i][j]*2;a[i][j-1]=0;integral(a[i][j]*2);}else if(a[i][j]!=a[i][j-1]){A[i][m--]=a[i][j];}}//分析计算回归赋值。