21xrx.com
2024-12-22 22:09:42 Sunday
登录
文章检索 我的文章 写文章
C++ 2048 游戏源代码
2023-07-05 09:19:14 深夜i     --     --
C++ 2048 游戏 源代码 编程

2021年C++ 2048游戏源代码

2048游戏是一个非常受欢迎的休闲益智游戏,它的规则非常简单:滑动方块来合并它们,直到达到2048。如今,2048游戏已经成为一个流行的编程练手项目,甚至在面试中也会被用来测试一个人的编程技能。因此,我们提供给大家一个使用C++编写的2048游戏源代码,帮助大家加深C++编程和算法的理解。

代码

#include

#include

#include

using namespace std;

const int ROWS = 4;

const int COLS = 4;

class Game2048 {

private:

  int board[ROWS][COLS];

public:

  Game2048();

  void play();

  bool move(int, int);

  void generateRandomTile();

  void printBoard();

  bool isGameOver();

};

Game2048::Game2048() {

  srand(time(NULL));

  for(int i=0; i

    for(int j=0; j

      board[i][j] = 0;

    }

  }

  generateRandomTile();

  generateRandomTile();

  printBoard();

}

void Game2048::play() {

  char ch;

  bool gameOver = false;

  do {

    cin >> ch;

    switch(ch) {

      case 'w':

        gameOver = move(-1, 0);

        break;

      case 's':

        gameOver = move(1, 0);

        break;

      case 'a':

        gameOver = move(0, -1);

        break;

      case 'd':

        gameOver = move(0, 1);

        break;

      default:

        cout << "Invalid move!" << endl;

    }

    if(!gameOver) {

      generateRandomTile();

      printBoard();

    }

  } while(!gameOver);

  cout << "Game over!" << endl; 

}

bool Game2048::move(int rowOffset, int colOffset) {

  bool moved = false;

  if(rowOffset != 0) {

    for(int j=0; j

      for(int i=(rowOffset == -1 ? 1 : ROWS-2);

          rowOffset == -1 ? i =0; i-=rowOffset) {

        if(board[i][j] != 0) {

          int curIndex = i;

          while(curIndex+rowOffset>=0 && curIndex+rowOffset

              board[curIndex+rowOffset][j]==0) {

            swap(board[curIndex][j], board[curIndex+rowOffset][j]);

            curIndex += rowOffset;

            moved = true;

          }

          if(curIndex+rowOffset>=0 && curIndex+rowOffset

              board[curIndex+rowOffset][j] == board[curIndex][j]) {

            board[curIndex+rowOffset][j] *= 2;

            board[curIndex][j] = 0;

            moved = true;

          }

        }

      }

    }

  } else {

    for(int i=0; i

      for(int j=(colOffset == -1 ? 1 : COLS-2);

          colOffset == -1 ? j =0; j-=colOffset) {

        if(board[i][j] != 0) {

          int curIndex = j;

          while(curIndex+colOffset>=0 && curIndex+colOffset

              board[i][curIndex+colOffset]==0) {

            swap(board[i][curIndex], board[i][curIndex+colOffset]);

            curIndex += colOffset;

            moved = true;

          }

          if(curIndex+colOffset>=0 && curIndex+colOffset

              board[i][curIndex+colOffset] == board[i][curIndex]) {

            board[i][curIndex+colOffset] *= 2;

            board[i][curIndex] = 0;

            moved = true;

          }

        }

      }

    }

  }

  return moved;

}

void Game2048::generateRandomTile() {

  int emptyTiles = 0;

  for(int i=0; i

    for(int j=0; j

      if(board[i][j] == 0) {

        emptyTiles++;

      }

    }

  }

  if(emptyTiles == 0)

    return;

  int randomIndex = rand() % emptyTiles;

  int count = 0;

  for(int i=0; i

    for(int j=0; j

      if(board[i][j] == 0) {

        if(count == randomIndex) {

          board[i][j] = (rand() % 2 + 1) * 2;

          return;

        }

        count++;

      }

    }

  }

}

void Game2048::printBoard() {

  cout << "-----------------------------" << endl;

  for(int i=0; i

    cout << "|";

    for(int j=0; j

      if(board[i][j] != 0) {

        printf("%4d |", board[i][j]);

      } else

        cout << "   |";

      |";

      }

    }

    cout << endl << "-----------------------------" << endl;

  }

}

bool Game2048::isGameOver() {

  for(int i=0; i

    for(int j=0; j

      if(board[i][j] == 0)

        return false;

      if((i-1>=0 && board[i-1][j]==board[i][j]) ||

          (i+1

          (j-1>=0 && board[i][j-1]==board[i][j]) ||

          (j+1 < p>

        return false;

    }

  }

  return true;

}

int main() {

  cout << "Welcome to the 2048 game!" << endl;

  cout << "Use the 'w', 'a', 's', and 'd' keys to move the tiles." << endl;

  cout << "Combine the tiles to get to 2048." << endl << endl;

  Game2048 game;

  game.play();

  return 0;

}

代码解释

这个程序是一个简单的面向对象程序,包含一个类“Game2048”,该类包含了所有与游戏逻辑相关的操作。主函数从类中创建一个游戏实例,然后调用play()函数开始游戏。

类“Game2048”具有以下方法:

- void move(int rowOffset, int colOffset):根据用户输入移动棋子。行偏移量是-1表示棋子向上移动,1表示向下移动。列偏移量是-1表示棋子向左移动,1表示向右移动。

- void generateRandomTile():在随机空格子中生成2或4。

- void printBoard():打印当前游戏板的状态。

- bool isGameOver():如果游戏板的所有位置都被填满,或者没有两个相邻的位置具有相同的值,则返回TRUE。

在主函数中,我们先输出游戏的一些规则和操作提示,然后创建游戏实例并调用play()函数,玩家可以通过wasd键移动所有的瓷砖,等到瓷砖合并到2048的时候就胜利了。

总结

这篇文章共享了一个简单的2048游戏的C++源代码,通过此代码我们可以了解C++的语法,理解面向对象编程的基本概念,还可以锻炼我们的算法实现能力。如果您正在学习C++开发,这是一个很好的入门练手项目。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复