網站首頁 編程語言 正文
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://z-ming.blog.csdn.net/article/details/122070318
相關推薦
- 2022-12-24 fetch()函數說明與使用方法詳解_基礎知識
- 2022-05-31 jQuery實現側邊導航欄及滑動電梯效果(仿淘寶)_jquery
- 2022-09-25 aspnet core中間件 短路 Response.WriteAsync正確用法
- 2022-05-11 如何使 React 中的 useEffect、useLayoutEffect 只調用一次
- 2023-02-07 C++11中的引用限定符示例代碼_C 語言
- 2022-04-25 Pycharm報錯:'NoneType'?object?has?no?attribute?'byte
- 2022-04-01 Python格式化輸出之format用法詳解_python
- 2024-07-18 【SpringBoot】SpringCache輕松啟用Redis緩存
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支