三子棋問題即在3 * 3的二維數組上下棋,只要有棋子在行、列或對角線連成一線即取得勝利。數組
可實現玩家與電腦對弈。ide
說明 :函數
(1)本遊戲玩家輸入的是棋盤的座標。this
(2)「X」表明玩家,「0」表明電腦。spa
(3)電腦下棋採用的是隨機數給出,大大增長了遊戲的隨機性。遊戲
#include<stdio.h> #include<stdlib.h> #include<time.h> char arr[3][3] = { 0 }; //直接定義外部變量全部的函數能夠直接使用 int size = 9; //棋盤大小固定 每下一個子都會使能夠下子的容量-1 void chessboard() //打印棋盤 { int i = 0,j = 0; printf(" | | \n"); for (i = 0; i < 3; i++) { printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);//棋盤對應位置下棋 if (i < 2) printf(" | | \n"); } } void player() //玩家下棋 { int m = 0, n = 0; printf("player(X):"); //輸入的是對應的座標 scanf("%d%d", &m,&n); //玩家輸入的座標必須在範圍內而且不能是被下過的地方 if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ') { printf("this place can not play!\n"); //若是不符合要求則繼續調用這個函數 player(); } else { arr[m - 1][n - 1] = 'X'; //將棋子放入相應的內容 棋盤容量-1 size--; } } void computer() //電腦下棋 { printf("computer(0):\n"); int m = 0, n = 0; srand(time(NULL)); //電腦的座標是隨機產生的 以時間爲種子 m = rand() % 3; //對3取餘產生0-2的隨機數賦給數組下標 n = rand() % 3; while (arr[m][n] != ' ') //若是產生的座標不符合要求則循環產生 (效率比較低) { m = rand() % 3; n = rand() % 3; } arr[m][n] = '0'; //操做後容量-1 size--; } int winner() //判斷獲勝者 { if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == 'X') || (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == 'X') || (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == 'X') || (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == 'X') || (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == 'X') || (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == 'X') || (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == 'X') || (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == 'X')) return 1; //玩家獲勝 else if((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '0') || (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '0') || (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '0') || (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '0') || (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '0') || (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '0') || (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '0') || (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '0')) return 0; //電腦獲勝 else if (size == 0) return -1; //平局 } int main() { int i = 0, j = 0; //將數組初始化爲空格 for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { arr[i][j] = ' '; } } while (1) //循環對弈直到一方獲勝或者平局 { chessboard(); //循環每次開始都打印棋盤 if (winner() == -1 || winner() == 0 || winner() == 1) { break; } player(); computer(); } if (winner() == 1) { printf("player win!\n"); } else if (winner() == 0) { printf("computer win!\n"); } else { printf("no one win!\n"); } system("pause"); return 0; }
本遊戲還有好多不足的地方,但願你們多提意見,我也會繼續改進的,但願會提升它的效率。it