C/C++实现植物大战僵尸(PVZ)——打地鼠版
实现一个简化版的“植物大战僵尸:打地鼠版”需要我们创建基本的类和逻辑。以下是一个简单的C++实现示例。这个版本里,我们将采用一个控制台界面来模拟游戏过程。
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <thread>
#include <chrono>
#include <mutex>
#include <atomic>
using namespace std;
// 地鼠类
class Mole {
public:
bool isActive;
Mole() : isActive(false) {}
void appear() {
isActive = true;
}
void disappear() {
isActive = false;
}
};
// 游戏类
class MoleWhackingGame {
vector<Mole> board;
int score;
atomic<bool> running;
mutex mtx;
public:
MoleWhackingGame(int size) : board(size), score(0), running(true) {
srand(static_cast<unsigned int>(time(nullptr)));
}
void moleAppearanceLoop() {
while (running) {
unique_lock<mutex> lock(mtx);
int moleIndex = rand() % board.size();
board[moleIndex].appear();
lock.unlock();
// Moles stay visible for a random short duration
this_thread::sleep_for(chrono::milliseconds(300 + rand() % 700));
lock.lock();
board[moleIndex].disappear();
lock.unlock();
this_thread::sleep_for(chrono::milliseconds(200));
}
}
void play() {
thread moleThread(&MoleWhackingGame::moleAppearanceLoop, this);
char input;
while (running) {
displayBoard();
cout << "Enter the mole number to whack (q to quit): ";
cin >> input;
if (input == 'q') {
running = false;
} else {
int index = input - '0'; // Convert char to int
whackMole(index);
}
}
moleThread.join();
cout << "Game Over! Your score is: " << score << endl;
}
void whackMole(int index) {
if (index < 0 || index >= board.size()) {
cout << "Invalid selection!\n";
return;
}
lock_guard<mutex> lock(mtx);
if (board[index].isActive) {
board[index].disappear();
score++;
cout << "Hit! Score: " << score << "\n";
} else {
cout << "Miss!\n";
}
}
void displayBoard() {
lock_guard<mutex> lock(mtx);
for (int i = 0; i < board.size(); ++i) {
if (board[i].isActive) {
cout << '[' << i << "] ";
} else {
cout << "[ ] ";
}
}
cout << endl;
}
};
int main() {
MoleWhackingGame game(9);
game.play();
return 0;
}
解释
Mole 类: 表示每个地鼠对象。地鼠有一个
isActive
属性,表示地鼠是否出现。MoleWhackingGame 类:
- 包含一个
vector<Mole>
来表示地鼠板。 - 一个分数
score
来跟踪成功拍打地鼠的次数。 - 使用
std::thread
和std::mutex
来实现多线程,在后台随机出现地鼠。 play
方法控制游戏主循环,玩家可以通过输入数字来尝试打地鼠。
- 包含一个
运行逻辑:
moleAppearanceLoop
是后台线程,随机激活板上的地鼠并在短暂时间后隐藏。play
是游戏主管理函数,控制玩家输入和游戏进行。whackMole
检查玩家选择的位置是否有地鼠出现,并更新分数。
该游戏采用了C++多线程和基本的输入输出处理,适合初学者练习基本的类和线程管理。