如果程序里面有错误,希望大家能够批评指正!

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#define WIN 256 // 可以修改决定游戏输赢的值 // 矩阵数组
int num[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int t[5]={0,0,0,0,0}; // 辅助数组
int move=0; // 记录移动步数
int score=0; // 记录得分情况
int max=0; // max表示游戏输赢,max=WIN时赢
int change=1;
// 产生一个随机位置和随机数
void Srand()
{
int i,j;
do// 产生一个随机位置,如果产生的位置有数据,就继续随机生成一个新位置
{
i=((unsigned)rand())%4;
j=((unsigned)rand())%4;
}while(num[i][j]!=0);
if(((unsigned)rand())%4==0)
{ // 产生一个随机数,如果该数对4取余=0,则填充为4
num[i][j]=4;
}
else
{
num[i][j]=2;
}
move++;
}
void Print()
{
system("CLS");
printf("*~~~~~~~~2048~~~~~~~*\n");
printf("*author: 亚威 *\n");
printf("*得分: %d 步数: %d \n",score,move);
printf("*~~~~~~~~~~~~~~~~~~~*\n");
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
if(num[i][j]==0)
printf("* ");
else
printf("*%4d",num[i][j]);
}
printf("*\n*~~~~~~~~~~~~~~~~~~~*\n");
}
} // 消除t数组中前面和中间出现的0
void fun()
{
int i,j;
for(i=0;i<=3;i++)
{
if(t[i]==0)
{
for(j=i+1;j<=3;j++)
{
if(t[j]!=0)
{
change=1;
break;
}
}
t[i]=t[j];
t[j]=0;
}
if(j>=3)
break;
}
} // 合并操作
void hebing()
{
for(int i=0;i<=2;i++)
{
if((t[i]!=0)&&(t[i]==t[i+1]))
{
t[i]*=2;
score+=t[i];
change=1;
t[i+1]=0;
}
if(max<t[i])
max=t[i];
}
} // 合并相邻且相等的两个数
void add()
{
fun(); // 消除前面的和中间的0
hebing(); // 合并相邻且相等的两个数
fun(); // 再次消0
}
int main()
{
int i,j;
int gameover=1;
// 产生一个随机位置
srand((unsigned)time(NULL));
max=0;
while(gameover&&(max<WIN))
{ if(change)
{
Srand(); // 产生一个随机位置和随机数
} change=0;
Print(); // 显示界面
char in=getch(); // 读取操作命令
switch(in)
{
case 'w':
case 'W':
for(i=0;i<=3;i++)
{ // 依次处理第1至第4列
for(j=0;j<=3;j++)
{ // 把第i列的数据依次赋给辅助数组t
t[j]=num[j][i];
}
add(); // 核心:合并相邻且相等的两个数
for(j=0;j<=3;j++)
{ // 把处理后的数据依次放到矩阵对应位置
num[j][i]=t[j];
}
} break;
case 's':
case 'S':
for(i=0;i<=3;i++)
{ // 依次处理第1至第4列
for(j=0;j<=3;j++)
{ // 把第i列的数据依次赋给辅助数组t
t[3-j]=num[j][i];
}
add(); // 核心:合并相邻且相等的两个数
for(j=0;j<=3;j++)
{ // 把处理后的数据依次放到矩阵对应位置
num[j][i]=t[3-j];
}
}
break;
case 'a':
case 'A':
for(i=0;i<=3;i++)
{ // 依次处理第1至第4列
for(j=0;j<=3;j++)
{ // 把第i列的数据依次赋给辅助数组t
t[j]=num[i][j];
}
add(); // 核心:合并相邻且相等的两个数
for(j=0;j<=3;j++)
{ // 把处理后的数据依次放到矩阵对应位置
num[i][j]=t[j];
}
}
break;
case 'd':
case 'D':
for(i=0;i<=3;i++)
{ // 依次处理第1至第4列
for(j=0;j<=3;j++)
{ // 把第i列的数据依次赋给辅助数组t
t[3-j]=num[i][j];
}
add(); // 核心:合并相邻且相等的两个数
for(j=0;j<=3;j++)
{ // 把处理后的数据依次放到矩阵对应位置
num[i][j]=t[3-j];
}
}
break;
}
gameover=0;
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
{
if(num[i][j]==0)
gameover=1;
}
}
if((gameover==0)&&(change==0))
break;
}
Print();
if(max>=WIN)
{
printf("You Win!\n");
printf("你很牛啊!!!\n");
}
else
{
printf("Gameover\n");
printf("努力啊!!!\n");
}
system("pause");
return 0;
}

2048游戏C语言代码的更多相关文章

  1. 2048游戏 - C语言不引入图形库简单实现

    声明:本程序绝大部分属于原创,交互部分参考了博客园 Judge Young的原创文章 游戏2048源代码 - C语言控制台界面版, 作者Judge Young的算法思想非常值得参考,感谢作者的分享 附 ...

  2. [python] python实现2048游戏,及代码解析。

    我初学python,有不对之处望大家指教.转载请征得同意. 我在网络上也找了一些2048游戏代码的讲解,但都不是特别详细.所以我希望能够尽量详细的讲解.同时,有的地方我也不懂,希望大家能帮助补充.我会 ...

  3. R语言写2048游戏

    2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束. 编程时并未查看原作者代码,不喜勿喷. 程序结构如 ...

  4. C++学习(三十九)(C语言部分)之 游戏项目(2048游戏)

    /***************************项目 2048**********************c语言编写 图形库制作时间:2019.04.03 准备工具: vs2013 图形库 i ...

  5. 最少javascript代码完成一个2048游戏

    原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...

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

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

  7. powershell字符界面的,powershell加WPF界面的,2048游戏

    ------[序言]------ 1 2048游戏,有段时间很火,我在地铁上看有人玩过.没错,坐地铁很无聊,人家玩我就一直盯着看. 2 我在电脑上找了一个,试玩了以下,没几次格子就满了.我就气呼呼的放 ...

  8. iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码

    iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...

  9. Android项目开发实战-2048游戏

    <2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于&l ...

随机推荐

  1. xampp 端口冲突

    最近使用xampp ,提示端口有问题,使用xampp自带的 xampp control修改的端口之后还是不行. 如果是apache端口有问题就修改 xampp\apache\conf\ httpd.c ...

  2. ef join 用法

    var customers = DB.Customer.Join(DB.Commission, cst => cst.CommissionId,                          ...

  3. Create and Install Timer Job in MOSS 2007

    Excute Timerjob public class TriggerLoadCacheTimerJob : SPJobDefinition { string ExceptionFlag = str ...

  4. React Native 获取网络数据

    getMoviesFromApiAsync() { return fetch('http://facebook.github.io/react-native/movies.json') .then(( ...

  5. idea安装

  6. java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  7. Android-内存泄漏

    单例造成的内存泄漏   单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏,由于单例的静态特性使得单例的生命周期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象 ...

  8. Shell父进程获取子进程的变量值

    #!/bin/kshshit=""export shitshit=$(su - grid -c 'echo $ORACLE_BASE')pvar=$(subvar="he ...

  9. 关于arcengine中geoprocessor使用的困惑

    最近在实验一个小功能,就是用arcengine10.1做一个小程序,将point类型的shp转换为polyline类型的shp文件,用到的工具是pointstoline,但就是在设置input_fea ...

  10. Android6.0中的权限

    Android6.0相比之前的Android版本有一个很大的不同点,就是动态的获取权限.之前我们需要什么权限只需要在Manifest文件中声明即可,在6.0中,又新增了运行时权限的动态检测. Andr ...