骰子投掷问题

Dice Throwing Issue

本文关键字:问题      更新时间:2023-10-16

游戏的规则是这样的:编写一个程序,允许一定数量的玩家进行一定数量的骰子投掷。让程序计算每个球员的投掷和打印出获胜者的总和(最大的总和)。如果两个或更多球员的总和相同,那么获胜者是一个,他投掷了6个。

这是我到目前为止得到的:

#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
int main(){
srand(time(NULL));
int numberOfPlayers;
int numberOfThrows;
int sum = 0;
int throws = 0;
cout << "Enter the amount of players: "; cin >> numberOfPlayers;
cout << "How many throws does each one have?? "; cin >> numberOfThrows;
cout << endl;
for(int i = 1; i <= numberOfPlayers; i++){
    for(int j = 0; j < numberOfThrows; j++){
      throws = rand()%6+1;
      sum = sum + throws;
    }
    cout << "Sum of the player " << i << " is: " << sum;
    cout << endl;
    sum = 0;
}

  return 0;

}

我坚持在那个点上,我需要打印出一个人投掷的数字,总结每个玩家的投掷并扫描扔掉6的人。

这是使用std::vector和库countaccumulate算法的实现。

基本上,这里发生的事情是,我制作了一个名为Parlythrows的向量向量,该向量包含每个玩家的投掷向量。这样,您可以跟踪每个球员的每一场比赛。然后,当您循环浏览numberOfPlayers时,我在playerThrows中放置了一个新向量,每次投掷,我都会向throws的向量推回一个值。

然后,在进行了所有投掷之后。我通过调用accumulte算法找到所有投掷的总和。并使用count算法计数6的数量。您想做的事取决于您。对于此示例,我只是打印了值。

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <time.h>
#include <stdlib.h>
using namespace std;
int main() {
    // You should look into the <random> header rather than srand
    srand(time(NULL));
    int numberOfPlayers;
    int numberOfThrows;
    vector<vector<int>> playerThrows;
    cout << "Enter the amount of players: "; cin >> numberOfPlayers;
    cout << "How many throws does each one have?? "; cin >> numberOfThrows;
    cout << endl;
    // Do throws for each player
    for (int i = 0; i != numberOfPlayers; ++i) {
        playerThrows.emplace_back(vector<int>{}); // Make vector for player
        for (int j = 0; j < numberOfThrows; ++j)
            playerThrows[i].push_back(rand() % 6 + 1);
        // Find sum
        auto sum = accumulate(playerThrows[i].begin(), playerThrows[i].end(), 0);
        // Find 6's
        auto sixes = count(playerThrows[i].begin(), playerThrows[i].end(), 6);
        cout << "Sum of player " << i + 1 << " is: " << sum << 'n';
        cout << "They had " << sixes << " 6's" << "nn";
    }
    return 0;
}

您可能还需要考虑查看<random>标题以获取更好的随机数,而<chrono>进行计时。

根据评论中的要求。这是仅使用C 标头的版本:

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <random>
int main() {
    // Using <random> header
    std::random_device seeder {};
    std::mt19937 generator(seeder());
    std::uniform_int_distribution<int> diceGenerator(1, 6); 
    int numberOfPlayers;
    int numberOfThrows;
    std::vector<std::vector<int>> playerThrows;
    std::cout << "Enter the amount of players: ";
    std::cin >> numberOfPlayers;
    std::cout << "How many throws does each one have: ";
    std::cin >> numberOfThrows;
    std::cout << std::endl;
    // Do throws for each player
    for (int i = 0; i != numberOfPlayers; ++i) {
        playerThrows.emplace_back(std::vector<int>{}); // Make vector for player
        for (int j = 0; j < numberOfThrows; ++j)
            playerThrows[i].push_back(diceGenerator(generator));
        // Find sum
        auto sum = std::accumulate(playerThrows[i].begin(), playerThrows[i].end(), 0);
        // Find 6's
        auto sixes = std::count(playerThrows[i].begin(), playerThrows[i].end(), 6);
        std::cout << "Sum of player " << i + 1 << " is: " << sum << 'n';
        std::cout << "They had " << sixes << " 6's" << "nn";
    }
    return 0;
}

满足您需求的一种方法是为玩家创建一个结构,该结构可以存储他的投掷之和6的数量。

struct Player {
    int sum;
    int numSix;
    Player():sum(0),numSix(0){}
};

使用此结构,您可以创建一个大小为numberOfPlayers的数组。

auto players = new Player[numberOfPlayers];

在您的投掷循环中,将投掷添加到播放器中:

  throws = rand()%6+1;
  players[i].sum += throws;
  players[i].numSix += throws/6; //either 0 or 1 in case of 6

最后,您可以循环浏览玩家数组,并检查谁赢得了比赛,以及每个玩家在平等的情况下都有多少个玩家。