c語言實現三子棋小游戲(涉及二維數組、函數、循環、常量、動態取地址等知識點)

使用C語言實現一個三子棋小游戲

涉及知識點:二維數組自定義函數自帶函數庫循環常量動態取地址等等

一些細節點:

1、引入自定義頭文件,需要用""雙引號包裹文件名,目的是為了和官方頭文件的<>區分開。
#include "game.h"
2、使用rand()函數,需要先調用sand(),保證每次隨機函數生成的值均不一樣
3、為了使srand()擁有隨機種子,可以使用時間戳函數time()作為值傳入使用
4、自定義方法首字母大寫,是為了和官方函數庫區分開

三子棋代碼如下:

效果

在這里插入圖片描述

代碼

函數頭文件 game.h
#include <stdio.h>
#include <time.h>// 定義棋盤的行與列(二位數組的大小)
#define ROW 3
#define COL 3// 菜單打印
void Menu();
//開始游戲
void Game();// 初始化棋盤
void InitChessboard(char board[ROW][COL], int row, int col);
// 打印棋盤
void PrintBoard(char board[ROW][COL], int row, int col);
// 玩家輸入
void PlayerInput(char board[ROW][COL], int row, int col);
//電腦輸入
void ComputerInput(char board[ROW][COL], int row, int col);
// 判斷棋局是否結束
char IsEnd(char board[ROW][COL], int row, int col);
函數主文件 game.c
#define _CRT_SECURE_NO_WARNINGS
// 引入自定義函數頭文件
#include "game.h"// 菜單選項
void Menu()
{printf("***************三子棋***************\n");printf("******* 1.開始游戲 0.退出游戲 ******\n");printf("************************************\n");}// 打印棋盤
void PrintBoard(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){int k = 0;for (k = 0; k < col; k++){printf("---");if (k < col - 1){printf("|");}}printf("\n");}}printf("\n");
}// 初始化棋盤
void InitChessboard(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 PlayerInput(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家請下棋(格式為數字+空格+數字,按下回車確認)\n請輸入坐標:");scanf("%d %d", &x, &y);// 判斷玩家輸入值是否超出棋盤if ((x > ROW || x < 1) || (y > COL || y < 1) ){printf("坐標值超出棋盤大小,請重新輸入\n");}// 判斷坐標位置是否已有棋子else if(board[x-1][y-1] !=  ' '){printf("該位置已存在棋子,請重新輸入\n");}// 滿足條件,可下棋else{board[x-1][y-1] = '*';// 約定:玩家下棋用*表示break;}}}// 電腦下棋
void ComputerInput(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){// 產生一個隨機位置 范圍[0, ROW/COL - 1]x = rand() % ROW; // 行位置y = rand() % COL; // 列位置// 因為隨機數的產生做了限制,此處無須再做數值的有效性校驗// 位置是否沖突校驗(等于空格則認為該位置可下)if (board[x][y] == ' '){board[x][y] = '#';// 約定:電腦下棋用#表示break;}}printf("電腦下棋\n");
}// 判斷棋局是否結束
char IsEnd(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][2] != ' '){return board[0][0];}}// 列int j = 0;for ( j = 0; j < COL; j++){// 有一列相同就認為完成三連if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' '){return board[0][0];}}// 斜角if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && board[2][2] != ' '){return board[0][0];}if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && board[2][0] != ' '){return board[0][2];}// 判斷平局int x = 0;int y = 0;for (x = 0; x < ROW; x++){for (y = 0; y < COL; y++){// 但凡存在一個空格說明棋盤還有空位if (board[x][y] == ' '){return 'g'; // go on 繼續}}}return 'd';// dogfall 表示平局
}void Game()
{char board[ROW][COL] = { 0 };//初始化棋盤InitChessboard(board, ROW, COL);//打印棋盤PrintBoard(board, ROW, COL);char res = 0;// 循環表示玩家和電腦依次下棋while (1){// 玩家輸入PlayerInput(board, ROW, COL);// 輸入完畢打印棋盤PrintBoard(board, ROW, COL);// 判斷棋局是否結束res = IsEnd(board, ROW, COL);// 不為g表示有了結果,為g就繼續下棋if ('g' != res){break;}//電腦輸入ComputerInput(board, ROW, COL);// 輸入完畢打印棋盤PrintBoard(board, ROW, COL);// 判斷棋局是否結束res = IsEnd(board, ROW, COL);// 不為g表示有了結果,為g就繼續下棋if ('g' != res){break;}}// 判斷贏家/平局if ('*' == res){printf("玩家獲勝!\n");}else if ('#' == res){printf("電腦獲勝!\n");}else{printf("平局!\n");}}
main函數入口文件 test.c
#define _CRT_SECURE_NO_WARNINGS#include "game.h"int main()
{// 三子棋int a = 0;do{// srand 保證隨機數每次生成均不一樣srand((unsigned int)time(NULL));//打印菜單Menu();printf("請輸入:");scanf("%d", &a);if (1 == a){printf("------三子棋游戲開始------\n\n");// 開始游戲Game();}else if(0 == a){printf("退出游戲\n");return;} else{printf("輸出數字錯誤,請重新輸入\n");}} while (a);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70957.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言數據類型及其使用 (帶示例)

目錄 1. 基本數據類型 整型 浮點型 字符型 2. 構造數據類型 數組 結構體 聯合體&#xff08;共用體&#xff09; 枚舉類型 3. 指針類型 4. 空類型 在 C 語言中&#xff0c;數據類型是非常重要的概念&#xff0c;它決定了數據在內存中的存儲方式、占用空間大小以及可…

Web自動化之Selenium添加網站Cookies實現免登錄

在使用Selenium進行Web自動化時&#xff0c;添加網站Cookies是實現免登錄的一種高效方法。通過模擬瀏覽器行為&#xff0c;我們可以將已登錄狀態的Cookies存儲起來&#xff0c;并在下次自動化測試或爬蟲任務中直接加載這些Cookies&#xff0c;從而跳過登錄步驟。 Cookies簡介 …

NAT 技術:網絡中的 “地址魔術師”

目錄 一、性能瓶頸&#xff1a;NAT 的 “阿喀琉斯之踵” &#xff08;一&#xff09;數據包處理延遲 &#xff08;二&#xff09;高并發下的性能損耗 二、應用兼容性&#xff1a;NAT 帶來的 “適配難題” &#xff08;一&#xff09;端到端通信的困境 &#xff08;二&…

php序列化與反序列化

文章目錄 基礎知識魔術方法&#xff1a;在序列化和反序列化過程中自動調用的方法什么是 __destruct() 方法&#xff1f;何時觸發 __destruct() 方法&#xff1f;用途&#xff1a;語法示例&#xff1a; 反序列化漏洞利用前提條件一些繞過策略繞過__wakeup函數繞過正則匹配繞過相…

docker 占用系統空間太大了,整體遷移到掛載的其他磁盤|【當前普通用戶使用docker時,無法指定鏡像、容器安裝位置【無法指定】】

文章目錄 前言【核心步驟皆為 大模型生成的方案】總結步驟應該是&#xff1a;詳細步驟如下1. **停止 Docker 服務**2. **備份原數據&#xff08;防止遷移失敗&#xff09;**3. **遷移數據到新磁盤**4. **修改 Docker 配置文件**5. **重啟 Docker 服務**6. **驗證容器和鏡像**7.…

設計后端返回給前端的返回體

目錄 1、為什么要設計返回體&#xff1f; 2、返回體包含哪些內容&#xff08;如何設計&#xff09;&#xff1f; 舉例 3、總結 1、為什么要設計返回體&#xff1f; 在設計后端返回給前端的返回體時&#xff0c;通常需要遵循一定的規范&#xff0c;以確保前后端交互的清晰性…

Springboot 自動化裝配的原理

Springboot 自動化裝配的原理 SpringBoot 主要作用為&#xff1a;起步依賴、自動裝配。而為了實現這種功能&#xff0c;SpringBoot 底層主要使用了 SpringBootApplication 注解。 首先&#xff0c;SpringBootApplication 是一個復合注解&#xff0c;它結合了 Configuration、…

基于vue框架的游戲博客網站設計iw282(程序+源碼+數據庫+調試部署+開發環境)帶論文文檔1萬字以上,文末可獲取,系統界面在最后面。

系統程序文件列表 項目功能&#xff1a;用戶,博客信息,資源共享,游戲視頻,游戲照片 開題報告內容 基于FlaskVue框架的游戲博客網站設計開題報告 一、項目背景與意義 隨著互聯網技術的飛速發展和游戲產業的不斷壯大&#xff0c;游戲玩家對游戲資訊、攻略、評測等內容的需求日…

算法-二叉樹篇13-路徑總和

路徑總和 力扣題目鏈接 題目描述 給你二叉樹的根節點 root 和一個表示目標和的整數 targetSum 。判斷該樹中是否存在 根節點到葉子節點 的路徑&#xff0c;這條路徑上所有節點值相加等于目標和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否則&#xff0c;返回…

8. 示例:對32位數據總線實現位寬和值域覆蓋

文章目錄 前言示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;仿真與覆蓋率分析覆蓋點詳細說明覆蓋率提升技巧常見錯誤排查 示例四&#xff1a;仿真步驟 前言 針對32位數據總線實現位寬和值域的覆蓋&#xff0c;并且能夠用xrun運行&#xff0c;查看日志和波形。cover…

TDengine 中的數據庫

數據庫概念 時序數據庫 TDengine 中數據庫概念&#xff0c;等同于關系型數據庫 MYSQL PostgreSQL 中的數據庫&#xff0c;都是對資源進行分割管理的單位。 TDengine 數據庫與關系型數據庫最大區別是跨庫操作&#xff0c;TDengine 數據庫跨庫操作除了少量幾個SQL 能支持外&…

開源電商項目、物聯網項目、銷售系統項目和社區團購項目

以下是推薦的開源電商項目、物聯網項目、銷售系統項目和社區團購項目&#xff0c;均使用Java開發&#xff0c;且無需付費&#xff0c;GitHub地址如下&#xff1a; ### 開源電商項目 1. **mall** GitHub地址&#xff1a;[https://github.com/macrozheng/mall](https://git…

如何設計一個短鏈系統?

短鏈系統設計的關鍵要點: 系統功能實現 短鏈生成:接收長鏈接,先檢查是否已有對應短鏈,存在則直接返回。否則,使用分布式 ID 生成器(如號段模式、SnowFlake 算法、數據庫自增 ID、Redis 自增等)生成唯一 ID,或通過哈希算法(如 MurmurHash)處理長鏈接得到哈希值。再將生…

數據結構(初階)(三)----單鏈表

單鏈表 概念 概念&#xff1a;鏈表是?種物理存儲結構上?連續、?順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。 結點 與順序表不同的是&#xff0c;鏈表的結構類似于帶車頭的火車車廂&#xff0c;&#xff0c;鏈表的每個車廂都是獨立…

游戲引擎學習第129天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 小妙招: vscode:定位錯誤行 一頓狂按F8 重構快捷鍵:F2 重構相關的變量 回顧并為今天的內容做準備 今天的工作主要集中在渲染器的改進上&#xff0c;渲染器現在運行得相當不錯&#xff0c;得益于一些優化和組織上的改進。我們計…

文字描邊實現內黃外綠效果

網頁使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黃色文字 */-webkit-text-stroke: 2px #008000; /* 綠色描邊&#xff08;兼容Webkit內核&#xff09; */text-stroke: 2px #008000; /* 標準語法 *…

yolov8 目標追蹤 (源碼 +效果圖)

1.在代碼中 增加了s鍵開始追蹤 e鍵結束追蹤 顯示移動距離(代碼中可調標尺和像素的比值 以便接近實際距離) 2.繪制了監測區域 只在區域內的檢測 3.規定了檢測的類別 只有人類才繪制軌跡 import osimport cv2 from ultralytics import YOLO from collections import defaultdic…

2.5 運算符2

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商業目的 2.5.3 賦值運算符 賦值運算符將值存儲在左操作數指定的對象中。有兩種賦值操作&#xff1a; 1、簡單賦值&#xff0c;使用。其中第二…

地彈與振鈴

地彈&#xff08;Ground Bounce&#xff09;和振鈴&#xff08;Ringing&#xff09;是數字電路中常見的信號完整性問題&#xff0c;兩者都與高速開關和寄生參數有關&#xff0c;但表現形式和成因不同。以下是它們的對比及解決方法&#xff1a; 1. 地彈&#xff08;Ground Bounc…

解決Deepseek“服務器繁忙,請稍后再試”問題,基于硅基流動和chatbox的解決方案

文章目錄 前言操作步驟步驟1&#xff1a;注冊賬號步驟2&#xff1a;在線體驗步驟3&#xff1a;獲取API密鑰步驟4&#xff1a;安裝chatbox步驟5&#xff1a;chatbox設置 價格方面 前言 最近在使用DeepSeek時&#xff0c;開啟深度思考功能后&#xff0c;頻繁遇到“服務器繁忙&am…