Крэпс игра не возвращает правильные значения - PullRequest
0 голосов
/ 21 апреля 2011

Привет всем с тех пор, как я в последний раз нашел здесь крайнюю помощь, я снова задам вопрос

Мой код не возвращает правильные значения: что-то не так в функции play_game, и я не могу понять, что это такое. Я считаю, что все случаи покрыты, но каким-то образом они в итоге испортились также код не зацикливается каждый раз, когда я хочу сыграть в игру после того, как вторая игра остановится. это не задание

есть предложения?

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

static int sum, point, win = 0, roll = 0;    
bool play_game(void);
int roll_dice(void);

int main(void){

srand(time(NULL)); 


play_game();

char input[10];

do{ point = 0;
    play_game();
    if(win == 1){ // I'm assuming that play returns whether you won or not
        printf("You won!\n");
    }else{
        printf("You lost!\n");
    }
    printf("Would you like to continue? y/n\n");
    gets(input);
}while(*input == 'y'); // gets() flushes the buffer for next time you need input
return 0;
}


bool play_game(void){

point=0;
roll_dice();
printf("Your point is %d\n", sum);

while(roll == 1) /* first round */
{
  if(sum == 7 || sum == 11)
     return win = 1;
  else if(sum == 2 || sum == 3 || sum == 12)
     return win = 0;
  else if(sum == 1 || sum == 4 || sum == 5 || sum == 6 || sum == 8 || sum == 9 || sum    == 10){
     point=sum;
     roll_dice();
     }

}

while(roll > 1) /* all others rounds*/
{  
      if(sum == 7)
        return win = 0;
      else if(sum == point)
        return win = 1;
      else if(sum != point || sum != 7)
      roll_dice();

} 

}

int roll_dice(void){

int a,b;

a=1+rand() % (6);
b=1+rand() % (6);
sum=a+b;
roll++;
printf("You rolled %d\n", sum);
return sum;

}

OUTPUT

Ответы [ 5 ]

3 голосов
/ 21 апреля 2011

Пара моментов:

  • Возможно, вы хотите 1 + rand() % 6
  • Возвращаемое значение printf(), вероятно, не то, что вы хотите вернуть из roll_dice()
2 голосов
/ 21 апреля 2011

Цикл должен быть больше похож на:

main(){
    char input[10];

    do{
        score = 0; //Always initialize the score
        if(play_game()){ // I'm assuming that play returns whether you won or not
            printf("You won!\n");
        }else{
            printf("You lost!\n");
        }
        printf("Would you like to continue? y/n\n");
        gets_s(input, 9);
    }while(*input == 'y'); // gets() flushes the buffer for next time you need input
}
1 голос
/ 21 апреля 2011

Ответ Кайла очень хорош (как я вижу), но я могу заметить несколько проблем, надеюсь, это поможет вам в дальнейших случаях.

  • Ты всегда побеждаешь, и я знаю, что это хорошо, но держу пари, что это не ожидаемое поведение:

while(true) // This will always happen, because true is always evaluated as true
 {
  printf("Won\n\n");
  printf("Play again? y/n: ");
  break;
  }  

while(false) //This will never happen, since false is always evaluated as false
 {
  printf("Lost\n\n");
  printf("Play again? y/n: ");
  break;
  }

Я думаю, что вы хотели проверить результат play_game(). Поэтому добавьте еще одну переменную и проверьте ее:

bool win;
win = play_game();
while (win == true)
...
while (win == false)
...

  • Зачем использовать цикл while? в любом случае вы нарушаете его в первой итерации

if(win == true)
{
  printf("Won\n\n");
}  
else
{
  printf("Lost\n\n");
}
printf("Play again? y/n: ");

  • Игра будет выполняться не более двух раз, потому что у вас нет цикла, который зависит от ответа, а только оператор if, который оценивается только один раз:

if(v=getchar() == 'y') //This is the second time the code runs, after that? nada.
 {
  point =0; /* reset point var */
  play_game();
  }
 else if(v=getchar() == 'n') // Why adding this check? you're going out anyway after the if-else
  exit(1);

EDIT

Когда вы используете цикл while, вы делаете следующее:
Хотя (некоторое выражение в скобках) истинно, выполните код в блоке {..}, а затем снова проверьте выражение в скобках.

Если вы пишете while(true), вы на самом деле пишете while true is true, execute the code in the block. И это всегда будет происходить.
Если вы пишете while(false), вы на самом деле пишете while false is true, execute the code in the block. и эта ложь никогда не верна, тогда она никогда не выполнит код в блоке.
Если вы хотите получить реальное условие здесь, вы можете использовать while(play_game()). это похоже на запись while the returned value from the function play_game is true, execute the code in the block, и тогда код будет выполняться только тогда, когда функция play_game вернет true (что указывает на победу в игре).

Есть много хороших обучающих программ по C, начинайте с здесь или здесь

0 голосов
/ 27 апреля 2012

Бросок костей происходит в неправильных точках во время вашей игровой последовательности.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

// add defines to make states easier to read
#define WIN 1
#define LOSE 0

static int sum, point, win = 0, roll = 0;    
//bool play_game(void); 
int play_game(void); // changed return type to be int
int roll_dice(void);

int main(void){

    srand(time(NULL)); 


    // play_game(); // unncessary

    char input[10];

    do
    {
        point = 0;
        //play_game();
        // if(win == 1){
        if(play_game()){ // use return value from play_game()
            printf("You won!\n");
        }else{
            printf("You lost!\n");
        }
        printf("Would you like to continue? y/n\n");
        // gets(input);
        fgets(input, sizeof(input), stdin); // a safer input read
    } while(*input == 'y'); // gets() flushes the buffer for next time you need input
    return 0;
}


// bool play_game(void)
int play_game(void) // changed return type to be int
{

    point=0;
    // remove as this messes up the roll sequence.
    // roll_dice();
    // incorrect place to display this message
    //printf("Your point is %d\n", sum);

    // the while loop here is unnecessary
    //while(roll == 1) /* first round */
    //{
        roll_dice(); // add for initial come out roll.
        if(sum == 7 || sum == 11) { // I use braces to remove ambiguity
            // return win = 1;
            return WIN;
        } else if(sum == 2 || sum == 3 || sum == 12) {
            //return win = 0;
            return LOSE;
        }
        // sum will never be 1
        // on that note if it control reaches here it will be one of the other numbers.
        //} else if(sum == 1 || sum == 4 || sum == 5 || sum == 6 || sum == 8 || sum == 9 || sum == 10){
        // point=sum;
        // roll_dice(); // remove as this messes up the roll sequence.
        // }
        point=sum;
        printf("Your point is %d\n", sum);

    //}

    // while(roll > 1) /* all others rounds*/
    while (1) // might as well loop forever 
    {  
        roll_dice(); // add for subsequent dice rolls
        if(sum == 7) {
            //return win = 0;
            return LOSE;
        } else if(sum == point) {
            // return win = 1;
            return WIN;
        }
        // remove as this is unnecessary
        //  else if(sum != point || sum != 7)
        // remove as this messes up the roll sequence.
          //roll_dice();

    } 

}

int roll_dice(void){

    int a,b;

    a=1+rand() % (6);
    b=1+rand() % (6);
    sum=a+b;
    // roll++; // unncessary
    printf("You rolled %d\n", sum);
    return sum;

}
0 голосов
/ 21 апреля 2011

Трудно сказать по вашему описанию (скажите, что вы ожидали и что произошло вместо этого), но первое, что я заметил, это то, что вы бросаете 5-сторонние кости для a и b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...