简体   繁体   English

我的While循环不会停止

[英]My While Loop Won't Stop At Condition

I'm running a card game where both players take turns picking cards and the player goes forward that many number of spaces. 我正在运行一个纸牌游戏,其中两个玩家轮流捡纸牌,并且玩家前进了许多个空格。 In this case, once either player reaches the number 25 or greater, they've hit Home and the game is supposed to stop. 在这种情况下,一旦任一位玩家的数字达到25或更大,他们就会击中主屏幕,并且游戏应该停止。

//This is the function that plays the entire game
    void play(int size, int &player1, int &player2, int cardPile[], int board[]){
        displayRules();

        while(player1 < 25 || player2 < 25){
        cout << "\nPlayer 1's turn!" << endl;
        takeTurn(size, player1, cardPile, board, player2);
        showState(player1, player2);
        cout << "\nPlayer 2's turn!" << endl;
        takeTurn(size, player2, cardPile, board, player1);
        showState(player1, player2);
        }

    }

My while loop continues looping after both players have hit 25 even though I've set the conditions to loop while either player 1's value is less than 25 or player 2's value is less than 25. 即使我已经设置了要在玩家1的值小于25或玩家2的值小于25时循环的条件,我的while循环仍然在两个玩家都击中25之后继续循环。

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

void play(int size, int &player1, int &player2, int cardPile[], int board[]);
void displayRules();
int takeTurn(int size, int &player, int cardPile[], int board[], int &opposingPlayer);
int shuffleDeck(int size, int cardPile[]);
int switchPlaces(int &player, int &opposingPlayer);
int obstacles(int &player, int board[]);
void showState(int &player1, int &player2);
void youWin(int &player1, int &player2);


int main()
{
    const int size = 10;
    int board[] = {0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0};
    int cardPile[size] = {1, 1, 2, 2, 3, 3, 4, 4, 0, 5};
    int player1 = 0;
    int player2 = 0;

    play(size, player1, player2, cardPile, board);
    return 0;
}

//This is the function that plays the entire game
void play(int size, int &player1, int &player2, int cardPile[], int board[]){
    displayRules();

    while(player1 < 25 || player2 < 25){
    cout << "\nPlayer 1's turn!" << endl;
    takeTurn(size, player1, cardPile, board, player2);
    showState(player1, player2);
    cout << "\nPlayer 2's turn!" << endl;
    takeTurn(size, player2, cardPile, board, player1);
    showState(player1, player2);
    }

}

//This function does a single turn for each player
int takeTurn(int size, int &player, int cardPile[], int board[],int &opposingPlayer){
    shuffleDeck(size, cardPile);
    int i = 0;
    if(cardPile[i] == 0)
        cout << "You drew a Lose a turn card! You lose a turn!" << endl;

    else if(cardPile[i] == 5)
        cout << "You drew a Switch Places card! You must switch places with the other player!" << endl,
        switchPlaces(player, opposingPlayer);

    else
    cout << "You drew a " << cardPile[i] << "!";
        switch(cardPile[i]){
        case 1:
            cout << " Move forward " << cardPile[i] << " space on the board!" << endl;
            player += cardPile[i];
            obstacles(player, board);
            break;
        case 2:
            cout << " Move forward " << cardPile[i] << " spaces on the board!" << endl;
            player += cardPile[i];
            obstacles(player, board);
            break;
        case 3:
            cout << " Move forward " << cardPile[i] << " spaces on the board!" << endl;
            player += cardPile[i];
            obstacles(player, board);
            break;
        case 4:
            cout << " Move forward " << cardPile[i] << " spaces on the board!" << endl;
            player += cardPile[i];
            obstacles(player, board);
            break;

        }

}

//This function shuffles the deck of cards
int shuffleDeck(int size, int cardPile[]){

    srand(time(0));
    for(int i = 0; i < size; i++){
            int index = rand() % size;
            int temp = cardPile[i];
            cardPile[i] = cardPile[index];
            cardPile[index] = temp;
    }

}


//This is the function that tells a player when they have ran into an
//obstacle and moves them back the appropriate number of spaces
int obstacles(int &player, int board[]){
    if(player == 1)
        player -= 1,
        cout << "You ran into an obstacle! Move back 1 space!" << endl;
    else if(player == 4)
        player -= 1,
        cout << "You ran into an obstacle! Move back 1 space!" << endl;
    else if(player == 8)
        player -= 2,
        cout << "You ran into an obstacle! Move back 2 spaces!" << endl;
    else if(player == 12)
        player -= 3,
        cout << "You ran into an obstacle! Move back 3 spaces!" << endl;
    else if(player == 16)
        player -= 2,
        cout << "You ran into an obstacle! Move back 2 spaces!" << endl;
    else if(player == 20)
        player -= 1,
        cout << "You ran into an obstacle! Move back 1 space!" << endl;
}

Where did I go wrong with the while loop condition? while循环条件在哪里出错?

EDIT: Here is some output of one of the tests I ran. 编辑:这是我运行的测试之一的一些输出。

Welcome to GoHome! The main objective of this game is to reach Home first.
The basic rules of the game are as follows:

-To begin the player with the shortest name goes first.
-Each player picks a card that has a number on it and the player must moves forward that many number of spaces.
-If a card says 'Lose A Turn', the player does nothing and theturn moves to the next player.
-If a card says 'Switch Places', that player is allowed to switch places with any player on the board.
-If a player lands on an obstacle, that player must move back that many number of spaces.
-If a player lands another obstacle while moving backwards, then it does not have to move backwards again.

0
0

Player 1's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 3 of the board.
Player 2 is at Start!


Player 2's turn!
You drew a 4! Move forward 4 spaces on the board!
You ran into an obstacle! Move back 1 space!

Player 1 is on spot 3 of the board.
Player 2 is on spot 3 of the board.

3
3

Player 1's turn!
You drew a 1! Move forward 1 space on the board!
You ran into an obstacle! Move back 1 space!

Player 1 is on spot 3 of the board.
Player 2 is on spot 3 of the board.


Player 2's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 3 of the board.
Player 2 is on spot 6 of the board.

3
6

Player 1's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 7 of the board.
Player 2 is on spot 6 of the board.


Player 2's turn!
You drew a 1! Move forward 1 space on the board!

Player 1 is on spot 7 of the board.
Player 2 is on spot 7 of the board.

7
7

Player 1's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 10 of the board.
Player 2 is on spot 7 of the board.


Player 2's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 10 of the board.
Player 2 is on spot 11 of the board.

10
11

Player 1's turn!
You drew a 1! Move forward 1 space on the board!

Player 1 is on spot 11 of the board.
Player 2 is on spot 11 of the board.


Player 2's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 11 of the board.
Player 2 is on spot 14 of the board.

11
14

Player 1's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 15 of the board.
Player 2 is on spot 14 of the board.


Player 2's turn!
You drew a 1! Move forward 1 space on the board!

Player 1 is on spot 15 of the board.
Player 2 is on spot 15 of the board.

15
15

Player 1's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 18 of the board.
Player 2 is on spot 15 of the board.


Player 2's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 18 of the board.
Player 2 is on spot 19 of the board.

18
19

Player 1's turn!
You drew a 1! Move forward 1 space on the board!

Player 1 is on spot 19 of the board.
Player 2 is on spot 19 of the board.


Player 2's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 19 of the board.
Player 2 is on spot 22 of the board.

19
22

Player 1's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 23 of the board.
Player 2 is on spot 22 of the board.


Player 2's turn!
You drew a 1! Move forward 1 space on the board!

Player 1 is on spot 23 of the board.
Player 2 is on spot 23 of the board.

23
23

Player 1's turn!
You drew a 3! Move forward 3 spaces on the board!

Player 1 is on spot 26 of the board.
Player 2 is on spot 23 of the board.


Player 2's turn!
You drew a 4! Move forward 4 spaces on the board!

Player 1 is on spot 26 of the board.
Player 2 is on spot 27 of the board.

Well, your condition says "while either player1 is less than 25, or player2 is less than 25, do the thing that it's in the loop". 好吧,您的条件为“当player1小于25或player2小于25时,请执行循环中的操作”。 But this is definitely not what you want. 但这绝对不是您想要的。 Simply changing: 只需更改:

while(player1 < 25 || player2 < 25){

to

while(player1 < 25 && player2 < 25){

Will do the work, I think. 我想会做的工作。

This is related to De Morgan's laws , from logic. 从逻辑上讲 ,这与德摩根定律有关。

Also, keep in mind that for the program to terminate when either player reached 25, you have to ask after every turn, ie after each takeTurn call. 另外,请记住,要使程序在任一玩家达到25岁时终止,您必须在每个回合之后(即在每个takeTurn调用之后)询问。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM