• 2048小游戏(c++)(转)


    下为源码

    
    #include <iostream>
    #include <windows.h>
    #include <ctime>
    using namespace std;
     
    int const ROW = 4;
    int const COL = 4;
    int game[ROW][COL] = {0};
     
    //上下左右
    int const UP = 1;
    int const DOWN = 2;
    int const LEFT = 3;
    int const RIGHT = 4;
     
    //游戏所处的状态
    int const GAME_OVER = 1;
    int const GAME_WIN = 2;
    int const GAME_CONTINUE = 3;
     
    enum GameNum
    {
    	Game_2 = 2,
    	Game_4 = 4,
    	Game_8 = 8,
    	Game_16 = 16,
    	Game_32 = 32,
    	Game_64 = 64,
    	Game_128 = 128,
    	Game_256 = 256,
    	Game_512 = 512,
    	Game_1024 = 1024,
    	Game_2048 = 2048,
    };
     
    //打印所得的数组
    void Print()
    {
    	system("cls");
    	cout << "*****************  2048 控 制 台 版  ******************" << endl;
    	cout << "*****************  By Tanzf (Intern) ******************" << endl << endl;
    	for (int i = 0; i < ROW; ++i)
    	{
    		cout << "---------------------------------"<< endl;
    		for (int j = 0; j < COL; ++j)
    		{
    			if (game[i][j] == 0)
    			{
    				cout <<"|   	";
    			}
    			else 
    			{
    				cout <<"|   " << game[i][j] << "	";
    			}
    		}
    		cout << "|" << endl;
    	}
    	cout << "---------------------------------"<< endl;
    }
     
     
    bool CreateNumber()
    {
    	int x = -1;
    	int y = -1;
    	int times = 0;
    	int maxTimes = ROW * COL;
    	//三分之二的概率生成2,三分之一的概率生成4
    	int whitch = rand() % 3;
    	do 
    	{
    		x = rand() % ROW;
    		y = rand() % COL;
    		++times;
    	} while (game[x][y] != 0 && times <= maxTimes);
     
    	//说明格子已经满了
    	if(times >= maxTimes)
    	{
    		return false;
    	}
    	else
    	{
    		GameNum num;
    		if(whitch == 0)
    		{
    			num = Game_4;
    		}
    		else if(whitch)
    		{
    			num = Game_2;
    		}
    		game[x][y] = num;
    	}
     
    	return true;
    }
     
    void Process(int direction)
    {
    	switch (direction)
    	{
    	case UP:
    		//最上面一行不动
    		for(int row = 1; row < ROW; ++row)
    		{
    			for(int crow = row; crow >= 1; --crow)
    			{
    				for(int col = 0; col < COL; ++col)
    				{
    					//上一个格子为空
    					if(game[crow-1][col] == 0)
    					{
    						game[crow-1][col] = game[crow][col];
    						game[crow][col] = 0;
    					}
    					else 
    					{
    						//合并
    						if(game[crow-1][col] == game[crow][col])
    						{
    							game[crow - 1][col] *= 2;
    							game[crow][col] = 0;
    						}
     
    					}
    				}
    			}
    		}
    		break;
    	case DOWN:
    		//最下面一行不动
    		for(int row = ROW - 2; row >= 0; --row)
    		{
    			for(int crow = row; crow < ROW - 1; ++crow)
    			{
    				for(int col = 0; col < COL; ++col)
    				{
    					//上一个格子为空
    					if(game[crow + 1][col] == 0)
    					{
    						game[crow + 1][col] = game[crow][col];
    						game[crow][col] = 0;
    					}
    					else 
    					{
    						//合并
    						if(game[crow + 1][col] == game[crow][col])
    						{
    							game[crow + 1][col] *= 2;
    							game[crow][col] = 0;
    						}
     
    					}
    				}
    			}
    		}
    		break;
    	case LEFT:
    		//最左边一列不动
    		for(int  col = 1; col < COL; ++col)
    		{
    			for(int ccol = col; ccol >= 1; --ccol)
    			{
    				for(int row = 0; row < ROW; ++row)
    				{
    					//上一个格子为空
    					if(game[row][ccol-1] == 0)
    					{
    						game[row][ccol - 1] = game[row][ccol];
    						game[row][ccol] = 0;
    					}
    					else 
    					{
    						//合并
    						if(game[row][ccol - 1] == game[row][ccol])
    						{
    							game[row][ccol - 1] *= 2;
    							game[row][ccol] = 0;
    						}
     
    					}
    				}
    			}
    		}
    		break;
    	case RIGHT:
    		//最右边一列不动
    		for(int  col = COL - 2; col >= 0; --col)
    		{
    			for(int ccol = col; ccol <= COL - 2; ++ccol)
    			{
    				for(int row = 0; row < ROW; ++row)
    				{
    					//上一个格子为空
    					if(game[row][ccol + 1] == 0)
    					{
    						game[row][ccol + 1] = game[row][ccol];
    						game[row][ccol] = 0;
    					}
    					else 
    					{
    						//合并
    						if(game[row][ccol + 1] == game[row][ccol])
    						{
    							game[row][ccol + 1] *= 2;
    							game[row][ccol] = 0;
    						}
     
    					}
    				}
    			}
    		}
    		break;
    	}
     
    }
     
    //处理输入输出,返回上下左右
    int Input()
    {
    	//读取上下左右四个方向键
    	int upArrow = 0;
    	int downArrow = 0;
    	int leftArrow = 0;
    	int rightArrow = 0;
    	int direction = 0;
    	while (true)
    	{
    		upArrow = GetAsyncKeyState(VK_UP);
    		downArrow = GetAsyncKeyState(VK_DOWN);
    		leftArrow = GetAsyncKeyState(VK_LEFT);
    		rightArrow = GetAsyncKeyState(VK_RIGHT);
     
    		if(upArrow)
    		{
    			direction = UP;
    			break;
    		}
    		else if(downArrow)
    		{
    			direction = DOWN;
    			break;
    		}
    		else if(leftArrow)
    		{
    			direction = LEFT;
    			break;
    		}
    		else if(rightArrow)
    		{
    			direction = RIGHT;
    			break;
    		}
     
    		Sleep(100);
    	}
     
    	return direction;
    }
     
    //判断游戏状态
    int Judge()
    {
    	//赢得游戏
    	for(int i = 0; i < ROW; ++i)
    	{
    		for(int j = 0; j < COL; ++j)
    		{
    			if(game[i][j] == 2048)
    			{
    				return GAME_WIN;
    				break;
    			}
    		}
    	}
     
    	//横向检查
    	for(int i = 0 ; i < ROW; ++i)
    	{
    		for(int j = 0; j < COL - 1; ++j)
    		{
    			if(!game[i][j] || (game[i][j] == game[i][j+1]))
    			{
    				return GAME_CONTINUE;
    				break;
    			}
    		}
    	}
    	//纵向检查
    	for(int j = 0; j< COL; ++j)
    	{
    		for(int i = 0; i < ROW -1; ++i)
    		{
    			if(!game[i][j] || (game[i][j] == game[i+1][j]))
    			{
    				return GAME_CONTINUE;
    				break;
    			}
    		}
    	}
     
    	//不符合上述两种状况,游戏结束
    	return GAME_OVER;
     
    }
     
    int main()
    {
    	//设置一个随机数种子
    	srand((unsigned int)time(0));
    	CreateNumber();
    	CreateNumber();
    	Print();
    	int direction = 0;
    	int gameState = -1;
    	while(true)
    	{
    		direction = Input();
     
    		gameState = Judge();
    		if(direction && gameState == GAME_CONTINUE)
    		{
    			Process(direction);
    			CreateNumber();
    			Print();
    			Sleep(100);
    		}
    		else if(gameState == GAME_WIN)
    		{
    			Print();
    			cout << "You Win!" << endl;
    			break;
    		}
    		else if(gameState == GAME_OVER)
    		{
    			Print();
    			cout <<"You lose!" << endl;
    			break;
    		}
    	}
     
    	return 0;
    }
    

    版权声明:本文为CSDN博主「AceTan」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/one_piece_luffy/article/details/44240295

  • 相关阅读:
    MVC概念性的内容
    类 class
    php获取真实IP地址
    面向对象static静态的属性和方法的调用
    smarty 入门2(个人总结)
    smarty入门
    读取文件内容fopen,fgets,fclose
    mysql常用命令
    mybatis查询的三种方式
    MyBatis 映射文件
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300186.html
Copyright © 2020-2023  润新知