首页 > 解决方案 > 卡牌游戏程序在进行中。不知道为什么我得到一个随机数-858993460

问题描述

几乎是为班级创建纸牌游戏。不是在寻找直接的答案,而是更好地了解我为什么会遇到问题的材料。感谢我能得到的任何帮助。继承人的问题:

使用struct数据结构创建一个名为flash card的纸牌游戏,每个玩家抽三张随机数(1-4)的牌,分别为钻石、黑桃、梅花和红心,另一组随机数为1-13。cardScore 被定义为最高(比如 cardScore = 100,三个 A (cardValue 1),然后是三个 Jacks(cardValue 11)(比如 cardScore 90),然后是三个 Kings(cardValue 13)(比如 cardScore =80)和然后是三个皇后(cardValue 12)(比如cardScore = 70)。除上述组合外,cardScore由每次抽奖的cardValue之和定义。三抽后得分最高的玩家获胜。显示抽出的牌由每个玩家和cardScore和获胜者

#include "pch.h"
#include <iostream>
#include <string>
#include <stdlib.h> 
#include <math.h>
using namespace std;
class Values
{
public:
    string cardFace;
    int cardValue;
    int cardFaceRng;
    int cardValueRng;
private:


};

//declaring functions
void setCardFaceRandom();
void setCardValueRandom();
void setCardFace();
void setCardValue();
int main()
{
    Values v;



    for (int i = 0; i < 3; i++) 
    {

        v.cardFaceRng = rand() % 3 + 1;
        v.cardValueRng = rand() % 14 + 1;
        //setCardFaceRandom();
        //setCardValueRandom();
        setCardFace();
        setCardValue();
            cout << v.cardFace << " " << v.cardValue << endl;
    }
    system("pause");
    return 0;
}

void setCardFace() {
    Values v;
        switch (v.cardFaceRng)
                            {
                                    case 0:
                                        v.cardFace = "Diamond";
                                        break;
                                    case 1:
                                        v.cardFace = "Spade";
                                        break;
                                    case 2:
                                        v.cardFace = "Club";
                                        break;
                                    case 3:
                                        v.cardFace = "Hearts";
                                        break;
                            }
        cout << v.cardFace;

}


void setCardValue() {
    Values v;
    switch (v.cardValueRng)
    {
    case 0:
        v.cardValue = 2;
        break;
    case 1:
        v.cardValue = 3;
        break;
    case 2:
        v.cardValue = 4;
        break;
    case 3:
        v.cardValue = 5;
        break;
    case 4:
        v.cardValue = 6;
        break;
    case 5:
        v.cardValue = 7;
        break;
    case 6:
        v.cardValue = 8;
        break;
    case 7:
        v.cardValue = 9;
        break;
    case 8:
        v.cardValue = 10;
        break;
    case 9:
        v.cardValue = 11;
        break;
    case 10:
        v.cardValue = 12;
        break;
    case 11:
        v.cardValue = 13;
        break;
    case 12:
        v.cardValue = 14;
        break;

    }
    cout << v.cardValue;

}


void setCardFaceRandom()

    {
        Values v;

             v.cardFaceRng = rand() % 3 + 1;

    }



    void setCardValueRandom()

    {
        Values v;

            v.cardValueRng = rand() % 14 + 1;

    }

标签: c++

解决方案


仅使用其中一个函数作为示例。所有函数都有相同的问题:

void setCardFace() {
Values v;
    switch (v.cardFaceRng)

这将在此函数中创建一个名为 的新局部变量v,并默认构造它。由于Values该类没有显式构造函数,因此所有类成员都是默认构造的,并且对于int此类的成员,它们不会被初始化为任何内容。他们是随机垃圾。所以这v.cardFaceRng是随机垃圾,从这一点开始,它是未定义的行为。

v此函数中的对象setCardFace()v您在main(). 在函数内部声明的所有对象都是该函数的局部对象,仅存在于该函数中,并在函数返回时被销毁;并且不同的函数可以有不同的本地对象,它们具有相同的名称,否则,彼此完全独立。

为了让这个setCardFace()类使用你在你的声明和初始化的对象main()——正如你明显的意图在这里——你需要将它作为参数显式传递给这个函数,以及你声明的所有其他函数——最好传递它引用。


推荐阅读