C語言三子棋游戲?qū)崿F(xiàn)代碼解析
本文實(shí)例為大家分享了C語言三子棋游戲的具體代碼,供大家參考,具體內(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語句判斷所選內(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");
}
界面搞定完成之后,就要考慮棋盤的打印了,當(dāng)玩家選擇進(jìn)行游戲的時(shí)候,我們希望打印出的棋盤是這樣的。

當(dāng)我們想進(jìn)行5*5的棋盤或者更大的棋盤打印的時(shí)候,可以定義全局變量X,Y分別表示行數(shù)和列數(shù),這樣更方便改動(dòng)。


這個(gè)時(shí)候,可以利用字符型數(shù)組,給每個(gè)數(shù)組單元賦值為空格,然后進(jìn)行打印。
void begin(char arr[X][Y], int x, int y) //初始化棋盤
{
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ì)棋盤進(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)被下過,這時(shí)候要判斷所下位置是否為空格,若不是空格則需要再次輸入,電腦下棋時(shí),生成隨機(jī)數(shù),為保證生成的隨機(jī)數(shù)在數(shù)組下表范圍內(nèi),需要將生成的隨機(jī)數(shù)對(duì)x,y取余,為擴(kuò)大rand函數(shù)的范圍,在引用srand函數(shù),在函數(shù)內(nèi)部放置無符號(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)被下過,請(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");
}
為了方便起見,我們將引用的頭文件和函數(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語言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼)
大家好,本篇文章主要講的是c語言實(shí)現(xiàn)簡(jiǎn)易版三子棋(附完整代碼),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C++ 內(nèi)聯(lián)函數(shù)inline案例詳解
這篇文章主要介紹了C++ 內(nèi)聯(lián)函數(shù)inline案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包
這篇文章主要介紹了C++版本基于ros將文件夾中的圖像轉(zhuǎn)換為bag包,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01

