2021-01-07

大一上学期19c20c课设2048小游戏

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
using namespace std;

class Game
{
private:
	int chessboard[5][5] = {0};
	int remove;
	int x, y, k,count1;
public:

	int i, j;
	void show();//声明初始化棋盘
	void print();//声明打印棋盘的函数
	void up();//上
	void down();//下
	void left();//左
	void right();//右
	//声明响应键盘事件的函数
	void newadd();//声明新增数字函数,数字增加是要找空位vacancy,也就是chessboard[x][y] = 0;
	int getscore();//声明得分函数;
	int gameover();//声明游戏结束函数
};

void Game::show()
{
	int count2 = rand() % 2;
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
		{
			if (chessboard[i][j] == 0)
			{
				goto vacancy;
			}
		}
vacancy:srand((unsigned int)time(NULL));
	do {
		x = rand() % 5;
		y = rand() % 5;
		int coun1 = x;
	} while (chessboard[x][y] != 0);

	if (count2 == 0)
	{
		chessboard[x][y] = 2;
	}
	else
		chessboard[x][y] = 4;
}


void Game::print()
{
	
	for (int i = 0; i < 5; i++)
	{
		cout << " ───────────────────────────────────────" << endl;
		for (int j = 0; j < 5; j++)
		{
			if (chessboard[i][j] == 0)
			{
				cout << "│  " << chessboard[i][j] <<" \t";
			}
			else
			{
				cout << "│   " << chessboard[i][j] <<"\t";
			}
		}
		cout << "│" << endl;
	}
	    cout << " ───────────────────────────────────────" << endl;
}//定义打印棋盘的函数

void Game::newadd()
{
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
		{
			if (chessboard[i][j] == 0)
			{
				goto vacancy;
			}
			else
			{
				continue;
			}
		}
vacancy:srand((unsigned int)time(NULL));
	int count1 = rand() % 2;
	do {
		x = rand() % 5;
		y = rand() % 5;
	} while (chessboard[x][y] != 0);

	if (count1==0)
	{
		chessboard[x][y] = 2;
	}
	else
		chessboard[x][y] = 4;
	
}//定义新增数字的函数,空位的定义,空位的数字补充。

void Game::up()
{
	//↑
	char ch;
	ch=_getch();	

	if (ch == 72)//第一行的元素是不动
	{
		for (int i = 1; i < 5; i++)//要找上一个格子是否为零,
		{
			for (int k = i; k >= 1; k--)
			{
				for (int j = 0; j < 5; j++)
				{
					if (chessboard[k - 1][j] == 0)//上一个格子为零,就是空位
					{
						chessboard[k - 1][j] = chessboard[k][j];//让上个空位的值等于他下面的
						chessboard[k][j] = 0;//再让下面的空位是零,也就是还原空位	
						
					
					}
					else//上一个位置的数字等于他下面的数字的情况
					{
						if (chessboard[k - 1][j] == chessboard[k][j])
						{
							chessboard[k - 1][j] *= 2;//让上一个位置的数字是原来的二倍
							chessboard[k][j] = 0;//再让下面位置的数字为零
						
						}
					}
				}
			}
		}
	}	
}

void Game::down()
{   //↓
	char ch;
	ch = _getch();

	if (ch == 80)//最后一行的元素是不动的
	{
		for (int i = 3; i >= 0; i--)
		{
			for (int k = i; k < 4; k++)
			{
				for (int j = 0; j < 5; j++)
				{
					if (chessboard[k + 1][j] == 0)//找下面为上面
					{
						chessboard[k + 1][j] = chessboard[k][j];//让下面的那个空位为他上面的位置的数字
						chessboard[k][j] = 0;//上面的位置又要变回初始值0

					}
					else//如果下面的值与他上面的是一样的值
					{
						if (chessboard[k + 1][j] == chessboard[k][j])
						{
							chessboard[k + 1][j] *= 2;//下面的位置为数字乘以2
							chessboard[k][j] = 0;//让上面的位置恢复初始值0

						}
					}
				}
			}
		}

	}
}

void Game::left()
{
	//←
	char ch;
	ch = _getch();

	if (ch ==75)//最左列不动
	{
		for (int j = 1; j < 5; j++)
		{
			for (int k = j; k >= 1; k--)//让有0列
			{
				for (int i = 0; i < 5; i++)
				{
					if (chessboard[i][k - 1] == 0)//如果右边的值是空位0
					{
						chessboard[i][k - 1] = chessboard[i][k];//让左边的值等于它右边的值
						chessboard[i][k] = 0;//让其右边的值恢复初始值0

					}
					else
					{
						if (chessboard[i][k - 1] == chessboard[i][k])//右边的值等于左边的值
						{
							chessboard[i][k - 1] *= 2;//让左边的值是二倍
							chessboard[i][k] = 0;//让右边的值恢复初始值0

						}
					}
				}
			}
		}

	}

}

void Game::right()
{
	//→
	char ch;
	ch = _getch();

	if (ch == 77)//最右列不动
	{
		for (int j = 3; j >= 0; j--)
		{
			for (int k = j; k < 4; k++)
			{
				for (int i = 0; i < 5; i++)
				{
					if (chessboard[i][k + 1] == 0)//右边的位置为空0
					{
						chessboard[i][k + 1] = chessboard[i][k];//让右边的值等于左边的值
						chessboard[i][k] = 0;//让左边的值恢复初始值0

					}
					else//右边的值等于左边的值的情况
					{
						if (chessboard[i][k + 1] == chessboard[i][k])
						{
							chessboard[i][k + 1] *= 2;//右边的值是变为二倍
							chessboard[i][k] = 0;//左边的值恢复初始值0

						}
					}
				}
			}
		}
	}
}

int Game::getscore()
{
	int score = 0;
		for (int i = 0; i < 5; i++)
		{
			for (int j = 0; j < 5; j++)
			{
				score += chessboard[i][j];	
			}
		}
		cout << "score=" << score << endl;
		return score;
}

int  Game::gameover()
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (chessboard[i][j] == 2048)
			{
				cout << "You Win The Game" << endl;
				
			}
			
		}
		break;
	}

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (chessboard[i][j] == 0 || chessboard[i][j]==chessboard[i][j + 1])
			{
				cout << "Game Continue" << endl;
				
			}
		}
		break;
	}

	for (int j = 0; j < 5; j++)
	{
		for (int i = 0; i < 4; i++)
		{
			if (chessboard[i][j]==0||chessboard[i][j] == chessboard[i + 1][j])
			{
				cout << "Game Continue" << endl;
				
			}
		}
		break;
	}   
	return 0 ;
}



int main()
{
	Game a;
	a.show();
	a.print();
	while (1)
	{
		
		a.up();
		system("CLS");
		a.getscore();
		a.print();

		a.down();
		system("CLS");
		a.getscore();
		a.print();

		a.left();
		system("CLS");
		a.getscore();
		a.print();

		a.right();
		system("CLS");
		a.getscore();
		a.print();

		a.newadd();
		system("CLS");
		a.print();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值