【2048】游戏实验

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值