C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲源碼
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
1、游戲的整體劃分
因?yàn)镃語(yǔ)言是面向過(guò)程的,我將游戲抽象出來(lái)玩家下棋,電腦下棋,在判斷輸贏這一過(guò)程,又通過(guò)對(duì)過(guò)程的分析,進(jìn)行了具體函數(shù)的實(shí)現(xiàn),分為如下模塊:
游戲主菜單函數(shù)
void menu();
初始化棋盤(pán)函數(shù)
void InitBoard(char board[ROW][COL], int row, int col);
打印棋盤(pán)函數(shù)
void DisplayBoard(char board[ROW][COL], int row, int col);
玩家下棋函數(shù)
void PlayerMove(char board[ROW][COL], int row, int col);
電腦下棋函數(shù)
void ComputerMove(char board[ROW][COL], int row, int col);
判斷棋盤(pán)是否為空的函數(shù)
int IsFull(char board[ROW][COL], int row, int col);
判斷輸贏的函數(shù)
char IsWin(char board[ROW][COL], int row, int col);
//.h文件的源碼,僅供大家參考 #pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 3 #define COL 3 void menu(); void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); int IsFull(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col);
2、整體講解及其菜單函數(shù)實(shí)現(xiàn)
在對(duì)于棋盤(pán)方面,利用#define定義了一個(gè)大小為3行3列的char類型的數(shù)組,來(lái)表示整個(gè)的棋盤(pán)。整體游戲邏輯的實(shí)現(xiàn)使用do……while();循環(huán)和switch多分支語(yǔ)句的配合使用,使得完成整個(gè)游戲的邏輯過(guò)程。
菜單menu函數(shù)的實(shí)現(xiàn)是要配合switch語(yǔ)句來(lái)進(jìn)行的,以便后期對(duì)switch語(yǔ)句進(jìn)行操作,menu函數(shù)具體實(shí)現(xiàn)如下:
void menu() { ?? ?printf("************歡迎來(lái)到三子棋游戲中心**************\n"); ?? ?printf("************1.開(kāi)始游戲 ? ? ? ? ? ?**************\n"); ?? ?printf("************2.再來(lái)一局 ? ? ? ? ? ?**************\n"); ?? ?printf("************0.退出游戲 ? ? ? ? ? ?**************\n"); }
3、初始化棋盤(pán)和打印棋盤(pán)
1.初始化棋盤(pán)
利用函數(shù)將數(shù)組傳遞過(guò)來(lái),對(duì)二維數(shù)組進(jìn)行遍歷賦值為空字符,從而完成對(duì)整個(gè)數(shù)組的初始化。具體代碼如下:
void InitBoard(char board[ROW][COL], int row, int col) { ?? ?for (int i = 0; i < row; i++) ?? ?{ ?? ??? ?for (int j = 0; j < col; j++) ?? ??? ?{ ?? ??? ??? ?board[i][j] = ' '; ?? ??? ?} ?? ?} }
2.打印棋盤(pán)
打印棋盤(pán)時(shí)數(shù)組的遍歷要配合條件控制下的字符的打印結(jié)合,從而使打印的棋盤(pán)不僅僅是單純不變的數(shù)組,是棋盤(pán)被|和-分割開(kāi),更加的形象。具體實(shí)現(xiàn)如下:
void DisplayBoard(char board[ROW][COL], int row, int col) { ?? ?for (int i = 0; i < row; i++) ?? ?{ ?? ??? ?for (int j = 0; j < col; j++) ?? ??? ?{ ?? ??? ??? ?printf("%c", board[i][j]); ?? ??? ??? ?if (0 == j || 1 == j) ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("|"); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?printf("\n"); ?? ??? ?for (int k = 0; k < col; k++) ?? ??? ?{ ?? ??? ??? ?if (0 == i || 1 == i) ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("--"); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?printf("\n"); ?? ?} }
4、玩家下棋和電腦下棋
1.玩家下棋
玩家下棋時(shí),定義了兩個(gè)整型的變量,用來(lái)充當(dāng)數(shù)組的下標(biāo)。當(dāng)玩家輸入數(shù)組的下標(biāo)位置在合適的范圍的時(shí)候,在當(dāng)前下標(biāo)賦值了字符‘*’來(lái)代表玩家的下棋。并且下棋成功后,將棋盤(pán)的情況打印出來(lái),便于玩家了解當(dāng)前游戲的局勢(shì)和情況。具體實(shí)現(xiàn)如下:
void PlayerMove(char board[ROW][COL], int row, int col) { ?? ?int r = 0, c = 0; ?? ?printf("請(qǐng)輸入您要下棋的位置:\n"); ?? ?while (1) ?? ?{ ?? ??? ?scanf("%d %d", &r, &c); ?? ??? ?r = r - 1; ?? ??? ?c = c - 1; ?? ??? ?if (board[r][c]==' ') ?? ??? ?{ ?? ??? ??? ?board[r][c] = '*'; ?? ??? ??? ?printf("下棋成功\n"); ?? ??? ??? ?DisplayBoard(board, ROW, COL); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?printf("輸入的位置有誤或已被占用,請(qǐng)重新輸入:\n"); ?? ??? ?} ?? ?} }
2.電腦下棋
電腦下棋時(shí)原來(lái)同玩家一樣,區(qū)別在于電腦用的不是直接從鍵盤(pán)輸入的值,而是利用rand函數(shù)隨機(jī)生成的值,具體實(shí)現(xiàn)如下
void ComputerMove(char board[ROW][COL], int row, int col) { ?? ?int r = 0, c = 0; ?? ?printf("電腦走>\n"); ?? ?while (1) ?? ?{ ?? ??? ?r = rand() % row; ?? ??? ?c = rand() % col; ?? ??? ?if (board[r][c] == ' ') ?? ??? ?{ ?? ??? ??? ?board[r][c] = '#'; ?? ??? ??? ?DisplayBoard(board, ROW, COL); ?? ??? ??? ?break; ?? ??? ?} ?? ?} }
5、判斷輸贏
當(dāng)棋盤(pán)中橫、豎或者對(duì)角線的值相等的時(shí)候就可分出勝負(fù),如果棋盤(pán)已經(jīng)被下滿并且沒(méi)有分出勝負(fù),那就是平局。采用比較暴力遍歷比較,返回4種不同的狀態(tài):
1、玩家贏 - ‘*’
2、電腦贏 - ‘#’
3、平局 - ‘Q’
4、繼續(xù) - ‘C’
具體實(shí)現(xiàn)如下:
char IsWin(char board[ROW][COL], int row, int col) { ?? ?int i = 0; ?? ?for (int i = 0; i < row; i++) ?? ?{ ?? ??? ?if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') ?? ??? ?{ ?? ??? ??? ?return board[i][1]; ?? ??? ?} ?? ?} ?? ?for (int i = 0; i < i; 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]; ?? ?} ?? ?int ret = IsFull(board, row, col); ?? ?if (ret == 1) ?? ?{ ?? ??? ?return 'Q'; ?? ?} ?? ?return 'C'; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)AVL樹(shù)全面分析
今天的這一篇博客,我要跟大家介紹一顆樹(shù)——AVL樹(shù),它也是一顆二叉搜索樹(shù),它就是在二叉搜索樹(shù)中加了一個(gè)平衡因子的概念在里面,下面我就來(lái)和大家聊一聊這棵樹(shù)是個(gè)怎么樣的樹(shù)2021-10-10C語(yǔ)言實(shí)現(xiàn)電話簿管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話簿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12JetBrains?CLion永久激活超詳細(xì)教程(最新激活方法)
JetBrains?Clion?是一款專為?C/C++?開(kāi)發(fā)所設(shè)計(jì)的跨平臺(tái)?IDE,本文適用?JetBrains?CLion?v2019.3/3.1/3.2/3.3?永久激活,附破解補(bǔ)丁和激活碼,可以永久激活?Windows、MAC、Linux?下的?CLion,下面給大家分享JetBrains?CLion永久激活超詳細(xì)教程,感興趣的朋友一起看看吧2023-01-01C++實(shí)現(xiàn)LeetCode(66.加一運(yùn)算)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(66.加一運(yùn)算),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07詳解C++設(shè)計(jì)模式編程中建造者模式的實(shí)現(xiàn)
這篇文章主要介紹了C++設(shè)計(jì)模式編程中建造者模式的實(shí)現(xiàn),建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)建于它的表現(xiàn)分離,可以減少代碼冗余,需要的朋友可以參考下2016-03-03C語(yǔ)言對(duì)磁盤(pán)文件進(jìn)行快速排序簡(jiǎn)單實(shí)例
這篇文章主要介紹了C語(yǔ)言對(duì)磁盤(pán)文件進(jìn)行快速排序簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06