- TDD測驗驅動開發
測驗驅動開發,英文全稱Test-Driven Development,簡稱TDD,是一種不同于傳統軟體開發流程的新型的開發方法,它要求在撰寫某個功能的代碼之前先撰寫測驗代碼,然后只撰寫使測驗通過的功能代碼,通過測驗來推動整個開發的進行,這有助于撰寫簡潔可用和高質量的代碼,并加速開發程序,
————轉自搜狗百科
所以我們可以利用這種思路,一步一步地實作一個個的小功能,進而逐漸實作一款游戲的開發,
首先我們建立兩個源檔案,一個名為test.c 主要就是游戲的一個框架,里面是游戲實作的大概邏輯,另外一個名為game.c 主要用來存放封裝好的函式,實作一個個小的功能,
再一個是創建一個頭檔案 game.h, 用來存放各種頭檔案和函式宣告,其它源檔案就可以不用再重復寫各種頭檔案的參考了,而是直接在最前面寫上include"game.h"就可以使用這個頭檔案中的東西了,
準備作業完成后,我們來構思一下一個游戲最開始應該是咋樣的,一開始應該會出現一個選擇選單,如下圖

會讓你選擇是開始游戲,還是退出游戲,
所以就需要寫一個函式menu(),里面列印圖形界面,如下圖:

然后你輸入你的選項,
注意:這里的選項設定得非常巧妙,讀者需要后期慢慢體會,為什么不能輸入其它的數字呢?
進入游戲后,你肯定會看到初始化的界面,如下圖:

依照這樣的思路,我們設計出來的游戲也應該一樣,如下圖:

所以接下來我們就要按照這種圖形設計一個初始化函式InitBoard()和列印函式DispalyBoard(),函式的引數分別為陣列首元素地址、橫格數以及縱格數,三子棋有九個格子,我們可以用3x3的二維陣列來儲存棋子,那么分割線便用豎線和橫線實作,也就是在初始化陣列中某個元素后(將陣列元素全部初始化為空格,陣列型別為char型),在其后面列印出來的 ‘|’, 但是注意一排中最后一個元素后不列印,橫線分隔就是在第一行陣列元素列印完了后,直接列印一行由橫線和豎線組合成的圖形,具體代碼實作請讀者參考后文提供的原始碼,此處只是講解了代碼大概思路,
接下來我們就要開始下棋了,輸入想要下棋的坐標,然后再棋盤上標記出玩家的棋子‘ * ’,接下是電腦下棋,標記‘ # ’,
當然,玩家不是程式員,輸入坐標肯定沒有帶0的,而陣列角標是從0開始的,
程式還需要判斷,下棋位置是否已經有棋子了,
電腦下棋的坐標肯定需要借用亂數生成函式,先再main函式中設定一個隨機種子數srand((unsighed)time(NULL)),然后再電腦下棋的函式ComputerMove()中獲取亂數 rand()%3,這樣就可以得到0~3的亂數了,
每一次下棋我們都需要判斷一下游戲是否結束,誰贏了?平局?
首先是檢驗橫三行,再是縱三列,最后是兩條對角線上的字符是否一致,
再判斷棋盤是不是滿了(沒有空格了),來判斷是否平局,
綜上所述,總結如下:我們需要寫如下五個函式:初始化棋盤函式,列印棋盤函式,玩家下棋函式,電腦下棋函式,最后是判斷輸贏函式,
原始碼如下:
//game.h file
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3 //三行
#define COL 3 //三列 column
//初始化棋盤
void InitBoard(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);
//test.c file
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("******* 1. PLAY *******\n");
printf("******* 0. EXIT *******\n");
printf("*******************************\n");
}
void game()
{
char board[ROW][COL];
//棋盤初始化
InitBoard(board, ROW, COL);
//列印棋盤
DisplayBoard(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
DisplayBoard(board, ROW, COL);//下完棋后立刻列印棋盤
//玩家下完棋后判斷玩家是否勝利
if ('*' == IsWin(board, ROW, COL))//IsWin函式回傳值為'#'、'*'、'C'-游戲未完成,繼續游戲、'T'-平局
{
printf("玩家贏了!\n");
break;
}
else if ('T' == IsWin(board, ROW, COL))
{
printf("平局~\n");
break;
}
ComputerMove(board, ROW, COL);//電腦下棋
DisplayBoard(board, ROW, COL);//下完棋后立刻列印棋盤
//電腦下完棋后判斷電腦是否勝利
if ('#' == IsWin(board, ROW, COL))
{
printf("您輸了\n");
break;
}
else if ('T' == IsWin(board, ROW, COL))
{
printf("平局~\n");
break;
}
}
DisplayBoard(board, ROW, COL);//展示最終的棋盤
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇>>\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("開始三子棋游戲\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入\n");
break;
}
} while (input);
return 0;
}
//game.c file
#include"game.h"
//初始化棋盤
void InitBoard(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");
}
}
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("請輸入您想要下棋位置的坐標:");
scanf("%d %d", &x, &y);
if (x > 0 && x <= col && y > 0 && y <= row)
{
if (' ' == board[y - 1][x - 1])
{
board[y - 1][x - 1] = '*';
break;
}
else
{
printf("該位置已經有棋子了!\n");
}
}
else
{
printf("您輸入的坐標不正確!\n");
}
}
}
//電腦下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % col;
int y = rand() % row;
if (' ' == board[y][x])
{
board[y][x] = '#';
break;
}
}
}
//判斷輸贏
char IsWin(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])
{
return board[i][1];//回傳連成三個的字符
}
}
//判斷列
for (i = 0; i < row; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[1][i];//回傳連成三個的字符
}
}
//判斷斜線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
{
return board[1][1];//回傳連成三個的字符
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
{
return board[1][1];//回傳連成三個的字符
}
//判斷平局-以上情況都沒發生,而且每個格子都不是空的
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 'C';//游戲繼續
}
}
}
return 'T';
}
代碼中有有一些注釋解釋代碼的實作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280979.html
標籤:其他
