提示信息

C/C++实现植物大战僵尸(PVZ)——打地鼠版

娇嗔 已关注

实现一个简化版的“植物大战僵尸:打地鼠版”需要我们创建基本的类和逻辑。以下是一个简单的C++实现示例。这个版本里,我们将采用一个控制台界面来模拟游戏过程。

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <thread>
  6. #include <chrono>
  7. #include <mutex>
  8. #include <atomic>
  9. using namespace std;
  10. // 地鼠类
  11. class Mole {
  12. public:
  13. bool isActive;
  14. Mole() : isActive(false) {}
  15. void appear() {
  16. isActive = true;
  17. }
  18. void disappear() {
  19. isActive = false;
  20. }
  21. };
  22. // 游戏类
  23. class MoleWhackingGame {
  24. vector<Mole> board;
  25. int score;
  26. atomic<bool> running;
  27. mutex mtx;
  28. public:
  29. MoleWhackingGame(int size) : board(size), score(0), running(true) {
  30. srand(static_cast<unsigned int>(time(nullptr)));
  31. }
  32. void moleAppearanceLoop() {
  33. while (running) {
  34. unique_lock<mutex> lock(mtx);
  35. int moleIndex = rand() % board.size();
  36. board[moleIndex].appear();
  37. lock.unlock();
  38. // Moles stay visible for a random short duration
  39. this_thread::sleep_for(chrono::milliseconds(300 + rand() % 700));
  40. lock.lock();
  41. board[moleIndex].disappear();
  42. lock.unlock();
  43. this_thread::sleep_for(chrono::milliseconds(200));
  44. }
  45. }
  46. void play() {
  47. thread moleThread(&MoleWhackingGame::moleAppearanceLoop, this);
  48. char input;
  49. while (running) {
  50. displayBoard();
  51. cout << "Enter the mole number to whack (q to quit): ";
  52. cin >> input;
  53. if (input == 'q') {
  54. running = false;
  55. } else {
  56. int index = input - '0'; // Convert char to int
  57. whackMole(index);
  58. }
  59. }
  60. moleThread.join();
  61. cout << "Game Over! Your score is: " << score << endl;
  62. }
  63. void whackMole(int index) {
  64. if (index < 0 || index >= board.size()) {
  65. cout << "Invalid selection!\n";
  66. return;
  67. }
  68. lock_guard<mutex> lock(mtx);
  69. if (board[index].isActive) {
  70. board[index].disappear();
  71. score++;
  72. cout << "Hit! Score: " << score << "\n";
  73. } else {
  74. cout << "Miss!\n";
  75. }
  76. }
  77. void displayBoard() {
  78. lock_guard<mutex> lock(mtx);
  79. for (int i = 0; i < board.size(); ++i) {
  80. if (board[i].isActive) {
  81. cout << '[' << i << "] ";
  82. } else {
  83. cout << "[ ] ";
  84. }
  85. }
  86. cout << endl;
  87. }
  88. };
  89. int main() {
  90. MoleWhackingGame game(9);
  91. game.play();
  92. return 0;
  93. }

解释

  1. Mole 类: 表示每个地鼠对象。地鼠有一个 isActive 属性,表示地鼠是否出现。

  2. MoleWhackingGame 类:

    • 包含一个 vector<Mole> 来表示地鼠板。
    • 一个分数 score 来跟踪成功拍打地鼠的次数。
    • 使用 std::threadstd::mutex 来实现多线程,在后台随机出现地鼠。
    • play 方法控制游戏主循环,玩家可以通过输入数字来尝试打地鼠。
  3. 运行逻辑:

    • moleAppearanceLoop 是后台线程,随机激活板上的地鼠并在短暂时间后隐藏。
    • play 是游戏主管理函数,控制玩家输入和游戏进行。
    • whackMole 检查玩家选择的位置是否有地鼠出现,并更新分数。

该游戏采用了C++多线程和基本的输入输出处理,适合初学者练习基本的类和线程管理。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
娇嗔 关注 已关注

最近一次登录:2024-11-19 20:19:15   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图