NO.21————三子棋遊戲
阿新 • • 發佈:2019-01-07
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
// 三子棋遊戲
// 1、列印棋盤(藉助二維陣列)
// 2、玩家落子(輸入座標)
// 3、判斷勝負情況
// 4、電腦落子(使用隨機數產生座標)
// 5、判斷勝負情況
// a、玩家獲勝
// b、電腦獲勝
// c、和棋
// d、遊戲未結束
char chess_borad[ROW][COL]; // 定義全域性變數
//選單函式
void menu()
{
printf("********************************************\n");
printf("歡迎您進入三子棋遊!\n");
printf("1、玩家先手\n");
printf("2、電腦先手\n");
printf("********************************************\n");
}
// 初始化
void init() { int row; int col; for (row = 0; row < ROW; row++) { for (col = 0; col < COL; col++) { chess_borad[row][col] = ' '; } } }
// 列印棋盤
void print_borad( )
{
int row;
int col=0;
for (row = 0; row < ROW; row++)
{
for (col = 0; col < COL; col++)
{
printf("| %c", chess_borad[row][col]);
}
printf("\n");
printf(" -- -- --\n");
}
}
// 玩家落子
void player_move() { int row; int col; printf("該您落子了,請輸入一個座標:"); while (1) { scanf("%d %d", &row, &col); if (row < 0 || row >= ROW || col < 0 || col >= COL || chess_borad[row][col] != ' ') //判斷玩家輸入座標是否合法 { printf("輸入有誤,請重新輸入:"); continue; } chess_borad[row][col] = 'X'; print_borad(chess_borad[row][col]); // 列印棋盤 break; } }
// 電腦落子
void computer_move()
{
int row;
int col;
while (1)
{
row = rand() % ROW;
col = rand() % COL;
if (chess_borad[row][col] != ' ')
{
continue;
}
chess_borad[row][col] = 'O';
printf("電腦已落子!\n");
print_borad(chess_borad[row][col]); // 列印棋盤
break;
}
}
// 判斷棋盤是否滿了
int Isfull()
{
int count = 0;
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL;col++)
if (chess_borad[row][col] != ' ')
count++;
}
if (count == 9)
return 2;
return 0;
}
// 判斷勝負
int judge_winner()
{
int row;
int col;
// 先判斷行
for (row = 0; row < ROW; row++)
{
if (chess_borad[row][0] == chess_borad[row][1] &&
chess_borad[row][0] == chess_borad[row][2] &&
chess_borad[row][0] != ' ')
return 1;
}
// 判斷列
for (col = 0; col < COL; col++)
{
if (chess_borad[0][col] == chess_borad[1][col] &&
chess_borad[0][col] == chess_borad[2][col] &&
chess_borad[0][col] != ' ')
return 1;
}
// 判斷對角線
if (chess_borad[0][0] == chess_borad[1][1] &&
chess_borad[0][0] == chess_borad[2][2] &&
chess_borad[0][0] != ' ')
return 1;
if (chess_borad[0][2] == chess_borad[1][1] &&
chess_borad[0][2] == chess_borad[2][0] &&
chess_borad[0][2] != ' ')
return 1;
return 0;
}
// 程式碼主體
int main()
{
int row = 0;
int col = 0;
int choice;
int winner = '\0';
menu(); // 呼叫menu函式,選擇玩家先手還是電腦先手
init();
print_borad(chess_borad[row][col]); // 列印棋盤
printf("請選擇你先手還是電腦先手:");
flag:
scanf("%d", &choice);
srand((unsigned)time(0)); // 設定隨機種子保證電腦每次落子是隨機的
while (1)
{
if (choice == 1)
{
player_move( ); // 玩家落子
winner = judge_winner(); // 判斷勝負
if (winner ==1)
{
printf("你贏了!\n");
print_borad(chess_borad[row][col]);
break;
}
winner = Isfull();
if (winner == 2)
{
printf("和棋,遊戲結束!\n");
print_borad(chess_borad[row][col]);
break;
}
system("cls");
computer_move(); // 電腦落子
winner = judge_winner();
if (winner ==1)
{
printf("你輸了!\n");
print_borad(chess_borad[row][col]);
break;
}
}
else if (choice == 2)
{
computer_move(); // 電腦落子
winner = judge_winner(); // 判斷勝負
if (winner == 1)
{
printf("你輸了!\n");
print_borad(chess_borad[row][col]);
break;
}
winner = Isfull();
if (winner == 2)
{
printf("和棋,遊戲結束!\n");
print_borad(chess_borad[row][col]);
break;
}
player_move(); // 玩家落子
winner = judge_winner();
if (winner == 1)
{
printf("你贏了!\n");
print_borad(chess_borad[row][col]);
break;
}
system("cls");
}
else if(choice !=1 &&choice!=2)
{
printf("輸入有誤,請重新輸入:");
goto flag;
break;
}
}
system("pause");
return 0;
}
執行結果:
1、和棋
2、玩家贏
3、電腦贏