大家好!我是誠摯的喬治
目錄
1.先進行環境的配置
2.各種功能實作的邏輯關系
2.1 實作游戲的開始退出流程
2.2 創建一個名為board的二維陣列,并進行初始化
2.3 棋盤的搭建
2.4 玩家下棋,并列印新的棋盤
2.5 電腦下棋,并列印新的棋盤
2.6.判斷結果
3.程式實作的代碼
3.1 text.c
3.2 game.h
3.3 game.c
前言:
相信我們都玩過三子棋,規則很簡單,但想用c語言做出這個游戲,事實上也是比較簡單的.(嗯.....的確是這樣)下面通過c語言進行對五子棋的分析.
1.先進行環境的配置
一共會用到三個檔案,分別是兩個源檔案test.c game.c ,還有一個頭檔案game.h
他們的關系分別是:

test.c是主體,是游戲的測驗邏輯
game.c是游戲的實作邏輯
game.h是實作游戲函式的宣告
也就是說,main函式在test.c檔案中,游戲的實作會使用一部分函式,而函式的功能的實作主要是在game.c函式里,主體檔案中使用時參考即可,game.c函式中主要是為了函式的宣告,說到這里,你是不是有疑惑,為什么要創建這么多的檔案,事實上,如果要實作三子棋的看功能的實作的確只需要一個test.c就可以完成,但是分開能夠很好區分各自的功能,防止檔案的內容過于繁瑣,不便觀察,這樣就能更好的理解,
2.各種功能實作的邏輯關系
游戲的實作大致流程是:
1.實作游戲的開始退出流程
2.創建一個名為board的二維陣列,并進行初始化
3.棋盤的搭建
4.玩家下棋,并列印新的棋盤
5.電腦下棋,并列印新的棋盤
6.判斷結果
2.1 實作游戲的開始退出流程
便于分析,我把各部分的功能分解,所有的功能全部放在test函式中來實作,
int main()
{
test();
return 0;
}
列印一個選單,
void menu()
{
printf("**************************\n");
printf("****** 1.star **********\n");
printf("****** 0.exit **********\n");
printf("**************************\n");
}
玩家選擇開始游戲與退出游戲選擇的實作
void test()
{
int input = 0;
do
{
menu();
printf("請輸入開始或者退出:");
scanf("%d", &input);
switch (input)
{
case(1):
game(); break;
case(0):
printf("退出游戲\n"); break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2.2 創建一個名為board的二維陣列,并進行初始化
創造一個二維陣列,初始話陣列,實作程式的大體框架
char board[ROW][COL] = { 0 };
void InitBoard(char board[ROW][COL], int row, int col)//初始化陣列
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
2.3 棋盤的搭建
首先是在game.c檔案中,實作棋盤搭建的功能
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");
}
}
然后就在test.c檔案呼叫
InitBoard(board, ROW, COL);
這一點是一個關鍵,棋盤的搭建,要留有資料的空間,以便于游戲開始時,玩家或電腦在棋盤上進行操作,還有每一行有一個分割線,且要保證每一行的區分,還有每一豎的分界線,要保證元素分割開,創建一個“井”子框架,
2.4 玩家下棋,并列印新的棋盤
在game檔案中實作玩家在棋盤上的空位進行判斷,并選擇一個位置在上面列印出你自己選擇的符號,并列印出你在上面操作之后的棋盤,
void Player_move(char board[ROW][COL], int row, int col)
{
int x, y;
while (1)
{
printf("請選擇坐標:\n");
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");
}
}
}
2.5 電腦下棋,并列印新的棋盤
玩家選擇一個位置列印符號后,這時候就要用rand函式產生一個亂數,并指定亂數的范圍,再隨機產生一個坐標,電腦自動選擇一個空位置隨機列印另一個符號,并重新列印出新的棋盤,(如果以后有機會,希望自己寫一個比較厲害的演算法 哈哈)
void computer_move(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;
}
}
}
2.6.判斷結果
再進行多次玩家--電腦--玩家--電腦的回圈之后,就會出現一個結果,這時候就要對結果進行分析,當三個相同的符號連在一起時,這些情況包括行豎,還有對角線,如果三符號相同,就會出現一個結果,當然,當全部下滿時,就會產生一個平局,代碼的實作如下:
//判斷輸贏
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
創建一個 is_win函式,并回傳一個符號,判斷結果
回傳的符號分別表示:
玩家贏:*
電腦贏:#
平局:Q;
繼續:C;
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[1][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 (1 == is_full(board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
當棋盤下滿時,若為分出勝負,就會使用is_full函式,并回傳相應符號,結果就是平局,
int is_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;
}
}
}
return 1;
}
3.程式實作的代碼
3.1 text.c
#define _CRT_SECURE_NO_WARNINGS 1
//游戲的開發邏輯
#include"game.h"
void game()
{
//假設玩家下的棋子是*,電腦下的是#
char board[ROW][COL] = { 0 };//陣列的內容應該全部是空格
//初始化棋盤
InitBoard(board, ROW, COL);
//列印棋盤
DisplayBoard(board, ROW, COL);
//玩家下棋
char ret = 0;
while (1)
{
srand((unsigned)time(NULL));
Player_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = is_win(board, ROW, COL);
//判斷輸贏
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if (ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
void menu()
{
printf("**************************\n");
printf("****** 1.star **********\n");
printf("****** 0.exit **********\n");
printf("**************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("請輸入開始或者退出:");
scanf("%d", &input);
switch (input)
{
case(1):
game(); break;
case(0):
printf("退出游戲\n"); break;
default:
printf("選擇錯誤,請重新選擇\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
3.2 game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//游戲實作函式的宣告
#include<stdio.h>
#define ROW 3
#define COL 3
#include<time.h>
#include <stdlib.h>
void InitBoard(char board[ROW][COL], int row, int col);//初始化函式
void DisplayBoard(char board[ROW][COL], int row, int col);//展示棋盤
void Player_move(char board[ROW][COL], int row, int col);//玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//電腦下棋
char is_win(char board[ROW][COL], int row, int col);
3.3 game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//游戲的實作邏輯
int is_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;
}
}
}
return 1;
}
void InitBoard(char board[ROW][COL], int row, int col)//初始化陣列
{
int i, j;
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 Player_move(char board[ROW][COL], int row, int col)
{
int x, y;
while (1)
{
printf("請選擇坐標:\n");
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 computer_move(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;
}
}
}
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[1][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 (1 == is_full(board, row, col))
{
return 'Q';
}
//繼續
return 'C';
}
有問題歡迎大家指出,我也歡迎有不懂的地方來提問啊🤞
如果有用就收藏唄~~看😃😃😃😃😃
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389321.html
標籤:其他
上一篇:Linux相關的內容(一)
下一篇:構建docker環境能夠運行自己的GPU服務,能夠快速適應不同宿主機的GPU型號、作業系統和驅動。linux版本、nvidia驅動、cuda、cudnn,docker+conda安裝深度學習環境
