三子棋小游戲
設計思路:
創建一個3*3的二維陣列,每個元素都是一個char型別
- 創建棋盤,并且初始化棋盤,把棋盤所有位置都設定成空格;
- 列印空白棋盤;
- 玩家落子,讓玩家輸入一組坐標(行row,列col);
- 判斷輸贏;
- 電腦落子,電腦隨機生成一組坐標,進行隨機落子;
- 判斷輸贏;
代碼實作
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//1.創建棋盤
//棋盤初始化
void init(char ChessBoard[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for(int col=0;col<MAX_COL;col++){
ChessBoard[row][col] = ' ';
}
}
}
//2.列印棋盤
void Print(char ChessBoard[MAX_ROW][MAX_COL]) {
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++) {
printf("|");
for (int col = 0; col < MAX_COL; col++) {
printf(" %c |", ChessBoard[row][col]);
}
printf("\n+---+---+---+\n");
}
}
//3.玩家落子
void PlayerMove(char ChessBoard[MAX_ROW][MAX_COL]) {
printf("玩家開始落子.....\n\n");
while (1) {
int row = 0;
int col = 0;
printf("請輸入一組坐標(row,col):");//(row,col)相當于(y,x)
scanf("%d %d", &row, &col);
if (row < 0 || row >= MAX_ROW || col<0 || col>MAX_COL) {
printf("您的輸入越界,請重新輸入!\n");
continue;
}
if (ChessBoard[row][col] != ' ') {
printf("您輸入的地方已被占用,請重新輸入!\n");
continue;
}
ChessBoard[row][col] = 'x';
break;
}
}
void ComputerMove(char ChessBoard[MAX_ROW][MAX_COL]) {
srand((unsigned int)time(0));
while (1) {
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (ChessBoard[row][col] != ' ') { //表示此處位置已經被占用
continue;
}
ChessBoard[row][col] = 'o';
break;
}
}
int isFull(char ChessBoard[MAX_ROW][MAX_COL]) { //遍歷棋盤,看有無空格
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
if (ChessBoard[row][col] == ' ') {
return 0; //回傳0則表示 棋盤沒滿
}
}
}
return 1;//回傳1則表示 棋盤已滿
}
char isOver(char ChessBoard[MAX_ROW][MAX_COL]) {
//掃描所有的行
for (int row = 0; row < MAX_ROW; row++) {
if (ChessBoard[row][0] != ' ' && ChessBoard[row][0] == ChessBoard[row][1]
&& ChessBoard[row][0] == ChessBoard[row][2]) {
return ChessBoard[row][0];
}
}
//掃描所有的列
for (int col = 0; col < MAX_COL; col++) {
if (ChessBoard[0][col] != ' ' && ChessBoard[0][col] == ChessBoard[1][col]
&& ChessBoard[0][col] == ChessBoard[2][col]) {
return ChessBoard[0][col];
}
}
//掃描對角線 1
if (ChessBoard[0][0] != ' ' && ChessBoard[0][0] == ChessBoard[1][1]
&& ChessBoard[0][0] && ChessBoard[2][2]) {
return ChessBoard[0][0];
}
//掃描對角線 2
if (ChessBoard[0][2] != ' ' && ChessBoard[0][2] == ChessBoard[1][1]
&& ChessBoard[0][2] == ChessBoard[2][0]) {
return ChessBoard[0][2];
}
if (isFull(ChessBoard)) {
return 'h'; //和棋
}
return ' ';
}
int main() {
char ChessBoard[MAX_ROW][MAX_COL];
init(ChessBoard);//1.棋盤初始化
char winner = ' ';
while (1) {
system("cls");
Print(ChessBoard);//2.列印棋盤
PlayerMove(ChessBoard);//3.玩家落子
Print(ChessBoard);
winner = isOver(ChessBoard);
if (winner != ' ') {
break;
}
ComputerMove(ChessBoard);//4.電腦落子
winner = isOver(ChessBoard);
if (winner != ' ') {
break;
}
}
if (winner == 'x') {
printf("恭喜你 贏了!\n");
}
else if (winner == 'o') {
printf("很遺憾,你失敗了\n");
}
else {
printf("平局!\n");
}
system("pause");
return 0;
}
代碼剖析:
1.初始化棋盤,把棋盤所有位置都設定成空格; init函式實作

2. 列印棋盤; Print函式實作

3. 玩家落子;PlayerMove函式實作

4.(1) 判斷游戲是否結束; isOver函式
(2)判斷是否平局;isFull函式

5. 電腦隨機落子;ComputerMove函式

輸出示例:

將各個函式在主函式中正確呼叫即可!為了游戲體驗感,不要忘了清屏和最侄訓勝結果的呈現哦~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280564.html
標籤:其他
上一篇:js關于所有回圈的邏輯練習題(供初學者內部消化)-----------------系列文章(一)
下一篇:C語言人機大戰之決戰三子棋之巔
