2048小游戏c语言编程设计

合集下载

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

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语言2048游戏课程设计

c语言2048游戏课程设计一、课程目标知识目标:1. 让学生掌握C语言的基本语法和结构,包括变量声明、数据类型、运算符、控制结构等。

2. 帮助学生理解数组的定义和使用,掌握二维数组的访问和操作。

3. 引导学生了解函数的定义、调用和参数传递,重点掌握递归和模块化编程。

技能目标:1. 培养学生运用C语言解决问题的能力,特别是逻辑思维和算法设计能力。

2. 通过设计2048游戏,让学生掌握游戏开发的基本流程,包括需求分析、设计、编码、测试等。

3. 提高学生的编程实践能力,使其能够独立编写、调试和优化C语言程序。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学习动力,提高学习积极性。

2. 引导学生养成合作、探究的学习习惯,培养团队精神和解决问题的能力。

3. 培养学生的创新意识,鼓励他们勇于尝试,敢于挑战,形成积极向上的学习态度。

课程性质:本课程为C语言编程实践课程,旨在通过设计2048游戏,让学生在实际项目中运用所学知识,提高编程能力和逻辑思维能力。

学生特点:学生处于高年级阶段,已经具备一定的C语言基础,具有一定的编程能力和独立思考能力。

教学要求:教师应关注学生的个体差异,因材施教,注重理论与实践相结合,提高学生的编程实践能力。

同时,教师应引导学生积极参与课堂讨论,培养他们的合作精神和创新能力。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. C语言基础知识回顾:变量、数据类型、运算符、控制结构(选择、循环)。

2. 数组与二维数组:数组的概念、定义、初始化;二维数组的访问和操作。

3. 函数:函数的定义、调用、参数传递;递归函数的编写和调用。

4. 2048游戏原理与设计:a. 游戏规则介绍b. 游戏界面设计c. 游戏逻辑实现:移动、合并、生成新数字等d. 游戏胜负判断5. 编程实践:a. 使用C语言编写2048游戏的各个功能模块b. 调试、优化程序,提高游戏性能c. 测试游戏功能,确保游戏可玩性6. 教学内容安排与进度:a. 基础知识回顾(1课时)b. 数组与二维数组(2课时)c. 函数与递归(2课时)d. 2048游戏原理与设计(2课时)e. 编程实践(3课时)教材章节关联:1. 基础知识回顾:教材第1-4章2. 数组与二维数组:教材第5章3. 函数与递归:教材第6章4. 游戏设计与编程实践:结合教材实例,拓展相关知识教学内容确保科学性和系统性,以2048游戏为载体,引导学生运用所学知识,培养编程实践能力和逻辑思维能力。

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

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⼩游戏代码解析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关闭的函数,没有任何逻辑。

2048C语言

2048C语言
if (i%W == 1 || i%W == 0) //在第一行和每个格子的最后一行输入一行的*
{
for (int j = 1; j <= 2 * W * N; j++){
putchar('*');
}
}
else if (i%W == (W + 1) / 2) //在中间行输出数字或者空白
putchar('*');
else
putchar(' ');
}
}
putchar('\n');
}
printf("******************************************************************************");
return 0;
}
//判断是否可以上下左右移动的函数,判断成败的条件
int Up(int number[][N]){
int i, j, k, t; //k为本次所求单个数的列下标,t为移动的,计算要和k做变化的下标
int b = 0; //b为标志变量,标志此次移动是否发生,无论是移动还是相加都代表着发生了移动
int n;//获得的随机数存放在这里
int x, y;//获得的随机坐标存放在这里
long a = rand();//a为与时间相关的随机种子数
if (a % 2 == 0)
n = 2;
else
n = 4;
/* while (1){
x = (time(0)%100) % 4;
system("color 1F");

2048c语言课程设计

2048c语言课程设计

2048c语言课程设计一、课程目标知识目标:1. 掌握C语言基本数据类型和变量声明;2. 学会使用C语言进行算术表达式和逻辑表达式的编写;3. 理解数组的定义和使用方法,能够运用数组解决2048游戏中的数据存储问题;4. 掌握循环结构和条件判断语句,实现对游戏逻辑的控制。

技能目标:1. 能够运用C语言编写简单的2048游戏程序,实现数字的合并和移动;2. 学会使用调试工具,找出并修复程序中的错误;3. 能够分析2048游戏的算法,并进行优化;4. 培养逻辑思维能力和编程解决问题的能力。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学习积极性;2. 培养学生的团队合作意识,学会与他人共同解决问题;3. 培养学生面对困难不轻言放弃,勇于尝试和克服挑战的精神;4. 培养学生遵守编程规范,养成良好的编程习惯。

课程性质:本课程为实践性较强的课程,结合2048游戏案例,使学生能够在实际操作中掌握C语言编程技巧。

学生特点:学生具备一定的计算机操作基础,对编程有一定了解,但实践经验不足。

教学要求:通过案例教学,引导学生动手实践,注重培养学生的编程思维和实际操作能力。

在教学过程中,关注学生的个体差异,提供个性化的指导和帮助,确保每个学生都能达到课程目标。

将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. C语言基本数据类型和变量声明:介绍整型、浮点型、字符型等基本数据类型,以及变量的定义和初始化方法。

相关教材章节:第一章《C语言概述》。

2. 算术表达式和逻辑表达式:讲解C语言中的运算符、优先级,以及如何编写算术表达式和逻辑表达式。

相关教材章节:第二章《运算符与表达式》。

3. 数组的使用:介绍一维数组、二维数组的定义和初始化,以及如何在2048游戏中使用数组存储数据。

相关教材章节:第三章《数组和字符串》。

4. 循环结构和条件判断语句:讲解for循环、while循环、do-while循环的使用,以及if条件语句和switch语句。

基于C语言实现2048游戏

基于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课程设计

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,进行程序调试,分析并优化程序性能。

C语言游戏开发_2048_设计说明书

C语言游戏开发_2048_设计说明书

2048游戏项目需求分析一、项目概述------------------------------------------------------------------------------------------------ 2二、需求分析------------------------------------------------------------------------------------------------ 21.游戏开发的趋势和特色--------------------------------------------------------------------------- 22.游戏操作需求 --------------------------------------------------------------------------------------- 23.开发环境---------------------------------------------------------------------------------------------- 3三、概要设计------------------------------------------------------------------------------------------------ 3四、程序流程图--------------------------------------------------------------------------------------------- 4五、详细设计------------------------------------------------------------------------------------------------ 53.颜色如下: --------------------------------------------------------------------------------------------- 64.光标位置等的格式控制--------------------------------------------------------------------------- 75.终端控制---------------------------------------------------------------------------------------------- 7六、游戏运行说明 ---------------------------------------------------------------------------------------- 101.游戏运行流程图 ----------------------------------------------------------------------------------- 10七、扩展说明----------------------------------------------------------------------------------------------- 101.扩展功能框图 -------------------------------------------------------------------------------------- 10一、项目概述2048是一款简单小巧的益智类游戏,挑战您的智力极限,借鉴1024和小3传奇游戏开发而成,难度相对有所下降,是一款让您根本停不下来的游戏。

c语言2048课程设计

c语言2048课程设计

c语言2048课程设计一、教学目标本课程的教学目标是使学生掌握 C 语言编程基础,能够运用 C 语言实现简单的程序,并借助 2048 游戏项目深化对 C 语言的理解和应用。

1.理解 C 语言的基本语法和数据类型。

2.掌握 C 语言的运算符和表达式。

3.学会使用 C 语言的控制结构编写程序。

4.理解函数的定义和调用。

5.能够使用 C 语言编写简单的输入输出程序。

6.能够使用 C 语言进行基本的数学运算。

7.能够编写控制流程的程序,如循环和分支。

8.能够编写和调用函数。

情感态度价值观目标:1.培养学生对编程的兴趣和热情。

2.培养学生解决问题的能力和创新思维。

3.培养学生团队协作和互相学习的习惯。

二、教学内容本课程的教学内容主要包括C 语言的基本语法、数据类型、运算符、控制结构、函数等,并通过 2048 游戏项目进行实践。

1. C 语言的基本语法和数据类型。

2.运算符和表达式。

3.控制结构:条件语句、循环语句。

4.函数的定义和调用。

5.2048 游戏项目:设计游戏界面、实现游戏逻辑、编写游戏主函数。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

1.讲授法:用于讲解 C 语言的基本语法、数据类型、运算符、控制结构和函数等基本概念。

2.案例分析法:通过分析 2048 游戏项目,让学生了解如何运用 C 语言实现游戏逻辑。

3.实验法:让学生动手编写 C 语言程序,巩固所学知识,提高实际编程能力。

四、教学资源1.教材:《C 程序设计语言》(K&R)。

2.参考书:《C Primer Plus》。

3.多媒体资料:PPT 课件、教学视频。

4.实验设备:计算机、编程环境。

教学资源的选择和准备要充分考虑学生的学习需求和教学目标,确保教学资源能够支持教学内容和教学方法的实施,提高学生的学习兴趣和效果。

五、教学评估本课程的评估方式包括平时表现、作业和考试三部分,以全面客观地评价学生的学习成果。

1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和理解程度,占总评的 30%。

C语言实现2048游戏代码

C语言实现2048游戏代码

C语⾔实现2048游戏代码本⽂实例为⼤家分享了C语⾔实现2048游戏具体代码,供⼤家参考,具体内容如下效果图:使⽤⽂本界⾯的屏幕绘图库 ncurses.设计思路:在满⾜条件情况下消除⽅块允许在游戏主界⾯(16 宫格)中任意⼀格输出数据实现代码:#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <unistd.h>#include <signal.h>#include <time.h>void draw(); // ⽤于绘制游戏界⾯void play(); // 游戏运⾏的逻辑主体void init(); // 初始化函数,⽤于完成⼀些必要的初始化操作void draw_one(int y, int x); // 绘制单个数字void cnt_value(int *new_y, int *new_x); //统计(y, x)对应的格⼦周围⼀圈的空格的个数int game_over(); // 结束游戏int cnt_one(int y, int x); //统计(y, x)对应的格⼦周围⼀圈的空格的个数// 游戏主界⾯是⼀个 4*4 的 16 宫格,使⽤⼆维数组进⾏表⽰,⽤ 0 表⽰空格int a[4][4] = { 0 };// 16 宫格中空格的个数int empty;int old_y, old_x;int main(){init();play();endwin();return 0;}void init(){int x, y;initscr(); //开启curses模式cbreak(); //开启cbreak模式,除 DELETE 或 CTRL 等仍被视为特殊控制字元外⼀切输⼊的字元将⽴刻被⼀⼀读取 noecho(); //echo() and noecho(): 此函式⽤来控制从键盘输⼊字元时是否将字元显⽰在终端机上curs_set(0); //设置光标模式empty = 15;srand(time(0));x = rand() % 4;y = rand() % 4;a[y][x] = 2;draw();}void draw(){int n, m, x, y;char c[4] = {'0', '0', '0', '0'};clear(); //清除终端屏幕{move(n, m);//将游标移动⾄ x,y 的位置 addch('-');//在当前位置画字符'-'refresh();//将做清除萤幕的⼯作}}for(m = 0; m < 22; m += 5){for(n = 1; n < 8; n++){move(n, m);addch('|');refresh();}}for(y = 0; y < 4; y++){for(x = 0; x < 4; x++){draw_one(y, x);}}}void draw_one(int y, int x){int i, m, k, j;char c[5] = {0x00};i = a[y][x];m = 0;while(i > 0){j = i % 10;c[m++] = j + '0';i = i / 10;}m = 0;k = (x + 1) * 5 - 1;while(c[m] != 0x00){move(2 * y + 1, k);addch(c[m++]);k--;}}void play(){int x, y, i, new_x, new_y, temp;int old_empty, move;char ch;while(1){move = 0;old_empty = empty;ch = getch();switch(ch){case 97: //左移 acase 104: // hcase 68: // 左移⽅向键for(y = 0; y < 4; y++)for(x = 0; x < 4; ){if(a[y][x] == 0){x++;for(i = x + 1; i < 4; i++){if(a[y][i] == 0){continue;}else{if(a[y][x] == a[y][i]){a[y][x] += a[y][i];a[y][i] = 0;empty++;break;}else{break;}}}x = i;}}for(y = 0; y < 4; y++)for(x = 0; x < 4; x++){if(a[y][x] == 0){continue;}else{for(i = x; (i > 0) && (a[y][i - 1] == 0); i--) {a[y][i - 1] = a[y][i];a[y][i] = 0;move = 1;}}}break;case 100: //右移 dcase 108: // lcase 67: //右移⽅向键for(y = 0; y < 4; y++)for(x = 3; x >= 0; ){if(a[y][x] == 0){x--;continue;}else{for(i = x - 1; i >= 0; i--){if(a[y][i] == 0){continue;}else if(a[y][x] == a[y][i]){a[y][x] += a[y][i];a[y][i] = 0;empty++;break;}else{break;}for(y = 0; y < 4; y++)for(x = 3; x >= 0; x--){if(a[y][x] == 0){continue;}else{for(i = x; (i < 3) && (a[y][i + 1] == 0); i++) {a[y][i + 1] = a[y][i];a[y][i] = 0;move = 1;}}}break;case 119: //上移 wcase 107: //kcase 65: //上移⽅向键for(x = 0; x < 4; x++)for(y = 0; y < 4; ){if(a[y][x] == 0){y++;continue;}else{for(i = y + 1; i < 4; i++){if(a[i][x] == 0){continue;}else if(a[y][x] == a[i][x]){a[y][x] += a[i][x];a[i][x] = 0;empty++;break;}else{break;}}y = i;}}for(x = 0; x < 4; x++)for(y = 0; y < 4; y++){if(a[y][x] == 0){continue;}else{for(i = y; (i > 0) && (a[i - 1][x] == 0); i--) {a[i - 1][x] = a[i][x];a[i][x] = 0;move = 1;}}}case 66: //下移⽅向键for(x = 0; x < 4; x++)for(y = 3; y >= 0; ){if(a[y][x] == 0){y--;continue;}else{for(i = y - 1; i >= 0; i--){if(a[i][x] == 0){continue;}else if(a[y][x] == a[i][x]){a[y][x] += a[i][x];a[i][x] = 0;empty++;break;}else{break;}}y = i;}}for(x = 0; x < 4; x++)for(y = 3; y >= 0; y--){if(a[y][x] == 0){continue;}else{for(i = y; (i < 3) && (a[i + 1][x] == 0); i++) {a[i + 1][x] = a[i][x];a[i][x] = 0;move = 1;}}}break;case 'Q':case 'q':game_over();break;default:continue;break;}if(empty <= 0)game_over();if((empty != old_empty) || (move == 1)){do{new_x = rand() % 4;new_y = rand() % 4;}while(a[new_y][new_x] != 0);cnt_value(&new_y, &new_x);{temp = rand() % 4;}while(temp == 0 || temp == 2);a[new_y][new_x] = temp + 1;empty--;}draw();}}int cnt_one(int y, int x){int value = 1;if(y - 1 > 0)a[y - 1][x] ? 0 : value++;if(y + 1 < 4)a[y + 1][x] ? 0 : value++;if(x - 1 >= 0)a[y][x - 1] ? 0 : value++;if(x + 1 < 4)a[y][x + 1] ? 0 : value++;if(y - 1 >= 0 && x - 1 >= 0)a[y - 1][x - 1] ? 0 : value++;if(y - 1 >= 0 && x + 1 < 4)a[y - 1][x + 1] ? 0 : value++;if(y + 1 < 4 && x - 1 >= 0)a[y + 1][x - 1] ? 0 : value++;if(y + 1 < 4 && x + 1 < 4)a[y + 1][x + 1] ? 0 : value++;return value;}void cnt_value(int *new_y, int *new_x){int max_x, max_y, x, y, value;int max = 0;max = cnt_one(*new_y, *new_x);for(y = 0; y < 4; y++)for(x = 0; x < 4; x++){if(!a[y][x]){value = cnt_one(y, x);if(value > max && old_y != y && old_x != x){*new_y = y;*new_x = x;old_x = x;old_y = y;break;}}}}int game_over(){sleep(1); //暂停1秒endwin(); //关闭curses并重置tty(结束curses编程时,最后调⽤的⼀个函数)exit(0);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

C语言实现简易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游戏

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的c语言源程序

游戏2048的c语言源程序

//2048的源程序#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <windows.h>//预处理方块的个数#define height 15 //Height#define width 40 //Widthint board[4][4],temp[4],f,t = 0,r = 0;long long score = 0;char key;void xy(int x,int y); //坐标信息void draw(); //绘画棋格,信息栏void menu(); //主菜单void qaz_draw(); //绘画QAZvoid info(); //动态信息void keyboard(char key); //键盘动作void getchkey(); //获取键盘操作void random(int j); //随机数产生void print(); //打印结果void move(int k); //移动数字方块(算法核心)//void replay(int r); //失败与成功后的操作int lose(); //寻找失败信息int main(){system("mode con: cols=121 lines=33");qaz_draw();return 0;}void xy(int x,int y){COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); }void draw(){short i;//画左右,中间竖五列方块for(i = 1;i <= height;i++){xy(0,i);printf("■");xy(width,i);printf("■");xy((width / 4),i);printf("■");xy((width / 2),i);printf("■");xy((width / 4 * 3),i);printf("■");}//画上下,中间横五行方块for(i = 0;i <= width + 1;i+= 2){xy(i,0);printf("■");xy(i,height + 1);printf("■");xy(i,((height + 1) / 4));printf("■");xy(i,((height + 1) / 2));printf("■");xy(i,((height + 1) / 4 * 3));printf("■");}//画信息栏两行方块for(i = 0;i <= 78;i+= 2){xy(i,19);printf("■");xy(i,30);printf("■");}//画信息栏两列方块for(i = 19;i < 30;i++){xy(0,i);printf("■");xy(78,i);printf("■");}}void qaz_draw(){system("color 2F");int i;xy(23,9); printf(" ■■■■■■■■■■■■■■■■■■\n"); xy(23,10);printf(" ■■■■■\n");xy(23,11);printf(" ■■■■■\n");xy(23,12);printf("■■■■■\n");xy(23,13);printf("■■■■■■\n");xy(23,14);printf("■■■■■■\n");xy(23,15);printf("■■■■■■\n");xy(23,16);printf("■■■■■■\n");xy(23,17);printf(" ■■■■■\n");xy(23,18);printf(" ■■■■■\n");xy(23,19);printf(" ■■■■■■■■■■\n");xy(23,20);printf(" ■■■■■■■■■■■■■\n");xy(54,25);printf("qaz与你同在");for(i = 24;i < 93;i+= 3){xy(i,23);printf("→_→");Sleep(55);if(i == 57){xy(57,26);printf("2048");}}xy(48,28);printf("Press Any Key To Continue");getch();menu();}void info(){xy(44,1); printf("2048");xy(44,3); printf("使用帮助:");xy(44,4); printf("WASD滑动数字");xy(44,5); printf("所有的数字方块都会往滑动的方向靠拢");xy(44,6); printf("系统会在随机空白地区出现2或4数字方块");xy(44,7); printf("相同数字的会相加");xy(44,8); printf("凑出2048即算成功");xy(44,9); printf("F1重新开始F2保存最高纪录与战局");xy(44,10); printf("ESC关闭");xy(44,12); printf("made by qaz");xy(44,13); printf("helper: zxy,sun");xy(5,22); printf("Score:");}void getchkey(){key = getch();keyboard(key);}void random(int j){int i,f1,f2,k;switch(j){case 1: srand((unsigned) time(NULL)); //初始状态下设置初始两个数for(i = 0; i <= 1;i++){f1 = rand() % 4; f2 = rand() % 4; k = rand() % 2 + 1;//#if board[f1][f2] = 2;//#endif xy(5,27);printf("行= %d 列= %d",f1 + 1,f2 + 1);if(board[f1][f2] == 0){if(k == 1){board[f1][f2] = 2; xy(5,26);printf("2");xy(5,27);printf("行= %d 列= %d",f1 + 1,f2 + 1);}if(k == 2){board[f1][f2] = 4; xy(5,26);printf("4");xy(5,27);printf("行= %d 列= %d",f1 + 1,f2 + 1);}}else i-= 1;}print();break;case 2: srand((unsigned) time(NULL)); //经过移动后产生数for(i = 0; i < 1; i++){f1 = rand() % 4; f2 = rand() % 4; k = rand() % 2 + 1;if(board[f1][f2] == 0){if(k == 1){board[f1][f2] = 2; xy(5,26);printf("2");xy(5,27);printf("行= %d 列= %d",f1 + 1,f2 + 1);}if(k == 2){board[f1][f2] = 4; xy(5,26);printf("4");xy(5,27);printf("行= %d 列= %d",f1 + 1,f2 + 1);}}else i-= 1;}print();break;}}void keyboard(char key){switch(key){case 59: for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) board[i][j] = 0; menu();break; case 27: exit(0);case 119: t = 0;move(1);random(2); xy(5,24);printf("↑");getchkey();break; //UP case 115: t = 0;move(2);random(2); xy(5,24);printf("↓");getchkey();break; //DOWN case 97: t = 0;move(3);random(2); xy(5,24);printf("←");getchkey();break; //LEFT case 100: t = 0;move(4);random(2); xy(5,24);printf("→");getchkey();break; //RIGHT default: /*cls(1);*/xy(5,24);printf("?\7");getchkey();break;}}void print(){int i,j,f1,f2;for(i = 4,f1 = 0;i <= 34 && f1 < 4;i+= 10,f1++){ //f1为递增列for(j = 2,f2 = 0; j <= 18 && f2 < 4; j+= 4,f2++){ //f2为递增行if(board[f2][f1] != 0){xy(i,j); printf("%d ",board[f2][f1]);}else if(board[f2][f1] == 0){xy(i,j); printf(" ");}if(board[f2][f1] == 2048){xy(50,22); printf("You Win!");}}}xy(12,22);printf("%lld",score);}int lose(){int i,j;for(j = 0;j < 4;j++) //Ufor(i = 3;i > 0;i--){if(((board[i][j] != 0 && board[i - 1][j] == 0) || (board[i][j] == board[i - 1][j]))) r++; }for(j = 0;j < 4;j++) //Dfor(i = 0;i < 3;i++){if(((board[i][j] != 0 && board[i + 1][j] == 0) || (board[i][j] == board[i + 1][j]))) r++; }for(i = 0;i < 4;i++) //Lfor(j = 3;j > 0;j--){if(((board[i][j] != 0 && board[i][j - 1] == 0) || (board[i][j] == board[i][j - 1]))) r++; }for(i = 0;i < 4;i++) //Rfor(j = 0;j < 3;j++){if(((board[i][j] != 0 && board[i][j + 1] == 0) || (board[i][j] == board[i][j + 1]))) r++; }if(r == 0) return 1;r = 0;}void move(int k){int i,j;switch(k){case 1: //UPif(lose() == 1){xy(50,22); printf("You Lose!");}for(i = 0;i < 4;i++){for(j = 3;j > 0;j--){if((board[j][i] != 0 && board[j - 1][i] == 0) || (board[j][i] == board[j - 1][i]) && (board[j][i] != 0)){t++;break;}}}if(t == 0){getchkey();break;}//判断输入是否有效,否则返回for(f = 0;f < 4;f++) temp[f] = 0; //临时数组赋值为0for(i = 0;i < 4;i++){ //赋值for(j = 0,f = 0;j < 4;j++){if(board[j][i]){temp[f] = board[j][i];f++;}}for(j = 0,f = 0;j < 4;j++,f++) board[j][i] = temp[f]; //赋值回去for(f = 0;f < 4;f++)temp[f] = 0; //清空数组}for(j = 0;j < 4;j++){ //相加for(i = 0;i < 3;i++){if(board[i][j] == board[i + 1][j]){board[i][j] += board[i + 1][j];board[i + 1][j] = 0;score += board[i][j] * 2;}}}for(f = 0;f < 4;f++) temp[f] = 0; //临时数组赋值为0for(i = 0;i < 4;i++){ //赋值for(j = 0,f = 0;j < 4;j++){if(board[j][i]){temp[f] = board[j][i];f++;}}for(j = 0,f = 0;j < 4;j++,f++) board[j][i] = temp[f]; //赋值回去for(f = 0;f < 4;f++)temp[f] = 0; //清空数组if(lose() == 1){xy(50,22); printf("You Lose!");}}break;case 2://DOWNif(lose() == 1){xy(50,22); printf("You Lose!");}for(i = 0;i < 4;i++){for(j = 0;j < 3;j++){if((board[j][i] != 0 && board[j + 1][i] == 0) || (board[j][i] == board[j + 1][i]) && (board[j][i] != 0)){t++;break;}}}if(t == 0){ getchkey();break;} //判断是否有用for(f = 0;f < 4;f++) temp[f] = 0; //清空for(i = 0;i < 4;i++){for(j = 3,f = 3;j >= 0;j--){ //赋值if(board[j][i]){temp[f]=board[j][i];f--;}}for(j = 0,f = 0;j < 4;j++,f++) board[j][i] = temp[f]; //赋值回去for(f = 0;f < 4;f++) temp[f] = 0; //清空}for(i = 0;i < 4;i++){ //相加for(j = 3;j > 0;j--){if(board[j][i] == board[j - 1][i]){board[j][i] += board[j - 1][i];board[j - 1][i] = 0;score += board[j][i] * 2;}}}for(f = 0;f < 4;f++) temp[f] = 0; //清空for(i = 0;i < 4;i++){ //赋值for(j = 3,f = 3;j >= 0;j--){if(board[j][i]){temp[f]=board[j][i];f--;}}for(j = 0,f = 0;j < 4;j++,f++) board[j][i] = temp[f];for(f = 0;f < 4;f++) temp[f] = 0;if(lose() == 1){xy(50,22); printf("You Lose!");}}break;case 3://LEFTif(lose() == 1){xy(50,22); printf("You Lose!");}for(i = 0;i < 4;i++)for(j = 3;j > 0;j--){if((board[i][j] != 0 && board[i][j - 1] == 0) || (board[i][j] == board[i][j - 1]) && (board[i][j] != 0)){t++;break;}}if(t == 0) {getchkey();break;}for(f = 0;f < 4;f++)temp[f] = 0;for(i = 0;i < 4;i++){for(j = 0,f = 0;j < 4;j++){if(board[i][j]){temp[f] = board[i][j];f++;}}for(j = 0,f = 0;j < 4;j++,f++) board[i][j] = temp[f];for(f = 0;f < 4;f++)temp[f] = 0;}for(i = 0;i < 4;i++)for(j = 0;j < 3;j++){if(board[i][j] == board[i][j + 1]){board[i][j] += board[i][j + 1];score += board[i][j];board[i][j + 1] = 0;}}for(f = 0;f < 4;f++)temp[f] = 0;for(i = 0;i < 4;i++){for(j = 0,f = 0;j < 4;j++){if(board[i][j]){temp[f] = board[i][j];f++;}}for(j = 0,f = 0;j < 4;j++,f++)board[i][j] = temp[f];for(f = 0;f < 4;f++)temp[f] = 0;if(lose() == 1){xy(50,22); printf("You Lose!");}}break;case 4://RIGHTif(lose() == 1){xy(50,22); printf("You Lose!");}for(i = 0;i < 4;i++)for(j = 0;j < 3;j++){if((board[i][j] != 0 && board[i][j + 1] == 0) || (board[i][j] == board[i][j + 1]) && (board[i][j] != 0)){t++;break;}}if(t == 0){getchkey(); break;}for(f = 0;f < 4;f++)temp[f] = 0;for(i = 0;i < 4;i++){for(j = 3,f = 3;j >= 0;j--){if(board[i][j]){temp[f] = board[i][j];f--;}}for(j = 0,f = 0;j < 4;j++,f++)board[i][j] = temp[f]; for(f = 0;f < 4;f++)temp[f] = 0;}for(i = 0;i < 4;i++)for(j = 3;j > 0;j--){if(board[i][j] == board[i][j - 1]){board[i][j] += board[i][j - 1];score += board[i][j];board[i][j - 1] = 0;}}for(f = 0;f < 4;f++)temp[f] = 0;for(i = 0;i < 4;i++){for(j = 3,f = 3;j >= 0;j--){if(board[i][j]){temp[f] = board[i][j];f--;}}for(j = 0,f = 0;j < 4;j++,f++)board[i][j] = temp[f]; for(f = 0;f < 4;f++)temp[f] = 0;if(lose() == 1){xy(50,22); printf("You Lose!");}}break;}}void menu(){system("mode con: cols=81 lines=31");system("cls");info();draw();random(1); getchkey(); }。

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

#include<stdio.h>#include<conio.h> //使用getch()函数#include<time.h>#include <stdlib.h>int num[4][4];int score, gameover, ifappear, gamew, gamef,move;char key;void explation(){void menu();system("cls");printf("\t\t*****************************************\t\t\n");printf("\t\t*****************************************\n");printf("\t\t******************游戏规则***************\n");printf("\t\t*****************************************\n");printf("\t\t*****************************************\t\t\n");printf("玩家可以选择上、下、左、右或W、A、S、D去移动滑块\n");printf("玩家选择的方向上若有相同的数字则合并\n");printf("合并所得的所有新生成数字相加即为该步的有效得分\n");printf("玩家选择的方向行或列前方有空格则出现位移\n");printf("每移动一步,空位随机出现一个2或4\n");printf("棋盘被数字填满,无法进行有效移动,判负,游戏结束\n");printf("棋盘上出现2048,获胜,游戏结束\n");printf("按上下左右去移动滑块\n");printf("请按任意键返回主菜单...\n");getch();system("cls");main();}void gamefaile(){int i, j;system("cls");printf("\t\t*****************************************\t\t\n");printf("\t\t*****************************************\n");printf("\t\t******************you fail***************\n");printf("\t\t*****************************************\n");printf("\t\t*****************************************\t\t\n");printf("\t\t\t---------------------\n\t\t\t");for (j = 0; j<4; j++){for (i = 0; i<4; i++)if (num[j][i] == 0)printf("| ");elseprintf("|%4d", num[j][i]);printf("|\n");printf("\t\t\t---------------------\n\t\t\t");}printf("你的成绩:%d,移动了%d步\n", score,move);printf("请按任意键返回主菜单...\n");getch();system("cls");main();}void gamewin(){int i, j;system("cls");printf("\t\t*****************************************\t\t\n");printf("\t\t*****************************************\n");printf("\t\t*******************you win***************\n");printf("\t\t*****************************************\n");printf("\t\t*****************************************\t\t\n");printf("\t\t\t---------------------\n\t\t\t");for (j = 0; j<4; j++){for (i = 0; i<4; i++)if (num[j][i] == 0)printf("| ");elseprintf("|%4d", num[j][i]);printf("|\n");printf("\t\t\t---------------------\n\t\t\t");}printf("你的成绩:%d,移动了%d步\n", score,move);printf("请按任意键返回主菜单...\n");getch();system("cls");main();}void prin(){int i, j;system("cls");printf("\t\t*****************************************\t\t\n");//输出界面printf("\t\t*****************************************\n");printf("\t\t******************游戏开始***************\n");printf("\t\t*****************************************\n");printf("\t\t*****************************************\t\t\n");printf("\t\t 请按方向键或W、A、S、D移动滑块\n");//输出操作提示语句printf("\t\t 按ESC返回至主菜单\n");printf("\t\t\t---------------------\n\t\t\t");for (j = 0; j<4; j++) //输出4*4的表格{for (i = 0; i<4; i++)if (num[j][i] == 0)printf("| ");elseprintf("|%4d", num[j][i]);printf("|\n");printf("\t\t\t---------------------\n\t\t\t");}printf("你的成绩:%d,移动了%d步\n", score,move);//输出得分和移动步数}void appear(){int i, j,ran,t[16],x=0,a,b;srand((int)time(0)); //随机种子初始化for (j = 0; j < 4; j++) //将空白的区域的坐标保存到中间数组t中for (i = 0; i < 4;i++)if (num[j][i] == 0){t[x] = j * 10 + i;x++;}if (x == 1) //在t中随机取一个坐标ran = x - 1;elseran = rand() % (x - 1);a = t[ran] / 10; //取出这个数值的十位数b = t[ran] % 10; //取出这个数值的个位数srand((int)time(0));if ((rand() % 9)>2) //在此空白区域随机赋值2或4num[a][b] = 2;elsenum[a][b] = 4;}void close(){exit(0);}void add(int *p){int i=0, b;while (i<3){if (*(p + i) != 0){for (b = i + 1; b < 4; b++){if (*(p + b) != 0)if (*(p + i) == *(p + b)){score = score + (*(p + i)) + (*(p + b));*(p + i) = *(p + i) + *(p + b);if (*(p + i) == 2048)gamew = 1;*(p + b) = 0;i = b + i;++ifappear;break;}else{i = b;break;}}if (b == 4)i++;}elsei++;}}void Gameplay(){int i, j, g, e, a, b[4];appear();appear();while (1){if (ifappear!=0)appear();prin();key = getch();switch (key){case 'w':case 'W':case 72:ifappear = 0;for (j = 0; j < 4; j++){for (i = 0; i < 4; i++){b[i] = num[i][j];num[i][j] = 0;}add(b);e = 0;for (g = 0; g < 4; g++){if (b[g] != 0){num[e][j] = b[g];if (g != e)++ifappear;e++;}}}if (ifappear!=0)++move;break;case 's':case 'S':case 80:ifappear = 0;for (j = 0; j < 4; j++){for (i = 0; i < 4; i++){b[i] = num[i][j];num[i][j] = 0;}add(b);e = 3;for (g = 3; g>=0; g--){if (b[g] != 0){num[e][j] = b[g];if (g != e)++ifappear;e--;}}}if (ifappear != 0)++move;break;case 'a':case 'A':case 75:ifappear = 0;for (j = 0; j < 4; j++){for (i = 0; i < 4; i++){b[i] = num[j][i];num[j][i] = 0;}add(b);e = 0;for (g = 0; g < 4; g++){if (b[g] != 0){num[j][e] = b[g];if (g!=e)++ifappear;e++;}}}if (ifappear != 0)++move;break;case 'd':case 'D':case 77:ifappear = 0;for (j = 0; j < 4; j++){for (i = 0; i < 4; i++){b[i] = num[j][i];num[j][i] = 0;}add(b);e = 3;for (g = 3; g >=0; g--){if (b[g] != 0){num[j][e] = b[g];if (g!=e)++ifappear;e--;}}}if (ifappear != 0)++move;break;case 27:system("cls");main();break;}for (j = 0; j < 4; j++){for (i = 0; i < 4; i++){if (j < 3){if (i < 3){if (num[j][i] == num[j + 1][i] || num[j][i] == num[j][i + 1] || num[j][i] == 0){gamef = 0;break;}elsegamef = 1;}else{if (num[j][i] == num[j + 1][i] || num[j][i] == 0){gamef = 0;break;}elsegamef = 1;}}else{if (i < 3){if (num[j][i] == num[j][i + 1] || num[j][i] == 0 || num[j][i + 1] == 0){gamef = 0;break;}elsegamef = 1;}}}if (gamef == 0)break;}if (gamef == 1 || gamew == 1)break;}if (gamef == 1)gamefaile();elsegamewin();}void menu(){int n;printf("\t\t*****************************************\t\t\n"); //输出游戏菜单的图形printf("\t\t* 1、开始游戏*\n");printf("\t\t* 2、游戏规则*\n");printf("\t\t* 3、退出游戏*\n");printf("\t\t*****************************************\n");printf("请输入1或2或3:[ ]\b\b");scanf("%d", &n);switch (n){case 1:Gameplay(); //游戏开始函数break;case 2:explation(); //游戏规则函数break;case 3:close(); //关闭游戏函数break;}}int main(){int j, i;for (j = 0; j < 4; j++) //对4*4进行初始赋值为0for (i = 0; i < 4; i++)num[j][i] = 0;gamew = 0; //游戏获胜的判断变量初始化gamef = 0; //游戏失败的判断变量初始化ifappear = 0; //判断是否应该随机出现2或4的变量初始化score = 0; //游戏得分变量初始化gameover = 0; //游戏是否结束的变量初始化move = 0; //游戏的移动步数初始化menu(); //调用主菜单函数return 0;}。

相关文档
最新文档