赞
踩
提示:这里可以添加本文要记录的大概内容:
昨天晚上突然想用c写个2048,觉得学了这么久,没写点什么东西有点心空空,就乘着备考时间来写写看,以前就想过,也就想想,一直没去写,今天没什么课,而且还是网课,然后就先看看别人写的代码之后,自己理解之后又重新敲了一遍,写了一天也算是写了个简易的2048。
2048的代码也不难,主要就是使用数组对数组的操作,再对数组移动改变的时候的逻辑清楚就没问题了。
写的很仓促,代码不怎么好看,以后有时间会慢慢优化并增加一些功能。
提示:以下是本篇文章正文内容,下面案例可供参考
我用的是sublime text写的代码,使用DEVC++里也可以直接打开编译,但是中文字符会乱码,后面我想弄点背景音乐,搜了之后用vs更简便一点,使用vs代码也可以直接拿过去只需修改一点代码和添加一点代码就可以了。
代码如下
#include<stdio.h>
#include<stdlib.h>//提供随机函数,清屏
#include<time.h>//为随机函数提供参数
#include<conio.h>//提供getch()函数
int map[4][4]={0};//游戏地图
int score=0;//分数
int movenum=-1;//移动次数
char input;//控制方向
int gameover=1;//判断游戏是否结束,0结束
int change=1;//判断数组是否改变,0不变
代码如下(示例):
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 <= 3; i++) { for ( j = 0; j<= 3; j++) { printf(" "); if (map[i][j]==0) printf("| "); else printf("|%5d",map[i][j]); } printf(" |\n |-------------------------------------------|\n"); } }
该函数是对主界面的编辑,
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++; } }
int up(){//向上 int now,next; int i,j,k; for (j = 0; j < 4; j++)//第一个for语句是把当前控制方向的数组里相同的数合并,其他方向的都是一样 { for ( i = 0; i < 4; i++) { now=map[i][j]; if (now!=0) { k=i+1; while(k<4){ next=map[k][j]; if (next!=0) { 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 < 4; j++)//第二个for语句是把当前控制方向的非零元素移动当前方向的前面 { for (i = 0; i <4 ; i++) { now=map[i][j]; if (now==0) { k=1+i; while(k<4){ next=map[k][j]; if (next!=0) { 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 < 4; i++) { for ( j = 3; j >= 0; j--) { 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 < 4; i++) { for ( j = 3; j >= 0; j--) { 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 < 4; i++) { for (j = 0; j < 4; j++) { now=map[i][j]; k=j+1; while(k<4){ next=map[i][k]; if (next!=0) { 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 < 4; i++) { for (j = 0; j < 4; j++) { now=map[i][j]; if (now==0) { k=j+1; while(k<4){ next=map[i][k]; if (next!=0) { 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 < 4; j++) { for ( i = 3; i >= 0; i--) { 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 < 4; j++) { for ( i = 3; i >= 0; i--) { 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; } }
int over(){//判断游戏是否结束 int i,j; gameover=0; for ( i = 0; i < 4; i++) { for ( j = 0; j < 4; j++) { 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; }
void start(){//游戏开始
srand((unsigned)time(NULL));
while(gameover==1){
randIntNum();
menu();
move();
over();
}
}
int main(){
start();
printf(" GAME OVER\n");
printf(" YOUR SCORE IS %d\n",score );
printf(" YOUR MOVE %d TIMES\n",movenum);
return 0;
}
#include<Windows.h>
#pragma comment(lib,"winmm.lib")
PlaySound(TEXT("F:\\code\\编程\\game\\2048\\vs\\resoure\\111.wav"), 0, SND_FILENAME | SND_ASYNC | SND_LOOP);
input = _getch();
emmmmm
以上就算总结了把。。。。。睡觉了,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。