0

Я делаю программу, чтобы перетасовать колоду карт и разобраться с двумя руками, но прямо сейчас нет выхода! Я прочесывал код для бесконечных циклов, но ничего не могу найти! Может кто-нибудь, пожалуйста, помогите мне?Нет вывода в программе?

// (Description in Word File) 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 
using namespace std; 

unsigned seed = time(0); // for use of rand() 

const int SUIT = 4; 
const int FACE = 13; 
const int HAND = 5; 

// A couple of reference arrays. 
const string SUITS[SUIT] = {" Hearts", " Diamonds", " Clubs", " Spades"}; 
const string FACES[FACE] = {"Ace of", "Two of", "Three of", 
          "Four of", "Five of", "Six of", "Seven of", 
          "Eight of", "Nine of", "Ten of", 
          "Jack of", "Queen of", "King of"}; 

// The reason that these functions are in Main is because 
// it gives me error 2065: undeclared identifier otherwise. 
void shuffle(string[][FACE]); 
void deal(string[][FACE], string[HAND]); 
void displayDeck(string[][FACE]); 
void displayHand(string[HAND]); 

int main() 
{ 
    string deck[SUIT][FACE]; 
    string hand1[HAND]; 
    string hand2[HAND]; 

    srand(seed); // for use of rand() 

    // Shuffle the deck. 
    shuffle(deck); 

     // Now display the deck 
    displayDeck(deck); 

    // Deal for each hand. 
    deal(deck, hand1); 
    deal(deck, hand2); 

    // Now display each hand. 
    displayHand(hand1); 
    displayHand(hand2); 

    return 0; 
} 

// This function will keep track of face values 
// for the shuffle function 
bool duplCheck(string cards[][FACE], int suit, int face) 
{ 
    bool status = true; 
    for (int count1 = 0; count1 != SUIT; count1++) 
     for (int count2 = 0; count2 != FACE; count2++) 
      if (cards[count1][count2] == cards[suit][face] 
       && suit != count1 && face != count2) 
       return false; 
    return status; 
} 

// This function will shuffle the deck. 
void shuffle(string cards[][FACE]) 
{ 
    int randFace, randSuit; 
    // These loops will assign random face values 
    // and suits to each place in cards[][]. 
    for (int count1 = 0; count1 != SUIT; count1++) 
     for (int count2 = 0; count2 != FACE; count2++) 
     { 
      do 
      { 
       randFace = rand() % FACE; 
       randSuit = rand() % SUIT; 
       if (duplCheck(cards, randSuit, randFace) == true) 
        cards[count1][count2] = 
         FACES[randFace] + SUITS[randSuit]; 
      } while(duplCheck(cards, randSuit, randFace) == false); 
     } 
} 

// This function deals out a hand of five random cards. 
void deal(string cards[][FACE], string hand[HAND]) 
{ 
    for (int count = 0; count != HAND; count++) 
    { 
     // make random suit and face numbers 
     int randSuit = rand() % SUIT; 
     int randFace = rand() % FACE; 

     // If random card is not obsolete... 
     if (cards[randSuit][randFace] != "null") 
      // ...assign that card to hand. 
      hand[count] = cards[randSuit][randFace]; 

     // obsolete that card 
     cards[randSuit][randFace] = "null"; 
    } 
} 

void displayDeck(string cards[][FACE]) 
{ 
    std::cout << "\t\tThe Deck:\n\n"; 
    for (int count1 = 0; count1 != SUIT; count1++) 
     for (int count2 = 0; count2 != FACE; count2++) 
     { 
      std::cout << ((count1 * FACE) + count2 + 1) << " " 
       << cards[count1][count2] << endl; 
     } 
} 

void displayHand(string hand[HAND]) 
{ 

} 
+2

'displayHand' ничего не делает. Что вы ожидаете от этого? –

+0

Что делает «duplCheck» делать то, что вы называете это дважды в основной петле Shuffle? 30 секунд, добавление дополнительного вывода показывает, что здесь разрывается ваш код. http://ideone.com/BkZKD9 – kfsone

+0

Насколько я могу судить, вы никогда не выходите из 'shuffle' – Duck

ответ

2

Ваша проблема в перетасовке, в частности, при использовании duplCheck.

void shuffle(string cards[][FACE]) 
{ 
    int randFace, randSuit; 
    // These loops will assign random face values 
    // and suits to each place in cards[][]. 
    for (int count1 = 0; count1 != SUIT; count1++) 
     for (int count2 = 0; count2 != FACE; count2++) 
     { 
      do 
      { 
       randFace = rand() % FACE; 
       randSuit = rand() % SUIT; 
       std::cout << count1 << "," << count2 << " trying " << randFace << "/" << randSuit << std::endl; 
       if (duplCheck(cards, randSuit, randFace) == true) { 
        std::cout << "duplCheck returned true" << std::endl; 
        cards[count1][count2] = 
         FACES[randFace] + SUITS[randSuit]; 
       } 
      } while(duplCheck(cards, randSuit, randFace) == false); 
     } 
} 

Я добавил дополнительный выход. Это демонстрирует (http://ideone.com/BkZKD9), что duplCheck не возвращает false при первом запуске.

do 
{ 
    randFace = rand() % FACE; 
    randSuit = rand() % SUIT; 
    if (duplCheck(cards, randSuit, randFace) == true) { 
       ... this doesn't happen 
    } 
} while(duplCheck(cards, randSuit, randFace) == false); 

Поскольку duplCheck возвращает false, вы постоянно находитесь в этом цикле.

bool duplCheck(string cards[][FACE], int suit, int face) 
{ 
    bool status = true; 
    for (int count1 = 0; count1 != SUIT; count1++) 
     for (int count2 = 0; count2 != FACE; count2++) 
      if (cards[count1][count2] == cards[suit][face] 
       && suit != count1 && face != count2) 
       return false; 
    return status; 
} 

Оказывается, что duplCheck возвращает «ложь», если есть дубликат и «истина», если нет, но ваше использование его ожидает обратное: ваш цикл в то время останавливается, когда duplCheck возвращает истину, он ожидает duplCheck, чтобы вернуть true, если есть дубликат.

+0

Это не сработало, независимо от того, что я изменил. Думаю, я поменяю другой подход. – SoloMael

+0

Да, я понял другой путь. Мальчик, был этот проект боль! – SoloMael

0

Ваша функция отображения на дисплее пуста.

void displayHand(string hand[HAND]) 
{ 
    cout << "Put some output here"; 
} 
+0

Действительно, но не ответ. – kfsone

+0

Я хотел бы добавить его в качестве комментария, но у меня недостаточно репутации ... @kfsone – charlieparker

0

Проблема в том, что ваша колода изначально начинается с пустых значений (""). Вы можете заполнить это в начале, перед вызовом shuffle(), или вы можете добавить эту проверку в начало duplCheck():

if(cards[suit][face].length() == 0) 
    return true; 
Смежные вопросы