基于C語言實(shí)現(xiàn)簡單的五子棋游戲
這是一個(gè)用C語言實(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 ? ? ?//獲勝所需要連起來的棋子個(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)大俠重新來過\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)行截圖




以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split詳解
這篇文章主要給大家介紹了關(guān)于如何在c++中實(shí)現(xiàn)字符串分割函數(shù)split的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
c++實(shí)現(xiàn)一個(gè)簡易的網(wǎng)絡(luò)緩沖區(qū)的實(shí)踐
這篇文章主要介紹了c++實(shí)現(xiàn)一個(gè)簡易的網(wǎng)絡(luò)緩沖區(qū)的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
OpenCV c++滑動(dòng)條的創(chuàng)建和使用代碼
滾動(dòng)條(Trackbar)在OpenCV中是非常方便的交互工具,它依附于特定的窗口而存在,下面這篇文章主要給大家介紹了關(guān)于OpenCV?c++滑動(dòng)條的創(chuàng)建和使用的相關(guān)資料,需要的朋友可以參考下2023-06-06
基于QT實(shí)現(xiàn)顯示OpenCV讀取的圖片
OpenCV自帶了一部分常用的GUI功能,但是更多的圖像處理功能需要其他GUI框架來輔助實(shí)現(xiàn),本文將通過QT來顯示OpenCV讀取的圖片,需要的可以參考一下2022-11-11
C++實(shí)現(xiàn)求動(dòng)態(tài)矩陣各元素的和
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)求動(dòng)態(tài)矩陣各元素的和,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
Qt利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制
這篇文章主要介紹了Qt如何利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定是參考價(jià)值,需要的可以參考一下2022-06-06

