C語言實作井字棋小游戲
文章目錄
- C語言實作井字棋小游戲
- 前言
- 一、寫一個簡易的選單
- 二、初始化并列印出棋盤
- 1. 先進行初始化棋盤,將棋盤中的每個數值初始化為空白
- 2. 列印出棋盤,并且中間要留下棋子(陣列)的位置
- 三、玩家或者電腦下棋
- 1. 玩家下棋(并列印)
- 2. 電腦下棋(并列印)
- 四、判斷輸贏
- 總結
- game.h檔案
- game.c檔案:
- 主程式.c檔案
前言
相信很多人都玩過井字棋,簡單介紹一下游戲規則:
當行或列或斜對角出現三個相同棋子,那么使用該棋子的棋手獲勝,那么今天我們利用C語言中的陣列和回圈的知識來實作一個簡單的三子棋小游戲,這里我們可以分檔案寫,這樣更加清晰明了,
那么我們大概可以分為幾個步驟:
1. 打開vs2019
2. 新建專案
3. 寫入代碼
4. 運行,大功告成

1.寫一個簡易的選單
2.初始化并列印出棋盤
3.玩家或者電腦下棋
4.判斷輸贏
本次專案大致可以分為三個檔案:
1.game.c(函式的實作)
2.game.h(函式宣告,頭檔案)
3.主程式.c
一、寫一個簡易的選單
在主程式中寫出一個建議的選單
void menu()
{
printf("請選擇:\n");
printf("***************************\n");
printf("***1.play 2.exit***\n");
printf("***************************\n");
}
當我們選擇1時就進入游戲,如果選擇2則退出游戲,
int main()
{
int input = 0;
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出游戲");
break;
default:
printf("輸入錯誤,請重新輸入");
}
} while (input != 2);
return 0;
}
這里的game()函式即是游戲整體的實作
二、初始化并列印出棋盤
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
}
在game.h頭檔案中宣告頭檔案中定義ROW、COL為3,宣告出這兩個函式,并包含所需頭檔案
#define ROW 3
#define COL 3
#include<stdio.h>
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
那么再實作這兩個函式
1. 先進行初始化棋盤,將棋盤中的每個數值初始化為空白
在game.c中實作代碼,代碼如下(示例):
void initialize(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] = ' ';//初始化為字符' '
}
}
}
2. 列印出棋盤,并且中間要留下棋子(陣列)的位置
在game.c中實作代碼,代碼如下(示例):
void display(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");
}
}
}

1.這里棋盤的列印可以分為三行,三列,
2.在第一行中列印出棋盤內容(陣列內容)和分隔符’ | ‘,換行,
3.列印分割用的’—’,三列列印三次即可,再列印出分隔 符’|’,(演示效果圖連在一起了),
4.利用回圈,依次列印出第二行,第三行的內容,
三、玩家或者電腦下棋
1. 玩家下棋(并列印)
在game()函式中呼叫,代碼如下(示例):
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
playermove(board, ROW, COL);//玩家移動
display(board, ROW, COL);//列印
}
在game.h頭檔案中宣告,代碼如下(示例):
#define ROW 3
#define COL 3
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
在game.c中實作代碼,代碼如下(示例):
void playermove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x, y = 0;
printf("請輸入您要下的位置");
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");
}
}
}
作為游戲的設計者當然知道陣列下標是從0開始的,但是玩家不知道啊,所以讓玩家輸入一個大于零小于三的數字,并在玩家所輸入的數字基礎上減1即可,
當玩家移動后讓電腦移動:
2. 電腦下棋(并列印)
在game()函式中呼叫,代碼如下(示例):
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
playermove(board, ROW, COL);//玩家移動
display(board, ROW, COL);//列印
pcmove(board, ROW, COL);//電腦走
display(board, ROW, COL);//列印
}
在game.h頭檔案中宣告,代碼如下(示例):
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
void pcmove(char board[ROW][COL], int row, int col);
在game.c中實作代碼,代碼如下(示例):
void pcmove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:\n");
x = rand() % row;
y = rand() % col;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
這里還是定義陣列的下標為x,y,并使用回圈判斷陣列位置是否為空白,下完棋子使用break終止回圈,與玩家不同的是x,y是隨機值,那么在C語言中的隨機值是用rand函式,并且取余之后的值的范圍,是根據模誰來判斷的,在C語言中時間就是一個亂數,要在主程式中進行初始化,并且要在頭檔案中包含<stdlib.h>和<time.h>檔案,同時電腦也要下在空白處,
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出游戲");
break;
default:
printf("輸入錯誤,請重新輸入");
}
} while (input != 2);
return 0;
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
void pcmove(char board[ROW][COL], int row, int col);
這里將頭檔案一并寫在geme.h的頭檔案中,那么在其他檔案中直接#include"game.h"即可,
很明顯的,我們下棋不可能只下一次就結束了,那么我們可以對playermove和pcmove使用一個回圈,然后在回圈中,判斷輸贏平局之類的,用以跳出整個回圈,
在game()函式中實作代碼,代碼如下(示例):
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
while (1)
{
playermove(board, ROW, COL);//玩家移動
display(board, ROW, COL);//列印
pcmove(board, ROW, COL);//電腦走
display(board, ROW, COL);//列印
}
}
至此,大概的游戲模塊已經實作完畢,萬事俱備,最后再寫一個用以判斷的函式即可
四、判斷輸贏
在game()函式中呼叫,代碼如下(示例):
定義一個字符變數char ret= whowin(board, ROW, COL),用于接收whowin函式的回傳值
如果回傳值為‘*’,玩家獲勝,回傳值’#'電腦獲勝,(不會真有人輸給電腦吧),
每下完一個棋,都要進行判斷輸贏,當不滿足獲勝或平局條件則回傳字符’C’,回圈繼續,當滿足獲勝或平局條件,則回傳其他字符,回圈終止,進行判斷是誰贏了,或者平局,
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
char ret = 0;
while (1)
{
playermove(board, ROW, COL);//玩家移動
display(board, ROW, COL);//列印
ret = whowin(board, ROW, COL);
if (ret != 'C')
{
break;
}
pcmove(board, ROW, COL);//電腦走
display(board, ROW, COL);//列印
ret = whowin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家獲勝\n");
}
else if (ret == '#')
{
printf("電腦獲勝\n");
}
else
{
printf("平局\n");
}
}
在game.h頭檔案中宣告,代碼如下(示例):
用于判斷輸贏的函式宣告回傳值型別為char型,回傳該行中已經獲勝的陣列元素,
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
void pcmove(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);
char whowin(char board[ROW][COL], int row, int col);
在game.c中實作代碼,代碼如下(示例):
回傳值型別為int 型的is_full函式判斷棋盤是否為滿格,如果是滿格則回傳1,如果不是回傳0,
并且在whowin函式中接收值,
int is_full(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 (board[i][j]==' ')
return 0;//沒滿
}
}
return 1;//滿了
}
char whowin(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];
}
}
//判斷列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j]&&board[j][1] != ' ')
{
return board[0][j];
}
}
//斜對角
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 == is_full(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
在代碼中使用回圈遍歷陣列:分別判斷行列和對角線的判斷,并回傳該行中其中一個元素即可,
在用if陳述句判斷if_full函式陣列元素是否滿格,如果is_full函式回傳值為1,則滿格則回傳Q,不是就回傳C,且作為判斷的中間值board[i][1]或者board[j][1]不能為空白,否則判斷為平局,如果去掉這一判斷條件,判斷到第二行時,全部為’ ‘(空格字符),回傳’ '(空格字符),判斷平局,
總結
提示:這里對代碼進行總結:
game.h檔案
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void initialize(char board[ROW][COL], int row, int col);
void display(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
void pcmove(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);
char whowin(char board[ROW][COL], int row, int col);
game.c檔案:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void initialize(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 display(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)
{
while (1)
{
int x, y = 0;
printf("請輸入您要下的位置");
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 pcmove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:\n");
x = rand() % row;
y = rand() % col;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(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 (board[i][j]==' ')
return 0;//沒滿
}
}
return 1;//滿了
}
char whowin(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];
}
}
//判斷列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j]&&board[j][1] != ' ')
{
return board[0][j];
}
}
//斜對角
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 == is_full(board, ROW, COL))
{
return 'Q';
}
return 'C';
}
主程式.c檔案
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("請選擇:\n");
printf("***************************\n");
printf("***1.play 2.exit***\n");
printf("***************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
initialize(board, ROW, COL);//初始化棋盤
display(board, ROW, COL);//列印棋盤
char ret = 0;
while (1)
{
playermove(board, ROW, COL);//玩家移動
display(board, ROW, COL);//列印
ret = whowin(board, ROW, COL);
if (ret != 'C')
{
break;
}
pcmove(board, ROW, COL);//電腦走
display(board, ROW, COL);//列印
ret = whowin(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 int)time(NULL));
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出游戲");
break;
default:
printf("輸入錯誤,請重新輸入");
}
} while (input != 2);
return 0;
}
那么這么一個非常簡單的三子棋小游戲就完成了,
比心!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290974.html
標籤:其他
上一篇:用C語言實作掃雷小游戲(附上思路+專案展示+源代碼)
下一篇:【游戲開發實戰】Unity從零開發多人視頻聊天功能,無聊了就和自己視頻聊天(附原始碼 | Mirror | 多人視頻 | 詳細教程)
