详细思路注解
/*********************2048**************************/
#include<stdio.h>
#include<conio.h>
//实时输出
void print(int a[4][4]){
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++)
printf("%4d",a[i][j]);
printf("\n");
}
printf("\n");
}
//判断游戏是否结束:没有结束返回零,结束返回一
int end(int a[4][4]){
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<4;j++){//判断每一行
if(a[i][j]==0) return 0;//假如还有空位置就不会结束
if(j!=3)
if(a[i][j]==a[i][j+1]) return 0;//相邻有相同数字也不会结束
}
for(k=0;k<4;k++)//判断每一列
if(k!=3)
if(a[k][i]==a[k+1][i]) return 0;
}
return 1;
}
//移动:移动成功返回零,移动失败返回一
//这个算法可以有写起来比较简单的(但是循环嵌套比较多),但是个人认为我这个
//虽然判断次数多了一点但是时间复杂度会比较好。
int move(int a[4][4],char key){
int i,tag=0;
switch(key){
case 'a'://左
for(i=0;i<4;i++){
if(a[i][0]==0&&a[i][1]==0&&a[i][2]==0&&a[i][3]!=0){//0 0 0 1型
a[i][0]=a[i][3];
a[i][3]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]==0){//0 0 1 0型
a[i][0]=a[i][2];
a[i][2]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]==0){//0 1 0 0型
a[i][0]=a[i][1];
a[i][1]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]!=0){//0 0 1 1型
if(a[i][2]==a[i][3])
a[i][0]=a[i][2]*2;
else a[i][0]=a[i][2],a[i][1]=a[i][3];
a[i][2]=0,a[i][3]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]!=0){//0 1 0 1型
if(a[i][1]==a[i][3])
{a[i][0]=a[i][1]*2;a[i][1]=0,a[i][3]=0;}
else {a[i][0]=a[i][1];a[i][1]=a[i][3];a[i][3]=0;}
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]==0){//0 1 1 0型
if(a[i][1]==a[i][2])
{a[i][0]=a[i][1]*2;a[i][1]=0,a[i][2]=0;}
else {a[i][0]=a[i][1];a[i][1]=a[i][2];a[i][2]=0;}
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]==0){//1 1 0 0型
if(a[i][0]==a[i][1])
{a[i][0]=a[i][1]*2;a[i][1]=0;tag=1;}
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]==0&&a[i][3]!=0){//1 0 0 1型
if(a[i][0]==a[i][3])
a[i][0]=a[i][0]*2;
else a[i][1]=a[i][3];
a[i][3]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]==0){//1 0 1 0型
if(a[i][0]==a[i][2])
a[i][0]=a[i][0]*2;
else a[i][1]=a[i][2];
a[i][2]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]!=0){//0 1 1 1型
if(a[i][1]==a[i][2])
{a[i][0]=a[i][1]*2;a[i][1]=a[i][3];a[i][2]=0;}
else if(a[i][2]==a[i][3])
{a[i][0]=a[i][1];a[i][1]=a[i][2]*2;}
else {a[i][0]=a[i][1];a[i][1]=a[i][2];a[i][2]=a[i][3];}
a[i][3]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]!=0){//1 0 1 1型
if(a[i][0]==a[i][2])
{a[i][0]=a[i][0]*2;a[i][1]=a[i][3];a[i][2]=0;}
else if(a[i][2]==a[i][3])
a[i][1]=a[i][2]*2;
else {a[i][1]=a[i][2];a[i][2]=a[i][3];}
a[i][3]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]!=0){//1 1 0 1型
if(a[i][0]==a[i][1])
{a[i][0]=a[i][1]*2;a[i][1]=a[i][3];}
else if(a[i][1]==a[i][3])
a[i][1]=a[i][1]*2;
else a[i][2]=a[i][3];
a[i][3]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]==0){//1 1 1 0型
if(a[i][0]==a[i][1])
{a[i][0]=a[i][0]*2;a[i][1]=a[i][2];a[i][2]=0;tag=1;}
else if(a[i][1]==a[i][2])
{a[i][1]=a[i][1]*2;a[i][2]=0;tag=1;}
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]!=0){//1 1 1 1型
if(a[i][0]==a[i][1]){
a[i][0]=a[i][0]*2;
if(a[i][2]==a[i][3]){
a[i][1]=a[i][2]*2;
a[i][2]=0;
a[i][3]=0;
}
else{
a[i][1]=a[i][2];
a[i][2]=a[i][3];
a[i][3]=0;
}
tag=1;
}
else if(a[i][1]==a[i][2]){
a[i][1]=a[i][1]*2;
a[i][2]=a[i][3];
a[i][3]=0;
tag=1;
}
else if(a[i][2]==a[i][3]){
a[i][2]=a[i][2]*2;
a[i][3]=0;
tag=1;
}
}
}
break;
case 's'://下
for(i=0;i<4;i++){
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]==0&&a[3][i]==0){//1 0 0 0型
a[3][i]=a[0][i];
a[0][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]==0){//0 0 1 0型
a[3][i]=a[2][i];
a[2][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]==0){//0 1 0 0型
a[3][i]=a[1][i];
a[1][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]!=0){//0 0 1 1型
if(a[2][i]==a[3][i]){
a[3][i]=a[2][i]*2;
a[2][i]=0;
tag=1;
}
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]!=0){//0 1 0 1型
if(a[1][i]==a[3][i])
{a[3][i]=a[1][i]*2;a[1][i]=0;}
else {a[2][i]=a[1][i];a[1][i]=0;}
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]==0){//0 1 1 0型
if(a[1][i]==a[2][i])
{a[3][i]=a[1][i]*2;a[1][i]=0,a[2][i]=0;}
else {a[3][i]=a[2][i];a[2][i]=a[1][i];a[1][i]=0;}
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]==0){//1 1 0 0型
if(a[0][i]==a[1][i])
a[3][i]=a[1][i]*2;
else {a[3][i]=a[1][i];a[2][i]=a[0][i];}
a[0][i]=0;a[1][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]==0&&a[3][i]!=0){//1 0 0 1型
if(a[0][i]==a[3][i])
a[3][i]=a[0][i]*2;
else a[2][i]=a[0][i];
a[0][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]==0){//1 0 1 0型
if(a[0][i]==a[2][i])
{a[3][i]=a[0][i]*2;a[2][i]=0;}
else {a[3][i]=a[2][i];a[2][i]=a[0][i];}
a[0][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]!=0){//0 1 1 1型
if(a[3][i]==a[2][i])
{a[3][i]=a[3][i]*2;a[2][i]=a[1][i];a[1][i]=0;tag=1;}
else if(a[1][i]==a[2][i])
{a[2][i]=a[1][i]*2;a[1][i]=0;tag=1;}
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]!=0){//1 0 1 1型
if(a[3][i]==a[2][i])
{a[3][i]=a[3][i]*2;a[2][i]=a[0][i];}
else if(a[0][i]==a[2][i])
a[2][i]=a[2][i]*2;
else a[1][i]=a[0][i];
a[0][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]!=0){//1 1 0 1型
if(a[3][i]==a[1][i])
{a[3][i]=a[1][i]*2;a[2][i]=a[0][i];}
else if(a[1][i]==a[0][i])
a[2][i]=a[1][i]*2;
else {a[2][i]=a[1][i];a[1][i]=a[0][i];}
a[0][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]==0){//1 1 1 0型
if(a[2][i]==a[1][i])
{a[3][i]=a[1][i]*2;a[2][i]=a[0][i];a[1][i]=0;}
else if(a[1][i]==a[0][i])
{a[3][i]=a[2][i];a[2][i]=a[1][i]*2;a[1][i]=0;}
else {a[3][i]=a[2][i];a[2][i]=a[1][i];a[1][i]=a[0][i];}
a[0][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]!=0){//1 1 1 1型
if(a[3][i]==a[2][i]){
a[3][i]=a[2][i]*2;
if(a[0][i]==a[1][i]){
a[2][i]=a[0][i]*2;
a[0][i]=0;a[1][i]=0;
}
else{
a[2][i]=a[1][i];
a[1][i]=a[0][i];
a[0][i]=0;
}
tag=1;
}
else if(a[1][i]==a[2][i]){
a[2][i]=a[1][i]*2;
a[1][i]=a[0][i];
a[0][i]=0;
tag=1;
}
else if(a[0][i]==a[1][i]){
a[1][i]=a[1][i]*2;
a[0][i]=0;
tag=1;
}
}
}
break;
case 'd'://右
for(i=0;i<4;i++){
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]==0&&a[i][3]==0){//1 0 0 0型
a[i][3]=a[i][0];
a[i][0]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]==0){//0 0 1 0型
a[i][3]=a[i][2];
a[i][2]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]==0){//0 1 0 0型
a[i][3]=a[i][1];
a[i][1]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]!=0){//0 0 1 1型
if(a[i][2]==a[i][3]){
a[i][3]=a[i][2]*2;
a[i][2]=0;
tag=1;
}
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]!=0){//0 1 0 1型
if(a[i][1]==a[i][3])
{a[i][3]=a[i][1]*2;a[i][1]=0;}
else {a[i][2]=a[i][1];a[i][1]=0;}
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]==0){//0 1 1 0型
if(a[i][1]==a[i][2])
{a[i][3]=a[i][1]*2;a[i][1]=0,a[i][2]=0;}
else {a[i][3]=a[i][2];a[i][2]=a[i][1];a[i][1]=0;}
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]==0){//1 1 0 0型
if(a[i][0]==a[i][1])
a[i][3]=a[i][1]*2;
else {a[i][3]=a[i][1];a[i][2]=a[i][0];}
a[i][0]=0;a[i][1]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]==0&&a[i][3]!=0){//1 0 0 1型
if(a[i][0]==a[i][3])
a[i][3]=a[i][0]*2;
else a[i][2]=a[i][0];
a[i][0]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]==0){//1 0 1 0型
if(a[i][0]==a[i][2])
{a[i][3]=a[i][0]*2;a[i][2]=0;}
else {a[i][3]=a[i][2];a[i][2]=a[i][0];}
a[i][0]=0;
tag=1;
}
if(a[i][0]==0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]!=0){//0 1 1 1型
if(a[i][3]==a[i][2])
{a[i][3]=a[i][3]*2;a[i][2]=a[i][1];a[i][1]=0;tag=1;}
else if(a[i][1]==a[i][2])
{a[i][2]=a[i][1]*2;a[i][1]=0;tag=1;}
}
if(a[i][0]!=0&&a[i][1]==0&&a[i][2]!=0&&a[i][3]!=0){//1 0 1 1型
if(a[i][3]==a[i][2])
{a[i][3]=a[i][3]*2;a[i][2]=a[i][0];}
else if(a[i][0]==a[i][2])
a[i][2]=a[i][2]*2;
else a[i][1]=a[i][0];
a[i][0]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]==0&&a[i][3]!=0){//1 1 0 1型
if(a[i][3]==a[i][1])
{a[i][3]=a[i][1]*2;a[i][2]=a[i][0];}
else if(a[i][1]==a[i][0])
a[i][2]=a[i][1]*2;
else {a[i][2]=a[i][1];a[i][1]=a[i][0];}
a[i][0]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]==0){//1 1 1 0型
if(a[i][2]==a[i][1])
{a[i][3]=a[i][1]*2;a[i][2]=a[i][0];a[i][1]=0;}
else if(a[i][1]==a[i][0])
{a[i][3]=a[i][2];a[i][2]=a[i][1]*2;a[i][1]=0;}
else {a[i][3]=a[i][2];a[i][2]=a[i][1];a[i][1]=a[i][0];}
a[i][0]=0;
tag=1;
}
if(a[i][0]!=0&&a[i][1]!=0&&a[i][2]!=0&&a[i][3]!=0){//1 1 1 1型
if(a[i][3]==a[i][2]){
a[i][3]=a[i][2]*2;
if(a[i][0]==a[i][1]){
a[i][2]=a[i][0]*2;
a[i][0]=0;a[i][1]=0;
}
else{
a[i][2]=a[i][1];
a[i][1]=a[i][0];
a[i][0]=0;
}
tag=1;
}
else if(a[i][1]==a[i][2]){
a[i][2]=a[i][1]*2;
a[i][1]=a[i][0];
a[i][0]=0;
tag=1;
}
else if(a[i][0]==a[i][1]){
a[i][1]=a[i][1]*2;
a[i][0]=0;
tag=1;
}
}
}
break;
case 'w'://上
for(i=0;i<4;i++){
if(a[0][i]==0&&a[1][i]==0&&a[2][i]==0&&a[3][i]!=0){//0 0 0 1型
a[0][i]=a[3][i];
a[3][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]==0){//0 0 1 0型
a[0][i]=a[2][i];
a[2][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]==0){//0 1 0 0型
a[0][i]=a[1][i];
a[1][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]!=0){//0 0 1 1型
if(a[2][i]==a[3][i])
a[0][i]=a[2][i]*2;
else a[0][i]=a[2][i],a[1][i]=a[3][i];
a[2][i]=0,a[3][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]!=0){//0 1 0 1型
if(a[1][i]==a[3][i])
{a[0][i]=a[1][i]*2;a[1][i]=0,a[3][i]=0;}
else {a[0][i]=a[1][i];a[1][i]=a[3][i];a[3][i]=0;}
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]==0){//0 1 1 0型
if(a[1][i]==a[2][i])
{a[0][i]=a[1][i]*2;a[1][i]=0,a[2][i]=0;}
else {a[0][i]=a[1][i];a[1][i]=a[2][i];a[2][i]=0;}
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]==0){//1 1 0 0型
if(a[0][i]==a[1][i])
{a[0][i]=a[1][i]*2;a[1][i]=0;tag=1;}
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]==0&&a[3][i]!=0){//1 0 0 1型
if(a[0][i]==a[3][i])
a[0][i]=a[0][i]*2;
else a[1][i]=a[3][i];
a[3][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]==0){//1 0 1 0型
if(a[0][i]==a[2][i])
a[0][i]=a[0][i]*2;
else a[1][i]=a[2][i];
a[2][i]=0;
tag=1;
}
if(a[0][i]==0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]!=0){//0 1 1 1型
if(a[1][i]==a[2][i])
{a[0][i]=a[1][i]*2;a[1][i]=a[3][i];a[2][i]=0;}
else if(a[2][i]==a[3][i])
{a[0][i]=a[1][i];a[1][i]=a[2][i]*2;}
else {a[0][i]=a[1][i];a[1][i]=a[2][i];a[2][i]=a[3][i];}
a[3][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]==0&&a[2][i]!=0&&a[3][i]!=0){//1 0 1 1型
if(a[0][i]==a[2][i])
{a[0][i]=a[0][i]*2;a[1][i]=a[3][i];a[2][i]=0;}
else if(a[2][i]==a[3][i])
a[1][i]=a[2][i]*2;
else {a[1][i]=a[2][i];a[2][i]=a[3][i];}
a[3][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]==0&&a[3][i]!=0){//1 1 0 1型
if(a[0][i]==a[1][i])
{a[0][i]=a[1][i]*2;a[1][i]=a[3][i];}
else if(a[1][i]==a[3][i])
a[1][i]=a[1][i]*2;
else a[2][i]=a[3][i];
a[3][i]=0;
tag=1;
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]==0){//1 1 1 0型
if(a[0][i]==a[1][i])
{a[0][i]=a[0][i]*2;a[1][i]=a[2][i];a[2][i]=0;tag=1;}
else if(a[1][i]==a[2][i])
{a[1][i]=a[1][i]*2;a[2][i]=0;tag=1;}
}
if(a[0][i]!=0&&a[1][i]!=0&&a[2][i]!=0&&a[3][i]!=0){//1 1 1 1型
if(a[0][i]==a[1][i]){
a[0][i]=a[0][i]*2;
if(a[2][i]==a[3][i]){
a[1][i]=a[2][i]*2;
a[2][i]=0;
a[3][i]=0;
}
else{
a[1][i]=a[2][i];
a[2][i]=a[3][i];
a[3][i]=0;
}
tag=1;
}
else if(a[1][i]==a[2][i]){
a[1][i]=a[1][i]*2;
a[2][i]=a[3][i];
a[3][i]=0;
tag=1;
}
else if(a[2][i]==a[3][i]){
a[2][i]=a[2][i]*2;
a[3][i]=0;
tag=1;
}
}
}
break;
default://非法操作
break;
}
if(tag==0) return 1;
return 0;
}
void getrand(int a[4][4]){
int i,j,x,y,tag=1;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==0){
tag=0;
break;
}
while(tag==0){
x=rand()%4;
y=rand()%4;
if(a[x][y]==0){
a[x][y]=2;
break;
}
}
}
void main(){
int cell[4][4];//界面数组
int x,y;
int i,j;
char key;//定义按键
//初始化
for(i=0;i<4;i++)
for(j=0;j<4;j++)
cell[i][j]=0;
x=rand()%4;
y=rand()%4;
cell[x][y]=2;
print(cell);
while(!end(cell)){
key=getch();
if(move(cell,key)==1){//移动失效
printf("Wrong direction or you press the wrong key!\nPlease move again: \n");
continue;
}
else getrand(cell);
print(cell);
}
printf("Game Over!!!\n");
}
Java版的2048下载地址:简单电脑版2048
---------------------------------------------------- 分割线 -----------------------------------------------------
以上内容编辑于 2015年04月30日 14:05:45 ,由于放在草稿箱太久,现在把重新出来发布