2017-12-10 11 views
0

私は、戦闘機1のために印刷された戦艦の地図を作ろうとしています。これは私が作ったコードです。2d戦艦ゲームの印刷方法

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define W '~' 
#define H '*' 
#define M 'm' 

#define C  'c' 
#define B  'b' 
#define R  'r' 
#define S  's' 
#define D  'd' 
typedef int boolean; 
enum {false,true}; 
typedef struct { 
int aim; 
char visuals; 
}Space; 
typedef struct{ 
int size; 
int type; 
}Ship; 
Space player1Side[10][10]; 
Space player2Side[10][10]; 
Ship s, *nS; 
int a, b; 
char l; 
void printBoard() { 
for (int x = 0; x < 10; x++) { 
    printf("   | "); 
    for (int y = 0; y < 10; y++) { 

     if (player1Side[x][y].aim != 0) { 
      printf("%c", player1Side[x][y].visuals); 
     } 
     else { 
      switch (player1Side[x][y].visuals) 
      { 
      case H: printf("%c", H); 
       break; 
      case M: printf("%c", M); 
       break; 
      case C: printf("%c", C); 
       break; 
      case B: printf("%c", B); 
       break; 
      case R: printf("%c", R); 
       break; 
      case S: printf("%c", S); 
       break; 
      case D: printf("%c", D); 
       break; 
      case W: 
      default: printf("%c", W); break; 
       break; 
      } 
     } 
      printf(" | "); 
     } 
     printf(" | | "); 
     for (int y = 10; y > 0; y--) { 
      if (player2Side[x][y].aim != 0) { 
       printf("%c", player2Side[x][y].visuals); 
      } 
      else { 
       switch (player2Side[x][y].visuals) 
       { 
       case H: printf("%c", H); 
        break; 
       case M: printf("%c", M); 
        break; 
       default: printf("%c", W); break; 
        break; 
       } 



      } 
      printf(" | "); 
     } 
     printf("%d \n", x + 1); 
    } 
printf("   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |\n"); 
printf("      Player's board        
Computer's board\n"); 
} 
void placeShips() { 
printf("Start placing the ships by specifying what orientation ('h' for horizontal and 'v' for vertical) ship you wish to place, then putting the coordinates of where you wish to place it. 'c' for aircraft Carrier, 'd' for Destroyer, 'r' for Cruser, 's' for Submarine, and 'b' for BATTLESHIP.\n"); 
int *x = &a; 
int *y = &b; 
int c = 0; 
char *i = &l; 
Ship *nS = &s; 
boolean isVert; 
    while(c < 1) { 
     isVert = false; 
     scanf("%c %c", &i, &nS->type); 
     if (l == 'v') { 
      isVert = true; 
     } 
     switch (s.type) 
     { 
     case C: 
      s.size = 5; 
      break; 
     case B: 
      s.size = 4; 
      break; 
     case R: 
      s.size = 3; 
      break; 
     case S: 
      s.size = 3; 
      break; 
     case D: 
      s.size = 2; 
      break; 
     default: 
      break; 
     } 
     scanf("%d %d", &x, &y); 
     if (a - 1 >= 10 || b - 1 >= 10 || (a + s.size >= 10 && isVert!=true) || (a + s.size >= 10 && isVert == true)){ 
      printf("That is out of bounds. please try again\n"); 
      placeShips(); 
      break; 
     } 
     else { 
      for (int i = s.size; i > 0; i--) { 
       if (isVert!= true) { 
        player1Side[a + i - 1][b].visuals = &nS->type; 
       } 
       else { 
        player1Side[a][b + i - 1].visuals = &nS->type; 
       } 
      } 

     } 
     c++; 
    } 
    } 
    void cpuPlaceShips() { 




    } 
    boolean checkWinner() { 

return true; 


} 

main() { 

    for (int x = 0; x < 10;x++) { 
     for (int y = 0; y < 10;y++) { 
     player1Side[x][y].aim = 0; 
     player2Side[x][y].aim = 0; 
     player1Side[x][y].visuals = '~'; 
     player2Side[x][y].visuals = '~'; 
    } 
    } 
    printBoard(); 
    placeShips(); 
    printBoard(); 
    system("pause"); 


    } 

私はそれを実行すると、入力された座標で船のシンボルを得ることを期待します。代わりに、私はこれを取得します。 result of

これは本当に迷惑で、何時間も私を悩ませています。誰でも助けてくれますか?私は本当にそれを感謝します。あなたが次にいくつかのポインタの混乱があるtypeは、構造体のcharなくint

typedef struct{ 
    int size; 
    char type; // <== not int 
} Ship; 

であることを考慮すべきであると思われるコードを見てみると

+0

コードをレンダリングする必要があると思われる方法の同様のマップを提供することをお勧めします。 – Alan

+0

コードの重要な部分が欠落しています。 –

+0

@RingØそれを教えてくれてありがとう。私はコードの重要な部分を追加するためにそれを編集しました。私はこれが私のコードで解決策を見つけるのに役立つことを願っています。 – JBoi

答えて

1

placeShips

while(c < 1) { 
    isVert = false; 
    scanf("%c %c", i, &nS->type); // <== not &i 

と FYI

player1Side[a + i - 1][b].visuals = nS->type; // <== not & 
} 
else { 
    player1Side[a][b + i - 1].visuals = nS->type; // <== not & 

ため

scanf("%d %d", x, y); // <== not &x &y 

後でスイッチの後には、

をやって直接pない&pのscanf使用されているので

は、zアドレスにpポイントになります。

これらを固定すると、ボードの外観がよくなります。

+0

ありがとうございます。あなたは信じられないほどの金額を助けました。 – JBoi

+1

ああ、申し訳ありません。私はこの光景に新しいです^^ " – JBoi

関連する問題