今天早上两点半起床太亢奋,于是写了这个2048终端版的游戏,其实2048实现起来还是比较简单的,基本和是哪个没有太深奥的东西,有点C语言基础还是能很容易的写下来。虽然是比较简单还是被我写出了四百多行,真实太辣鸡了(#滑稽#)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
int num[4][4];
int socre;
void display();
void initialization();
void produceDigital();
void gamePlay();
int isFull();
int moveup();
int movedown();
int moveleft();
int moveright();
int isWin();
void win();
int isLost();
void lost();
int main()
{
initialization();
gamePlay();
system("pause");
return 0;
}
void initialization()
{
system("cls");
system("mode con cols=100 lines=20");
system("color 04");
printf("\t\t###################################################################\n");
printf("\t\t###########################游戏规则################################\n");
printf("\t\t#################玩家可以使用W,A,S,D移动滑块#######################\n");
printf("\t\t#################相同的滑块将会被合并,合并后#######################\n");
printf("\t\t#################的新数字相加就是玩家所得的########################\n");
printf("\t\t#################有效分,每一次操作都会随机产#######################\n");
printf("\t\t#################一个2或4,如果产生2048即为获#######################\n");
printf("\t\t#################胜,如果无法继续移动则为输.########################\n");
printf("\t\t###################################################################\n");
printf("\n\n\n");
printf("\t\t\t\t\t******************\n");
printf("\t\t\t\t\t*按任意键开始游戏*\n");
printf("\t\t\t\t\t******************\n");
getch();
system("cls");
system("mode con cols=50 lines=20");
int i, j;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
num[i][j] = 0;
socre = 0;
produceDigital();
produceDigital();
produceDigital();
display();
}
void display()
{
system("cls");
int i, j;
printf("\t#################################\n");
printf("\t# 当前得分:%6d #\n", socre);
printf("\t#################################\n");
printf("\n\n\n");
for(i = 0; i < 4; i++)
{
printf("\t\t=====================\n");
printf("\t\t║");
for(j = 0; j < 4; j++)
{
if(num[i][j] == 0)
printf(" ║");
else
printf("%4d║",num[i][j]);
}
printf("\n");
}
printf("\t\t=====================\n");
}
int isFull()
{
int i, j;
int flag = 1;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(num[i][j] == 0)
{
flag = 0;
return flag;
}
return flag;
}
void produceDigital()
{
if(isFull())
return;
srand(time(0));
while(1)
{
int x,y;
x = rand()%4;
y = rand()%4;
if(num[x][y] == 0)
{
num[x][y] = (rand()%2 + 1) * 2;
break;
}
}
}
void gamePlay()
{
char ch;
while(1)
{
int flag = 0;
ch = getch();
switch(ch)
{
case 'w':
case 'W':
flag = moveup();
break;
case 's':
case 'S':
flag = movedown();
break;
case 'a':
case 'A':
flag = moveleft();
break;
case 'd':
case 'D':
flag = moveright();
break;
default:
continue;
}
if(flag)
{
produceDigital();
display();
}
if(isWin())
{
win();
break;
}
if(isLost())
{
lost();
break;
}
}
}
int moveup()
{
int i, j, k, q;
int flag = 0;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(num[i][j] == 0)
{
for(k = i + 1; k < 4; k++)
if(num[k][j] != 0)
{
num[i][j] = num[k][j];
num[k][j] = 0;
flag = 1;
for(q = i + 1; q < 4; q++)
{
if(num[q][j] != 0 && num[i][j] != num[q][j])
break;
else if(num[i][j] == num[q][j])
{
num[i][j] *= 2;
socre += num[i][j];
num[q][j] = 0;
flag = 1;
break;
}
}
break;
}
}
else
for(k = i + 1; k < 4; k++)
{
if(num[k][j] != 0 && num[i][j] != num[k][j])
break;
else if(num[i][j] == num[k][j])
{
num[i][j] *= 2;
socre += num[i][j];
num[k][j] = 0;
flag = 1;
break;
}
}
return flag;
}
int movedown()
{
int i, j, k, q;
int flag = 0;
for(i = 3; i >= 0; i--)
for(j = 3; j >= 0; j--)
if(num[i][j] == 0)
{
for(k = i - 1; k >= 0; k--)
if(num[k][j] != 0)
{
num[i][j] = num[k][j];
num[k][j] = 0;
flag = 1;
for(q = i - 1; q >= 0; q--)
{
if(num[q][j] != 0 && num[i][j] != num[q][j])
break;
else if(num[i][j] == num[q][j])
{
num[i][j] *= 2;
socre += num[i][j];
num[q][j] = 0;
flag = 1;
break;
}
}
break;
}
}
else
for(k = i - 1; k >= 0; k--)
{
if(num[k][j] != 0 && num[i][j] != num[k][j])
break;
else if(num[i][j] == num[k][j])
{
num[i][j] *= 2;
socre += num[i][j];
num[k][j] = 0;
flag = 1;
break;
}
}
return flag;
}
int moveleft()
{
int i, j, k, q;
int flag = 0;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(num[i][j] == 0)
{
for(k = j + 1; k < 4; k++)
if(num[i][k] != 0)
{
num[i][j] = num[i][k];
num[i][k] = 0;
flag = 1;
for(q = j + 1; q < 4; q++)
{
if(num[i][q] != 0 && num[i][j] != num[i][q])
break;
else if(num[i][j] == num[i][q])
{
num[i][j] *= 2;
socre += num[i][j];
num[i][q] = 0;
flag = 1;
break;
}
}
break;
}
}
else
for(k = j + 1; k < 4; k++)
{
if(num[i][k] != 0 && num[i][j] != num[i][k])
break;
else if(num[i][j] == num[i][k])
{
num[i][j] *= 2;
socre += num[i][j];
num[i][k] = 0;
flag = 1;
break;
}
}
return flag;
}
int moveright()
{
int i, j, k, q;
int flag = 0;
for(i = 3; i >= 0; i--)
for(j = 3; j >= 0; j--)
if(num[i][j] == 0)
{
for(k = j - 1; k >= 0; k--)
if(num[i][k] != 0)
{
num[i][j] = num[i][k];
num[i][k] = 0;
flag = 1;
for(q = j - 1; q >= 0; q--)
{
if(num[i][q] != 0 && num[i][j] != num[i][q])
break;
else if(num[i][j] == num[i][q])
{
num[i][j] *= 2;
socre += num[i][j];
num[i][q] = 0;
flag = 1;
break;
}
}
break;
}
}
else
for(k = j - 1; k >= 0; k--)
{
if(num[i][k] != 0 && num[i][j] != num[i][k])
break;
else if(num[i][j] == num[i][k])
{
num[i][j] *= 2;
socre += num[i][j];
num[i][k] = 0;
flag = 1;
break;
}
}
return flag;
}
int isWin()
{
int i, j;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
if(num[i][j] == 2048)
return 1;
return 0;
}
void win()
{
system("cls");
system("mode con cols=100 lines=20");
printf("\n\n");
printf("\t\t ## # ## ## ## ## \n");
printf("\t\t ## # # ## #### ##\n");
printf("\t\t ## ## ## ## ## ## ## ##\n");
printf("\t\t ## ## ## ## ## ## ## ##\n");
printf("\t\t ## ## ## ## ## ## ## ##\n");
printf("\t\t # # # # ## ## ####\n");
printf("\t\t # # ## ## ##\n");
printf("\n\n");
printf("\t\t\t#################################\n");
printf("\t\t\t# 得分:%6d #\n", socre);
printf("\t\t\t#################################\n");
}
int isLost()
{
if(isFull())
{
int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
if(num[i][j] == num[i+1][j] || num[i][j] == num[i][j+1])
return 0;
return 1;
}
return 0;
}
void lost()
{
system("cls");
system("mode con cols=100 lines=20");
printf("\n\n");
printf("\t\t## ##### ######### ##############\n");
printf("\t\t## ## ## ## ##############\n");
printf("\t\t## ## ## ## ## \n");
printf("\t\t## ## ## ## ## \n");
printf("\t\t## ## ## ######### ## \n");
printf("\t\t## ## ## ## ## \n");
printf("\t\t## ## ## ## ## \n");
printf("\t\t####### ## ## ## ## \n");
printf("\t\t####### ##### ######### ## \n");
printf("\n\n");
printf("\t\t\t#################################\n");
printf("\t\t\t# 得分:%6d #\n", socre);
printf("\t\t\t#################################\n");
}