如何做一款C語言小游戲——三子棋
前言
c語言在已經學習了基本常識,分支與回圈,函式,陣列以后是能夠獨立制作小游戲-三子棋.,為了使代碼更加簡潔,使用多檔案形式
1.游戲內容
1.能夠重復玩
2.電腦隨機下棋
3.玩家下棋
4.列印棋盤
5.判斷輸贏
2.實作重復玩
重復玩,也就是用回圈來實作重復玩的邏輯,由于每一次啟動程式,都應該進入游戲,所以使用do while回圈,同時記得給玩家提示,如何開始游戲
//test.C
void meum()
{
printf("**************\n");
printf("*****1.play***\n");
printf("*****0.exit***\n");
printf("**************\n");
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
meum();
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("你已經退出了游戲了哦\n");
break;
}
default:
{
printf("你輸入錯了,你得再輸入一遍");
break;
}
}
} while (input);
}
如代碼,當input為1時,則進入switch陳述句中的case 1,進入游戲,如果選擇0,則進入case 0 ,退出游戲,同時由于do while回圈中 input=0,為假,跳出回圈,程式執行結束,利用 0 為假來控制結束程式,如果輸入其他字符,則會提示玩家,輸入錯誤,重新輸入
3.初始化棋盤,
棋盤的內容應該都是空格,由于是三子棋,所以應該是九宮格類似的棋盤,
可以定義一個二維陣列,再將二維陣列的內容初始化為空格
代碼如下
//test.c
char board[ROW][COL];
//game.c
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++)
{
arr[i][j]=' ';
}
}
}
//game.h
void initboard(char board[ROW][COL],int row,int col);
4.列印棋盤
棋盤應該不只是全空格,要不然剛開始會什么也看不見,同時游戲也不是很美觀,
我們希望應該是一個由分割行的棋盤,

列印陣列還是用回圈來實作
要實作如圖的棋盤,應該在二維陣列的每一個元素的兩邊都有一個空格,同時只有最后一個元素的后面沒有分割行,而其他元素的右邊都會有分割行,而且第一行與第二行下方有分割行,也就是只有最后一行的下方沒有分割行
實作的代碼如下
void printboard(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++)
{
if (j < col - 1)
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %c ", board[i][j]);
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
{
printf("---");
}
}
printf("\n");
}
}
5.玩家下棋
##### 1.玩家輸入
玩家下棋輸入棋盤的坐標,但是玩家不是程式員,需要注意二維陣列的下標起始是 0 ,所以在對棋盤內容修改時記得注意這一點,
2.棋盤輸入錯誤的情況
在玩家下棋的程序,可能出現三種情況,1:輸入成功玩家實作了下棋,(玩家輸入正確同時棋盤內容為空格)2:該棋盤已經被玩家或者電腦下過了,
3.玩家輸入的坐標是錯誤的,
對于 第一種情況而言,是不需要重新輸入坐標的,而對于第二種與第三種情況,應該讓玩家重新輸入坐標
3.實作代碼如下
//game.c
void playermove(char board[ROW][COL], int row, int col)
{
int x, y;
while (1)
{
printf("玩家走> 請輸入\n");
scanf("%d%d", &x, &y);
if (x <= 3 && x >= 1 && y <= 3 && y >= 1 && board[x-1][y-1]==' ')
{
board[x - 1][y - 1] = '#';
break;
}
else if (board[x-1][y-1] == '#'|| board[x - 1][y - 1] == '*')
{
printf("已經被下過了,再下一次\n");
}
else
{
printf("坐標非法,重新輸入\n");
}
}
}
//game.h
void playermove(char board[ROW][COL], int row, int col)
6.電腦下棋
電腦下棋,坐標的輸入是隨機的,同時應該保證與玩家下棋類似的邏輯,但是由于電腦下棋,是不需要提示玩家電腦輸入錯誤的,電腦會重新生成亂數坐標并再一次輸入棋盤中,
代碼如下
其中 %3 的作用是使得每一次下棋得亂數都在0-2之間
使用rand函式記得設定種子srand()函式
void computermove(char board[ROW][COL], int row, int col)
{
printf("電腦走>\n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
7.判斷輸贏
三子棋顧名思義,也就是行或者列都擁有三個相同得棋子或者對角線也擁有三個相同的棋子則為勝利
當然,也有可能為平局
代碼如下
代碼決議:先判斷行列或者對角線是否有三個相同的元素并且不為空格,如果都不成立,則只有平局和繼續游戲兩種情況,先判斷棋盤是否已經下滿,下滿則平局,沒下滿則繼續下棋
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;//滿了
}
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][1] != ' ')
{
return board[i][1];
}
}
//豎三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//兩個對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
//判斷是否平局
if (1 == IsFull(board, ROW, COL))
{
return 'Q';
}
//繼續
return 'C';
}
8.主要游戲邏輯
進入game游戲函式以后,要做到先列印棋盤給玩家看,玩家下棋以后再列印棋盤給玩家看,同時判斷輸贏,電腦下完棋也有判斷輸贏并且列印棋盤給玩家看,玩家才能輸得明白,
代碼如下
void game()
{
char ret = 0;
char board[ROW][COL];
//初始化棋盤
initboard(board, ROW, COL);
//列印棋盤
printboard(board, ROW, COL);
while (1)
{
//玩家走
playermove(board, ROW, COL);
printboard(board, ROW, COL);
//判斷輸贏
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//電腦走
computermove(board, ROW, COL);
printboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("電腦贏\n");
}
else if (ret == '#')
{
printf("玩家贏\n");
}
else
{
printf("平局\n");
}
}
9.全部游戲代碼
//test.c
#include"game.h"
void meum()
{
printf("**************\n");
printf("*****1.play***\n");
printf("*****0.exit***\n");
printf("**************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL];
//初始化棋盤
initboard(board, ROW, COL);
//列印棋盤
printboard(board, ROW, COL);
while (1)
{
//玩家走
playermove(board, ROW, COL);
printboard(board, ROW, COL);
//判斷輸贏
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//電腦走
computermove(board, ROW, COL);
printboard(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()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
meum();
scanf("%d", &input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("你已經退出了游戲了哦\n");
}
default:
{
printf("你輸出錯了,你得再輸入一遍");
}
}
} while (input);
}
//game.c
#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 printboard(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++)
{
if (j < col - 1)
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %c ", board[i][j]);
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
{
printf("---");
}
}
printf("\n");
}
}
void playermove(char board[ROW][COL], int row, int col)
{
int x, y;
while (1)
{
printf("玩家走> 請輸入\n");
scanf("%d%d", &x, &y);
if (x <= 3 && x >= 1 && y <= 3 && y >= 1 && board[x-1][y-1]==' ')
{
board[x - 1][y - 1] = '#';
break;
}
else if (board[x-1][y-1] == '#'|| board[x - 1][y - 1] == '*')
{
printf("已經被下過了,再下一次\n");
}
else
{
printf("坐標非法,重新輸入\n");
}
}
}
void computermove(char board[ROW][COL], int row, int col)
{
printf("電腦走>\n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
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;//滿了
}
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][1] != ' ')
{
return board[i][1];
}
}
//豎三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//兩個對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
//判斷是否平局
if (1 == IsFull(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 initboard(char board[ROW][COL],int row,int col);
void printboard(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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/356849.html
標籤:其他
下一篇:小游戲系列——低配版掃雷
