2017-09-16 155 views
-1

游戏规则如下:编写一个程序,允许一定数量的玩家执行一定数量的掷骰子。让程序计算每个玩家的总和并打印出胜出者(总和最大者)。如果两个或两个以上的玩家有相同的总和,胜者就是那个投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。

+0

看着'std :: vector'来存储所有的掷骰子。然后你可以计算该向量中的6,并计算向量中所有元素的和。 – Carl

+2

你可以在'throws = rand()%6 + 1;'行后面输出'throws'的值来显示抛出的数字。而且你也可以使用一个计数器来跟踪每个玩家的6秒。 –

回答

2

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

基本上这里发生的事情是,我制作了一个名为playerThrows的矢量矢量,其中包含了每个玩家的投掷矢量。这样你可以跟踪每个玩家的每一个投掷。然后,当你通过numberOfPlayers循环时,我在playerThrows中放置了一个新的向量,并且对于每次投掷,我将一个值推回到该向量的投掷。

然后,在所有投掷完成后。我通过调用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" << "\n\n"; 
    } 

    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" << "\n\n"; 
    } 

    return 0; 
} 
+0

我知道,但它们在原始示例中使用,所以我将它们留在那里以便不完全重写他的代码,但只需添加他所缺少的内容。正如我所说的,我会用''和''代替C头。 – Carl

+0

已更新为不使用命名空间+仅C++头文件的版本。 – Carl

+0

谢谢。如果初学者看到尽可能多的idomatic C++会更好,因为许多课程都是通过类来教C的。 – tambre

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 

最后,您可以通过播放器阵列循环和检查谁赢得了比赛,也多6的每个玩家的情况下怎么过平等。

+0

这里不需要手动动态分配,使用C库时不安全且不必要。在这个例子中,你还必须记住''删除[]'后面的球员。在你的结构中,你可能应该在'sum'和'numSix'中使用类内初始值设定项,使它们的默认值为0. – Carl

+0

好点,增加了默认构造函数。 当然,使用std :: vector更容易。但取决于默认的容量和数量,使用std :: vector的播放器和引擎会导致多次重新分配内存,并且您无法获得最大的性能。 – Auskennfuchs