C語言實現三子棋(通過陣列)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
- 建立一個全域性陣列
因為如果陣列大小變化,遊戲規則和實現思路都會有很大的變化,所以不進行巨集定義常量來定義陣列
char board[3][3];
int main()
{
do
{
int i = 0;
printf("1.Start the game\n");
printf("2.Quit the game\n");
printf("Please enter your options->");
scanf("%d", &i);
switch (i)
{
case 1:
game(); //game()函式為遊戲過程框架
break;
case 2:
return 0;
default:
printf("Input error,please enter again!\n");
break;
}
} while(1);
}
void game()
{
initBoard();
srand((unsigned)time(NULL)); //生成隨機種子,後面需要生成隨機座標
char temp = ' '; //定義一個字元變數,用於接收後面判斷函式返回值,用於決定遊戲勝負
do
{
printBoard(); //列印棋盤的函式
userPlay(); //玩家下棋的函式
temp = judge(); //判斷遊戲是否分出勝負
if (temp != ' ')
break;
robotPlay(); //電腦下棋的函式
temp = judge();
} while (temp == ' ');
printBoard();
switch (temp)
{
case '@':
printf("User WIN!\n");
break;
case '$':
printf("Bobot WIN!\n");
break;
case '*':
printf("Dogfall !\n");
break;
dafault:
break;
}
}
- 設計棋盤樣式
有興趣的可以搞的更加花裡胡哨,這裡草草了事,呸,簡單設計一下 哈
//##########
// | |
//_|_|_
// | |
//_|_|_
// | |
//##########
- 列印棋盤
重點就在這了,棋盤設計的再牛逼,也得能列印出來才行
這裡棋盤設計的比較簡易,列印起來也比較簡單,關鍵是思路要清晰
void printBoard()
{
printf("##########\n");
int i = 0,j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (j != 2)
{
printf("%c|",board[i][j]);
}
else
printf("%c\n",board[i][j]);
}
if (i != 2)
printf("_|_|_\n");
}
printf("##########\n");
}
- 玩家下棋
本人習慣用介面程式設計的座標系表示座標,因此下面賦值時橫座標和縱座標倒過來了
void userPlay()
{
printf("Please enter coordinates->");
int x = 0,y = 0;
while(1)
{
scanf("%d %d", &x, &y);
if (x > 0 && x < 4 && y > 0 && y < 4)
{
if (board[y - 1][x - 1] == ' ')
{
board[y - 1][x - 1] = '@';
break;
}
else
printf("There are chess pieces here,please enter again!->");
}
else
printf("Input error,please enter again!->");
}
}
- 電腦下棋
這裡關鍵是 要生成可行的座標,以及隨機數的生成
void robotPlay()
{
int i = 0, j = 0;
while (1)
{
i = rand() % 3;
j = rand() % 3;
if (board[i][j] == ' ')
{
board[i][j] = '$';
break;
}
}
}
- 判斷遊戲勝負
這裡就到了最難分析的一部分了
廢話不多說,直接看程式碼
char judge()
{
int i = 0, j = 0;
//判斷兩條對角線 對i j 的值不做帶動,所以放在前面
if (board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i + 2][j + 2] && board[i][j] != ' ')
return board[i][j];
if (board[i][j + 2] == board[i + 1][j + 1] && board[i][j + 2] == board[i + 2][j] && board[i][j] != ' ')
return board[i][j + 2];
//依次判斷三行、三列
for (i = 0,j = 0; j < 3; j++)
{
if (board[i][j] == board[i + 1][j] && board[i][j] == board[i + 2][j] && board[i][j] != ' ')
return board[i][j];
}
for (i = 0,j = 0; i < 3; i++)
{
if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] && board[i][j] != ' ')
return board[i][j];
}
//判斷棋盤是否滿了(平局)
for (i = 0; i < 3; i++)
{
for (j = 0;j < 3; j++)
{
if (board[i][j] == ' ')
return board[i][j];
}
}
//如果沒出現以上情況,隨便返回一個不同符號,使遊戲繼續進行
return '*';
}
原始碼連結(Github)