目錄
三子棋
test.c檔案
選單函式
game函式
game.c檔案
InitBoard初始化棋盤函式
DisplayBoard列印棋盤函式
PlayerMove玩家移動函式
ComputerMove電腦移動函式
IsFull判斷棋盤是否下滿函式
IsWin判斷是否贏函式
game.h檔案
宏
函式申明
三子棋
這是一個用C語言寫的簡單小游戲,也是我第一個用C語言寫的小游戲,游戲雖小,代碼俱全,
test.c檔案
為了方便自述,還是從mian進入(我也優化過三子棋代碼,不能無限輸錯)
int main()
{
int input = 0;
int timer = 3;//游戲剩余次數
int flag = 1;//進入游戲標志
srand((unsigned)time(NULL));//設定隨機起點(運用時間戳)
/*為了體會一下游戲的可玩性,先玩一把然后再決定玩與不玩
因此用do while回圈*/
do
{
Menu(); //選單函式
printf("請選擇:>");
scanf("%d",&input);
switch (input)//選擇模式
{
case 1:
flag = 0; //玩游戲時游戲標志清零
game();
break;
case 0:
printf("退出\n");
break;
default:
if (flag == 0) //將游戲標記置一
{
flag = 1;
timer = 3;//可玩次數重新置三
}
timer--;
if (timer == 0)//當沒有游戲次數時就不能玩了
{
printf("沒有選擇機會了,已退出游戲,");
break;
}
printf("選擇錯誤,可以重新選擇,還有%d錯誤就強制退出,time = %d\n",timer,timer);
break;
}
} while(input&&timer);//可玩次數為0,自己不想玩都可以退出游戲
return 0;
}
選單函式
void Menu()
{
printf("**********************\n");
printf("***1.play 2.exit***\n");
printf("**********************\n");
}
game函式
void game()
{
char ret = 0;
char board[ROW][COL];//棋盤陣列
InitBoard(board,ROW,COL);//初始化棋盤
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.c檔案
InitBoard初始化棋盤函式
這里為什么要用傳過來的row,col呢,有人會說不是有ROW,COL嗎理論上是沒有問題的,但不用自己傳過來的引數,用COL,ROW是被限制了的,獨立性下降了許多,受到到了限制,用自己傳過來的引數,是靈活變化的,不是依賴于COL,ROW的
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0 ; j < col; j++)
{
board[i][j] = ' ';
}
}
}
DisplayBoard列印棋盤函式
棋盤設計每個人可能多多少少有點不同,這個就是棋盤界面,沒有花里胡哨,只有普通的分割行,資料行

void DisplayBoard(char board[ROW][COL], int row, int col)
{
/*int i = 0;
for ( i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("%c", board[i][j]);
}
printf("\n");
}*/
int i = 0;
for (i = 0; i <= row; i++)
{
int j = 0;
for ( j = 0; j <= col; j++)
{
//列印分割行
printf("*");
if(j<col)
printf("---");
}
printf("\n");
if (i < row)
{
for (j = 0; j <= col; j++)
{
//列印資料行
printf("|");
if (j < col)
printf(" %c ", board[i][j]);
}
printf("\n");
}
}
}
PlayerMove玩家移動函式
玩家移動,為了體現自己的價值,所以先手永遠都是給玩家先走,誒我可以給電腦走可是就不給,就是玩,為了方便視覺觀察,玩家移動電腦移動都用漢字提示
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
int time = 3;//我們也不能放縱玩家瞎玩,連續瞎移動3次也讓你此局報廢
int flag = 1;
printf("玩家移動:>\n");
while (time)
{
printf("請輸入坐標;>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (flag == 0)//到了這里說明你還是想玩的,標記置1,次數充滿
{
flag = 1;
time = 3;
}
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("已經被占用,請重新落子:\n");
}
}
else
{
flag = 0;//到了這個代碼塊首先標記置0
time--;//可玩次數減少
if (time == 0)//這里我們也賦予棋盤爆怒情緒
{
printf("你不想玩就滾,當我沒脾氣啊.\n");
break;
}
printf("坐標非法,超出范圍:你還有%d次機會\n", time);
}
}
}
ComputerMove電腦移動函式
電腦移動,你永遠都是后手
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦移動:>");
while (1)
{
x = rand() % row;//這里的rand是和srand配合使用的
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
IsFull判斷棋盤是否下滿函式
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;//兩層回圈都沒有空格說明滿了
}
IsWin判斷是否贏函式
判斷游戲輸贏 回傳4種不同的狀態: return '*' 玩家贏 return '#' 電腦贏 return 'Q' 平局 return 'C' 繼續
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] && board[i][0] != ' ')
return board[i][0]; //這步非常不錯省了不少代碼,因為列印的符號和回傳的符號相同
}
for (i = 0; i < col; i++)//列判斷
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
return board[0][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[1][1] != ' ')//對角線判斷
return board[1][1];
//判斷平局,只需要看一下棋盤是不是滿了就行
if (IsFull(board, row, col))
return 'Q';
//游戲繼續
return 'C';
}
game.h檔案
宏
宏的出現大大加大了代碼的可移植性
#define ROW 3//行
#define COL 3//列
函式申明
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);
int IsFull(char board[ROW][COL], int row, int col);
測驗圖
瞎選的后果

只要在最后以后選正確,次數充滿

下面多條測驗




轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290992.html
標籤:其他
