#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//ROW橫,COL豎
char g_broad[ROW][COL];
//棋盤3*3
void Init(char broad[ROW][COL]) {
for (int row = 0; row < ROW; ++row) {
for (int col = 0; col < COL; ++col){
broad[row][col] = ' ';
//指派操作
}
}
}
//棋盤函數
void Print(char broad[ROW][COL]) {
for (int row = 0; row < ROW; ++row) {
printf(" %c | %c | %c \n", broad[row][0], broad[row][1], broad[row][2]);
printf("---|---|---\n");
}
}
//玩家落子函數
void PlayerMove(char broad[ROW][COL]) {
printf("玩家落子!\n");
while (1) {
int row = 0;
int col = 0;
printf("請輸入一組坐标(row col):");
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROW || col<0 || col>COL) {
printf("您輸入的坐标非法!請重新輸入!\n");
continue;
}
if (broad[row][col] != ' ') {
printf("該位置已有子,請重新輸入!\n");
continue;
}
broad[row][col] = 'X';
break;
}
}
//電腦落子函數
void ComputerMove(char broad[ROW][COL]) {
printf("電腦落子!\n");
while(1) {
//1是真條件
//rand随機數
int row = rand() % ROW;
int col = rand() % COL;
if (broad[row][col] != ' ') {
//該位置被占用,重新生成随機數
continue;
}
broad[row][col] = '0';
break;
}
}
int IsFull(char broad[ROW][COL]) {
for(int row = 0; row < ROW; ++row) {
for (int col = 0; col < COL; ++col){
if (broad[row][col] == ' ') {
return 0;
}
}
}
return 1;
}
char CheckWinner(char broad[ROW][COL]) {
//先檢查所有行
for (int row = 0; row < ROW; ++row) {
if (broad[row][0] == broad[row][1]
&& broad[row][0] == broad[row][2]
&& broad[row][0] != ' ') {
return broad[row][0];
}
}
//檢查所有列
for (int col = 0; col < COL; ++col) {
if (broad[0][col] == broad[1][col]
&& broad[0][col] == broad[2][col]
&& broad[0][col] != ' ') {
return broad[0][col];
}
}
//檢查對角線
if (broad[0][0] == broad[1][1]
&& broad[0][0] == broad[2][2]
&& broad[0][0] != ' ') {
return broad[0][0];
}
if (broad[2][0] == broad[1][1]
&& broad[2][0] == broad[0][2]
&& broad[2][0] != ' ') {
return broad[2][0];
}
//判定是否和棋
if (IsFull(broad)) {
return'q';
}
return' ';
}
void Game() {
//1.先對棋盤進行初始化
Init(g_broad);
char Winner = ' ';
while (1) {
//2.列印棋盤(第一次列印的是空棋盤)
Print(g_broad);
//3.玩家落子,檢查遊戲是否結束
PlayerMove(g_broad);
//X玩家勝,O電腦勝,q和棋,‘ ’勝負未分。
if (Winner != ' ') {
break;
}
//4.電腦落子,檢查遊戲是否結束
ComputerMove(g_broad);
Winner = CheckWinner(g_broad);
if (Winner != ' ') {
break;
}
}
if (Winner == 'X') {
printf("玩家勝!\n");
}
else if (Winner == 'O') {
printf("電腦勝!\n");
}
else if (Winner == 'q') {
printf("和棋!\n");
}
else {
printf("程式出錯!\n");
}
}
int Menu() {
printf("************************\n");
printf("1.開始遊戲\n");
printf("0.退出遊戲\n");
printf("************************\n");
printf("請輸入您的選擇:");
int choice;
scanf("%d", &choice);
}
int main() {
//随機種子的設定,隻要程式啟動時,設定一次就行
srand((unsigned int)time(0));
while (1) {
int choice = Menu();
if (choice == 1) {
Game();
}
else {
printf("good bye!\n");
break;
}
}
system("pause");
return 0;
}