文章目錄
游戲說明
游戲效果展示
游戲代碼
游戲代碼詳解:
1、游戲開始界面
2、是否進入游戲選擇
3、初始化游戲棋盤
4、游戲棋盤列印
5、玩家電腦走棋
6、判斷輸贏
游戲說明
1、玩家先執*棋,電腦執#棋
2、玩家開始先走棋,玩家電腦交替走棋
3、誰先在橫豎斜之一三子連線,則判為勝利
游戲效果展示
1、進入界面

2、選擇進入游戲列印棋盤

3、游戲進行程序中

4、游戲勝利進行選擇判斷

游戲代碼
1、text.c頭檔案
#define _CRT_SECURE_NO_WARNINGS 1
//測驗游戲
#include"game.h"
void menu() //列印三子棋游戲目錄
{
printf("*********三子棋**********\n");
printf("*************************\n");
printf("*****1、進入游戲*********\n");
printf("*****0、退出游戲*********\n");
printf("*************************\n");
}
void game()
{
//三子棋游戲程序
char board[ROW][COL]; //棋盤陣列
//鍵盤初始化,其中各格都是空格
InitBoard(board, ROW, COL);
//棋盤列印
Dispiayboard(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家走棋
PlayerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL); //判斷游戲輸贏,玩家贏‘*’電腦贏‘#' 平局 'Q'繼續'C'
if (ret != 'C')
break;
//電腦走棋
ComputerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家贏\n");
else if (ret == '#')
printf("電腦贏\n");
else
printf("平局\n");
}
int main()
{
srand((unsigned int) time(NULL));
int input = 0;
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;
}
2、game.c頭檔案
#define _CRT_SECURE_NO_WARNINGS 1
//游戲函式實作程序
#include"game.h"
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] = ' ';
}
}
}
void Dispiayboard(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]);
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) //玩家走棋
{
printf("玩家走->\n");
int x = 0;
int y = 0;
again:
printf("請輸入坐標->");
scanf("%d %d", &x,&y);
while(1)
{
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐標格式正確
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已經下子,請重新輸入\n");
goto again;
}
}
else
{
//坐標格式錯誤
printf("超出棋盤,下子錯誤\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col) //電腦走棋
{
int x = 0;
int y = 0;
printf("電腦走->\n");
while (1)
{
x = rand() % row;
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++)
{
board[i][j] == ' ';
return 0;
}
}
return 1;
}
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[j][0] == board[j][1] && board[j][0] == board[j][2] && board[j][0] != ' ')
return board[j][0];
}
//判斷斜線(兩條)
if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[0][2] != ' ')
return board[2][0];
//判斷平局
if (IsFull(board,row,col))
return 'Q';
//游戲繼續
return 'C';
}
game.h頭檔案
#define _CRT_SECURE_NO_WARNINGS 1
//游戲函式宣告
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void Dispiayboard(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);
游戲代碼詳解
游戲開始界面
開始界面中,需要列印一個選擇界面框架,包含進入游戲和退出游戲兩個選擇即可,因此運用 5次printf函式列印即可
void menu() //列印三子棋游戲目錄
{
printf("*********三子棋**********\n");
printf("*************************\n");
printf("*****1、進入游戲*********\n");
printf("*****0、退出游戲*********\n");
printf("*************************\n");
}
是否進入游戲選擇
這一塊的內容就是主函式的內容,在這里我們運用一個swich函式實作一個分支——進入游戲or退出,在case1進入游戲函式主體,在這里我們將游戲主體放在game.c檔案里面,然后頭檔案放在game.h中,這樣在test.c游戲實作界面引入頭檔案“game.h即可
int main()
{
srand((unsigned int) time(NULL));
int input = 0;
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;
}
初始化游戲棋盤
初始化界面用一個3*3的二維陣列即可實作
在初始話陣列里面都放入空格即可
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] = ' ';
}
}
}
游戲棋盤列印
為了游戲棋盤界面的美觀,我們加入了分界線來區分割棋盤
然后將3*3的二位陣列列印到螢屏上即可
void Dispiayboard(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]);
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回圈使雙方交替走棋,while的條件里面為一,當判斷游戲結束時候即可利用break陳述句跳出回圈
玩家走棋代碼:
void PlayerMove(char board[ROW][COL], int row, int col) //玩家走棋
{
printf("玩家走->\n");
int x = 0;
int y = 0;
again:
printf("請輸入坐標->");
scanf("%d %d", &x,&y);
while(1)
{
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//坐標格式正確
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已經下子,請重新輸入\n");
goto again;
}
}
else
{
//坐標格式錯誤
printf("超出棋盤,下子錯誤\n");
}
}
}
電腦走棋代碼:
void ComputerMove(char board[ROW][COL], int row, int col) //電腦走棋
{
int x = 0;
int y = 0;
printf("電腦走->\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
測驗檔案中game的走棋代碼:
while (1)
{
//玩家走棋
PlayerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL); //判斷游戲輸贏,玩家贏‘*’電腦贏‘#' 平局 'Q'繼續'C'
if (ret != 'C')
break;
//電腦走棋
ComputerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家贏\n");
else if (ret == '#')
printf("電腦贏\n");
else
printf("平局\n");
}
判斷輸贏
可以分別判斷橫線豎線斜線是否有三子一樣
接收判斷后回傳值
Q表示平局
C表示繼續
*玩家贏
#電腦贏
利用回傳值判斷下步驟程序
while (1)
{
//玩家走棋
PlayerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL); //判斷游戲輸贏,玩家贏‘*’電腦贏‘#' 平局 'Q'繼續'C'
if (ret != 'C')
break;
//電腦走棋
ComputerMove(board, ROW, COL);
Dispiayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家贏\n");
else if (ret == '#')
printf("電腦贏\n");
else
printf("平局\n");
}
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[j][0] == board[j][1] && board[j][0] == board[j][2] && board[j][0] != ' ')
return board[j][0];
}
//判斷斜線(兩條)
if (board[0][0] == board[1][1] && board[2][2] == board[1][1] && board[0][0] != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[2][0] == board[1][1] && board[0][2] != ' ')
return board[2][0];
//判斷平局
if (IsFull(board,row,col))
return 'Q';
//游戲繼續
return 'C';
}
好了本期分享到此結束,歡迎各位交流
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295754.html
標籤:其他
