2016-10-23 25 views
0

だから私は、プレイヤーに数字を選び、コンピュータが何を選んだのかを推測するかどうかを尋ねる小さな小さなゲームを構築しなければならなかった。それは2人のプレイヤーを持ち、それぞれが他のプレイヤーに自分のターンを渡すことができます。 私の教授がLinux OSを実行していて、それがうまくいけばそれは洗いだと言われています。私がcodeblocksでコードを実行すると、findは動作し、それがするべきことを正確に実行します。プレイヤーが通過して出力メッセージが表示され、ターンが切り替わります。私はLinuxサーバ上でコードを実行するとなぜこのプログラムのチャンクはLinuxではなくWindows上で動作しますか?

は、それは常に私はそれがのWindows上でコードブロックの上にそれを実行するとint turnInputNum = atoi(turnInput);

if(strcmp(turnInput, passValue) == 1)としてfalseを返す「PASS」以外の何かと動くようplayTurn()turnInputを評価しますそれはまさにそれがすべきことです。私がそれをコンパイルしたときに、私は何の警告も得ず、Linux自体は以前は本当に扱ったことのないOSです。そのコードを通過する理由はありますか?

  1. <0
  2. ==0
  3. >0

は特段==1ありません、そしてそれが安全かに移植することはできません。

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

struct player{ 
    int passNum; 
    int currentPassNum; 
    bool myTurn; 
}; 
    struct player player1; 
    struct player player2; 



    int turn = 1; //holds the games current turn 
    int input; //holds the number input by player to indicate which player it is 
    int RN; //holds Random Number 
    int actualNum = -1; //signals completion of game by ending while loop 

    void playTurn(void); 
int main() { 

    player1.currentPassNum = 0; 
    player1.passNum = 0; 
    player1.myTurn = true; 
    player2.currentPassNum = 0; 
    player2.passNum = 0; 
    player2.myTurn = false; 

    RN = generateRandom(); 


    while(RN != actualNum){ 
     printf("\nEnter Player Number: "); 
     scanf("%d", &input); 
     if(input == turn){ 
      playTurn(); 
      if(turn == 1 && player1.myTurn == false){ 
       turn = 2; 
      } 
      else{ 
       turn = 1; 
      } 
     } 
     else{ 
      printf("You have to wait your turn"); 
     } 

    } 



    return 0; 
} 

int generateRandom(){ 
    int n; 

    srand(time(NULL)); 

    n = rand() % 100 + 1; 

    return n; 
} 

void playTurn(){ 
    char turnInput[4]; 
    char passValue[4] = "PASS"; 
    int passes; 

    printf("Enter your guess: "); 
    scanf("%s", &turnInput); 
     if(strcmp(turnInput, passValue) == 1){ <---- not running when PASS 
      if(input == 1){ 
       if(player1.currentPassNum > 0){ 
       player1.currentPassNum = 0; 
       player1.myTurn == true; 
       printf("You may not pass!"); 
       return; 
       } 
       else{ 
       passes = player1.passNum; 
       player1.passNum = player1.passNum + 1; 
       player1.currentPassNum = 1; 
       player1.myTurn = false; 
       printf("Player 1 Passes to Player 2"); 
       return; 
       } 
      } 
      if(input == 2){ 
       if(player2.currentPassNum > 0){ 
       player2.currentPassNum = 0; 
       printf("You may not pass!"); 
       return; 
       } 
       else{ 
       passes = player2.passNum; 
       player2.passNum++; 
       player2.currentPassNum++; 
       printf("Player 2 Passes to Player 1"); 
       return; 

       } 
      } 
      if(passes > 3){ 
       printf("You can't pass anymore"); 
       return; 
      } 
     } 
     int turnInputNum = atoi(turnInput); <---- Jumping to here every time 
     if(turn == 1){ 
      player1.currentPassNum = 0; 
      player1.myTurn = false; 
     } 
     else{ 
      player2.currentPassNum = 0; 
      player1.myTurn = true; 
     } 
     if(turnInputNum > RN){ 
      printf("Too High"); 
      return; 
     } 
     if(turnInputNum < RN){ 
      printf("Too Low"); 
      return; 
     } 
     if(turnInputNum == RN){ 
      printf("CORRECT"); 
      actualNum = RN; 
      return; 
     } 

} 
+4

誰が 'if(strcmp(turnInput、passValue)== 1)'を使うと言ったのですか? 'strcmp'は' <0'、 '== 0'、'> 0'を扱います。リターンコード1の具体的な言及はありません。それは確かに安全で可搬性のある仮定ではありません。 – John3136

+0

'char passValue [4] =" PASS ";' - > 'char passValue [5] =" PASS ";' – BLUEPIXY

+0

@ John3136うまくいきました。これは文字通り私がCで書いた最初のプログラムであり、多くの機能が不明です。あなたが答えたら私はそれを正しいものとしてマークします –

答えて

3

strcmpは、3つの可能なリターンコードを持っていますあなたはsaできると思うy ==1。代わりに>0を使用してください。

これは実際には移植性と移植の問題のかなり良い例です。質問から明らかに==1はWindows上で動作しますが、そのコードをLinuxに移植して停止します。私は、Windows文書 "-1、0、1"か、それがうまく動作したと仮定しているかどうかはわかりませんが、OPが見つかったので、 "Gotcha !!"

関連する問題