游戏动过dos窗口不断刷新进行实现,画面比较丑陋。练手用的。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "conio.h"
int And (int a[][4],int point)
{
int i,j,k,move=0;
switch(point)
{
case 8:{
for(j=0;j<4;j++)
for(i=0;i<4;i++)
{
if(a[i][j]==0)
{
for(k=i+1;k<4;k++)
if(a[k][j]!=0)
{
move=1;
a[i][j]=a[k][j];
a[k][j]=0;
break;
}
if(k==4)
break;
}
for(k=i+1;k<4;k++)
{
if(a[k][j]!=a[i][j] &&a[k][j]!=0)
break;
if(a[k][j]==a[i][j])
{
move=1;
a[i][j]+=a[k][j];
a[k][j]=0;
break;
}
}
}
break;
}
case 4:{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(a[i][j]==0)
{
for(k=j+1;k<4;k++)
if(a[i][k]!=0)
{
move=1;
a[i][j]=a[i][k];
a[i][k]=0;
break;
}
if(k==4)
break;
}
for(k=j+1;k<4;k++)
{
if(a[i][k]!=a[i][j] &&a[i][k]!=0)
break;
if(a[i][k]==a[i][j])
{
move=1;
a[i][j]+=a[i][k];
a[i][k]=0;
break;
}
}
}
break;
}
case 5:{
for(j=0;j<4;j++)
for(i=3;i>=0;i--)
{
if(a[i][j]==0)
{
for(k=i-1;k>=0;k--)
if(a[k][j]!=0)
{
move=1;
a[i][j]=a[k][j];
a[k][j]=0;
break;
}
if(k==-1)
break;
}
for(k=i-1;k>=0;k--)
{
if(a[k][j]!=a[i][j] &&a[k][j]!=0)
break;
if(a[k][j]==a[i][j])
{
move=1;
a[i][j]+=a[k][j];
a[k][j]=0;
break;
}
}
}
break;
}
case 6:{
for(i=0;i<4;i++)
for(j=3;j>=0;j--)
{
if(a[i][j]==0)
{
for(k=j-1;k>=0;k--)
if(a[i][k]!=0)
{
move=1;
a[i][j]=a[i][k];
a[i][k]=0;
break;
}
if(k==4)
break;
}
for(k=j-1;k>=0;k--)
{
if(a[i][k]!=a[i][j] && a[i][k]!=0)
break;
if(a[i][k]==a[i][j])
{
move=1;
a[i][j]+=a[i][k];
a[i][k]=0;
break;
}
}
}
break;
}
default :{
printf("error! please again!!\n");
point=getch();
And(a,point-48);
}
}
return move;
}
void Fill_in(int a[][4])
{
int line,row,random;
do{
line=rand()%4; row=rand()%4;
}while(a[line][row]!=0);
random=rand()%2;
if(random==0)
a[line][row]=2;
else
a[line][row]=4;
}
void output(int a[][4],int sum)
{
int i,j;
printf("\n\t\t||||======================================||||\n");
printf("\n\t\t||||===========上下左右为8,5,4,6==========||||\n",sum);
printf("\n\t\t|============================================|\n");
printf("\n\t\t|============= The sum is %5d =========|\n",sum);
printf("\n\t\t|============================================|\n");
printf("\t\t\t|---------------------------|\n");
for(i=0;i<4;i++)
{
printf("\t\t\t|");
for(j=0;j<4;j++)
if(a[i][j]!=0)
printf("%4d |",a[i][j]);
else
printf(" |");
printf("\n\t\t\t|---------------------------|\n");
}
}
int executable(int a[][4])
{
int i,j,flag=0,sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
sum+=a[i][j];
if(a[i][j]==0)
flag=1;
}
return sum*10+flag;
}
void game(int a[][4])
{
int point;
while(executable(a)%10)
{
Fill_in(a);
output(a,executable(a)/10);
do{
point=getch();
printf("\t\t\tcan't move\n");
}while(!And(a,point-48) && executable(a)%10);
system("CLS");
}
printf("\t\t\tlose\n");
}
void clean(int a[][4])
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=0;
}
int main()
{
system("color 1e");
int a[4][4]={0};
int again=1;
srand(time(0));
while(again==1)
{
game(a);
printf("If you want to again,point \"1\",else point \"0\"\n");
scanf("%d",&again);
clean(a);
system("CLS");
}
return 0;
}