基于C语言实现简单的五子棋游戏

 更新时间:2022年05月07日 12:07:51   作者:Monster_ii  
这篇文章主要为大家详细介绍了基于C语言实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这是一个用C语言实现的控制台小游戏—-五子棋,棋盘大小和获胜棋子数目是用宏定义的,可以自定义,所以可以轻松改为三子棋、六子棋等等。此游戏设定为人机对战(PVE),电脑走棋是随机的。

编译环境:VS2015

此程序采用多文件编译,共有三个文件,一个game.h头文件,一个game.c文件和一个main.c文件,代码分别如下:

game.h

这里是一些数据和函数的声明

#ifndef  _GAME_H_           
#define _GAME_H_

#define _BOARD_ 10      //棋盘大小
#define _PIECE_ 5      //获胜所需要连起来的棋子个数

typedef struct Board{
    char show[_BOARD_][_BOARD_];    //棋盘字符数组
    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

这里是函数的具体实现

#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("请输入落子位置:\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("请输入正确的位置!\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("请输入选项:>");
    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("请大侠重新来过\n");
            break;
        }
    }
}

main.c

程序入口

#include"game.h"

int main()
{
    Brd B;
    init(&B);
    menu(&B);
    printf("Thanks for playing my game.\n");
    return 0;
}

运行截图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 如何在c++中实现字符串分割函数split详解

    如何在c++中实现字符串分割函数split详解

    这篇文章主要给大家介绍了关于如何在c++中实现字符串分割函数split的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • C++ 虚函数专题

    C++ 虚函数专题

    这篇文章主要介绍了C++中虚函数的知识点,文中配合代码讲解非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言实现翻译功能

    C语言实现翻译功能

    这篇文章主要为大家详细介绍了C语言实现简单的翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • c++实现一个简易的网络缓冲区的实践

    c++实现一个简易的网络缓冲区的实践

    这篇文章主要介绍了c++实现一个简易的网络缓冲区的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • OpenCV c++滑动条的创建和使用代码

    OpenCV c++滑动条的创建和使用代码

    滚动条(Trackbar)在OpenCV中是非常方便的交互工具,它依附于特定的窗口而存在,下面这篇文章主要给大家介绍了关于OpenCV c++滑动条的创建和使用的相关资料,需要的朋友可以参考下
    2023-06-06
  • 基于QT实现显示OpenCV读取的图片

    基于QT实现显示OpenCV读取的图片

    OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,本文将通过QT来显示OpenCV读取的图片,需要的可以参考一下
    2022-11-11
  • C++实现求动态矩阵各元素的和

    C++实现求动态矩阵各元素的和

    这篇文章主要为大家详细介绍了C++实现求动态矩阵各元素的和,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++多线程编程超详解

    C++多线程编程超详解

    本文给大家介绍的是C++多线程编程,由于C++本身没有多线程机制,在windows下我们使用调用SDK win32 api来实现,示例都很简单,讲解的也很详细,推荐给大家
    2021-09-09
  • c++输出斐波那契数列示例分享

    c++输出斐波那契数列示例分享

    这篇文章主要介绍了c++输出斐波那契数列示例,需要的朋友可以参考下
    2014-03-03
  • Qt利用QChart实现实时波形图的绘制

    Qt利用QChart实现实时波形图的绘制

    这篇文章主要介绍了Qt如何利用QChart实现实时波形图的绘制,文中的示例代码讲解详细,对我们学习有一定是参考价值,需要的可以参考一下
    2022-06-06

最新评论