C语言如何实现2048小游戏

这篇文章将为大家详细讲解有关C语言如何实现2048小游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下

C语言如何实现2048小游戏

滑块有颜色、有最高分(用到文件)

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>/*使用getch()函数*/
#include<time.h>
#include<windows.h>/*使用Sleep()函数*/

voidMenu();//菜单
voidRule_of_game();//游戏规则
voidBegin(intmax);//开始
voidTable();//打印4×4方格
intRandom_number1();//产生2或4的随机数
intRandom_number2();//产生0、1、2、3的随机数
intGet(int*p_cnt,intscore);//输入指令
voidMove();//保留上一次的棋盘布局
intIf_move();//判断是否移动
intOver();//判断是否结束
voidEstablish_game();//创建用于保存最高分的文件
voidWrite_max(intscore);//向2048游戏-最高记录写入最高分
intRead_max();//读出最高分记录的文件
voidEstablish_file();//创建存档文件
voidWrite_file(int*p_cnt,intscort);//存档
intRead_file(int*p_cnt);//读档
voidagain();//是否继续游戏
intcolor(intc);//更改颜色
voidbox_color(intx);//不同数值对应不同颜色

inta[4][4]={0};//定义全局的二维数组
intA[4][4];//保留上一步的棋局
char*name_max="2048游戏-最高记录";
char*name_file="[空白]-2048游戏";

intmain(){
system("modeconcols=90lines=30");
system("title2048超级大大型游戏");//程序标题
system("colorF0");//F表示背景颜色,0表示前景颜色
Menu();
system("pause");//暂停,输入任意键继续
system("cls");//清屏
again();//是否继续游戏
return0;
}

voidMenu()//菜单
{
printf("\t\t╔══════════════════════════════════════════════╗\n");
printf("\t\t║欢迎使用由[空白]制作的2048超级大大型游戏║\n");
printf("\t\t╟──────────────────────────────────────────────╢\n");
printf("\t\t║请输入选项:║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│1│游戏规则║\n");
printf("\t\t║└───┘║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│2│开始游戏║\n");
printf("\t\t║└───┘║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│3│继续游戏║\n");
printf("\t\t║└───┘║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│4│退出游戏║\n");
printf("\t\t║└───┘║\n");
printf("\t\t╚══════════════════════════════════════════════╝\n");
intx=1,max=0;
while(x){
switch(getch()){
case'1':
x=0;
Rule_of_game();//游戏规则
Menu();
break;
case'2':
x=0;
system("cls");//清屏
Establish_game(name_file);//创建新的读档文件
Establish_game(name_max);//创建新的保存最高记录的文件
Begin(max);//开始游戏
break;
case'3':
x=0;
system("cls");//清屏
max=Read_max();//读取之前的最高记录
Begin(max);//开始游戏
break;
case'4':
exit(0);
default:
printf("输入了非法选项,请重新选择!\n");
}
}
}

voidRule_of_game()
{
system("cls");//清屏
printf("╔══════════════════════════════════════════════════════════════════════════════════╗\n");
printf("║本游戏通过按键W、S、A、D(不区分大小写)四个键分别控制滑块上移、下移、左移和右移。║\n");
printf("║滑块移动的过程中,如有相邻且相等数字的滑块将会相加,并获得相应的分数。║\n");
printf("║当棋盘上的所有位置均有数字,且不能合成,则游戏结束。本游戏未设置游戏成功。║\n");
printf("║游戏过程中输入I即为存档并退出游戏,输入O即为读档,输入P则退出游戏。║\n");
printf("║“开始游戏”则清除最高记录及存档、“继续游戏”则保存之前的最高记录,且可以读档。║\n");
printf("╚══════════════════════════════════════════════════════════════════════════════════╝\n");
system("pause");//暂停
system("cls");//清屏
}

voidBegin(intmax)
{
intscore=0;
intsign=1;
inth,l,cnt=0;
int*p_cnt=&cnt;
while(1){
printf("\t\t╔══════════════════════════════════════════════╗\n");
printf("\t\t║欢迎使用由[空白]制作的2048超级大大型游戏║\n");
printf("\t\t╟──────────────────────────────────────────────╢\n");
printf("\t\t║移动:┌───┐存档:读档:退出:║\n");
printf("\t\t║│W│║\n");
printf("\t\t║┌───┼───┼───┐┌───┐┌───┐┌───┐║\n");
printf("\t\t║│A│S│D││I││O││P│║\n");
printf("\t\t║└───┴───┴───┘└───┘└───┘└───┘║\n");
printf("\t\t╚══════════════════════════════════════════════╝\n");
while(1){
if(sign==1){
h=Random_number2();
l=Random_number2();
if(a[h][l]==0){
a[h][l]=Random_number1();
cnt++;
break;
}
}
else{
break;
}

}
Table();//打印棋盘
printf("\t\t移动的步数:%d\t当前得分:%d\n\t\t最高记录:%d\n",cnt-1,score,max);
Move();//保留棋盘
score+=Get(p_cnt,score);//得分
sign=If_move();//判断棋盘是否有变动
if(Over()==0){
if(max<score){//打破记录
Establish_game(name_max);//清除之前的记录
Write_max(score);//保存此次记录
printf("\t\t恭喜您已打破记录!\n");
}
break;
}
system("cls");//清屏
}
}

voidTable()
{
inth,l;
for(h=0;h<4;h++){
if(h==0){
printf("\t\t\t┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");
}
else{
printf("\t\t\t┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫\n");
}
printf("\t\t\t┃┃┃┃┃\n");
for(l=0;l<4;l++){
if(a[h][l]==0){//如果二维数组与棋盘对应的位置为零,则不放入数据
if(l==0){
printf("\t\t\t┃");
}
else{
printf("┃");
}
}
else{//否则放入与二维数组对应的数据
if(l==0){
printf("\t\t\t┃");
box_color(a[h][l]);//判断滑块的数值,给对应颜色
printf("%5d",a[h][l]);
color(0);//恢复白色背景
}
else{
printf("┃");
box_color(a[h][l]);//判断滑块的数值,给对应颜色
printf("%5d",a[h][l]);
color(0);//恢复白色背景
}
}
}
printf("┃\n");
printf("\t\t\t┃┃┃┃┃\n");
}
printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n");
}

intRandom_number1()/*随机生成2or4*/
{
ints;
srand(time(NULL));
s=((unsigned)rand()%2);
s=s==0?2:4;
returns;
}

intRandom_number2()/*随机生成二维数组的下标*/
{
intx;
x=((unsigned)rand()%4);
returnx;
}

intGet(int*p_cnt,intscore)
{
inth,l,t,sum=0;
charch;
ch=getch();//输入字符
switch(ch){
/*滑块向上移动*/
case'w':
case'W':
/*向上聚集数字*/
for(l=0;l<4;l++){
for(t=0;t<4;t++){
for(h=3;h>0;h--){
if(a[h-1][l]==0){
a[h-1][l]=a[h][l];
a[h][l]=0;
}
}
}
}
/*竖直方向上,相邻且相同的数字相加*/
for(l=0;l<4;l++){
for(h=0;h<3;h++){
if(a[h][l]==a[h+1][l]){
a[h][l]+=a[h+1][l];
a[h+1][l]=0;
sum+=a[h][l];
}
}
}
/*向上聚集数字*/
for(l=0;l<4;l++){
for(t=0;t<4;t++){
for(h=3;h>0;h--){
if(a[h-1][l]==0){
a[h-1][l]=a[h][l];
a[h][l]=0;
}
}
}
}
break;
case's':
case'S':
for(l=0;l<4;l++){
for(t=0;t<4;t++){
for(h=0;h<3;h++){
if(a[h+1][l]==0){
a[h+1][l]=a[h][l];
a[h][l]=0;
}
}
}
}
for(l=0;l<4;l++){
for(h=3;h>0;h--){
if(a[h][l]==a[h-1][l]){
a[h][l]+=a[h-1][l];
a[h-1][l]=0;
sum+=a[h][l];
}
}
}
for(l=0;l<4;l++){
for(t=0;t<4;t++){
for(h=0;h<3;h++){
if(a[h+1][l]==0){
a[h+1][l]=a[h][l];
a[h][l]=0;
}
}
}
}
break;
case'a':
case'A':
for(h=0;h<4;h++){
for(t=0;t<4;t++){
for(l=3;l>0;l--){
if(a[h][l-1]==0){
a[h][l-1]=a[h][l];
a[h][l]=0;
}
}
}
}
for(h=0;h<4;h++){
for(l=0;l<3;l++){
if(a[h][l]==a[h][l+1]){
a[h][l]+=a[h][l+1];
a[h][l+1]=0;
sum+=a[h][l];
}
}
}
for(h=0;h<4;h++){
for(t=0;t<4;t++){
for(l=3;l>0;l--){
if(a[h][l-1]==0){
a[h][l-1]=a[h][l];
a[h][l]=0;
}
}
}
}
break;
case'd':
case'D':
for(h=0;h<4;h++){
for(t=0;t<4;t++){
for(l=0;l<3;l++){
if(a[h][l+1]==0){
a[h][l+1]=a[h][l];
a[h][l]=0;
}
}
}
}
for(h=0;h<4;h++){
for(l=3;l>0;l--){
if(a[h][l]==a[h][l-1]){
a[h][l]+=a[h][l-1];
a[h][l-1]=0;
sum+=a[h][l];
}
}
}
for(h=0;h<4;h++){
for(t=0;t<4;t++){
for(l=0;l<3;l++){
if(a[h][l+1]==0){
a[h][l+1]=a[h][l];
a[h][l]=0;
}
}
}
}
break;
case'i':
case'I'://存档当前游戏格局
Establish_file();//创建用于存档的文件
Write_file(p_cnt,score);//调用存档函数
break;
case'o':
case'O':
sum=Read_file(p_cnt);//读档
break;
case'p':
case'P':
exit(0);//退出程序
default:
break;
}

returnsum;
}

voidMove()
{
inth,l;
for(h=0;h<4;h++){
for(l=0;l<4;l++){
A[h][l]=a[h][l];
}
}
}

intIf_move()
{
inth,l,sign=0;
for(h=0;h<4;h++){
for(l=0;l<4;l++){
if(a[h][l]!=A[h][l]){//未进入条件框,说明滑块没有发生移动
sign=1;
gotoout;
}
}
}
out:
returnsign;
}

intOver()
{
intover=0;
inth,l;
for(h=0;h<4;h++){
for(l=0;l<4;l++){
if(a[h][l]==0){//有空格
over=1;//游戏继续
return1;
}
}
}
if(over==0){//没有空格
for(h=0;h<3;h++){
for(l=0;l<3;l++){
if(a[h][l]==a[h][l+1]){
over=1;//游戏继续
break;
}
elseif(a[h][l]==a[h+1][l]){
over=1;//游戏继续
break;
}
}
if(over==1){
break;
}
}
}
returnover;//游戏结束
}

voidEstablish_game()//创建文件
{
inth;
if(h=fopen(name_max,"wb")==NULL){//函数fopen()返回NULL则创建文件失败
printf("\t\t创建文件失败!程序即将自动退出...\n");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);//退出程序
}
}

voidWrite_max(intscore)//写入文件
{
/*FILE*fp是指向文件的指针*/
FILE*fp=fopen(name_max,"at+");//at+读写打开或着建立一个文本文件;允许读写。
if(fp==NULL)//函数fopen()返回NULL则创建文件失败
{
printf("\t\t保存最高分失败!程序即将自动退出...");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);//退出程序
}
else{
fprintf(fp,"%d",score);//将score的值写入*pf指向的文件内
}
fclose(fp);//关闭*pf指向的文件
}

intRead_max()//读出文件
{
intmax_score=0;
FILE*fp=fopen(name_max,"at+");//at+读写打开或着建立一个文本文件;允许读写。
if(fp==NULL)
{
printf("\t\t读取失败!程序即将自动退出...");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);//退出程序
}
else{
fscanf(fp,"%d",&max_score);//从*pf指向的文件内数值赋值给max_score
}
fclose(fp);//关闭*pf指向的文件

returnmax_score;//返回最高记录的值
}

voidEstablish_file()//创建文件
{
inth;
if(h=fopen(name_file,"wb")==NULL){//函数fopen()返回NULL则创建文件失败
printf("\t\t创建文件失败!程序即将自动退出...\n");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);//退出程序
}
}

voidWrite_file(int*p_cnt,intscore)
{
inth,l;
FILE*fp=fopen(name_file,"at+");//at+读写打开或着建立一个文本文件;允许读写。
if(fp==NULL)
{
printf("\t\t存档失败!程序即将自动退出...\n");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);
}
else{
for(h=0;h<4;h++){
for(l=0;l<4;l++){
fprintf(fp,"%d",a[h][l]);
}
}
}
fprintf(fp,"%d",score);
fprintf(fp,"%d",*p_cnt-1);
printf("\t\t存档成功!游戏即将自动退出...\n");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);
fclose(fp);//关闭文件
}

intRead_file(int*p_cnt)
{
inth,l,score=0;
FILE*fp=fopen(name_file,"at+");//at+读写打开或着建立一个文本文件;允许读写。
if(fp==NULL)
{
printf("\t\t读档失败!程序即将自动退出...\n");
Sleep(3000);//睡眠3000毫秒,即停留3秒钟
exit(0);
}
else{
for(h=0;h<4;h++){
for(l=0;l<4;l++){
fscanf(fp,"%d",&a[h][l]);
}
}
}
fscanf(fp,"%d",&score);
fscanf(fp,"%d",p_cnt);
fclose(fp);//关闭文件

returnscore;
}

voidagain()//是否继续游戏
{
printf("\t\t╔══════════════════════════════════════════════╗\n");
printf("\t\t║您已失败║\n");
printf("\t\t╟──────────────────────────────────────────────╢\n");
printf("\t\t║是否继续:║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│1│扶我起来,我还能再来一局!║\n");
printf("\t\t║└───┘║\n");
printf("\t\t║┌───┐║\n");
printf("\t\t║│2│不了不了,我要学习!║\n");
printf("\t\t║└───┘║\n");
printf("\t\t╚══════════════════════════════════════════════╝\n");
if(_getch()=='1'){
system("cls");//清屏
inth,l;
for(h=0;h<4;h++){
for(l=0;l<4;l++){
a[h][l]=0;
A[h][l]=0;
}
}
Menu();//回到菜单
}
else{
printf("\t\t游戏结束!\n");
}
}

intcolor(intc)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_INTENSITY|
BACKGROUND_BLUE|
BACKGROUND_RED|
BACKGROUND_GREEN|
c);
return0;
}

voidbox_color(intx)
{
switch(x){
case2:
color(8);
break;
case4:
color(0);
break;
case8:
color(2);
break;
case16:
color(6);
break;
case32:
color(10);
break;
case64:
color(3);
break;
case128:
color(9);
break;
case256:
color(11);
break;
case512:
color(5);
break;
case1024:
color(13);
break;
case2048:
color(12);
break;
default:
color(4);
break;
}
}

关于“C语言如何实现2048小游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-05-30 14:07:27
收藏
分享
海报
0 条评论
169
上一篇:2048小游戏怎么使用C语言实现 下一篇:C语言如何实现仓库物资管理系统
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码