#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
int matrix[4][4]={
0};
int flat=0;
int sum=0;
void welcome();
int move();
void newcreat();
void print();
void init();
int main()
{
int count=0,i,j,t;
welcome();
srand(time(NULL));
newcreat();
print();
while(1){
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
if(matrix[i][j]!=0){
count++;
if(matrix[i][j]==2048){
printf("\t\t\t\t\t\t\t\t\t\t\t\t恭喜你,游戏胜利\n");
break;
}
}
t=move();
if(t==1){
init();
system("cls");
newcreat();
print();
continue;
}
if(t==2){
printf("\t\t\t\t\t\t\t\t\t\t\t谢谢你的来到,欢迎下次再来\n");
getch();
break;
}
if(count==16&&flat==0){
printf("\t\t\t\t\t\t\t\t\t\t\t\t很遗憾,游戏失败\n");
break;
}
if(t!=3)
newcreat();
system("cls");
print();
flat=0;
count=0;
}
return 0;
}
void welcome()
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\t\t\t\t\t\t");
printf("欢迎来到2048游戏\n");
printf("\t\t\t\t\t\t\t\t\t\t\t --按回车键进入下一步(不变)\n");
getch();
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\t\t\t\t\t\t\t");
printf("玩法说明\n");
printf("\t\t\t\t\t\t\t\t\t\t");
printf("通过按数字键移动数字,合并相同的数字来取得更大的数。\n");
printf("\t\t\t\t\t\t\t\t\t\t");
printf("得到2048时游戏即胜利,当然您也可以选择继续挑战。\n\n\n");
printf("\t\t\t\t\t\t\t\t\t\t");
printf("按键操作:\n");
printf("\t\t\t\t\t\t\t\t\t\t");
printf("上:w 下:s 左:a 右:d 重新开始:r 退出游戏:e\n");
getch();
system("cls");
}
int move()
{
char ch;
int i,j,k,p=-1;
ch=getch();
switch(ch){
case 'w':
for(j=0;j<=3;j++){
for(i=3;i>=0;i--){
if(matrix[i][j]==0){
if(i+1<=3&&matrix[i+1][j]!=0){
for(k=i;k<3;k++)
matrix[k][j]=matrix[k+1][j];
matrix[3][j]=0;
flat=1;
}
}
if(matrix[i][j]!=0){
if(i!=0&&p!=i&&matrix[i][j]==matrix[i-1][j]){
matrix[i-1][j]*=2;
sum+=matrix[i-1][j];
p=i-1;
for(k=i;k<3;k++)
matrix[k][j]=matrix[k+1][j];
matrix[3][j]=0;
flat=1;
}
}
}
p=-1;
}
break;
case 's':
for(j=0;j<=3;j++){
for(i=0;i<=3;i++){
if(matrix[i][j]==0){
if(i-1>=0&&matrix[i-1][j]!=0){
for(k=i;k>0;k--)
matrix[k][j]=matrix[k-1][j];
matrix[0][j]=0;
flat=1;
}
}
if(matrix[i][j]!=0){
if(i!=3&&p!=i&&matrix[i][j]==matrix[i+1][j]){
matrix[i+1][j]*=2;
sum+=matrix[i+1][j];
p=i+1;
for(k=i;k>0;k--)
matrix[k][j]=matrix[k-1][j];
matrix[0][j]=0;
flat=1;
}
}
}
p=-1;
}
break;
case 'a':
for(i=0;i<=3;i++){
for(j=3;j>=0;j--){
if(matrix[i][j]==0){
if(j+1<=3&&matrix[i][j+1]!=0){
for(k=j;k<3;k++)
matrix[i][k]=matrix[i][k+1];
matrix[i][3]=0;
flat=1;
}
}
if(matrix[i][j]!=0){
if(j!=0&&p!=j&&matrix[i][j]==matrix[i][j-1]){
matrix[i][j-1]*=2;
sum+=matrix[i][j-1];
p=j-1;
for(k=j;k<3;k++)
matrix[i][k]=matrix[i][k+1];
matrix[i][3]=0;
flat=1;
}
}
}
p=-1;
}
break;
case 'd':
for(i=0;i<=3;i++){
for(j=0;j<=3;j++){
if(matrix[i][j]==0){
if(j-1>=0&&matrix[i][j-1]!=0){
for(k=j;k>0;k--)
matrix[i][k]=matrix[i][k-1];
matrix[i][0]=0;
flat=1;
}
}
if(matrix[i][j]!=0){
if(j!=3&&p!=j&&matrix[i][j]==matrix[i][j+1]){
matrix[i][j+1]*=2;
sum+=matrix[i][j+1];
p=j+1;
for(k=j;k>0;k--)
matrix[i][k]=matrix[i][k-1];
matrix[i][0]=0;
flat=1;
}
}
}
p=-1;
}
break;
case 'r':
return 1;
case 'e':
return 2;
default :
printf("\t\t\t\t\t\t\t\t\t\t\t你的输入有误,请重新输入\n");
getch();
return 3;
}
return 0;
}
void print()
{
int i,j;
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\t\t\t\t\t\t当前得分:%d\n",sum);
printf("\t\t\t\t\t\t\t\t\t\t\t");
for(i=0;i<=3;i++){
printf("---------------------------\n");
printf("\t\t\t\t\t\t\t\t\t\t\t");
printf(" |");
for(j=0;j<=3;j++){
if(matrix[i][j]==0)
printf(" |");
else
printf(" %d |",matrix[i][j]);
}
printf("\n\t\t\t\t\t\t\t\t\t\t\t");
}
printf("---------------------------\n");
}
void newcreat()
{
int i,j,k;
i=rand()%4;
j=rand()%4;
while(matrix[i][j]){
i=rand()%4;
j=rand()%4;
}
k=rand()%2?2:4;
matrix[i][j]=k;
}
void init()
{
int i,j;
for(i=0;i<=3;i++){
for(j=0;j<=3;j++){
matrix[i][j]=0;
}
}
sum=0;
}