使用C語(yǔ)言實(shí)現(xiàn)三子棋游戲
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
先簡(jiǎn)單介紹一下我的三子棋小游戲是怎么玩的,就是自己跟電腦pk,只不過電腦沒這么智能。自己輸入想要下的坐標(biāo),電腦隨機(jī)生成一個(gè)坐標(biāo),直到贏家產(chǎn)生。在這個(gè)過程中我覺得比較難的就是贏家的判定部分。在c語(yǔ)言中隨機(jī)數(shù)的產(chǎn)生也就是調(diào)用srand()函數(shù)利用時(shí)間戳來獲取隨機(jī)值。算了游戲太簡(jiǎn)單,我想你們也都是沖著代碼來的,直接上代碼。
代碼和實(shí)現(xiàn)
為了代碼邏輯性更高,沒那么繁雜,主要將代碼分為三個(gè)部分,頭文件game.h,和兩個(gè)c文件,game.c放主程序,body.c放各種函數(shù)。
1.game.c
講解:游戲開始要打印一個(gè)界面,然后選擇要玩游戲還是退出,如果玩游戲就直接調(diào)用Game函數(shù)再調(diào)用各種花里胡哨的函數(shù)來實(shí)現(xiàn)游戲。game.c沒什么可講的,都是基本操作,有手就行。
#include "game.h" void menu() { printf("********************\n"); printf("****** 1.play *****\n"); printf("****** 0.exit *****\n"); printf("********************\n"); } void Game() { char ch; char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); ShowBoard(board, ROW, COL); while (1) { PlayerMove(board, ROW, COL); ShowBoard(board, ROW, COL); ch=WhoWin(board, ROW, COL); if (ch == '*') { printf("玩家贏!\n"); break; } else if (ch == '#') { printf("電腦贏!\n"); break; } else if(ch=='a') { printf("平局!\n"); break; } WindowPlay(board, ROW, COL); ShowBoard(board, ROW, COL); ch = WhoWin(board, ROW, COL); if (ch == '*') { printf("玩家贏!\n"); break; } else if (ch == '#') { printf("電腦贏!\n"); break; } else if(ch=='a') { printf("平局!\n"); break; } } } int main() { menu(); srand((unsigned int)time(NULL)); int input = 0; do { printf("請(qǐng)輸入:"); scanf("%d", &input); switch (input) { case 1: Game(); continue; case 0: break; default: printf("輸入不合法,請(qǐng)從新輸入\n"); continue; } } while (input); return 0; }
2.body.c
講解:body.c里就是各種花里胡哨的函數(shù),一個(gè)功能一個(gè)函數(shù),不要一個(gè)函數(shù)搞太多功能,看起來比較繁雜,條理不清晰。這里的棋盤借用二維數(shù)組來實(shí)現(xiàn),因?yàn)槎S數(shù)組和一個(gè)棋盤的構(gòu)造類似,用二維數(shù)組再合適不過,如果你夠牛逼,你來個(gè)三維數(shù)組的。包含的功能有棋盤初始化,打印棋盤,玩家下,電腦下,最后就是判斷輸贏。判斷輸贏也是比較難的一個(gè)部分。這里我用了最粗暴的方法,就是分四種情況,行,列,對(duì)角線,還有棋盤滿了。比較繁瑣但是比較實(shí)用,也沒什么可說的都是比較常用的語(yǔ)句。唯一可說的就是srand()函數(shù)獲取隨機(jī)值,srand()功能就是生成隨機(jī)值,還需要一個(gè)種子seed為無(wú)符號(hào)整型數(shù)??梢杂胻ime(NULL)時(shí)間戳來作為這個(gè)種子,用rand()%n來獲取你想要的數(shù)字。
#include "game.h" //初始化棋盤 void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { board[i][j] = ' '; } } } //打印棋盤 void ShowBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); if (i < row - 1) { printf("---|---|---\n"); } } } //玩家下 void PlayerMove(char board[ROW][COL], int row, int col) { do { int i; int j; printf("請(qǐng)玩家輸入:"); scanf("%d%d", &i, &j); if (i > row && j > col && i <= 0 && j<= 0) { printf("坐標(biāo)不合法,請(qǐng)從新輸入\n"); continue; } else if (board[i-1][j-1] == ' ') { board[i-1][j-1] = '*'; break; } else { printf("該處已被占請(qǐng)從新輸入\n"); continue; } } while (1); } //電腦下 void WindowPlay(char board[ROW][COL], int row, int col) { printf("等待電腦下!\n"); do { int i = rand() % 3; int j = rand() % 3; if (board[i][j] == ' ') { board[i][j] = '#'; break; } else { continue; } } while (1); } //判斷輸贏 char WhoWin(char board[ROW][COL], int row, int col) { //判斷行 for (int i = 0; i < row; i++) { int j = 0; if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j]!=' ') { if (board[i][j] == '*') { return board[i][j]; } else { return board[i][j]; } } } //判斷列 for (int j = 0; j < col; j++) { int i = 0; if (board[i][j] == board[i+1][j] && board[i+1][j] == board[i+2][j] && board[i][j] != ' ') { if (board[i][j] == '*') { return board[i][j]; } else { return board[i][j]; } } } //判斷對(duì)角線 int i = 0; int j = 0; if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ') { if (board[i][i] == '*') { return board[i][j]; } else{ return board[i][j]; } } if (board[i][j+2] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j] && board[i][j+2] != ' ') { if (board[i][i] == '*') { return board[i][j+2]; } else{ return board[i][j+2]; } } //判斷棋盤是否滿 int count = 0; //char a=0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (board[i][j] == ' ') { count++; } } } if (count == 0) { return 'a'; } }
3.game.h
講解:這里主要給大家說一下頭文件,頭文件可以把各個(gè)c語(yǔ)言文件聯(lián)系起來,可以定義一些全局變量,宏,函數(shù)聲明,引用一些內(nèi)部庫(kù)等。一次定義多處使用,其他c文件只要引用這個(gè)頭文件就賦予了它調(diào)用某些函數(shù)的權(quán)限,調(diào)用某些變量,宏的權(quán)限。頭文件只是聲明不占用內(nèi)存空間,可以不用,但是強(qiáng)烈建議用,因?yàn)楫?dāng)一個(gè)工程的代碼量很大時(shí),沒有頭文件就相當(dāng)于沒有了頭。所以是很重要的。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 3 #define COL 3 //初始化棋盤 void InitBoard(char board[ROW][COL],int row,int col); //打印棋盤 void ShowBoard(char board[ROW][COL],int row,int col); //玩家下 void PlayerMove(char board[ROW][COL], int row,int col); //電腦下 void WindowPlay(char board[ROW][COL], int row,int col); //判斷輸贏 char WhoWin(char board[ROW][COL],int row,int col);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++?STL容器詳解之紅黑樹部分模擬實(shí)現(xiàn)
本文主要對(duì)紅黑樹進(jìn)行了詳細(xì)介紹,并對(duì)其核心功能進(jìn)行了模擬實(shí)現(xiàn)。文中的代碼對(duì)我們的學(xué)習(xí)或工作有一定的價(jià)值,感興趣的小伙伴可以了解一下2021-12-12Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程
這篇文章主要為大家詳細(xì)介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07輕松實(shí)現(xiàn)C/C++各種常見進(jìn)制相互轉(zhuǎn)換
這篇文章主要介紹了輕松實(shí)現(xiàn)C/C++各種常見進(jìn)制相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11OpenCV實(shí)現(xiàn)車牌字符分割(C++)
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)車牌字符分割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04基于C語(yǔ)言利用哈夫曼樹實(shí)現(xiàn)文件壓縮的問題
哈夫曼編碼是一種編碼方式,又稱“霍夫曼編碼”,其是可變字長(zhǎng)的編碼(VCL)的一種,這篇文章主要介紹了基于C語(yǔ)言利用哈夫曼樹實(shí)現(xiàn)文件壓縮,需要的朋友可以參考下2021-08-08