21xrx.com
2024-12-22 22:26:23 Sunday
登录
文章检索 我的文章 写文章
C++实现取石子游戏
2023-06-22 02:06:10 深夜i     --     --
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++实现取石子游戏是一项很有趣且具有挑战性的工作。只有深入理解游戏规则,并逐一实现各个函数,才能编写出高效、可靠的游戏程序。

  
  

评论区

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