C语言 2048源码(每步细致讲解更新ing) 您所在的位置:网站首页 电脑小游戏程序代码 C语言 2048源码(每步细致讲解更新ing)

C语言 2048源码(每步细致讲解更新ing)

2024-07-16 19:15| 来源: 网络整理| 查看: 265

前言

提示:这里可以添加本文要记录的大概内容:

昨天晚上突然想用c写个2048,觉得学了这么久,没写点什么东西有点心空空,就乘着备考时间来写写看,以前就想过,也就想想,一直没去写,今天没什么课,而且还是网课,然后就先看看别人写的代码之后,自己理解之后又重新敲了一遍,写了一天也算是写了个简易的2048。

2048的代码也不难,主要就是使用数组对数组的操作,再对数组移动改变的时候的逻辑清楚就没问题了。

写的很仓促,代码不怎么好看,以后有时间会慢慢优化并增加一些功能。

提示:以下是本篇文章正文内容,下面案例可供参考

一、编译器

我用的是sublime text写的代码,使用DEVC++里也可以直接打开编译,但是中文字符会乱码,后面我想弄点背景音乐,搜了之后用vs更简便一点,使用vs代码也可以直接拿过去只需修改一点代码和添加一点代码就可以了。

二、编写代码 1.头文件,全局变量

代码如下

#include #include//提供随机函数,清屏 #include//为随机函数提供参数 #include//提供getch()函数 int map[4][4]={0};//游戏地图 int score=0;//分数 int movenum=-1;//移动次数 char input;//控制方向 int gameover=1;//判断游戏是否结束,0结束 int change=1;//判断数组是否改变,0不变 先创建地图大小并初始化,还有一些全局变量,这些变量是在写代码的时候来进行补充。 2.主界面

代码如下(示例):

void menu(){ system("CLS");//每显示一次清屏之前的重新打印 int i=0,j=0; printf(" 欢迎来到2048\n"); printf(" ----------------------------------------\n"); printf(" W——UP S——DOWN A——LEFT D——RIGHT\n"); printf(" Please enter 0 if you do not want paly.\n"); printf(" MOVE:%d SCORE:%d\n",movenum,score); printf(" Made by XiaoQi\n"); printf(" \n |-------------------------------------------|\n"); for ( i = 0; i printf(" "); if (map[i][j]==0) printf("| "); else printf("|%5d",map[i][j]); } printf(" |\n |-------------------------------------------|\n"); } }

该函数是对主界面的编辑,

在数组里随机生成一个地址并赋值2或4 int randIntNum(){//再数组里随机生成一个地址并赋值 int i,j,n; if (change>=1) { do{ i=((unsigned)rand())%4; j=((unsigned)rand())%4; }while(map[i][j]!=0); n=((unsigned)rand())%2; if (n==0) map[i][j]=n+2; else map[i][j]=n+3; movenum++; } } 该函数使用rand()函数之前必须要使用srand()函数,否则产生的数并不随机了,我放在了游戏开始之前,在对数组随机产生一个地址并赋值的前提是该数组进行了移动,这里用change来判断,rand()随机产生的数必须是地图范围内,产生随机的数求余4,只会是0,1,2,3,随机产生2和4的话,就求余2,产生0和1,然后分别加2和3。对地图赋值之后说明肯定对数组移动了,所以这里的步数加一。 向上移动 int up(){//向上 int now,next; int i,j,k; for (j = 0; j now=map[i][j]; if (now!=0) { k=i+1; while(k if (now==next) { change=1; score+=map[k][j]; map[i][j]=2*map[k][j]; map[k][j]=0; } k=4; } k++; } } } } for (j = 0; j now=map[i][j]; if (now==0) { k=1+i; while(k change=1; map[i][j]=next; map[k][j]=0; k=4; } k++; } } } } return change; }

对于移动控制数组的里变化分两步,第一步是先进行对相同的数进行合并,第二部是把非零的数移到零的位置,我觉得2048最主要的代码就是对数组移动变化的操作了,可以先明白这里的逻辑后,写后面的移动操作就很简单了,都是差不多的。

在第一步两个数合并之后,就对得分进行赋值,合并之后代表对数组移动了,所以change变量赋值为1

向右 int right(){//向右 int i,j; int now,next,k; for ( i = 0; i now=map[i][j]; k=j-1; while(k>=0){ next=map[i][k]; if (next!=0) { if (next==now) { change=1; map[i][j]=map[i][k]*2; map[i][k]=0; } k=-1; } k--; } } } for ( i = 0; i now=map[i][j]; if (now==0) { k=j-1; while(k>=0){ next=map[i][k]; if (next!=0) { change=1; map[i][j]=map[i][k]; map[i][k]=0; k=-1; } k--; } } } } return change; } 这里和向上的代码差不多,但是对其中数组的行列不一样,这里值得注意 向左 int left(){//向左 int i,j; int now,next,k; for (i = 0; i now=map[i][j]; k=j+1; while(k if (now==next) { change=1; score+=map[i][k]; map[i][j]=map[i][k]*2; map[i][k]=0; } k=4; } k++; } } } for ( i = 0; i now=map[i][j]; if (now==0) { k=j+1; while(k change=1; map[i][j]=map[i][k]; map[i][k]=0; k=4; } k++; } } } } return change; } 向下 int down(){//向下 int i,j; int now,next,k; for ( j = 0; j now=map[i][j]; if (now!=0) { k=i-1; while(k>=0){ next=map[k][j]; if (next!=0) { if (now==next) { change=1; map[i][j]=map[k][j]*2; map[k][j]=0; } k=-1; } k--; } } } } for ( j = 0; j now=map[i][j]; if (now==0) { k=i-1; while(k>=0){ next=map[k][j]; if (next!=0) { change=1; map[i][j]=map[k][j]; map[k][j]=0; k=-1; } k--; } } } } return change; } 移动 void move(){//控制移动 int i,j; input=getch();//键盘读取控制 change=0; switch(input){ case '0': printf("Do you want exit?(y/n):"); input=getchar(); if (input=='y'||input=='Y') exit(0); break; case 'w': case 'W': up(); break; case 'a': case 'A': left(); break; case 's': case 'S': down(); break; case 'd': case 'D': right(); break; } } 该函数从键盘读取控制,说明即将对数组进行移动,所以这里先将change赋值0除了上下左右的功能,还有按键0的退出,如果想要其他的功能也可以在这添加 判断游戏是否结束 int over(){//判断游戏是否结束 int i,j; gameover=0; for ( i = 0; i if(map[i][j]==0) gameover=1; if(i>1){ if (map[i][j]==map[i-1][j]) gameover=1; } if (j>1){ if (map[i][j]==map[i][j-1]) gameover=1; } } } return 0; } 判断之前先将gameover变量赋值0,先判断地图里是否还有空位也就是数组里是否有0的值,若有则gameover改为1,然后进行是否有相同的两个数字挨在一起,若有则gameover改为1, 开始函数 void start(){//游戏开始 srand((unsigned)time(NULL)); while(gameover==1){ randIntNum(); menu(); move(); over(); } } 这里就是调用之前的函数来开始游戏在开始游戏之前,前面说到过要先使用srand函数,不然随机产生的数一点也不随机,while循环代表游戏开始,并调用之前实现的函数,调用函数并不是随便调用,按照游戏进行的顺序来调用,若调用的a函数里面有调用b函数,那么定义b函数的代码就必须放到定义a函数之前定义, 主函数 int main(){ start(); printf(" GAME OVER\n"); printf(" YOUR SCORE IS %d\n",score ); printf(" YOUR MOVE %d TIMES\n",movenum); return 0; } 到这里整个代码就结束了 vs里修改添加部分 #include #pragma comment(lib,"winmm.lib") 在vs里添加了背景音乐,头文件就要添加以上代码 PlaySound(TEXT("F:\\code\\编程\\game\\2048\\vs\\resoure\\111.wav"), 0, SND_FILENAME | SND_ASYNC | SND_LOOP); 在游戏开始之前,写上这行代码,注意的是使用的音乐必须是wav文件格式 input = _getch(); 需要修改的代码是move里面读取键盘控制前面加一个下划线就好了 运行截图

在这里插入图片描述

总结

emmmmm 以上就算总结了把。。。。。睡觉了,



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有