摘要:相信每個人都有一個設計游戲的夢想,都曾玩過王者農藥,cf等許多游戲,對之充滿好奇,好奇他是怎樣做出來的呢,
目錄
摘要:相信每個人都有一個設計游戲的夢想,都曾玩過王者農藥,cf等許多游戲,對之充滿好奇,好奇他是怎樣做出來的呢,
一、設計游戲
1.游戲的基本流程
2.列印游戲選單
3.規劃
二、游戲劃分
1.設計棋盤
2.列印棋盤
3.玩家下棋
4.電腦下棋
5.判斷輸贏
三、整個游戲代碼
test.c
game.c
game.h
一、設計游戲
1.游戲的基本流程
首先一個代碼的執行要現有main()函式

2.列印游戲選單
可以通過函式的方法來使主函式變得簡潔一些,寫一個test()函式用來列印選單,可以采用do—while回圈來寫,這樣寫可以先列印選單,再判斷玩家是否進行游戲,
創建一個整型變數,利用switch陳述句來判斷是否進行下一步,
void test()
{
int input = 0;
do
{
//列印選單
printf("************\n");
printf("***1.開始***\n");
printf("***0.退出***\n");
printf("************\n");
//判斷玩家的選擇
scanf("%d", &input);
switch (input)
{
//選擇1則執行游戲程式
case 1:
game();
break;
//選擇0退出游戲
case 0:
break;
//輸入其他的數
default:
printf("請重新選擇\n");
}
} while (input);
}
3.規劃
將每個部分分開
創建一個game.c檔案將函式體部分放進game.c里,
創建一個game.h檔案用來宣告函式,
創建一個test.c檔案寫游戲的的主體部分
這樣做可以合理規劃,方便除錯,
二、游戲劃分
1.設計棋盤
要下棋得先有一個棋盤才能開始啊
首先棋盤3*3的大小

便采用#define來定義常量,也可以方便日后的棋盤大小的更改,

棋盤的樣子也想好了,那便定義一個二維陣列用來當作棋盤,
接下就是初始化棋盤,并將其盤列印出來,

2.列印棋盤
要列印棋盤可以先將二維陣列初始化為空格,撰寫一個函式 initialize_board(board, ROW, COL);
在game.c檔案里撰寫函式體,進行二維陣列的初始化,
//初始化棋盤
void initialize_board(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] = ' ';
}
}
}
當然要在game.h檔案里宣告該函式,
初始化后便可以將棋盤整體列印出來,
//列印棋盤
void printf_board(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)//這里來限制分割行的次數,重用列印2行---
{
for (j = 0; j < col; j++)//用來列印每列的---
{
printf("---");
if (j < col - 1)//與上面一樣,限制列印 | 的次數
printf("|");
}
printf("\n");
}
}
}
效果如下

我們來分析這一段代碼,首先可以將棋盤分為三行三列,用 | 來隔離每個字符,分割行則利用 --- 來處理;
有2點需要注意:
第2列后不用打 | ,這時便需要限制他的列印次數,可以利用if陳述句的效果做到限制,撰寫出 if (j < col - 1) 用來限制列印 | 的次數,
第2行后不用列印 --- ,同樣利用上面的if陳述句 if (i < row - 1) 來限制分割行的次數,只用列印2行分割行 --- ,

3.玩家下棋
棋盤已將列印出來,接下來便是游戲的開始了,這時就要往棋盤里下棋,
//玩家下棋
void play_game(char board[ROW][COL], int row, int col)
{
//定義2個整型常量,來存放玩家輸入的坐標位置
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("請輸入坐標\n");
while (1)
{
scanf("%d %d", &x, &y);
//判斷玩家輸入的坐標是否在范圍內
if (x > 0 && x <= row && y > 0 && y <= col)
{
//判斷坐標是否被占用
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已被占用,請重新輸入坐標,\n");
}
}
else
printf("坐標非法\n");
}
}
4.電腦下棋
玩家下完棋,就該電腦下了,那電腦該怎么下棋呢?
這是要利用到庫函式 rand()函式;來生成一個亂數,
//電腦下棋
void computer_game(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//生成0~2的數字
y = rand() % col;//生成0~2的數字
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
這里的x = rand() % row; 很重要,%row可以將生成的數字保持在0~2之間,y也是一樣,
其中使用rand()是需先參考srand((unsigned int)time(NULL)); //隨機產生一個數
5.判斷輸贏
雙方都下過棋了,就需要判斷誰贏誰輸,還是平局,
可以采用函式的回傳型別來進行判斷,C——繼續,Q——平局,*——玩家贏,#——電腦贏,
//判斷輸贏
char is_win(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][1] != ' ')
{
return board[i][0];
}
}
//判斷三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[0][i];
}
}
//判斷正對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[0][0];
}
//判斷副對角線
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][2];
}
//判斷平局
//以上4種情況都不滿足時
if (1 == board_full(board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
在判斷出沒有人贏時,在利用 board_full(board, row, col) 函式進行檢測棋盤是否下滿,下滿則回傳1,否之回傳0;
//判斷
int board_full(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;
}
}
//棋盤以下滿,回傳1;
return 1;
}
所以game.c里的函式體也就結束了,剩下的便是在test.c檔案中來接受回傳的字符,
//判斷
if ('C' != is_win(board, ROW, COL))
{
if ('*' == is_win(board, ROW, COL))
{
printf("玩家贏\n");
break;
}
if ('#' == is_win(board, ROW, COL))
{
printf("電腦贏\n");
break;
}
if ('Q' == is_win(board, ROW, COL))
{
printf("平局\n");
break;
}
}
記得在判斷誰贏了后加上break;來終止回圈,
在test.c檔案中的game()函式中呼叫的函式有以下這些,這樣寫的好處是代碼簡單明了,方便檢查錯誤,有很大的便利,
void game()
{
//定義一個二維陣列
char board[ROW][COL] = { 0 };
//初始化棋盤
initialize_board(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
while (1)
{
//玩家下棋
play_game(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
//判斷
if ('C' != is_win(board, ROW, COL))
{
if ('*' == is_win(board, ROW, COL))
{
printf("玩家贏\n");
break;
}
if ('#' == is_win(board, ROW, COL))
{
printf("電腦贏\n");
break;
}
if ('Q' == is_win(board, ROW, COL))
{
printf("平局\n");
break;
}
}
//電腦下棋
computer_game(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
//判斷
if ('C' != is_win(board, ROW, COL))
{
if ('*' != is_win(board, ROW, COL))
printf("玩家贏\n");
if ('#' != is_win(board, ROW, COL))
printf("電腦贏\n");
if ('Q' != is_win(board, ROW, COL))
printf("平局\n");
}
}
}
至此,整個游戲也便可以運行了,
快去試試寫出自己的三子棋游戲,
三、整個游戲代碼
test.c
#include"game.h"
void game()
{
//定義一個二維陣列
char board[ROW][COL] = { 0 };
//初始化棋盤
initialize_board(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
while (1)
{
//玩家下棋
play_game(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
//判斷
if ('C' != is_win(board, ROW, COL))
{
if ('*' == is_win(board, ROW, COL))
{
printf("玩家贏\n");
break;
}
if ('#' == is_win(board, ROW, COL))
{
printf("電腦贏\n");
break;
}
if ('Q' == is_win(board, ROW, COL))
{
printf("平局\n");
break;
}
}
//電腦下棋
computer_game(board, ROW, COL);
//列印棋盤
printf_board(board, ROW, COL);
//判斷
if ('C' != is_win(board, ROW, COL))
{
if ('*' != is_win(board, ROW, COL))
printf("玩家贏\n");
if ('#' != is_win(board, ROW, COL))
printf("電腦贏\n");
if ('Q' != is_win(board, ROW, COL))
printf("平局\n");
}
}
}
void meau()
{
//列印選單
printf("************\n");
printf("***1.開始***\n");
printf("***0.退出***\n");
printf("************\n");
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));//隨機產生一個數
do
{
meau();
printf("請選擇\n");
//判斷玩家的選擇
scanf("%d", &input);
switch (input)
{
//選擇1則執行游戲程式
case 1:
game();
break;
//選擇0退出游戲
case 0:
break;
//輸入其他的數
default:
printf("請重新選擇\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
game.c
#include"game.h"
//初始化棋盤
void initialize_board(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 printf_board(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)//這里來限制分割行的次數,只用列印2行---
{
for (j = 0; j < col; j++)//用來列印每列的---
{
printf("---");
if (j < col - 1)//與上面一樣,限制列印 | 的次數
printf("|");
}
printf("\n");
}
}
}
//玩家下棋
void play_game(char board[ROW][COL], int row, int col)
{
//定義2個整型常量,來存放玩家輸入的坐標位置
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("請輸入坐標\n");
while (1)
{
scanf("%d %d", &x, &y);
//判斷玩家輸入的坐標是否在范圍內
if (x > 0 && x <= row && y > 0 && y <= col)
{
//判斷坐標是否被占用
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標已被占用,請重新輸入坐標,\n");
}
}
else
printf("坐標非法\n");
}
}
//電腦下棋
void computer_game(char board[ROW][COL], int row, int col)
{
printf("電腦下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//生成0~2的數字
y = rand() % col;//生成0~2的數字
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判斷
int board_full(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;
}
}
//棋盤以下滿,回傳1;
return 1;
}
//判斷輸贏
char is_win(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][1] != ' ')
{
return board[i][0];
}
}
//判斷三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[0][i];
}
}
//判斷正對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[0][0];
}
//判斷副對角線
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][2];
}
//判斷平局
//以上4種情況都不滿足時
if (1 == board_full(board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
game.h
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3 //行
#define COL 3 //列
//初始化棋盤
void initialize_board(char board[ROW][COL], int row, int col);
//列印棋盤
void printf_board(char board[ROW][COL], int row, int col);
//玩家下棋
void play_game(char board[ROW][COL], int row, int col);
//電腦下棋
void computer_game(char board[ROW][COL], int row, int col);
//判斷
char is_win(char board[ROW][COL], int row, int col);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356191.html
標籤:其他
上一篇:嵌入式作業會越來越少嗎?
下一篇:敲三字棋的思路
