C語(yǔ)言實(shí)現(xiàn)控制臺(tái)五子棋小游戲
這是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的控制臺(tái)小游戲—-五子棋,棋盤大小和獲勝棋子數(shù)目是用宏定義的,可以自定義,所以可以輕松改為三子棋、六子棋等等。此游戲設(shè)定為人機(jī)對(duì)戰(zhàn)(PVE),電腦走棋是隨機(jī)的。
編譯環(huán)境:VS2015
此程序采用多文件編譯,共有三個(gè)文件,一個(gè)game.h頭文件,一個(gè)game.c文件和一個(gè)main.c文件,代碼分別如下:
game.h
這里是一些數(shù)據(jù)和函數(shù)的聲明
#ifndef _GAME_H_
#define _GAME_H_
#define _BOARD_ 10 //棋盤大小
#define _PIECE_ 5 //獲勝所需要連起來(lái)的棋子個(gè)數(shù)
typedef struct Board{
char show[_BOARD_][_BOARD_]; //棋盤字符數(shù)組
char Pc; //電腦使用的棋子
char Player; //棋手使用的棋子
}Brd ,*pBrd; //Brd:五子棋 pBrd:五子棋指針
void init(pBrd B);
void PrintBrd(const pBrd B);
void Pcrand(pBrd B);
int Player(pBrd B);
int judge(pBrd B, int n);
void menu(pBrd B);
#endif // ! _GAME_H_
game.c
這里是函數(shù)的具體實(shí)現(xiàn)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "game.h"
void init(pBrd B)
{
int i, j;
for (i = 0; i < _BOARD_; i++)
{
for (j = 0; j < _BOARD_; j++)
{
B->show[i][j] = ' ';
}
}
B->Pc = '@';
B->Player = '*';
}
void PrintBrd(const pBrd B)
{
int i, j;
printf(" ");
for (i = 0; i < _BOARD_; i++)
{
printf(" %d", i + 1);
}
printf("\n");
for (i = 0; i < _BOARD_; i++)
{
for (j = 0; j < _BOARD_; j++)
{
if (j == 0)printf(" %d|", i + 1);
printf(" %c |", B->show[i][j]);
}
if (i == 0)printf(" Player: *");
if (i == 1)printf(" AI: @");
printf("\n\n");
}
}
void Pcrand(pBrd B)
{
int i, j;
srand((unsigned int)time((NULL)));
int n = rand()%(_BOARD_*_BOARD_);
for (i = 0; i < _BOARD_; i++)
{
for (j = 0; j < _BOARD_; j++)
{
if (n > 0)n--;
else if (n == 0 && B->show[i][j] == ' ')
{
B->show[i][j] = B->Pc;
return;
}
}
}
}
int Player(pBrd B)
{
int i, j;
printf("請(qǐng)輸入落子位置:\n");
printf("行:>");
scanf("%d", &i);
printf("列:>");
scanf("%d", &j);
i--;
j--;
if (B->show[i][j] != ' ' || i >= _BOARD_ || j >= _BOARD_ || i < 0 || j < 0)
{
printf("請(qǐng)輸入正確的位置!\n");
system("pause");
return 0;
}
B->show[i][j] = B->Player;
return 1;
}
int judge(pBrd B, int n)
{
char s;
int c = 0;
int i, j, sum = 0;
if (n == 1)s = B->Player;
else if (n = 2) s = B->Pc;
for (i = 0; i < _BOARD_; i++)
{
sum = 0;
for (j = 0; j < _BOARD_; j++)
{
if (B->show[i][j] == s)sum++;
else sum = 0;
if (sum == _PIECE_)return 1;
}
}
for (j = 0; j < _BOARD_; j++)
{
sum = 0;
for (i = 0; i < _BOARD_; i++)
{
if (B->show[i][j] == s)sum++;
else sum = 0;
if (sum == _PIECE_)return 1;
}
}
sum = 0;
for (i = 0, j = 0; i < _BOARD_; i++, j++)
{
if (B->show[i][j] == s)sum++;
else sum = 0;
if (sum == _PIECE_)return 1;
}
sum = 0;
for (i = 0, j = _BOARD_ - 1; i < _BOARD_; i++, j--)
{
if (B->show[i][j] == s)sum++;
else sum = 0;
if (sum == _PIECE_)return 1;
}
return 0;
}
void menu(pBrd B)
{
int c,n = 1;
printf("****************************************\n");
printf("********* 1.play ** 0.exit *********\n");
printf("****************************************\n");
printf("請(qǐng)輸入選項(xiàng):>");
scanf("%d", &c);
while (c)
{
system("cls");
if (n == 1)
{
PrintBrd(B);
if(Player(B))n=2;
else continue;
}
else
{
Pcrand(B);
n = 1;
}
if (judge(B, n))
{
PrintBrd(B);
if (n == 1)printf("Old Fe 666!\n");
else printf("請(qǐng)大俠重新來(lái)過(guò)\n");
break;
}
}
}
main.c
程序入口
#include"game.h"
int main()
{
Brd B;
init(&B);
menu(&B);
printf("Thanks for playing my game.\n");
return 0;
}
運(yùn)行截圖




以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法匯總
這篇文章主要介紹了基于C++實(shí)現(xiàn)的各種內(nèi)部排序算法,非常經(jīng)典,需要的朋友可以參考下2014-08-08
C++實(shí)現(xiàn)LeetCode(14.最長(zhǎng)共同前綴)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(14.最長(zhǎng)共同前綴),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
c++類成員函數(shù)如何做函數(shù)參數(shù)
這篇文章主要介紹了c++類成員函數(shù)如何做函數(shù)參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Qt使用SqlLite實(shí)現(xiàn)權(quán)限管理的示例代碼
本文主要介紹了Qt使用SqlLite實(shí)現(xiàn)權(quán)限管理的示例代碼,管理員針對(duì)不同人員進(jìn)行權(quán)限設(shè)定,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)請(qǐng)求
這篇文章主要為大家介紹了Qt中是如何實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)請(qǐng)求的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過(guò)弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見(jiàn)會(huì)出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說(shuō)這個(gè)僅僅是一種編譯期的解決方案,如果程序在運(yùn)行過(guò)程中出現(xiàn)了循環(huán)引用,還是會(huì)造成內(nèi)存泄漏的2013-09-09

