C語(yǔ)言三子棋游戲?qū)崿F(xiàn)代碼解析
本文實(shí)例為大家分享了C語(yǔ)言三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
編程環(huán)境:Visual Studio 2019
(一)創(chuàng)建文件
為了邏輯清晰的編程,我們先創(chuàng)建一個(gè)叫g(shù)ame.h的頭文件用以游戲函數(shù)的聲明,兩個(gè)源文件,一個(gè)是text,c用以測(cè)試,另一個(gè)game,c用以游戲函數(shù)的實(shí)現(xiàn),如圖所示。
(二)思路分析
首先是進(jìn)入游戲界面,進(jìn)行界面打印,在主函數(shù)內(nèi)引用菜單函數(shù),為了使游戲能夠重復(fù)玩,將函數(shù)放在do-while循環(huán)內(nèi)部。然后玩家進(jìn)行游戲選擇,在主函數(shù)內(nèi)運(yùn)用switch語(yǔ)句判斷所選內(nèi)容。
int main() { int put; do { menu(); printf("請(qǐng)選擇:"); scanf("%d", &put); switch (put) { case 1: system("cls"); game(); //進(jìn)行游戲 break; case 0: printf("即將退出游戲?。?!"); break; default: printf("輸入錯(cuò)誤,請(qǐng)重新輸入??!"); system("cls"); } } while (put); return 0; } void menu()//菜單函數(shù) { printf("*******************************\n"); printf("********* 1.玩游戲 ************\n"); printf("********* 0.退出 **************\n"); printf("*******************************\n"); }
界面搞定完成之后,就要考慮棋盤(pán)的打印了,當(dāng)玩家選擇進(jìn)行游戲的時(shí)候,我們希望打印出的棋盤(pán)是這樣的。
當(dāng)我們想進(jìn)行5*5的棋盤(pán)或者更大的棋盤(pán)打印的時(shí)候,可以定義全局變量X,Y分別表示行數(shù)和列數(shù),這樣更方便改動(dòng)。
這個(gè)時(shí)候,可以利用字符型數(shù)組,給每個(gè)數(shù)組單元賦值為空格,然后進(jìn)行打印。
void begin(char arr[X][Y], int x, int y) //初始化棋盤(pán) { int i = 0; int j = 0; for (i = 0; i < x; i++) { for (j = 0; j < y; j++) arr[i][j] = ' '; //每個(gè)數(shù)組單元都為空格 } } void Print(char arr[X][Y], int x, int y) //對(duì)棋盤(pán)進(jìn)行打印 { int i = 0; int j = 0; int k = 0; for (i = 0;i < x;i++) { for (j = 0;j < y;j++) { if (j == y - 1) printf(" %c \n", arr[i][j]); else printf(" %c |", arr[i][j]); if (j==y - 1) { if (i != x - 1) { for (k = 0;k < y;k++) { if (k == y - 1) { printf("---\n"); break; } printf("---|"); } break; } } } } }
隨后,設(shè)置玩家下棋函數(shù)和電腦下棋函數(shù),將玩家下棋坐標(biāo)對(duì)應(yīng)數(shù)組單元賦值為'*',電腦下棋坐標(biāo)對(duì)應(yīng)數(shù)組單元賦值為'#',玩家下棋時(shí),首先輸入要下的坐標(biāo)(這里注意下棋坐標(biāo)和數(shù)組下標(biāo)差一),輸入坐標(biāo)后,還要進(jìn)行判斷該位置是否已經(jīng)被下過(guò),這時(shí)候要判斷所下位置是否為空格,若不是空格則需要再次輸入,電腦下棋時(shí),生成隨機(jī)數(shù),為保證生成的隨機(jī)數(shù)在數(shù)組下表范圍內(nèi),需要將生成的隨機(jī)數(shù)對(duì)x,y取余,為擴(kuò)大rand函數(shù)的范圍,在引用srand函數(shù),在函數(shù)內(nèi)部放置無(wú)符號(hào)time函數(shù),保證生成的數(shù)真正意義上隨機(jī) 。
void gamer(char arr[X][Y], int x, int y)//玩家輸入 { int a, b; scanf("%d %d", &a, &b); if (a > 0 && a <= x && b > 0 && b <= y) { if (arr[a - 1][b - 1] != ' ') { printf("位置已經(jīng)被下過(guò),請(qǐng)重新選擇:"); gamer(arr, x, y); } arr[a - 1][b - 1] = '*'; } else { printf("輸入不符合規(guī)則,請(qǐng)重新輸入:"); gamer(arr, x, y); } } void computer(char arr[X][Y], int x, int y) { int a = rand() % x; int b = rand() % y; if (arr[a][b] == ' ') { arr[a][b] = '#'; } else { computer(arr, x, y); } }
玩家電腦下棋后,進(jìn)行判斷輸贏,引用win函數(shù),當(dāng)橫排或豎排或?qū)蔷€相等的時(shí)候,返回相等元素的值,例如:第一排都為'*‘,則返回'*',根據(jù)返回值判斷為玩家贏。當(dāng)返回值為'*‘或者'#‘時(shí),判斷為游戲結(jié)束,玩家贏或者電腦贏,當(dāng)返回值為' ‘時(shí),游戲繼續(xù),當(dāng)以上判斷都不成立時(shí),判斷游戲屏幕是否已經(jīng)滿了,若不存在' ‘,則平局。
char win(char arr[X][Y], int x, int y)//判斷輸贏繼續(xù) { char ch = 'C'; int flag = 0; for (int i = 0; i < x; i++) { if (arr[i][0] == arr[i][1] && arr[i][0] == arr[i][2] && arr[i][1] == arr[i][2])//行相等 { return arr[i][0]; } } for (int j = 0; j < y; j++) { if (arr[0][j] == arr[1][j] && arr[0][j] == arr[2][j] && arr[1][j] == arr[2][j])//列相等 { return arr[0][j]; } } if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')//對(duì)角線相等 { return arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')//對(duì)角線相等 { return arr[0][2]; } for (int m = 0; m < x; m++)//是否鋪滿 { for (int n = 0; n < y; n++) { if (arr[m][n] == ' ') flag = 1; } } if (flag == 0) { ch = 'Q'; } return ch; }
void game()//游戲進(jìn)行函數(shù) { srand((unsigned int)time(NULL)); char arr[X][Y]; begin(arr, X, Y); char rat; Print(arr, X, Y); while (1) { rat = win(arr, X, Y); printf("請(qǐng)輸入您要下的棋子坐標(biāo):"); gamer(arr, X, Y); Print(arr, X, Y); rat = win(arr, X, Y); if (rat != 'C' && rat != ' ') { break; } printf("電腦走\(yùn)n"); computer(arr, X, Y); Print(arr, X, Y); rat = win(arr, X, Y); if (rat != 'C' && rat != ' ') { break; } } switch (rat) { case '*': printf("玩家贏了!\n"); break; case '#': printf("電腦贏了!\n"); break; case 'Q': printf("平局\n"); break; } printf("游戲結(jié)束\n"); system("cls"); }
為了方便起見(jiàn),我們將引用的頭文件和函數(shù)放到game.h下,其他文件直接引用game.h即可。
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #define X 3 #define Y 3 #include <stdio.h> #include <stdlib.h> #include <time.h> void menu(); void game(); void begin(char arr[X][Y], int x, int y); void Print(char arr[X][Y], int x, int y); void gamer(char arr[X][Y], int x, int y); void computer(char arr[X][Y], int x, int y); char win(char arr[X][Y], int x, int y);
(三)效果展示
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)
大家好,本篇文章主要講的是c語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01C++ 內(nèi)聯(lián)函數(shù)inline案例詳解
這篇文章主要介紹了C++ 內(nèi)聯(lián)函數(shù)inline案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09C++中Lambda表達(dá)式的語(yǔ)法與實(shí)例
C++ 11 中的 Lambda 表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++中Lambda表達(dá)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包
這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01c語(yǔ)言可變參數(shù)實(shí)現(xiàn)示例
這篇文章主要介紹了c語(yǔ)言可變參數(shù)實(shí)現(xiàn)示例,需要的朋友可以參考下2014-04-04C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題
這篇文章主要介紹了C語(yǔ)言解讀數(shù)組循環(huán)右移問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11