21xrx.com
2025-03-24 12:02:16 Monday
文章检索 我的文章 写文章
C++实现取石子游戏
2023-06-22 02:06:10 深夜i     13     0
C++ 取石子游戏 算法 遍历 逻辑思维

石子游戏是一个非常古老的策略游戏,它可以锻炼玩家的思维能力和逻辑思维能力。在这个游戏里,两个玩家轮流从一堆石子中拿出一定的个数,最终将整堆石子取光者获胜。

本文将使用C++语言实现一个简单的取石子游戏,让大家更好地了解游戏的规则和实现方法。

首先,我们需要定义一个游戏类,来表示整个游戏的状态和规则。在这个类中,我们需要定义如下的成员变量和成员函数:

class StoneGame {
private:
  int n; //石子的总个数
  int m; //每个玩家每次最多可以取的石子个数
  int turn; //轮到哪个玩家操作(1表示先手玩家,2表示后手玩家)
  int stones[1000]; //存储石子的数组
public:
  StoneGame(int n, int m); //构造函数,初始化石子的个数和每次可以取的石子数量
  void start(); //开始游戏
  void move(int k); //玩家取走k个石子
  bool checkWin(); //检查是否有玩家获胜
  void printStones(); //打印当前剩余石子的数量
};

在定义完这些成员变量和成员函数之后,我们需要依次实现它们的具体逻辑。下面逐一介绍实现方法。

1. 构造函数

构造函数主要负责初始化游戏的状态,即设置石子的总个数和每次可以取的石子数量。

StoneGame::StoneGame(int n, int m) {
  this->n = n;
  this->m = m;
  turn = 1;
  for (int i = 0; i < n; i++) {
    stones[i] = 1//初始化每个石子的数量为1,表示都没有被取走
  }
}

2. 开始游戏

开始游戏的函数中,我们需要轮流让两个玩家取走一定数量的石子,直到所有石子被取光为止。在每个玩家取石子之前,需要先打印出当前剩余石子的数量。

void StoneGame::start() {
  while (!checkWin()) {
    printStones(); //打印当前剩余石子的数量
    int k; //本次玩家要取走的石子数量
    cout << "轮到玩家" << turn << "操作,请输入要取走的石子数量:";
    cin >> k;
    move(k); //执行取石子的操作
    turn = (turn == 1 ? 2 : 1); //轮到下一个玩家操作
  }
  cout << "玩家" << (turn == 1 ? 2 : 1) << "获胜!" << endl;
}

3. 玩家取走k个石子

玩家取走k个石子的函数中,我们需要判断玩家是否有资格取走这些石子,即判断当前剩余石子的数量是否足够。如果不够,就提示玩家重新输入数量。如果玩家取走了k个石子,就将这些石子从数组中删除。

void StoneGame::move(int k) {
  if (k > m || k > n)  //判断玩家是否有资格取走这些石子
    cout << "您输入的石子数量不符合规定
  for (int i = 0; i < k; i++) {
    int j;
    do {
      j = rand() % n; //随机选取一颗石子
    } while (stones[j] == 0); //如果这颗石子已经被取走了,就继续选取下一颗石子
    stones[j] = 0; //将这颗石子从数组中删除
  }
}

4. 检查是否有玩家获胜

检查是否有玩家获胜的函数中,我们需要判断剩余石子的数量是否为0。如果为0,就返回`true`,表示游戏已经结束了。

bool StoneGame::checkWin() {
  for (int i = 0; i < n; i++) {
    if (stones[i] != 0)
      return false;
    
  }
  return true;
}

5. 打印当前剩余石子的数量

打印当前剩余石子的数量的函数中,我们需要遍历整个石子数组,统计剩余石子的数量,并将其打印输出。

void StoneGame::printStones() {
  cout << "当前剩余石子的数量为:";
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    if (stones[i] != 0) {
      cnt++;
    }
  }
  cout << cnt << endl;
}

完整的C++代码如下:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class StoneGame {
private:
  int n; //石子的总个数
  int m; //每个玩家每次最多可以取的石子个数
  int turn; //轮到哪个玩家操作(1表示先手玩家,2表示后手玩家)
  int stones[1000]; //存储石子的数组
public:
  StoneGame(int n, int m); //构造函数,初始化石子的个数和每次可以取的石子数量
  void start(); //开始游戏
  void move(int k); //玩家取走k个石子
  bool checkWin(); //检查是否有玩家获胜
  void printStones(); //打印当前剩余石子的数量
};
StoneGame::StoneGame(int n, int m) {
  this->n = n;
  this->m = m;
  turn = 1;
  for (int i = 0; i < n; i++) {
    stones[i] = 1//初始化每个石子的数量为1,表示都没有被取走
  }
}
void StoneGame::start() {
  while (!checkWin()) {
    printStones(); //打印当前剩余石子的数量
    int k; //本次玩家要取走的石子数量
    cout << "轮到玩家" << turn << "操作,请输入要取走的石子数量:";
    cin >> k;
    move(k); //执行取石子的操作
    turn = (turn == 1 ? 2 : 1); //轮到下一个玩家操作
  }
  cout << "玩家" << (turn == 1 ? 2 : 1) << "获胜!" << endl;
}
void StoneGame::move(int k) {
  if (k > m || k > n)  //判断玩家是否有资格取走这些石子
    cout << "您输入的石子数量不符合规定
  for (int i = 0; i < k; i++) {
    int j;
    do {
      j = rand() % n; //随机选取一颗石子
    } while (stones[j] == 0); //如果这颗石子已经被取走了,就继续选取下一颗石子
    stones[j] = 0; //将这颗石子从数组中删除
  }
}
bool StoneGame::checkWin() {
  for (int i = 0; i < n; i++) {
    if (stones[i] != 0)
      return false;
    
  }
  return true;
}
void StoneGame::printStones() {
  cout << "当前剩余石子的数量为:";
  int cnt = 0;
  for (int i = 0; i < n; i++) {
    if (stones[i] != 0) {
      cnt++;
    }
  }
  cout << cnt << endl;
}
int main() {
  srand(time(NULL));
  StoneGame game(10, 3);
  game.start();
  return 0;
}

在定义好游戏类和相关函数之后,我们可以通过调用`start()`函数来开始游戏,并在屏幕上查看程序的输出结果。

总体而言,使用C++实现取石子游戏是一项很有趣且具有挑战性的工作。只有深入理解游戏规则,并逐一实现各个函数,才能编写出高效、可靠的游戏程序。

  
  

评论区