栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【2048】游戏实验

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【2048】游戏实验

2048游戏

代码有问题有待优化 

#include 
#include 
#include 
int board[4][4];
int score;
int i,j;
int fl_count=1;
void beg(){
    printf("                游戏名: 2048                     分数:n");
	printf("             --------------------------------------------------nn");

	// 绘制表格和数字
	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 Overn");
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号