游戲介紹
三子棋又名井字棋,顧名思義與五子棋規則相同,當一方棋子的一行、一列、或斜對角線的三個棋子連成一條直線,則該方獲勝,本次實作的三子棋由玩家對戰電腦,
本次游戲的實作分為以下三個檔案:
1.game.c //游戲功能的實作
2.game.h //游戲函式的頭檔案,宣告函式
3.主程式.c
寫一個選單函式
列印游戲開始時的選項,如果選擇1則開始游戲,選擇0則退出游戲,選擇其他數字則重新進行選擇,這段代碼放在:主程式.c
//列印游戲選單
void menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
將這個函式放在main()中,然后進行選擇:
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //這是亂數生成
do
{
menu(); //列印選單
scanf("%d", &input);
switch (input)
{
case 1:
game(); //進行游戲
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
}
} while (input);
return 0;
}
初始化并列印棋盤
在game.h中定義兩個變數,分別是棋盤的行和列,并且宣告InitBoard函式和DisplayBoard函式,功能是初始化棋盤和列印棋盤,
#define ROW 3 //定義行為3
#define COL 3 //定義列為3
void InitBoard(char board[ROW][COL],int row,int col); //初始化棋盤
void DisplayBoard(char board[ROW][COL], int row, int col); //列印棋盤
在game函式中實作這兩個函式
void game()
{
char board[ROW][COL]; //棋盤陣列
InitBoard(board,ROW,COL);
DisplayBoard(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++)
{
board[i][j] = ' ';
}
}
}
//列印出棋盤
void DisplayBoard(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)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
玩家下棋和電腦下棋函式
在game.h中繼續宣告兩個函式,分別為PlayerMove()和ComputerMove()
#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 boaed[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
當然在game函式中要實作,規則就是使用一個while回圈,玩家下一個,然后列印棋盤,判斷有沒有三子連線,如果有就退出,如果沒有就繼續讓電腦下一個,電腦下完繼續判斷,如果有三子連線就退出,如果沒有則會繼續回圈,玩家下棋使用“*”,電腦下棋使用“#”,
void game()
{
char board[ROW][COL];//棋盤陣列
InitBoard(board,ROW,COL);
DisplayBoard(board, ROW, COL);
char ret = 0;
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):
玩家通過輸入坐標下棋,如果輸入坐標的位置是空格的話可以下,如果已經下過來會顯示重新輸入坐標,
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家走->\n");
int x = 0;
int y = 0;
while (1)
{
printf("請輸入坐標:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,超出范圍\n");
}
}
}
電腦下棋函式(放在game.c):
電腦自動生成隨機坐標,在有空格的位置下棋,
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.h
#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 DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char boaed[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); //添加一個判斷輸贏的函式
這是主程式.c和game.c都要包含的
#include <stdio.h>
#include "game.h"
判斷棋盤是否為滿格函式
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][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[1][1] != ' ')
{
return board[1][1];
}
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';
}
}
總結
主程式.c檔案代碼:
#include <stdio.h>
#include "game.h"
void menu()
{
printf("******************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("******************\n");
}
void game()
{
char board[ROW][COL];//棋盤陣列
InitBoard(board,ROW,COL);
DisplayBoard(board, ROW, COL);
char ret = 0;
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");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
}
} while (input);
return 0;
}
game.h檔案代碼:
#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 DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char boaed[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);
game.c檔案代碼:
#include <stdio.h>
#include "game.h"
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++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(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)
{
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;
while (1)
{
printf("請輸入坐標:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐標被占用,請重新輸入\n");
}
}
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;
}
}
}
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][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[1][1] != ' ')
{
return board[1][1];
}
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';
}
}
到此結束,一個簡單的三子棋小游戲就做好啦~~嘿嘿
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291576.html
標籤:其他
上一篇:C++掃雷小游戲(附贈源代碼)
下一篇:Unity 性能調優技術集錦
