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,其它:0
int 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;
}
*/

运行画面

720-C语言实现2048游戏相关推荐

  1. 2048游戏c语言linux简易代码,C语言实现2048游戏代码

    本文实例为大家分享了C语言实现2048游戏具体代码,供大家参考,具体内容如下 效果图: 使用文本界面的屏幕绘图库 ncurses. 设计思路: 在满足条件情况下消除方块 允许在游戏主界面(16 宫格) ...

  2. C语言实现2048游戏(Windows版)

    本文是Windows版的C语言实现2048小游戏,嵌入式版的请移步 C语言实现2048小游戏-粤嵌GE6818嵌入式系统实训 C语言实现电子音乐相册-粤嵌GE6818嵌入式系统实训 一.游戏介绍 所谓 ...

  3. 用C语言编写2048游戏

    2048_C_code 用C语言编写的2048 1 要实现我们的 2048 小游戏,需要涉及一些数据结构的知识,以及一些 Linux 的系统调用.此外,为了方便在屏幕上使用字符绘图,我们还需要使用一个 ...

  4. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  5. 花了一个深夜,才用C语言写了一个2048游戏雏形

    12年我毕业的第二个月工资,我就买了一个IPAD,然后在IPAD上下了一个2048游戏,玩起来非常爽. 然后这几天看到好几个公众号都发了自己写这个游戏的代码,然后我自己也想试试,所以就有了这篇文章,写 ...

  6. 2048游戏c语言实验报告,2048游戏语言实验报告.doc

    2048游戏语言实验报告 成绩评定 教师签名 评定日期 嘉应学院 计算机学院 实验报告 课程名称: C程序设计 开课学期: 2015-2016学年第1学期 班 级: 计算机1505 指导老师: 陈广明 ...

  7. C语言实现2048小游戏

    C语言实现2048小游戏-粤嵌GE6818嵌入式系统实训 部分功能演示视频. 实现的全部功能: 1.字模显示封面组员名字 2.完成2048游戏在板子上的运行 3.成功或者失败需要有标志也可以计分 4. ...

  8. C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训

    C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训 实现的全部功能: 功能演示: 版本介绍 简易版--大佬选这个 完整版--想保研.想得高分.想要装逼的同学选这个 至尊版--零基础的.想要装 ...

  9. c语言2048代码linux,C语言实现2048小游戏(示例代码)

    2048 一.设计思路 1.游戏规则 想要制作游戏,首先需要了解游戏的规则,下面就来介绍2048的游戏规则 2048游戏共有16个格子,初始时初始数字由2或者4构成. 手指向一个方向滑动,所有格子会向 ...

  10. 一个用 C 语言写的迷你版 2048 游戏,只有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,只有 487 个字符.来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak" ...

最新文章

  1. python装饰器原理wraps(method)(self)_python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变...
  2. Android Realm相关操作
  3. 在webpack中使用eslint配置(详细教程)-js教程-PHP中文网
  4. 零窗口探测怎么抓包_Linux服务器下的HTTP抓包分析
  5. 年底清理垃圾了,整理了一整套python学习资料无偿送给大家
  6. win10java配置环境变量msi_Windows10+eclipse+hadoop2.7.1环境配置+wordcount-折腾笔记
  7. 复制网站部分内容_这些网站帮你十分钟搞定年终报告/合同/公文/策划写作!
  8. AIoT助力文旅产业,2020年5A景区数字化发展指数报告
  9. vue 综合案例todos----重要
  10. 智云通CRM:销售高手如何维护自己的“地盘”?
  11. 计算机毕业设计ssm游泳馆管理平台
  12. 【学习笔记】stm32+openmv串口通信实现颜色识别
  13. 对bam文件作基础统计
  14. 对于K 均值聚类的尝试
  15. 读沈从文先生的《边城》
  16. 2020-11-30 09:51:55 精确到秒的时间戳
  17. Hack微信,不一样的安全视角
  18. 雷达信号处理基础 距离方程
  19. 智慧农业,数字农业经济效益,社会,经济,生态,运行
  20. matlab寻找一段曲线的极值点

热门文章

  1. 手机扫码枪app,二维码识别,二维码信息自动推送至电脑的(Excel,软件,记事本)等位置。
  2. 环境可靠性测试,气候环境类可靠性试验,可靠性测试标准
  3. 2008年上半年程序员考试上午真题自我汇总
  4. VMware ESXi 安装 IPMITOOL 工具
  5. Xshell7绿色版使用公钥对免密连接虚拟机(centos7.9-保姆级)
  6. FFmpeg —— 录制windows系统声音(附源码)
  7. 文档型数据库Mongodb
  8. 3Dmax转cad及批量出图
  9. CAD插件学习系列教程(一) 贱人工具箱的使用
  10. CUDA10安装,配合使用VS2017