三子棋------小遊戲c語言實現(超清晰邏輯)
阿新 • • 發佈:2018-12-30
今天用c語言來實現一個簡單有趣的小遊戲————三子棋!
三子棋的規則應該都不陌生吧 -_- .......
我一步,你(電腦)一步,無論是誰,每下完一步,就判斷是否有三顆棋子在一條直線上,若在,則誰WIN!!
(這句話有待會寫程式碼的邏輯思路喲!!)
好啦,現在開始著手如何實現整個程式碼 0.0 -------- 0.0
該程式分三個檔案來完成 test.c(存放main函式) game.c(存放各種遊戲函式) game.h(存放函式宣告等)
先分析一下邏輯:
一:玩一個遊戲,肯定得放在一個迴圈裡,玩完一次又來一次,知道選擇退出為止>>>>>>
所以我們在main函式裡提供一個迴圈,進入迴圈就選擇輸入選單,決定是否進入遊戲,選擇遊戲開始則進入playgame()函式,選擇退出就退出這個迴圈,程式結束。這裡我們要保證main函式裡的簡潔性,現在,main函式就搭建好了----------程式碼1---------test.c
int main() { srand((unsigned int)time(NULL)); //產生隨機數種子 int key = 0; do { menu(); scanf("%d", &key); if (key) { playgame(); } else { printf("遊戲結束\n"); break; } } while (key); return 0; }
二:首先,我們需要提供一個遊戲選單--------------程式碼2--------game.c
void menu()
{
printf("************** 歡迎光臨 ******************\n");
printf("**************** 請選擇 *********************\n");
printf("*****************1.開始遊戲 ****************\n");
printf("*****************0.結束遊戲 ****************\n");
}
三:進入遊戲後,得列印一個棋盤吧,這就得思考一下了,棋盤用什麼列印呢?待會棋盤還得放棋子呢,到底如何建立棋盤呢。嘿嘿,這裡就得用到我們的二維陣列了,想一想很nice吧!!建立棋盤二維陣列後,則應該初始化吧(全初始化為空格 ),則需要一個初始化函式-------------程式碼三-------game.c
(memset為一個提供記憶體初始化的庫函式,需引入標頭檔案string.h)
void arr_init(char arr[ROW][CLO], int row, int clo)
{
memset(&arr[0][0],' ',row*clo*sizeof(arr[0][0]));
}
四:棋盤建立好了得打印出來吧,so,列印棋盤為一個函式-----------------程式碼4-------game.c
void print(char arr[ROW][CLO], int row, int clo)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < clo; j++)
{
printf(" %c ", arr[i][j]);
if (j <(clo - 1))
{
printf("|");
}
}
printf("\n");
for (j = 0; j < clo; j++)
{
printf("---");
if (j <(clo - 1))
{
printf("|");
}
}
printf("\n");
}
printf("\n");
}
五:每下一部棋之前,我們是不是得判斷棋盤是否已經滿了,若滿了,則遊戲結束,為平局,所以需要一個判斷是否滿盤的函式--------程式碼五------test.c
int judge_full(char arr[ROW][CLO],int row, int clo)
{
int i = 0;
int j = 0;
int num = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < clo; j++)
{
if (arr[row][clo] == ' ')
{
num++;
break;
}
}
}
if (num > 0)
return 1;
else
return 0;
}
六:判斷完是否滿盤後,若遊戲沒結束,則該玩家下棋啦,則需要一個玩家下棋的函式----------程式碼六--------test.c
void play_man(char arr[ROW][CLO])
{
int row = 0;
int clo = 0;
do
{
printf("請輸入你要下的行和列:\n");
scanf("%d%d", &row, &clo);
if (row > 3 || clo > 3 || row < 0 || clo < 0)
{
printf("輸入有誤,請重新輸入\n");
continue;
}
else if (arr[row-1][clo-1] != ' ') //坑二,不要寫成arr[row][clo];
{
printf("這裡有棋了,請重新輸入\n");
continue;
}
else
{
arr[row - 1][clo - 1] = '0';
break;
}
} while (1);
}
七:玩家下完棋,是不是得判斷是否贏了(此時也得判斷是否盤滿),若贏了,則遊戲結束,若沒贏,遊戲繼續,所以需要一個判斷是否贏的函式---------程式碼七--------test.c
int judge(char arr[ROW][CLO])
{
int i = 0;
for (i = 0; i < 3; i++) //檢測行
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] != ' '))
{
return 1;
}
}
for (i = 0; i < 3; i++) //檢測列
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] != ' '))
{
return 1;
}
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' '))
{
return 1;
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && ((arr[0][2] != ' ')))
{
return 1;
}
return 0;
}
八:若遊戲沒有結束,是不是得有一個電腦下棋的函式,此時則需要引入隨機數的生成來完成電腦的下棋步驟---------程式碼八------------test.c
void play_computer(char arr[ROW][CLO])
{
while (1)
{
int row = rand() % 3;
int clo = rand() % 3;
if (arr[row][clo] == ' ')
{
arr[row][clo] = '1';
break;
}
}
}
九:(重點)上面二到八介紹了每一個步驟所需要的函式模組,此時,我們需要寫一個playgame()函式來將二到八所有程式碼銜接到一起,來完成:
while(1)
<><><><><>列印棋盤------判斷滿盤------玩家輸入------判斷輸贏、判斷滿盤-----電腦輸入------判斷輸贏<><><><><><>
這樣一個大迴圈
同樣放入game.c檔案中
void playgame()
{
char arr[ROW][CLO] = { 0 };
arr_init(arr,ROW,CLO);
int flag = 0;
print(arr, 3, 3);
while (1)
{
if (judge_full(arr, 3, 3))
{
printf("平局\n");
break;
}
play_man(arr);
print(arr, 3, 3);
flag = judge(arr);
if (flag)
{
printf("玩家贏\n");
break;
}
else if (judge_full(arr, 3, 3))
{
printf("平局\n");
break;
}
play_computer(arr);
Sleep(2000);
print(arr, 3, 3);
flag = judge(arr);
if (flag)
{
printf("電腦贏\n");
break;
}
}
}
最後,完成game.h標頭檔案,提供每個函式的原型(聲名)
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#define ROW 3
#define CLO 3
void playgame();
void arr_init(char arr[ROW][CLO], int row, int clo);
void print(char arr[ROW][CLO], int row, int clo); //列印棋盤
void menu(); //列印選單
void play_man(char arr[ROW][CLO]); //人類下棋
int judge(char arr[ROW][CLO]); //判斷輸贏
void play_computer(char arr[ROW][CLO]); //電腦下棋 都可以寫成char arr[][3],但不能寫成char arr[][];
int judge_full(char arr[ROW][CLO], int row, int clo); //判斷棋盤是否已滿