輸出初始棋盤,分為電腦和玩家輸入,輸入一次打印一次棋盤,判斷誰先三點一線完成誰贏最後輸出結果
#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(@):"); //輸入的是對應的坐標
scanf_s("%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] = '@'; //將棋子放入相應的內容 棋盤容量-1
size--;
}
}
void computer() //電腦下棋
{
printf("computer(#):\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] = '#'; //操作後容量-1
size--;
}
int winner() //判斷獲勝者
{ //雖然代碼多但是效率高 本來想采用函數比較考慮到效率太低就放棄了
if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '@') ||
(arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '@') ||
(arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '@') ||
(arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '@') ||
(arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '@') ||
(arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '@') ||
(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '@') ||
(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '@'))
return 1; //玩家獲勝
else if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '#') ||
(arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '#') ||
(arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '#') ||
(arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '#') ||
(arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '#') ||
(arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '#') ||
(arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '#') ||
(arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '#'))
return 0; //電腦獲勝
else if (size == 0)
return -1; //平局
else
return 2; //只是為了消除編譯的警告並無實際意義
}
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(); //每下一個子後都打印棋盤 然後就判斷又沒有人獲勝
chessboard();
if (winner() == -1 || winner() == 0 || winner() == 1)
{
break;
}
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;
}