【c语言】五子棋 Easy x 图形库

本文详细介绍了如何使用C++编程语言,结合EasyX库,实现一个简单的五子棋游戏,包括加载棋盘背景、画格子和棋子、处理鼠标点击事件、判断是否五子连珠以及游戏结束提示。
摘要由CSDN通过智能技术生成

1.头文件


2.在画图软件里画一个自己喜欢的棋盘背景,截图并将它保存在D盘里(如果发给其他用户打开运行程序会加载不出图片,因为对方电脑里没有此图片)或者将其放在和代码同一个文件夹里,通过easy x库的帮助手册用相关函数代码将棋盘背景展示在界面(下面关于图形的函数都可以参考帮助手册),尺寸需要根据自己所截的图计算,这里使用600*600

运行:


3.画格子,棋盘格子为15*15,写一个画线函数,15条线,580/14=40,左右上下各空20cm,一个格子长度为40,每隔40画一条,并在主函数里调用


4.画点,五子棋盘原始的五个小黑点,通过坐标计算圆心坐标,半径,并在主函数里调用


5.画棋子,定义一个全局变量num=1作为标志,让其变为1和-1来交替下黑棋和白棋,定义一个二维数组14行*14列并初始化为0,计算鼠标点击下棋的范围,在主函数里写鼠标事件并调用画棋子函数


6.写到这里我们目前只能交替下黑白棋子,但下过的位置再次点击还会继续下下一个棋子,黑棋子会变白,白棋子也会变黑,下来我们就解决此问题

通过二维数组值的变化来判断此位置是否下过棋,并在画棋子函数里调用


7.接下来我们就要判断是否五子连珠,通过二维数组的坐标来判断,表示出坐标即可


8.现在我们需要在五子连珠的时候设置提示并结束游戏,定义一个全局变量q,用来保存五子连珠时棋子的类型


9.在主函数里调用


全部代码

# define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <graphics.h>        // 引用图形库头文件
#include <stdlib.h>
int q;
int num = 1;
int arr[14][14] = { 0 };
void Line()
{
    setlinecolor(BLACK);//画竖线
    for (int x = 20; x < 600; x += 40)
        line(x, 20, x, 580);//起始x,起始y,终点x,终点y
    for (int y = 20; y < 600; y += 40)//画横线
        line(20,y,580,y);
}
void point()
{
    setfillcolor(BLACK);
    fillcircle(20 + 3* 40, 20 + 3* 40, 5);//圆心坐标(,,半径)
    fillcircle(20 + 11* 40, 20 + 3 * 40, 5);
    fillcircle(20 + 3 * 40, 20 + 11* 40, 5);
    fillcircle(20 + 11 * 40, 20 + 11 * 40, 5);
    fillcircle(20 + 7 * 40, 20 + 7 * 40, 5);
}
int check_qizi(int x, int y)//检查棋子是否下过
{
    if (arr[x][y] != 0)//因为初始化为0,若不等于0,则此位置已经下过,返回结束
        return 0;
    else
        arr[x][y] = num;//若不等于0,则此位置未下过,按照num交替下棋
    return 1;
}

void draw_qizi(int m, int n)//画棋子,(m,n)为鼠标所点的坐标
{
    
    if (num == -1)
    {
        setfillcolor(WHITE);//下白棋
    }
    else if (num == 1)
    {
        setfillcolor(BLACK);//下黑棋
    }
    int x, y;
    x = m / 40;//二维数组的横坐标
    y = n / 40;//二维数组的纵坐标
    if (check_qizi(x, y) == 0)//等于0表示下过棋,直接return
        return;
    fillcircle(x * 40 + 20, y * 40 + 20, 18);//棋子大小坐标
    num *= -1;//黑白交替
}

int check_five(int x, int y)//检查一个下过棋的坐标相邻五个是否一样
{
    if(arr[x][y]==arr[x-1][y]&&arr[x][y]==arr[x-2][y]&&arr[x][y]==arr[x+1][y] &&arr[x][y]==arr[x+2][y])//横向相邻
        return 1;
    if (arr[x][y] == arr[x][y - 1] && arr[x][y] == arr[x][y - 2] && arr[x][y] == arr[x][y + 1] && arr[x][y] == arr[x][y + 2])//纵向相邻
        return 1;
    if (arr[x][y] == arr[x - 1][y - 1] && arr[x][y] == arr[x - 2][y - 2] && arr[x][y] == arr[x + 1][y + 1] && arr[x][y] == arr[x + 2][y + 2])
        return 1;//主对角线
    if (arr[x][y] == arr[x - 1][y + 1] && arr[x][y] == arr[x + 2][y - 2] && arr[x][y] == arr[x + 1][y - 1] && arr[x][y] == arr[x - 2][y + 2])
        return 1;//副对角线
    else
        return 0;//相同返回1,不同返回0
}
int check_over()//判断输赢
{
    for (int x = 0; x < 15; x++)
    {
        for (int y = 0; y < 15; y++)
        {
            
            if (arr[x][y] == 0)//未下过棋的位置直接跳过
                continue;
            else if (check_five(x, y) == 1)
            {
                q = arr[x][y];//当前获胜方棋子类型
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    IMAGE img;
    initgraph(600, 600);//展示窗口的大小
    loadimage(NULL, _T("D:\\1.png"));
    //加载图片
    putimage(600, 600, &img);    // 显示图片
    Line();
    point();
    MOUSEMSG m;//保存鼠标消息
    while (1)//防止闪退
    {
        m = GetMouseMsg();//获取一个鼠标消息
        if (m.uMsg == WM_LBUTTONDOWN)//按下鼠标左键
        {
            draw_qizi(m.x, m.y);
            check_over();
            if (check_over() == 1)
            {
                if (q == 1)
                {
                    settextstyle(50, 0, _T("楷体"));
                    outtextxy(200, 250, "黑棋获胜");
                }
                else
                {
                    settextstyle(50, 0, _T("楷体"));
                    outtextxy(200, 250, "白棋获胜");
                }
                break;
            }
        }
    }
    _getch();
    closegraph();
    return 0;
}

  • 36
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值