今天定個小目標,用C語言實現三子棋的玩法。裡面有精彩情景故事幫助你更快理解程式碼內容,不進來了解一下嗎?(內附程式碼)
阿新 • • 發佈:2018-12-14
如標題所示,今天我們要用C語言來實現三子棋的遊戲。相信大家都玩過這個遊戲。我們來回憶一下游戲步驟。 一、今天你在家裡看書,你的朋友小紅邀請你和她一起玩三子棋。這時你有兩個選擇。 1.接受她的邀請,在玩遊戲的同手,促進你們的感情。 0.殘忍拒絕她,三子棋有什麼好玩的,是書不好看了嗎。 那我們在設計遊戲時,第一步也應該是讓玩家進行選擇。 二、假設你因為暗戀小紅接受了小紅髮來的遊戲邀請,這時你們決定開始玩三子棋。那你們首先要拿出棋譜和棋子並且選擇各自要執子的顏色。 那這個對應我們在寫程式碼時就是要列印棋盤,並且用不同的符號區分你和小紅所執的子。在本文中,我們將小紅看成是電腦玩家(小紅是一個沒有感情的棋手)小紅執子為黑子,用符號“@”表示,將你看成是個人玩家,執白色棋子,用符號“X”表示你所執的子。
//game.h部分 #ifndef __GAME_H__ #define __GAME_H__ #define ROW 3 //行 #define COL 3 //列 #include<stdio.h> #include<stdlib.h> #include<time.h> void menu(void);//開始選單 void init(char arr[ROW][COL], int row, int col);//初始化陣列 void printboard(char arr[ROW][COL], int row, int col);//遊戲棋盤 void playermove(char arr[ROW][COL],int row,int col); //玩家走 void computermove(char arr[ROW][COL], int row, int col); //電腦走 int win(char arr[ROW][COL], int row, int col); //判斷勝利 #endif // __GAME_H__ //我們將遊戲中涉及到的所有的函式放在game.h的標頭檔案中方便我們呼叫
//game.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void) //列印選單,讓玩家進行選擇
{
printf("************************\n");
printf("*** 1.開始 0.退出 ***\n");
printf("************************\n");
}
void init(char arr[ROW][COL], int row, int col) // 二維陣列的初始化
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
void printboard(char arr[ROW][COL], int row, int col) // 列印棋盤
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("------------------------\n");
printf("| | | |\n");
printf("| %c | %c | %c |\n",arr[i][0],arr[i][1],arr[i][2]);
printf("| | | |\n");
}
printf("------------------------\n");
}
void playermove(char arr[ROW][COL], int row, int col) / /玩家落子
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走\n請輸入座標:>");
scanf("%d%d", &x, &y);
if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < col && (y - 1) >= 0)//落子時要考慮取值範圍,不能超過棋盤
{
if (arr[x-1][y-1] == ' ') //此處為空時,才可以落子
{
arr[x - 1][y - 1] = 'X';
break;
}
else //否則進行重新選擇
{
printf("此座標已有棋子,請重新選擇座標!\n");
}
}
else
{
printf("輸入座標錯誤!\n");
}
}
}
void computermove(char arr[ROW][COL], int row, int col) / /電腦落子
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while (1)
{
x = rand() % row; //電腦落子取隨機數表示,取餘對隨機數範圍進行限定
y = rand() % col;
if (x< row && x >= 0 && y < col && y >= 0)
{
if (arr[x][y] == ' ')
{
arr[x][y] = '@';
break;
}
}
}
}
int win(char arr[ROW][COL], int row, int col) //判斷輸贏
{
int i = 0;
int j = 0;
int execute = 1;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++) //這裡我是用窮舉法列出了所有贏的可能,此處可以不用窮舉
{
if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
|| arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
|| arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
|| arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2))
{
printf("恭喜你贏了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(row - 2) && i<(row - 2)
|| arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(col - 2)
|| arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(row - 2)
|| arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(row - 2) && (j >= 2))
{
printf("電腦贏了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
execute = 0;
}
}
}
if(1 == execute)
{
printf("平局!\n");
return 1;
}
return 0;
}
//test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
int chose = 0;
int input = 0;
int i = 0;
char arr[ROW][COL] = { 0 };
srand((unsigned int)time(NULL));
while(1)
{
if (i == 0)
{
menu();
init(arr, ROW, COL);
printf("請選擇是否開始遊戲:");
}
i = 1;
scanf("%d", &input);
switch (input)
{
case 1:
printf("請輸入你要選擇的遊戲難度\n");
printf("*******************************\n");
printf("******** 0.簡單 ***********\n");
printf("***********1.困難 ***********\n");
printf("*******************************\n");
scanf("%d",&chose);
if(chose==0)
{
printboard(arr, ROW, COL);
while (1)
{
playermove(arr, ROW, COL);
printboard(arr, ROW, COL);
if(win(arr, ROW, COL)==1)
{
i = 0;
break;
}
computermove(arr, ROW, COL);
printboard(arr, ROW, COL);
if (win(arr, ROW, COL) == 1)
{
i = 0;
break;
}
}
break;
}
else if(chose==1)
printf("正在籌備中,敬請期待\n");
else
printf("輸入錯誤,請重新輸入\n");
case 0:
printf("遊戲退出!\n");
system("pause");
return 0;
break;
default:
printf("輸入錯誤!請重新輸入:");
break;
}
}
return 0;
}