2012-01-13 107 views
1

我目前正在寫一個簡單的井字遊戲,這被證明不是那麼簡單(至少對我來說,我是一個初學者)。我無法寫這應打印像這樣的display_board功能:顯示板在井字遊戲

_|_|_ 
_|_|_ 
| | 

而且當玩家板標誌着一個特定的位置添加一個X或O。我打算做的是把這一切都放到一個字符串中,但這有點令人困惑,特別是我想添加的新行,所以電路板正常出來。一個新的直線運算符在一個字符串中算作一個還是兩個字符? 如果你想看看我的代碼進行比賽,那就是:

#include <stdio.h> 
#include <stdbool.h> 

int board[3][3] = { 
         {0, 0, 0}, 
         {0, 0, 0}, 
         {0, 0, 0} 
        }; 

int main (void) 
{ 
    int const user1 = 1; 
    int const user2 = 2; 
    char move[]; 

    while (! all_locations_filled()) { 
     printf("User-1, please enter your move:"); 
     scanf("%s", &move); 

     if(valid_location(move)) { 
      mark_location(user1, move); 
      display_board(); 
     else if(won_the_game(user1) { 
      printf("Congratulations User-1, You Won the Game!"); 
      break; 
     } 
     else { 
      printf("Invalid Move"); 
     } 
     } 
     printf("User-2, please enter your move:"); 
     scanf("%s", &move); 

     if(valid_location(move)) { 
      mark_location(user2, move); 
      display_board(); 
     else if(won_the_game(user2) { 
      printf("Congratulations User-2, You Won the Game!"); 
      break; 
     } 
     else { 
      printf("Invalid Move"); 
     } 
     } 
} 

bool valid_location(char str[]) { 
    if (str[] == "upperLeft" || str[] == "up" || str[] == "upperRight" || str[] == "left" || str[] == "center" || str[] == "right" || str[] == "lowerLeft" || str[] == "down" || str[] == "lowerRight") { 
     return true; 
    } 
} 

void mark_location(int userU, char str[]) { 
    if (str[] == "upperLeft") { 
     board[0][0] = userU; 
    else if (str[] == "up") { 
     board[0][1] = userU; 
    else if (str[] == "upperRight") { 
     board[0][2] = userU; 
    else if (str[] == "left") { 
     board[1][0] = userU; 
    else if (str[] == "center") { 
     board[1][1] = userU; 
    else if (str[] == "right") { 
     board[1][2] = userU; 
    else if (str[] == "lowerLeft") { 
     board[2][0] = userU; 
    else if (str[] == "down") { 
     board[2][1] = userU; 
    else if (str[] == "lowerRight") { 
     board [2][2] = userU; 
    } 
} 

它有點亂,因爲我說我太新本。如果您有任何建議要清理它,請隨時與我聯繫。

+0

當這個問題來了個CodeGolf.SE爲[Noughts and Crosses(aka Tic-Tac-Toe)](http://codegolf.stackexchange.com/q/1054/78),我用curses來控制顯示。這可能是你想要的更多支持,但它仍然是一個相當低的水平。 (看無版本的版本,BTW。) – dmckee 2012-01-13 21:37:54

回答

2

代碼中有很多錯誤。這裏有一些:

使用strcmp功能在C

str[] == "upperLeft"

比較字符串不是有效的C表達式。

同樣在此定義:

char move[]; 

不是有效的陣列的定義,它忽略了[]之間元件的數量。

此外

scanf("%s", &move); 

%s轉換規範需要一個指針到char作爲參數。 &move的值是一個指向數組的指針,而不是指向char的指針。調用函數這種方式來代替:

scanf("%s", move); 
0

一個新行,'\n'"\n",算作一個字符,即使最終端需要兩個字符輸出。 (在DOS/Windows中,這是通過CRT將\n轉換爲CRLF來實現的,而在Unix中,這是由TTY驅動程序完成的。)

1

嘗試循環遍歷行和列。 我不想寫答案給你,但像...

function print_board() 
    iterate over rows 
     iterate over columns 
      print board location 
      if this is not the third spot, print a vertical bar character 
     print a newline followed be a line of dashes followed by a newline 
2

使用strcmp功能在C

str[] == "upperLeft" 

比較字符串不是有效的C表達式。

同樣在此定義:

char move[]; 

不是有效的陣列的定義,它忽略了[]之間元件的數量。

此外,

scanf("%s", &move); 

%s轉換規範需要一個指針到char作爲參數。 &move的值是一個指向數組的指針,而不是指向char的指針。調用函數這種方式來代替:

scanf("%s", move); 
0

這是井字 無效板()printf函數 {

printf("\n\n\tTic Tac Toe\n\n"); 

printf("Player 1 (X) - Player 2 (O)\n\n\n"); 


printf("  |  |  \n"); 
printf(" %c | %c | %c \n", square[1], square[2], square[3]); 

printf("_____|_____|_____\n"); 
printf("  |  |  \n"); 

printf(" %c | %c | %c \n", square[4], square[5], square[6]); 

printf("_____|_____|_____\n"); 
printf("  |  |  \n"); 

printf(" %c | %c | %c \n", square[7], square[8], square[9]); 

printf("  |  |  \n\n"); 

}

+1

嘗試提供一些解釋,而不僅僅是代碼。 StackOverflow答案應該旨在[教導一個人釣魚](https://zh.wiktionary.org/wiki/give_a_man_a_fish_and_you_feed_him_for_a_day ;_teach_a_man_to_fish_and_you_feed_him_for_a_lifetime) – Adrian 2017-08-11 18:57:53