目錄
test.c
1首先要有一個選單
2接著對玩家做出的不同選擇進行實作
3實作游戲函式的各個功能
game.c
初識化棋盤
列印棋盤
玩家下棋
電腦下棋
判斷輸贏
是否滿子
哪一方贏
game.h
實作一個三子棋小游戲
下面是實作步驟:
總共有需要三個檔案
第一,test.c
我們要在這個檔案里面實作游戲的主體流程
第二,game.c
在這個檔案里我們可以實作各個游戲函式的分裝
第三,game.h
在這個檔案里我們實作的是各個函式的宣告
test.c
1首先要有一個選單
讓玩家可以做出選擇
2接著對玩家做出的不同選擇進行實作
選1就是開始游戲,所以我們進入到game函式里就好了
選0就是退出游戲,
其他選擇的話就是選擇錯誤,重新選擇
這個我們可以用switch陳述句來實作
這里我們要先用的是do,while回圈,條件里放入我們要輸入的數
這樣的話如果輸入的數為0,即為假,正好會跳出回圈,后面接上return 0的話程式就結束了
所以我們先把以上所描述的功能寫出來
#include<stdio.h>
#include"game.h"
void menu()
{
printf("***********\n");
printf("***1play***\n");
printf("***0exit***\n");
printf("***********\n");
}
?
int main()
{
menu();
int input = 0;
do
{
printf("請選擇\n");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤,請重新選擇\n");
}
}while(input);
return 0;
}
3實作游戲函式的各個功能
我們要做的是三子棋,應該先有一個棋盤
所以我們就可以用二維陣列來創建這樣一個 3 * 3的棋盤
鑒于以后可能會想要不同行和列的棋盤
所以我們可以定義宏來表示陣列的行和列,以后想要修改行數和列數也很方便
創建棋盤之后,我們要將棋盤里的元素進行初始化
接著還要列印出來呈現給玩家
然后就是下棋的程序,因為我們得不斷下到一方贏或者棋盤滿
所以我們可以用while回圈來實作
接著就是
玩家下棋,展示棋盤,判斷輸贏
電腦下棋,展示棋盤,判斷輸贏
......
我們可以把以上功能表達出來
void game()
{
char board[ROW][COL];//宏的定義放在game.h里面
char ret = 0;//我們用ret這個變數去接收判斷輸贏的函式所回傳的值
IntBoard(board, ROW, COL);//這些具體的函式都會分裝到game.c上面
DisplayBoard(board, ROW, COL);
//創建和展示棋盤之后,就是不斷 下棋,展示,判斷的程序了
while(1)
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if(ret != 'C')//也就是指要么一方贏,要么棋盤滿,就應該跳出回圈,不再繼續下棋了
break;
//這兩步的區別就只是第一行而已
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if(ret != 'C')
break;
}
if(ret == '*')
printf("玩家贏\n");
else if(ret == '#')
printf("電腦贏\n");
else
printf("平局\n");
}
game函式放在menu函式后面就好了
game.c
所以我們所需要分裝到game.c里的函式有:
初始化棋盤,列印棋盤,玩家下棋,電腦下棋,判斷輸贏
那么接下來我們就在game.c里實作上述函式的功能
初識化棋盤
我們利用for回圈把里面的元素都初始化為空格
#include"game.h"
void IntBoard(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 DisplayBoard(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++)
{
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");//棋盤全都列印好之后列印分割行
}
}
玩家下棋
這里的實作思路是:
-
判斷輸入的位置有無越界
-
有則提示,沒有則判斷有無棋子
-
有則提示,沒有則將該位置放入元素*
(因為玩家可能要連續輸入幾次,所以我們要用到while回圈)
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x;
int y;
//玩家要輸入的行和列
while (1)
{
printf("請輸入坐標\n");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷有無越界
{
if (board[x-1][y-1] == ' ')//判斷有無棋子
{
board[x-1][y-1] = '*';
break;//輸入成功之后跳出回圈
}
else
printf("坐標被占用,請重新輸入\n");
}
else
printf("坐標非法,請重新輸入\n");
?
}
電腦下棋
這里的實作思路是:
-
生成亂數(這個數值不能越界)
-
將該位置放入元素#,這里不需要判斷,因為本身就不需要輸入
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
srand((unsigned int)time(NULL));
printf("電腦走\n");
while(1)
{
x = rand() % row;//生成亂數,這里就需要用到時間戳了,我們還要做test.c里面包含一個<time.h>
y = rand() % col;
if(board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判斷輸贏
這里還要分為棋盤是否滿子和一方贏
是否滿子
實作思路:
這個比較簡單,我們只要依次查看棋盤,若有一個元素為空格,即為滿
然后注意一下回傳值就好了
int IsFull(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++)
{
if(board[i][j] == ' ')
return 0;
}
}
return 1;
}
哪一方贏
實作思路:
根據規則,我們要判斷是否有三個相同的棋子連成直線
所以,每一行,每一列判斷一次,然后對角線再判斷兩次就好了
使用for回圈和if陳述句來實作
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 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][0];
}
for(j = 0; j < col; j++)//再判斷列
{
if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board != ' ')
return board[0][i];
}
//接著是兩次對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//然后我們再這里直接呼叫IsFull函式,就不用在game函式里呼叫了,而且回傳值都能統一管理
if(IsFull(board, row, col))
{
return 'Q';
}
return 'C';
}
到這里我們的game.c檔案的任務就完成了
game.h
然后我們還需要一個game.h檔案來對函式進行宣告
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
?
#define ROW 3
#define COL 3
?
?
void IntBoard(char board[ROW][COL], int row, int col);
?
void DisplayBoard(char board[ROW][COL], int row, int col);
?
void PlayerMove(char board[ROW][COL], int row, int col);
?
void ComputerMove(char board[ROW][COL], int row, int col);
?
char IsWin(char board[ROW][COL], int row, int col);
?
int IsFull(char board[ROW][COL], int row, int col);
?
好了,到了這里我們的三子棋小游戲就完成了!快去試試吧!
點關注,不迷路~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294567.html
標籤:其他
上一篇:童年回憶《三子棋》
下一篇:Unity 之 發布WebGL并部署到GitHub供外部訪問 (Unity | WebGL | GitHub | 內嵌網頁)
