# 國立屏東大學電腦五子棋 AI 程式競賽 - 入門篇(解決亂數重複下子問題與判斷黑子白子) ## Table of Contents - [入門](#入門) - [亂數](#亂數) - [下子判斷](#下子判斷) ## 入門 在這一個章節,我們會告訴您如何讓您的程式符合比賽的資格,但您的程式仍不具備基本的棋力。 ### 亂數 最基礎的作法就是透過亂數的方式隨機將棋子下在棋盤上的任一個位置,但仍需注意下子位置上是否已存在其他棋子,否則就會造成「重複下子」。 在此範例中,我們採用時間函數的方式建立亂數種子,當然,您也可以利用某個變數的記憶體位址建立隨機亂數。請參考以下程式碼: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(int argc, char *argv[]){ char chessboard[19][19]; char letter_arr[19] = "ABCDEFGHIJKLMNOPQRS"; int row = 0, col = 0; srand(time(NULL)); row = rand()%19; col = rand()%19; printf("%c, %d\n", letter_arr[col], row+1); } ``` 編譯完成後輸入 `./a.out` 執行程式,您可以發現每一次輸出的內容都是不一樣的。以下為範例輸出: ```bash realtime@realtimedeMacBook-Pro Gomoku-Example % ./a.out R, 6 ``` ### 下子判斷 為了避免重複下子,您的程式必須判斷棋盤上已存在的棋子位置,並選擇空白的區域下子。請參考範例程式碼: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(int argc, char *argv[]){ char chessboard[19][19]; char letter_arr[19] = "ABCDEFGHIJKLMNOPQRS"; int i = 0, j = 0; int row = 0, col = 0; int quit = 0; for(i=0; i<19; i++){ for(j=0; j<19; j++){ scanf(" %c", &chessboard[i][j]); } } while(!quit){ srand(time(NULL)); row = rand()%19; col = rand()%19; if(chessboard[row][col] == '.'){ printf("%c, %d\n", letter_arr[col], row+1); quit = 1; } } } ``` 恭喜您成功完成一個可執行的五子棋程式!當然這個程式目前還沒有任何棋力。 您可以將此程式上傳至屏東大學資工系計算機網路中心,並且透過輸入語法 **gomoku | gomoku1 | gomoku2 yourProgram 棋子顏色**(e.g. `gomoku ./a.out Black`) 來測試您的程式是否可以正常運作,gomoku 、 gomoku1 、 gomoku2 分別代表著不同棋力的 AI。 ## 如何判斷黑子白子? ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main(int argc, char *argv[]){ char chessboard[19][19]; char letter_arr[19] = "ABCDEFGHIJKLMNOPQRS"; int i = 0, j = 0; int row = 0, col = 0; int quit = 0; for(i=0; i<19; i++){ for(j=0; j<19; j++){ scanf(" %c", &chessboard[i][j]); } } // 若是先攻的黑子,則下在棋盤中央。 if( strcmp(argv[1],"Black")==0){ printf("J, 10\n"); exit(0); } ... } ```