目錄
- 傳統藝能😎
- 過渡區🤣
- 正片開始👀
- 準備👏
- 洋蔥戰略👏
- 1.萬金油開頭少不了😎
- 2.上菜得先上選單😎
- 3.游戲的入口——選單😎
- 4.游戲主體😎
- 1.棋盤初始化🎉
- 2.列印棋盤🎉
- 棋手操作🎉
- 判斷🎉
- 戰略總覽👏
- test.c👏
- game.c👏
- game.h👏
傳統藝能😎
小編是大一菜鳥不贅述,歡迎大佬指點江山(QQ:1319365055)
此前博客點我!點我!請搜索博主 【知曉天空之藍】點我!點我!請搜索博主 【知曉天空之藍】或掃碼進入!
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點我!

(https://blog.51cto.com)感謝支持!
過渡區🤣
現在是北京時間3:12,1:12開始寫,本來打算在12點前趕一篇博客出來,想想還是算了,事情確實太多了,今天就先熬夜把博客寫了,昨天沒寫手就夠癢了,反正明天早上一二節沒課就尋思來續命咯,

正片開始👀
準備👏
今晚是個大工程,但是咱不急,工欲善其事,必先利其器,先來看看需要哪些“器”:
1.一大餅函式(隨機值rand函式,srand函式,自義定函式……);
2.一小撮頭檔案:<stdlib.h>,<time.h>,<stdio.h>;
3.格局打開:封裝函式,提高可讀性與邏輯感;test.c存放main函式,用來當作程式的入口,參考game.h頭檔案(參考自己寫的頭檔案記得是雙引號“game.h”),game.c中存放實作工程的主體函式,game.h中則存放各種函式的宣告以及VS提供的頭檔案的包含;
4.一大堆二維陣列的運用;
5.錯綜的分支與回圈陳述句的嵌套使用;
6.善于分析的腦瓜子和勤快的小手手;
如果以上東西你都沒有問題,那我們就不用廢話,直接進入正題,
洋蔥戰略👏
對待問題就要像洋蔥一樣一層一層一層的剝開,接下來就帶大家來剝洋蔥
**
1.萬金油開頭少不了😎
int main()
{
test();
return 0;
}
2.上菜得先上選單😎
先用一個test函式將選單喚出來,之所以不寫在main函式里面是方便食用,
void test()
{
int input = 0;
srand((unsigned int)time(NULL));//亂數發生器的初始化函式,利用時間戳生成偽亂數
do//至少進行一次該程序
{
menu();
printf("請選擇選單:>");
scanf("%d", &input);//將值存入input以實作選單選擇功能
switch (input)
{
case 1:
{
printf("三子棋\n");
game();//進入游戲主體
break;
}
case 0:
{
printf("即將退出……");
break;
}
default:
{
printf("玩兒呢?\n");//防特殊情況防皮
break;
}
}
} while (input);//實作游戲的重復游玩
}
3.游戲的入口——選單😎
簡簡單單搞了一個選單出來,諸君可肆意發揮,我懶惰的天性造就了它平庸的外表,
void menu()
{
printf("------------------------------------\n");
printf("------------------------------------\n");
printf("-------1.P L A Y-----------\n");
printf("-------0.E X I T-----------\n");
printf("------------------------------------\n");
printf("------------------------------------\n");
}
當你輸入“ 1 ”時就正式開始了,
4.游戲主體😎
這里就需要動一下腦筋了,因為需要安排的東西突然就暴漲,制定規則就重在效率與目的并持,
首先在規則之下,需要實作的是三子棋的物質表達,即棋盤的設計,高大上一點就是在搭建游戲環境,棋盤是方的,那我們就用二維陣列行列式的相似性來模擬棋盤,這里我設定一個名為 board 的陣列,
**
1.棋盤初始化🎉
**
為了能搞出一個棋盤,我得用資料告訴編譯器一個棋盤的輪廓:既然是三子棋,我們就先從最簡單的3*3開始,分別用ROW(行),COL(列)來指定陣列元素,
為了方便寫也為了方便讀,我們將ROW和COL在game.h頭檔案中宏定義使用:
# define ROW 3
# define COL 3
這樣寫也有一個好處,想要改變棋盤大小就會很簡單,只需改變數字的大小,無需大費周章的到處去改這改那,
void Printboard(char board[ROW][COL], int row, int col)
{
int i = 0;//陣列下標從0開始
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)//嵌套回圈來完成整個陣列
{
board[i][j] = ' ';//將i行j列的陣列初始化為空,用來布局和放入棋子
}
}
}
**
2.列印棋盤🎉
**
萬事俱備只欠東風,代碼直接上:
void Display(char board[ROW][COL], int row, int col)
{
int i, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//放入%c以作為棋子位存放棋子
if (j < col - 1);//棋盤美觀去掉最外面的分隔線
printf("|");
}
printf("\n");//換行列印橫線
if(i<row-1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1);
printf("|");//同理列印分隔線
}
}
printf("\n");
}
}
這里自定義的Display函式,效果如下:

**
棋手操作🎉
**
棋盤搞好了就可以下了嘛,這里要實作下的話,就需要我們玩家的下棋函式和一個24小時在線陪玩的憨憨人機,我們就用 player 函式和 X_MAN函式實作(取名是一種藝術):
void player(char board[ROW][COL], int row, int col)//玩家
{
int x = 0;//模擬行數
int y = 0;//模擬列數
printf("玩家請輸入棋子坐標:>");坐標模擬棋格
scanf("%d%d", &x, &y);
while (1)
{
if (row >= x && x >= 1 && y >= 1 && y <= col)//界定有效范圍
{
if (board[x - 1][y - 1] == ' ')//人性化,按玩家眼中的棋盤設計
{
board[x - 1][y - 1] = '*';//如果本格為空,則將棋子*放入
Display(board, row, col);//顯示當前布局
break;
}
else
{
printf("無效棋格,請重新輸入\n");//防止占用
break;
}
}
else
{
printf("你下到棋盤外了!\n");//越界警告
}
}
}
相比之下,人機就好寫一些了;
這里注意兩個重點:1.偽亂數初始化函式記得放在上一級函式或者主函式里面;
2.電腦不需要像對玩家一樣“ -1”操作,電腦自己是可以識別的;
void x_man(char board[ROW][COL], int row, int col)//人機
{
int x = 0;
int y = 0;
printf("人機下:\n");
while(1)
{
x = rand() % ROW;//ROW,COL范圍0~2,得到0~2隨機值
y = rand() % COL;//同理
if (board[x][y] == ' ')
{
board[x][y] = '#';
Display(board, row, col);
break;
}
}
}
**
判斷🎉
**
下棋要判斷才有輸贏對吧,不然咱就是在和電腦搞打字聯誼,
我們就搞一個 winor函式來實作,基本思路是要實作三種情況:
1.玩家贏:
分為橫三列贏,豎三列贏,對角線贏,實作條件判斷我的思路簡單粗暴,就是傳遞性連著三個元素倆倆相等,最后保證都不為空格就行(其中一個不為空就行);
2.五五開;我們又需要一個Full函式來滿足平局的判斷,即棋盤下滿時并未滿足輸贏條件我們就給出平局的結果
3.電腦贏;
具體如下:
char winor(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//橫贏
{
return board[i][1];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//豎贏
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//對角線贏
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//對角線贏
{
return board[0][2];
}
if (1==Full(board, row, col))//Full函式判斷平局
{
return 'p';
}
return 'c';
}
Full函式定義如下:
int Full(char board[ROW][COL], int row, int col)
{
int i,j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')//有空格則不滿足平局繼續回圈
{
return 0;
}
}
}
return 1;回圈完未發現空格則回傳1表示平局
}
當以上步驟完成時,我們代入主體的game函式中進行邏輯組裝,如下:
void game()
{
char board[ROW][COL] = { 0 };
Printboard(board, ROW, COL); //初始化棋盤
Display(board, ROW, COL);//列印棋盤
char ret = 0;
while (1)//回圈以持續游戲進行
{
player(board, ROW, COL);//玩家先走
ret = winor(board, ROW, COL);//進入結果判斷
if (ret != 'c')//非“繼續”結果跳出
{
break;
}
x_man(board, ROW, COL);//人機后走
ret = winor(board, ROW, COL);//再次判斷
if (ret != 'c')
{
break;
}
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("你贏了!\n");
else
printf("你輸了\n");//回傳值對應判斷三種游戲結果
}
戰略總覽👏
整個游戲到這里就完成了,給整理出來完整的工程如下:
test.c👏
# include"game.h"
void menu()
{
printf("------------------------------------\n");
printf("------------------------------------\n");
printf("-------1.P L A Y-----------\n");
printf("-------0.E X I T-----------\n");
printf("------------------------------------\n");
printf("------------------------------------\n");
}
void game()
{
char board[ROW][COL] = { 0 };
Printboard(board, ROW, COL);
Display(board, ROW, COL);
char ret = 0;
while (1)
{
player(board, ROW, COL);
ret = winor(board, ROW, COL);
if (ret != 'c')
{
break;
}
x_man(board, ROW, COL);
ret = winor(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == 'p')
printf("平局!\n");
else if (ret == '*')
printf("你贏了!\n");
else
printf("你輸了\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇選單:>");
scanf("%d", &input);
switch (input)
{
case 1:
{
printf("三子棋\n");
game();
break;
}
case 0:
{
printf("即將退出……");
break;
}
default:
{
printf("玩兒呢?\n");
break;
}
}
} while (input);
}
int main()
{
test();
return 0;
}
game.c👏
# define _CRT_SECURE_NO_WARNINGS
# include"game.h"
void Printboard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void Display(char board[ROW][COL], int row, int col)
{
int i, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1);
printf("|");
}
printf("\n");
if(i<row-1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1);
printf("|");
}
}
printf("\n");
}
}
void player(char board[ROW][COL], int row, int col)//玩家
{
int x = 0;
int y = 0;
printf("玩家請輸入棋子坐標:>");
scanf("%d%d", &x, &y);
while (1)
{
if (row >= x && x >= 1 && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
Display(board, row, col);
break;
}
else
{
printf("無效棋格,請重新輸入\n");
break;
}
}
else
{
printf("你下到棋盤外了!\n");
}
}
}
void x_man(char board[ROW][COL], int row, int col)//人機
{
int x = 0;
int y = 0;
printf("電腦走:\n");
while(1)
{
x = rand() % ROW;
y = rand() % COL; //0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
Display(board, row, col);
break;
}
}
}
int Full(char board[ROW][COL], int row, int col)
{
int i,j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char winor(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][1];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[1][i];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (1==Full(board, row, col))
{
return 'p';
}
return 'c';
}
game.h👏
#pragma once
# define ROW 3
# define COL 3
# include<stdio.h>
# include<stdlib.h>
# include<time.h>
void game();
void Printboard(char board[ROW][COL], int row, int col);
void menu();
void Display(char board[ROW][COL], int row, int col);
void player(char board[ROW][COL], int row, int col);
void x_man(char board[ROW][COL], int row, int col);
char winor(char board[ROW][COL], int row, int col);
運行結果如下:

今天就到這里吧,躺平咯家人們,不然明天上課就得躺平了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354778.html
標籤:其他
上一篇:三子棋的實作--二維陣列的應用
