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;。
c语言2048课程设计
c语言2048课程设计一、课程目标知识目标:1. 掌握C语言基本的语法结构,如变量声明、数据类型、运算符、控制结构等。
2. 学会使用数组存储和处理数据,理解数组的访问方式及基本操作。
3. 理解函数的定义和调用方法,能编写简单的自定义函数实现特定功能。
技能目标:1. 培养学生运用C语言解决问题的能力,特别是逻辑思维和算法设计能力。
2. 能够设计并实现2048游戏的核心算法,包括数字合并、移动逻辑等。
3. 学会使用调试工具进行程序调试,提高程序的正确性和稳定性。
情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发探究精神,形成主动学习的习惯。
2. 增强学生的团队协作能力,通过小组讨论和协作完成课程项目。
3. 引导学生体验程序设计的成就感,培养自信心和耐心,形成积极向上的学习态度。
课程性质分析:本课程为C语言编程实践课程,结合2048游戏设计,旨在让学生在实际操作中巩固所学知识,提高编程能力。
学生特点分析:学生已具备一定的C语言基础,对编程有初步认识,但对复杂逻辑和算法设计尚需引导和练习。
教学要求:1. 以学生为主体,教师为主导,注重启发式教学,引导学生主动探索。
2. 结合实际案例,让学生在实践中掌握编程方法和技巧。
3. 关注学生个体差异,提供个性化指导,确保每个学生都能在课程中取得进步。
二、教学内容1. C语言基础语法复习:变量声明、数据类型、运算符、控制结构(条件语句、循环语句)。
相关教材章节:第一章至第四章。
2. 数组的使用:一维数组、二维数组的概念及应用,数组初始化、访问和遍历。
相关教材章节:第五章。
3. 函数的定义与调用:理解函数作用,掌握函数定义、调用、传参和返回值。
相关教材章节:第六章。
4. 2048游戏原理及算法设计:a. 游戏规则和逻辑介绍。
b. 数字合并、移动算法设计。
c. 随机生成数字、界面显示。
相关教材章节:算法设计与实践。
5. 程序调试与优化:使用调试工具,如GDB,进行程序调试,分析并优化程序性能。
2048游戏设计_课程设计报告
2016-2017学年第一学期《Windows程序设计》课程设计报告题目:2048游戏设计专业:班级:姓名:指导教师:成绩:学院二0一六年十一月十五日目录1、实验要求及目的 (1)2、游戏需求分析及概要设计 (1)2.1需求分析 (1)2.2可行性分析 (1)2.3运行环境 (1)2.4游戏概要设计 (1)3、游戏详细设计 (2)3.1游戏主界面 (2)3.2游戏结束界面 (4)3.3新纪录界面 (6)3.4游戏规则 (8)4、游戏测试 (8)4.1测试过程 (8)4.2测试内容 (8)4.3测试结果 (9)5、小结 (10)6、参考文献 (11)7、附录 (12)1、实验要求及目的本课程设计旨在提高学生的软件编程能力。
本设计将进一步加强学生对面向对象程序设计思想的理解,增强对C#程序语言的灵活运用。
要求学生能实现基本的应用软件,为以后从事相关行业打下软件编程基础。
2、游戏需求分析及概要设计2.1需求分析现代社会对休闲小游戏的需求是:提高游戏的操作可行性,降低游戏的操作难度,降低游戏的上手难度,降低游戏的竞争需求,对使用设备的要求趋于简单化和多样化,游戏界面更加人性化,功能更加贴合使用。
2.2可行性分析1)技术可行性根据游戏设计的要求,可以通过 c#进行源代码的编辑,通过 windows 界面进行用户界面的编辑和优化,结合时间和目前学习水平等各项因素,项目所要求功能和性能完全可以实现。
2)运行可行性游戏基本要求是.netframework4.0 及以上,在大部分的用户设备上可以实现,并且游戏运行对硬件几乎无要求,项目运行可以得到保证。
3)可行性综合分析综合以上两点,项目开发可以得到技术和运行的保证,证明项目可行。
2.3运行环境操作系统:Windows7应用软件:Microsoft Visual Studio 20122.4游戏概要设计图-1 概要设计3、游戏详细设计3.1游戏主界面1)截图如“图-2主界面”所示图-2主界面2)主界面核心功能代码case 0:{ gra.FillRectangle(newSolidBrush(Color.BurlyWood),dian.X,dian.Y,90,90); } break;case 2:{ gra.FillRectangle(newSolidBrush(Color.LightSalmon),dian.X, dian.Y, 90, 90); } break;case 4:{ gra.FillRectangle(new SolidBrush(Color.Peru),dian.X, dian.Y, 90, 90); } break;case 8:{ gra.FillRectangle(newSolidBrush(Color.Chocolate),dian.X, dian.Y, 90, 90); } break;case 16:{ gra.FillRectangle(new SolidBrush(Color.Gray), dian.X, dian.Y, 90, 90); } break;case 32:{ gra.FillRectangle(newSolidBrush(Color.DarkSeaGreen), dian.X, dian.Y, 90, 90); } break;case 64:{ gra.FillRectangle(new SolidBrush(Color.Gold), dian.X, dian.Y,90, 90); } break;case 128:{ gra.FillRectangle(new SolidBrush(Color.HotPink), dian.X, dian.Y, 90, 90); } break;case 256:{ gra.FillRectangle(new SolidBrush(Color.DarkOrange), dian.X, dian.Y, 90, 90); } break;case 512:{ gra.FillRectangle(new SolidBrush(Color.LightPink), dian.X, dian.Y, 90, 90); } break;case 1024:{ gra.FillRectangle(new SolidBrush(Color.DarkRed), dian.X, dian.Y, 90, 90); } break;case 2048:{ gra.FillRectangle(new SolidBrush(Color.Red), dian.X, dian.Y, 90, 90); } break;3.2游戏结束界面1)截图如“图-3 结束界面”、“图-4 结束界面”所示图-3 结束界面图-4 结束界面2)结束界面核心功能代码public partial class _2048messageBox : Form{public _2048messageBox(){ InitializeComponent(); }public string a{ get; set; }public string b{ get; set; }private void _2048messageBox_Load(object sender, EventArgs e){ label1.Text = a; textBox1.Text = b; this.TopLevel = true; }public void b_add(string x){ textBox1.AppendText(x); }private void _2048messageBox_MouseClick(object sender, MouseEventArgs e){ this.Close(); }private void _2048messageBox_KeyDown(object sender, KeyEventArgs e){ if (e.KeyCode == Keys.Enter) this.Close(); }private void textBox1_TextChanged(object sender, EventArgs e){ }}3.3新纪录界面1)截图如“图-5新纪录界面”、“图-6新纪录界面”所示图-5新纪录界面图-6新纪录界面2)新纪录界面核心功能代码public partial class _2048messageBox : Form{public _2048messageBox(){ InitializeComponent(); }public string a{ get; set; }public string b{ get; set; }private void _2048messageBox_Load(object sender, EventArgs e){ label1.Text = a; textBox1.Text = b; this.TopLevel = true; }public void b_add(string x){ textBox1.AppendText(x); }private void _2048messageBox_MouseClick(object sender, MouseEventArgs e){ this.Close(); }private void _2048messageBox_KeyDown(object sender,KeyEventArgs e){ if (e.KeyCode == Keys.Enter) this.Close(); }private void textBox1_TextChanged(object sender, EventArgs e){ }}3.4游戏规则开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4,玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动,玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并,合并所得的所有新生成数字想加即为该步的有效得分,玩家选择的方向行或列前方有空格则出现位移,每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)。
C语言游戏开发_2048_设计说明书
2048游戏项目需求分析一、项目概述------------------------------------------------------------------------------------------------ 2二、需求分析------------------------------------------------------------------------------------------------ 21.游戏开发的趋势和特色--------------------------------------------------------------------------- 22.游戏操作需求 --------------------------------------------------------------------------------------- 23.开发环境---------------------------------------------------------------------------------------------- 3三、概要设计------------------------------------------------------------------------------------------------ 3四、程序流程图--------------------------------------------------------------------------------------------- 4五、详细设计------------------------------------------------------------------------------------------------ 53.颜色如下: --------------------------------------------------------------------------------------------- 64.光标位置等的格式控制--------------------------------------------------------------------------- 75.终端控制---------------------------------------------------------------------------------------------- 7六、游戏运行说明 ---------------------------------------------------------------------------------------- 101.游戏运行流程图 ----------------------------------------------------------------------------------- 10七、扩展说明----------------------------------------------------------------------------------------------- 101.扩展功能框图 -------------------------------------------------------------------------------------- 10一、项目概述2048是一款简单小巧的益智类游戏,挑战您的智力极限,借鉴1024和小3传奇游戏开发而成,难度相对有所下降,是一款让您根本停不下来的游戏。
C语言大作业报告——2048小游戏程序
《C语言程序设计》实验大作业反思报告系统设计与实现:1.系统功能模块划分对系统进行自顶向下的模块分解,画出系统各个功能模块之间的结构图如下:2.函数功能和外部接口设计本系统总计设计了13个函数,每个函数的功能和接口设计如下表所示:序号函数名函数功能函数参数函数返回值1 read_keyboard 读取键盘输入的变量无key_code2 loop_Game 游戏循环cmd 无3 reset_Game 重置游戏无无4 add_rand_num 添加随机数无随机数5 get_null_count 获取空位置数量无空位置数量n6 check_Game_over 检查游戏是否结束无if_Game_over7 Move_left 左移无If_need_add_num8 Move_right 右移无If_need_add_num9 Move_up 上移无If_need_add_num10 Move_down 下移无If_need_add_num11 clear_screen 清屏无无12 refresh_show 刷新界面无无13 init_Game 初始化游戏无无各个函数之间的调用关系如下所示:3.数据结构结构体数组+指针,链表4.算法递推,查找,文件操作5.程序流程图系统总体流程图如下:实验过程中遇到的问题及解决方法与思路:问题1:开始部分函数体和数据设置较多,导致后面程序的编写过程中出现了许多错误,例如函数名和数据名的大小写等出现错误。
原因:函数名和数据的设计为了追求简洁而无法记住其意义,并且设置过多。
解决方法:在纸上将函数名和数据名都记好,以防后面编写时出现遗忘,此外,应当按照函数名以及数据名的具体作用进行设置,而非随心所欲。
问题2:对于清屏函数clear_screen和初始化函数init的掌握不熟练,导致编写过程中有许多错误出现,编写很不规范。
原因:对于Linux相关知识掌握较少,无法使用相关函数功能。
2048游戏编程实践
熟练掌握数门语言熟练掌握一个平台熟练掌握、理解算法和数据结构掌握编译原理、操作系统、网络、图形、数据库等专业课程知识认可《软件工程》学习提示:1. 在“桌面环境”中动手练习,若环境不流畅可选择WebIDE或字符界面。
2. 在教程上方“课程问答”中提出问题,或“共享桌面”寻求远程帮助。
3. 在教程上方“实验报告”中完成作业,记录心得。
发布实验报告可以获得大家点评。
4. 在“我的代码库”中用GIT提交你的实验代码。
C 语言制作 2048一、实验说明1. 环境登录无需密码自动登录,系统用户名 shiyanlou。
2. 环境介绍本实验环境采用带桌面的 Ubuntu Linux 环境,实验中会用到桌面上的程序:LX 终端(LXTerminal):Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令。
GVim:非常好用的编辑器,最简单的用法可以参考课程 Vim编辑器。
3.环境使用使用 GVim 编辑器输入实验所需的代码及文件,使用 LX 终端(LXTerminal)运行所需命令进行操作。
实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。
这些都是您学习的真实性证明。
4. 项目介绍这次我们的项目是 2048 游戏,也是一个非常热门的游戏。
最终效果图是这样的:图片描述信息如果需要先学习 C 语言教程,请点击:C语言入门教程二、项目准备1. 基础知识我们的项目用到了一点数据结构的知识,还涉及到了 linux 的一些系统调用,有助于我们加深对 linux 下的程序设计的深入理解。
此外,我们还用了一个文本界面的屏幕绘图库ncurses,编译时需要加上 -lcurses 选项。
安装 ncurses 库sudo apt-get install libncurses5-dev2. 设计思路我们的 2048 游戏里最关键的就是消掉方块和在屏幕任意位置输出数据。
C语言实现简易2048小游戏
C语⾔实现简易2048⼩游戏⼀直很喜欢玩这个⼩游戏,简单的游戏中包含运⽓与思考与策略,喜欢这种简约⼜不失内涵的游戏风格。
于是萌⽣了⽤C语⾔实现⼀下的想法。
具体代码是模仿这个:博主分析的都很到位,很多算法技巧都值得借鉴,C语⾔实现2048的主要思想已经在那个博客中详细的分析了,但是我觉得在博主的代码中还是有很多很好的思想是值得我借鉴学习的。
⽐如这个⽣成随机数,顺便规定随机数的概率:/* ⽣成随机数函数定义 */void add_rand_num(){srand(time(0));int n = rand() % get_null_count();/* 确定在何处空位置⽣成随机数 */for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){if (board[i][j] == 0 && n-- == 0) /* 定位待⽣成的位置 */{board[i][j] = (rand() % 3 ? 2 : 4);/* 确定⽣成何值,设定⽣成2的概率是4的概率的两倍 */return;}}}}⾸先是 srand() 函数,他是⼀个随机数发⽣器的初始化函数。
原型为:void srand(unsigned seed)⽤法是:程序员需要为这个函数提供⼀个随机数的种⼦:srand(随机数),如果使⽤相同的种⼦,那么后⾯的rand()函数就会每次运⾏都是⽣成⼀样的随机数,即伪随机数。
如:srand(1),直接⽤1来初始化种⼦,后⾯都是⼀样的随机数。
为了⽣成真正的随机数,我们⼀般采⽤系统时间来作为随机数初始化函数的种⼦。
使⽤time()函数来获取系统时间:它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即:srand((unsigned) time(&t));还有⼀个经常⽤法,不需要定义 time_t 型 t 变量,即: srand((unsigned) time(NULL)); 直接传⼊⼀个空指针,因为你的程序中往往并不需要经过参数获得的 t 数据。
C语言代码实现简单2048游戏
C语⾔代码实现简单2048游戏最近玩2048上瘾,于是尝试⽤C++写了⼀个2048⼩游戏操作⽅法很简单,通过wasd控制⽅块的⽅向,数据的上限为65536代码如下#include<bits/stdc++.h>#include<conio.h>#include <windows.h>void color(short x){if(x>=0 && x<=15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);}using namespace std;int qp[4][4]={0};long long int gread=0;int pd(){int i,j;for(i=0;i<4;i++){for(j=0;j<4;j++){if(qp[i][j]==0){return 0;}if(i==0&&j==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j+1]){return 0;}}else if(i==0&&j==3){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j-1]){return 0;}}else if(i==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i][j+1]||qp[i][j]==qp[i][j-1]){return 0;}}else if(i==3&&j==0){if(qp[i][j]==qp[i][j+1]||qp[i][j]==qp[i-1][j]){return 0;}}else if(j==0){if(qp[i][j]==qp[i+1][j]||qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j+1]){return 0;}}else if(i==3&&j==3){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]||qp[i][j]==qp[i][j+1]) {return 0;}}else if(j==3){if(qp[i][j]==qp[i-1][j]||qp[i][j]==qp[i][j-1]||qp[i][j]==qp[i+1][j]) {return 0;}}}}return 1;}int sjs(){int num = rand() % 100 + 1;if(num<=5){return 4;}else{return 2;}}int sc(){for(;;){int n=rand()%4;int m=rand()%4;if(qp[n][m]==0){qp[n][m]=sjs();return 0;}}}void dy(int n){if(n==0){cout<<" ";}else if(n==2){color(7);cout<<" "<<n<<" ";color(7);}else if(n==4){color(14);cout<<" "<<n<<" ";color(7);}else if(n==8){color(6);cout<<" "<<n<<" ";color(7);}else if(n==16){color(12);cout<<" "<<n<<" ";cout<<" "<<n<<" ";color(7);}else if(n==64){color(13);cout<<" "<<n<<" ";color(7);}else if(n==128){color(5);cout<<" "<<n<<" ";color(7);}else if(n==256){color(9);cout<<" "<<n<<" ";color(7);}else if(n==512){color(3);cout<<" "<<n<<" ";color(7);}else if(n==1024){color(11);cout<<n<<" ";color(7);}else if(n==2048){color(10);cout<<n<<" ";color(7);}else if(n==4096){color(2);cout<<n<<" ";color(7);}else{color(15);cout<<n;color(7);}}int main(){srand(time(NULL));int i,j;cout<<"Game start!(输⼊w a s d进⾏控制)"<<endl; sc();sc();cout<<"-------------------------"<<endl;cout<<"|";dy(qp[0][0]);cout<<"|";dy(qp[0][1]);cout<<"|";dy(qp[0][2]);cout<<"|";dy(qp[0][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl;cout<<"|";dy(qp[1][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[2][0]);cout<<"|";dy(qp[2][1]);cout<<"|";dy(qp[2][2]);cout<<"|";dy(qp[2][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[3][0]);cout<<"|";dy(qp[3][1]);cout<<"|";dy(qp[3][2]);cout<<"|";dy(qp[3][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; for(;;){char n;n=getch();if(n=='w'){int g=0;for(i=0;i<4;i++){for(j=1;j<4;j++){if(qp[j][i]!=0){int k=j;while(qp[k-1][i]==0&&k!=0){k--;}qp[k][i]=qp[j][i];if(k!=j){qp[j][i]=0;g=1;}}}if(qp[0][i]==qp[1][i]&&qp[0][i]!=0) {qp[0][i]=qp[0][i]*2;gread+=qp[0][i];qp[1][i]=qp[2][i];qp[2][i]=qp[3][i];qp[3][i]=0;g=1;}if(qp[1][i]==qp[2][i]&&qp[1][i]!=0) {qp[1][i]=qp[1][i]*2;gread+=qp[1][i];qp[2][i]=qp[3][i];qp[3][i]=0;g=1;}if(qp[2][i]==qp[3][i]&&qp[2][i]!=0) {qp[2][i]=qp[2][i]*2;{cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='d'){int g=0;for(i=0;i<4;i++){for(j=2;j>=0;j--){if(qp[i][j]!=0){int k=j;while(qp[i][k+1]==0&&k!=3){k++;}qp[i][k]=qp[i][j];if(k!=j){qp[i][j]=0;g=1;}}}if(qp[i][3]==qp[i][2]&&qp[i][3]!=0) {qp[i][3]=qp[i][3]*2;gread+=qp[i][3];qp[i][2]=qp[i][1];qp[i][1]=qp[i][0];qp[i][0]=0;g=1;}if(qp[i][2]==qp[i][1]&&qp[i][2]!=0) {qp[i][2]=qp[i][2]*2;gread+=qp[i][2];qp[i][1]=qp[i][0];qp[i][0]=0;g=1;}if(qp[i][1]==qp[i][0]&&qp[i][1]!=0) {qp[i][1]=qp[i][1]*2;gread+=qp[i][1];qp[i][0]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='s'){int g=0;for(i=0;i<4;i++)while(qp[k+1][i]==0&&k!=3){k++;}qp[k][i]=qp[j][i];if(k!=j){qp[j][i]=0;g=1;}}}if(qp[3][i]==qp[2][i]&&qp[3][i]!=0) {qp[3][i]=qp[3][i]*2;gread+=qp[3][i];qp[2][i]=qp[1][i];qp[1][i]=qp[0][i];qp[0][i]=0;g=1;}if(qp[2][i]==qp[1][i]&&qp[2][i]!=0) {qp[2][i]=qp[2][i]*2;gread+=qp[2][i];qp[1][i]=qp[0][i];qp[0][i]=0;g=1;}if(qp[1][i]==qp[0][i]&&qp[1][i]!=0) {qp[1][i]=qp[1][i]*2;gread+=qp[1][i];qp[0][i]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl; continue;}else{system("cls");}}else if(n=='a'){int g=0;for(i=0;i<4;i++){for(j=1;j<4;j++){if(qp[i][j]!=0){int k=j;while(qp[i][k-1]==0&&k!=0){k--;}qp[i][k]=qp[i][j];if(k!=j){qp[i][j]=0;g=1;}}}if(qp[i][0]==qp[i][1]&&qp[i][0]!=0)qp[i][2]=qp[i][3];qp[i][3]=0;g=1;}if(qp[i][1]==qp[i][2]&&qp[i][1]!=0){qp[i][1]=qp[i][1]*2;gread+=qp[i][1];qp[i][2]=qp[i][3];qp[i][3]=0;g=1;}if(qp[i][2]==qp[i][3]&&qp[i][2]!=0){qp[i][2]=qp[i][2]*2;gread+=qp[i][2];qp[i][3]=0;g=1;}}if(g==0){cout<<"换个⽅向试试~"<<endl;continue;}else{system("cls");}}else{cout<<"请输⼊w、a、s、d"<<endl; continue;}sc();cout<<"分数:"<<gread<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[0][0]);cout<<"|";dy(qp[0][1]);cout<<"|";dy(qp[0][2]);cout<<"|";dy(qp[0][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[1][0]);cout<<"|";dy(qp[1][1]);cout<<"|";dy(qp[1][2]);cout<<"|";dy(qp[1][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[2][0]);cout<<"|";dy(qp[2][1]);cout<<"|";dy(qp[2][2]);cout<<"|";dy(qp[2][3]);cout<<"|"<<endl;cout<<"-------------------------"<<endl; cout<<"|";dy(qp[3][0]);cout<<"|";dy(qp[3][1]);cout<<"|"<<endl;cout<<"-------------------------"<<endl;if(pd()==1){break;}}cout<<"Game over~"<<endl;cout<<"请输⼊“quit”并回车退出游戏"<<endl;for(;;){char s[10000];cin>>s;if(strcmp(s,"quit")==0){break;}}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
2048游戏实验报告
竭诚为您提供优质文档/双击可除2048游戏实验报告篇一:2048设计报告篇二:2048游戏开发与测试论文软件测试小论文项目:2048游戏开发与测试班级:小组:完成日期:指导教师:钱丽小组得分:摘要在这个信息化的世界,电脑的已经基本普及于千家万户,现在人们的生活越来越离开不了计算机,随着人们的物质生活得到了应有的保障,所以现在人们更加倾向于追逐精神享受,所以计算机就成为了很好的媒介。
几年,计算机游戏的发展很迅速,这说明了现在人们喜欢靠打游戏来休闲娱乐。
因此开发一个好玩有趣的游戏是很有发展前景的。
但是现在大型的游戏是非常的多,竞争力度也比较的激烈,并且开发的困难也比较的大,相对而言,针对小型的开发游戏还是比较少一点的,特别是对于老人和儿童的小游戏更是十分的少,竞争力度也很小,所以,开发简单的小型的单机游戏是很符合当今一定年龄层次的需求的。
所以,根据游戏需求的漏洞,本组人员决定开发一款,针对老人和儿童的小游戏,本游戏的特点就是简单、易于操作的特点,是非常适合这一年龄层次的人玩的,这样游戏就会得到的很大的推广。
关键词:计算机;小游戏;休闲娱乐;目录1.引言1.1编写目的根据测试计划报告,对软件进行测试,详细记录测试过程,以对软件的质量进行评价,为软件设计人员提供bug依据,故做产生测试分析报告。
1.2背景为了使游戏更加完善,使玩家有更好的游戏体验,针对游戏出现的一些问题,做出修复,使游戏更加生动,符合玩家的游戏习惯。
1.32048游戏可行性分析当今市场,已经出现了各种各样,适合不同年龄段和不同人群的游戏。
比如:cs、极品飞车、大富翁、魔兽等一些大型游戏,再比如连连看、贪吃蛇、找茬等一些小游戏,都是现在受大众欢迎的娱乐休闲游戏。
并且,随着互联网的发展,许多游戏不仅有单机版的,而且还有网络版的,甚至还有近两年流行起来的网页游戏。
迄今为止,游戏产业在我国已经发展为一个庞大的产业,为许多相关行业带来了巨大的经济效益。
C语言编程入门实战篇:制作2048小游戏
俗话说,熟能生巧,巧能生精。
学了那么多知识,不能只是看看而已,需要多加练习,在练习的过程中,巩固所学,当你能独立写出一个程序时,这样才算真正掌握了!下边是为同学们准备的小程序案例,有兴趣的可以跟着做做哦~ 最后,祝你学习愉快!???? 么么哒~C和C++的区别:C是一个结构化语言,它的重点在于算法和数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。
之所以说C++比C更先进,是因为“设计这个概念已经被融入到C++之中”。
C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。
之所以说C++比C更先进,是因为“设计这个概念已经被融入到C++之中”,而就语言本身而言,在C中更多的是算法的概念。
那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。
而且,“C加上好的设计”也能写出非常好的东西。
准备工作首先上一张图,因为这里只是在用C语言验证算法,所以没有对界面做很好的优化,丑是理所应当的。
了解了游戏的工作原理,实际上可以将游戏描述为四个带有方向的同一操作:1、将所有数字向一个方向移动至中间没有空位2、将相邻的两个相同的数字加和然后放在更靠近移动方向前部的一个位置上另外需要判断一下玩家当前输入的内容是否可以执行,如果不可以执行等待用户下一条记录。
同时需要对游戏的进程进行控制,如果可以继续游戏,那么运行玩家继续输入下一条指令,而如果不可以进行,那么提示无法继续游戏的提示。
首先的问题就是光标键的输入。
光标键属于功能键,使用常规的scanf当然是无法进行读取的,而使用更加接近硬件的getch()进行以字节为单位的标准输入。
用C语言实现2048游戏
⽤C语⾔实现2048游戏本⽂实例为⼤家分享了⽤C语⾔实现2048游戏的具体代码,供⼤家参考,具体内容如下我遇到的⼏个问题:问题1:如何显⽰?system("clear");//清屏每次发⽣变化就清屏⼀次,再把内容打印出来问题2:怎么⽤键盘控制?w,s,a,d-->上下左右system("stty -icanon");//关闭缓冲区,输⼊字符⽆需回车直接接受问题3:随机位置?⽤srand()与rand()产⽣随机数(x,y),再判断位置(x,y)是否为空格,不是空格就继续产⽣随机位置;若该位置为空格,则随机赋值2或4.代码:#include <stdio.h>#include <stdlib.h>#include <time.h>int a[4][4];int i,j,k;int move_up(){int f=0;//有移动过,则f=1,没移动过则为0for(j=0;j<4;j++){for(i=1;i<4;i++){if(a[i][j]!=0)//找到不是0的数{for(k=0;k<i;k++){if(a[k][j]==0)//其上的第⼀个0{a[k][j]=a[i][j];a[i][j]=0;f=1;break;}}}}}return f;int f=0;for(j=0;j<4;j++){for(i=2;i>=0;i--) {if(a[i][j]!=0){for(k=3;k>i;k--) {if(a[k][j]==0){a[k][j]=a[i][j]; a[i][j]=0;f=1;break;}}}}}return f;}int move_left(){int f=0;for(i=0;i<4;i++){for(j=1;j<4;j++) {if(a[i][j]!=0){for(k=0;k<j;k++) {if(a[i][k]==0){a[i][k]=a[i][j]; a[i][j]=0;f=1;break;}}}}}return f;}int move_right(){int f=0;for(i=0;i<4;i++){for(j=2;j>=0;j--) {if(a[i][j]!=0){for(k=3;k>j;k--) {if(a[i][k]==0){a[i][k]=a[i][j]; a[i][j]=0;f=1;break;}}}}}return f;}int f=0;//合并过,f=1,没和并过则为0//移动int f1=move_up();//移动过f1=1//合并for(j=0;j<4;j++){for(i=0;i<3;i++){if(a[i][j]==a[i+1][j]&&a[i][j]!=0){a[i][j]=2*a[i][j];a[i+1][j]=0;f=1;}}}if(f==1)//若合并后可能产⽣的空位,再移动move_up();return (f||f1);//移动过或合并过,则返回1;否则返回0 }int down(){int f=0;//移动int f1=move_down();//合并for(j=0;j<4;j++){for(i=3;i>0;i--){if(a[i][j]==a[i-1][j]&&a[i][j]!=0){a[i][j]=2*a[i][j];a[i-1][j]=0;f=1;}}}if(f==1)//若合并后产⽣的空位,move_down();return (f||f1);}int left(){int f=0;//移动int f1=move_left();//合并for(i=0;i<4;i++){for(j=0;j<3;j++){if(a[i][j]==a[i][j+1]&&a[i][j]!=0){a[i][j]=2*a[i][j];a[i][j+1]=0;f=1;}}}if(f==1)//若合并后产⽣的空位,move_left();return (f||f1);}int right(){int f=0;//移动int f1=move_right();{if(a[i][j]==a[i][j-1]&&a[i][j]!=0){a[i][j]=2*a[i][j];a[i][j-1]=0;f=1;}}}if(f==1)//若合并后产⽣的空位,move_right();return (f||f1);}int ran()//随机数{int z[8]={2,2,2,2,2,2,2,4};//出现2的概率⽐出现4的概率⼤srand(time(NULL));lb:i=rand()%4;j=rand()%4;//随机位置的值为0,则随机赋值2或4;否则继续找随机位置 if(a[i][j]==0)a[i][j]=z[rand()%8];elsegoto lb;}int fail()//失败{int count=0;for(i=0;i<4;i++){for(j=0;j<3;j++){if(a[i][j]==a[i][j+1])//左右相邻相等--》还没输{return 0;}}}for(i=0;i<3;i++){for(j=0;j<4;j++){if(a[i][j]==a[i+1][j])//上下相邻相等--》还没输{return 0;}}}for(i=0;i<4;i++){for(j=0;j<4;j++){if(a[i][j]==0)//统计空格的个数{count++;}}}if(count==0)//没有空格{printf("\n很遗憾!你离成功就差⼀点了!\n");return 1;}return 0;}system("stty -icanon");//关闭缓冲区,输⼊字符⽆需回车直接接受 ran();while(1){//产⽣随机数ran();//显⽰system("clear");//清屏printf("\n---------------------------------\n");for(i=0;i<4;i++){printf("|");for(j=0;j<4;j++){if(a[i][j]==0)printf(" |");elseprintf("%5d |",a[i][j]);}printf("\n---------------------------------\n");}printf("\n\nw,s,a,d-->上下左右;ESC退出游戏!\n");lab:n=getchar();switch(n){case 'w': //上if(0==up())//若既不移动⼜不合并{if(1==fail())//判断是不是游戏失败return -1;elsegoto lab;}break;case 's': //下if(0==down()){if(1==fail())return -1;elsegoto lab;}break;case 'a': //左if(0==left()){if(1==fail())return -1;elsegoto lab;}break;case 'd': //右if(0==right()){if(1==fail())return -1;elsegoto lab;}break;case 27: //ESCprintf("\n退出游戏!\n");return 0;default:goto lab;}//判断是否胜利for(i=0;i<4;i++){printf("\n恭喜你!游戏胜利!\n");return 1;//退出}}}}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
- 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];}}//分析计算回归赋值。