2048游戏
代码有问题有待优化
#include <stdio.h>
#include <Windows.h>
#include <time.h>
int board[4][4];
int score;
int i,j;
int fl_count=1;
void beg(){
printf(" 游戏名: 2048 分数:\n");
printf(" --------------------------------------------------\n\n");
// 绘制表格和数字
printf(" ┌────┬────┬────┬────┐\n");
printf(" │");
printf(" │");
printf(" 2 │");
printf(" 8 │");
printf(" 4 │");
printf("\n");
printf(" ├────┼────┼────┼────┤\n");
/*补全其余代码*/
printf(" │");
printf(" │");
printf(" 8 │");
printf(" 4 │");
printf(" 2 │");
printf("\n");
printf(" ├────┼────┼────┼────┤\n");
printf(" │");
printf(" 2 │");
printf(" │");
printf(" │");
printf(" │");
printf("\n");
printf(" ├────┼────┼────┼────┤\n");
// printf("\n");
printf(" │");
printf(" │");
printf(" │");
printf(" │");
printf(" │");
printf("\n");
printf(" └────┴────┴────┴────┘\n");
printf("\n");
printf(" --------------------------------------------------\n");
printf(" W↑ A← →D ↓S");
printf("\n 输 入 任 意 字 母 开 始 游 戏\n");
char str;
scanf("%c",&str);
}
void refresh_show(){
// 重设光标输出位置方式清屏可以减少闪烁,system("cls")为备用清屏命令,均为Windows平台相关
COORD pos = { 0, 0 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
//
system("cls");
printf(" ┌────┬────┬────┬────┐\n");
for( i=0; i<4; i++)
{
printf(" │");
for( j=0; j<4; j++)
{
if(board[i][j]!=0)
printf("%4d│",board[i][j]);
else
printf(" │");
}
printf("\n");
if(i<3)
printf(" ├────┼────┼────┼────┤\n");
}
printf(" └────┴────┴────┴────┘\n");
/*其余代码*/
}
void moveLeft() {
int flag=-1;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
int cell=board[i][j];
if(cell!=0)
{
int k=j+1;
while(k<4)
{
int nextcell=board[i][k];
if(nextcell!=0)
{
if(cell==nextcell)
{
flag=0;
board[i][j]+=board[i][k];
score+=board[i][j];
board[i][k]=0;
}
k=4;
break;
}
k++;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4-1;j++)
{
int cell=board[i][j];
if(cell==0)
{
int k=j+1;
while(k<4)
{
int nextcell=board[i][k];
if(nextcell!=0)
{
flag=0;//
board[i][j]=nextcell;
board[i][k]=0;
k=4;
}
k++;
}
}
}
}
}
void moveRight() {
int flag=-1;
for(i=0;i<4;i++)
{
for(j=3;j>=0;j--)
{
int cell=board[i][j];
if(cell!=0)
{
int k=j-1;
while(k>=0)
{
int nextcell=board[i][k];
if(nextcell!=0)
{
if(cell==nextcell)
{
flag=0;
board[i][j]+=board[i][k];
score+=board[i][j];
board[i][k]=0;
}
k=-1;
break;
}
k--;
}
}
}
}
for(i=0;i<4;i++)
{
for(j=3;j>0;j--)
{
int cell=board[i][j];
if(cell==0)
{
int k=j-1;
while(k>=0)
{
int nextcell=board[i][k];
if(nextcell!=0)
{
flag=0;
board[i][j]=nextcell;
board[i][k]=0;
k=-1;
}
k--;
}
}
}
}
}
void moveDown() {
score=0;
int flag=-1;
for(i=3;i>=0;i--)
{
for(j=0;j<4;j++)
{
int cell=board[i][j];
if(cell!=0)
{
int k=i-1;
while(k>=0)
{
int nextcell=board[k][j];
if(nextcell!=0)
{
if(board[i][j]==board[k][j])
{
flag=0;
board[i][j]+=board[k][j];
score+=board[i][j];
board[k][j]=0;
}
k=0;
break;
}
k--;
}
}
}
}
for(i=3;i>0;i--)
{
for(j=0;j<4;j++)
{
int cell=board[i][j];
if(cell==0)
{
int k=i-1;
while(k>=0)
{
int nextcell=board[k][j];
if(nextcell!=0)
{
flag=0;
board[i][j]=nextcell;
board[k][j]=0;
k=0;
}
k--;
}
}
}
}
}
void moveUp() {
int flag=-1;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
int cell=board[i][j];
if(cell!=0)
{
int k=i+1;
while(k<4)
{
int nextcell=board[k][j];
if(nextcell!=0)
{
if(cell==nextcell)
{
flag=0;
board[i][j]+=board[k][j];
score+=board[i][j];
board[k][j]=0;
}
k=4;
break;
}
k++;
}
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
int cell=board[i][j];
if(cell==0)
{
int k=i+1;
while(k<4)
{
int nextcell=board[k][j];
if(nextcell!=0)
{
flag=0;
board[i][j]=nextcell;
board[k][j]=0;
k=4;
}
k++;
}
}
}
}
}
int get_null_count(){
int sum=0;
for( i=0; i<4; i++)
{
for( j=0; j<4; j++)
{
if(board[i][j]==0)
{
sum++;
}
}
}
return sum;
}
void add_rand_num(){
srand(time(0));
int n = rand() % get_null_count();// 确定在何处空位置生成随机数
int i,j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
if (board[i][j] == 0)
{
if (n-- == 0) //定位待生成的位置
{
board[i][j] = (rand() % 3 ? 2 : 4);//rand() % 3的值为真(1或2)取前值2,反之,取 4 ,保证生成 2 的概率是 4 的 2 倍
return;
}
}
}
}
}
void dir(){
char ch;
scanf("%c",&ch);
int a=0;
if(ch=='w') moveUp();
if(ch=='s') moveDown();
if(ch=='a') moveLeft();
if(ch=='d') moveRight();
}
int if_game_over;
// 检查游戏是否结束 函数定义
void check_game_over(){
int fl=0;
// if_game_over=0,游戏不结束,=1游戏结束
for ( i = 0; i < 4; i++)
{
if(fl==1) break;
for ( j = 0; j < 3; j++)
{
if (board[i][j] == board[i][j + 1])
{
//如果有相等的就是可以合成,游戏还没有结束
fl=1;
break;
}
if (board[j][i] == board[j + 1][i])
{
fl=1;
break;
}
}
}
if(fl==1) if_game_over=0;
else if_game_over=1;
}
void reset_game(){
score = 0;
if_game_over = 0;
// 了解到游戏初始化时出现的两个数一定会有个 2,所以先随机生成一个 2,其他均为 0
int n = rand() % 16;
int i,j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
board[i][j] = (n-- == 0 ? 2 : 0);
}
}
// 前面已经生成了一个2,这里再生成一个随机的2或者4,且设定生成2的概率是4的两倍
add_rand_num();
// 在这里刷新界面并显示的时候,界面上已经默认出现了两个数字,其他的都为空(值为0)
system("cls");
refresh_show();
}
int main()
{
beg();
reset_game();
while(1)
{
check_game_over();
if(if_game_over==1)
{
COORD pos = { 0, 0 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
system("cls");
break;
}
char c;
getchar();
dir();
add_rand_num();
check_game_over();
if(if_game_over==1)
{
COORD pos = { 0, 0 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
system("cls");
break;
}
refresh_show();
}
COORD pos = { 0, 0 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
system("cls");
printf("Game Over\n");
return 0;
}