2048双人游戏(全网首发)!!!

 肝了3天终于做完了!!!纯纯新手

写第一个单人2048单人时候说的

简单变成了双人,再加了一个积分,采用了五局三胜的原理

给个👍不过分吧

#include<iostream>
#include<vector>
#include<ctime>
#include<cstdlib>
using namespace std;
class Game_2048
{
public:
    Game_2048();
    ~Game_2048();
    void introduction();
    bool judgeOver(int,int&,int&);                            //判断游戏是否结束
    void reSize();
    void printBoard();                          //打印函数
    void getRand();                              //随机在棋盘上生成2,4;
    void player1Slide();                                //玩家1滑动
    void player2Slide();                                //玩家2滑动
    bool ifFull();								//判断棋盘是否已满 

private:
    int m=4, n=4;
    char op;                                   //用户操作
    vector< vector<int> >     board;                                //棋盘
    vector<int>  row;
    bool judgeInsert(int x,int y);
    bool judgeSlide();                               //判断是否能滑动,(未写完)
    void copyBoard(vector< vector<int> > &newBoard,vector< vector<int> > &board);
    void inputOp();
    char getOp();                            //返回操作符
 
    bool judgeLeftSlide(bool mark=true);
    void leftSlide();                            //左滑动
 
    bool judgeRightSlide(bool mark = true);
    void rightSlide();
 
    bool judgeUpSlide(bool mark = true);
    void upSlide();
 
    bool judgeDownSlide(bool mark = true);
    void downSlide();
 
    void reStart();
    void enlarge();                             //将值扩大二倍
};
 
int main()
{
	int jifen1 = 0;
	int jifen2 = 0;
	for(int i=0;i<5;i++){
    	Game_2048 NB;
    	NB.introduction();
    	NB.getRand();
    	NB.printBoard();
    	int cnt = 0;
    	while (!NB.judgeOver(cnt,jifen1,jifen2))
    {
    	if (cnt % 2 == 0)
    	{
    		cout << "玩家1开始操作:" << endl; 
    		NB.player1Slide();
		}
        else
        {
    		cout << "玩家2开始操作:" << endl; 
        	NB.player2Slide();
		}

        if(!NB.ifFull()) 
       		NB.getRand();
        NB.printBoard();
        cnt++;
    }
	} 
    cout << "游戏结束!!!\n";
    system("pause");
    return 0;
 
}
 
void Game_2048::introduction()
{
    cout << "这是一个双人2048游戏,规则如下:\n";
    cout << "玩家1:上划:W;\n下滑:S;\n左划:A;\n右划:D;\n退出:Q;\n重新开始:R;\n";
    cout << "玩家2:上划:I;\n下滑:K;\n左划:J;\n右划:L;\n退出:Q;\n重新开始:R;\n";
}
 
void Game_2048::player1Slide()
{
    inputOp();
    switch (getOp())
    {
    case 'a':
    case 'A':
        if (judgeLeftSlide())
            do
                leftSlide();
            while (judgeLeftSlide(false));
        else
        {
            cout << "无法左滑动,请重试!!!\n";
            player1Slide();
        }
        break;
    case 'd':
    case 'D':
        if (judgeRightSlide())
            do
                rightSlide();
        while (judgeRightSlide(false));        
        else
        {
            cout << "无法右滑动,请重试!!!\n";
            player1Slide();
        }
        break;
    case 'w':
    case 'W':
        if(judgeUpSlide())
            do
            upSlide();
        while (judgeUpSlide(false));
        else
        {
            cout << "无法上滑动,请重试!!!\n";
            player1Slide();
        }
        break;
    case 's':
    case 'S':
        if(judgeDownSlide())
            do    
                downSlide();
            while (judgeDownSlide(false));
        else
        {
            cout << "无法下滑动,请重试!!!\n";
            player1Slide();
        }
        break;
    case 'p':
    case 'P':
        enlarge();
        break;
    case 'q':
    case 'Q':
        exit(0);
        break;
    case 'r':
    case 'R':
        reStart();
        break;
    default:
        cout << "输入错误!\n";
        break;
    }
}
 
void Game_2048::player2Slide()
{
    inputOp();
    switch (getOp())
    {
    case 'j':
    case 'J':
        if (judgeLeftSlide())
            do
                leftSlide();
            while (judgeLeftSlide(false));
        else
        {
            cout << "无法左滑动,请重试!!!\n";
            player2Slide();
        }
        break;
    case 'l':
    case 'L':
        if (judgeRightSlide())
            do
                rightSlide();
        while (judgeRightSlide(false));        
        else
        {
            cout << "无法右滑动,请重试!!!\n";
            player2Slide();
        }
        break;
    case 'i':
    case 'I':
        if(judgeUpSlide())
            do
            upSlide();
        while (judgeUpSlide(false));
        else
        {
            cout << "无法上滑动,请重试!!!\n";
            player2Slide();
        }
        break;
    case 'k':
    case 'K':
        if(judgeDownSlide())
            do    
                downSlide();
            while (judgeDownSlide(false));
        else
        {
            cout << "无法下滑动,请重试!!!\n";
            player2Slide();
        }
        break;
    case 'p':
    case 'P':
        enlarge();
        break;
    case 'q':
    case 'Q':
        exit(0);
        break;
    case 'r':
    case 'R':
        reStart();
        break;
    default:
        cout << "输入错误!\n";
        break;
    }
}
 
void Game_2048::reStart()
{
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++) {
            board[i][j] = 0;
        }
}
 
void Game_2048::enlarge()
{
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
            board[i][j] *= 2;
        }
}
 
 
char Game_2048::getOp()
{
    return op;
}
 
void Game_2048::upSlide()
{
    for (int j = 0; j < n; j++)
        for (int i = m - 1; i > 0; i--) {                              //n-1!!
            if (board[i][j] != 0 && board[i - 1][j] == 0)            //移动
            {
                    board[i - 1][j] = board[i][j];
                    board[i][j] = 0;
            }
        }
    for (int j = 0; j < n; j++)
        for (int i = m - 1; i > 0; i--) {
            if (board[i][j] != 0 && board[i-1][j] == board[i][j])  //覆盖
            {
                board[i-1][j] += board[i][j];
                board[i][j] = 0;
            }
        }
}
 
bool Game_2048::judgeUpSlide(bool mark)
{
    if (mark)
    {
        for (int i = 0; i < m; i++)
            for (int j = n - 1; j > 0; j--)
            {
                if (board[i][j] == 0)
                return true;
            }
    }
    for (int j = 0; j < n; j++)
        for (int i = m - 1; i > 0; i--) {                              //n-1!!
            if (board[i][j] != 0 && board[i - 1][j] == 0)            //移动
                return true;
            if (board[i][j] != 0 && board[i - 1][j] == board[i][j])  //覆盖
                return true;
        }
    return false;
}
 
bool Game_2048::judgeDownSlide(bool mark)
{
    if (mark) {
        for (int i = 0; i < m; i++)
            for (int j = n - 1; j > 0; j--)
                {
                    if (board[i][j] == 0)
                        return true;
                }
        
    }
    for (int j = 0; j < n; j++)
                for (int i = 0; i < m - 1; i++) {                              //n-1!!
                    if (board[i][j] != 0 && board[i + 1][j] == 0)            //移动
                        return true;
                    if (board[i][j] != 0 && board[i + 1][j] == board[i][j])  //覆盖
                        return true;
 
                }
    return false;
}
 
void Game_2048::downSlide()
{
    for (int j = 0; j < n; j++)
        for (int i = 0; i < m - 1; i++) {                         
            if (board[i][j] != 0 && board[i + 1][j] == 0)            //移动
            {
                    board[i + 1][j] = board[i][j];
                    board[i][j] = 0;
            }
        }
    for (int j = 0; j < n; j++)
        for (int i = 0; i < m - 1; i++) {
            if (board[i][j] != 0 && board[i + 1][j] == board[i][j])  //覆盖
            {
                board[i + 1][j] += board[i][j];
                board[i][j] = 0;
            }
        }
}
 
 
void Game_2048::rightSlide()
{
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n - 1; j++) {                              //n-1!!
            if (board[i][j] != 0 && board[i][j + 1] == 0)            //移动
            {
                    board[i][j + 1] = board[i][j];
                    board[i][j] = 0;
            }
        }
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n - 1; j++) {
            if (board[i][j] != 0 && board[i][j + 1] == board[i][j])  //覆盖
            {
                board[i][j + 1] += board[i][j];
                board[i][j] = 0;
            }
        }
}
 
bool Game_2048::judgeRightSlide(bool mark )
{
    if (mark) {
        for (int i = 0; i < m; i++)
            for (int j = n - 1; j > 0; j--)
            {
                if (board[i][j] == 0)
                    return true;
            }
    }
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n - 1; j++) {                              //n-1!!
            if (board[i][j] != 0 && board[i][j + 1] == board[i][j])  //覆盖
                return true;
            if (board[i][j] != 0 && board[i][j + 1] == 0)
                return true;
        }
    return false;
}
 
void Game_2048::leftSlide()
{
    for (int i = 0; i < m; i++)
        for (int j = 1; j < n; j++) {                              //n-1!!
            if (board[i][j] != 0 && board[i][j - 1] == 0)            //移动
            {
                    board[i][j - 1] = board[i][j];
                    board[i][j] = 0;
            }
        }
    for (int i = 0; i < m; i++)
        for (int j = 1; j < n; j++) {
            if (board[i][j] != 0 && board[i][j - 1] == board[i][j])  //覆盖
            {
                board[i][j - 1] += board[i][j];
                board[i][j] = 0;
            }
        }
}
 
bool Game_2048::judgeLeftSlide(bool mark)
{
    if (mark) {
        for (int i = 0; i < m; i++)
                for (int j = n - 1; j > 0; j--)
                {
                    if (board[i][j] == 0)
                        return true;
                }
    }
    for (int i = 0; i < m; i++)
        for (int j = n - 1; j > 0; j--) {                              //n-1!!
            if (board[i][j] != 0 && board[i][j - 1] == 0)            //移动
                return true;
            if (board[i][j] != 0 && board[i][j - 1] == board[i][j])  //覆盖
                return true;
        }
    return false;
}
 
bool Game_2048::judgeOver(int cnt,int &jifen1,int &jifen2)
{
    if (op == 'q' || op == 'Q')
        return true;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++) {
            if (board[i][j] == 2048)
            {
                printBoard();
                if (cnt % 2 == 0) 
				{
                	cout << "有数字达到了2048,恭喜玩家2获胜!!!" << endl;
					jifen2+=100;
					cout << "玩家2" << " " << jifen2 << "积分" <<endl ; 
				}
				else 
				{
					cout << "有数字达到了2048,恭喜玩家1获胜!!!" << endl;
					jifen1+=100;
					cout << "玩家1" << " " << jifen1 << "积分" <<endl; 	
				}
                return true;
            }    
        }
 
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++) {
             if (board[i][j] == 0)
                return false;
        }
    if (judgeSlide())
        return false;
    else
    {
        if (cnt % 2 == 0) 
		{
        	cout << "无法再滑动,恭喜玩家2获胜!!!" << endl; 
					jifen2+=100; 
					cout <<"玩家2"<< " " << jifen2 << "积分" <<endl; 
		}
		else 
		{
			cout << "无法再滑动,恭喜玩家1获胜!!!" << endl; 	
					jifen1+=100; 
					cout <<"玩家1"<< " " << jifen1 << "积分" <<endl; 
		}
        return true;
    }
        
}
 
bool Game_2048::judgeSlide()
{
    vector< vector<int> >     copyBoard;                                //棋盘
    vector<int>  copyRow;
    for (int i = 0; i < n; i++) {
        copyRow.push_back(0);
    }
    for (int i = 0; i < m; i++) {
        copyBoard.push_back(copyRow);
    }
    copyBoard = board;
    upSlide();
    downSlide();
    leftSlide();
    rightSlide();
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
            if (board[i][j] == 0) {
                board = copyBoard;
                return true;
            }    
        }
    return false;
}
 
void Game_2048::copyBoard(vector< vector<int> >& newBoard, vector< vector<int> >&     board)
{
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            newBoard[i][j] = board[i][j];
}
 
bool Game_2048::judgeInsert(int x,int y)
{
    if (board[x][y] == 0)
        return true;
    else
        return false;
}
void Game_2048::getRand()
{
    srand(time(0));
    int x, y,val;
    do
    {
        x = rand() % m;
        y = rand() % n;
    } while (!judgeInsert(x,y));
    val = (rand() % 2 + 1)*2;
    board[x][y] = val;
 
}
 
void Game_2048::inputOp()
{
    cin >> op;
}
void Game_2048::reSize()
{
    cout << "请输入棋盘大小m*n\n";
    cin >> m >> n;
    Game_2048();
}
 
Game_2048::~Game_2048()
{
}
 
Game_2048::Game_2048()
{
    for (int i = 0; i < n; i++){
        row.push_back(0);
    }
    for (int i = 0; i < m; i++){
        board.push_back(row);
    }
}

bool Game_2048::ifFull()
{
	for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
        	if (board[i][j] == 0) {
        		return false;
			}
        }
    return true;
}

void Game_2048::printBoard()
{
    cout << "\n--------------\n";
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << board[i][j];
            if (j < n-1)
            {
                cout << "―";
            }
            if (j == n-1 && i < m-1)
            {
                cout << endl;
                int count = 0;
                while (count++ < n-1)
                {
                    cout << "|  ";
                }
                cout << "|" << endl;
            }
        }
    }
 
    cout << "\n--------------\n" ;
}

相关推荐

  1. 首发】洛谷P2678 [NOIP2015 提高组] 跳石头

    2024-05-04 22:24:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-04 22:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-04 22:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-04 22:24:02       82 阅读
  4. Python语言-面向对象

    2024-05-04 22:24:02       91 阅读

热门阅读

  1. Django框架之模板层

    2024-05-04 22:24:02       23 阅读
  2. leetcode39-Combination Sum

    2024-05-04 22:24:02       33 阅读
  3. 深入浅出 iptables - Linux下的强大防火墙工具

    2024-05-04 22:24:02       37 阅读
  4. 大模型+低代码平台

    2024-05-04 22:24:02       33 阅读
  5. 2024年目标检测数据集大合集所有下载地址汇总

    2024-05-04 22:24:02       169 阅读
  6. SpringBoot camunda

    2024-05-04 22:24:02       30 阅读
  7. 算法:状态压缩dp

    2024-05-04 22:24:02       112 阅读
  8. 什么是CI/CD流水线

    2024-05-04 22:24:02       28 阅读
  9. windows ubuntu:sed,awk,grep篇:5.sed 附加命令

    2024-05-04 22:24:02       28 阅读