【C++】实现图形界面五子棋游戏源码

时间:2024-05-22 19:10:14

C++图形界面五子棋, Shell控制台实现五子棋的基础上引用了图形库源码。

如需远程调试,可加QQ905733049由专业技术人员远程协助!

【C++】实现图形界面五子棋游戏源码

下面给出代码:
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#include<stdio.h>
#include <time.h>
#pragma warning(disable:4996)
void menu();
void play();
void display();
void playgame();
void again(int index);
int a[9][9] = { 0 };
 
void main()
{
    initgraph(600, 600, SHOWCONSOLE);
    menu();
    getch();
}
 
void menu()
{
    IMAGE img;
    setaspectratio(1.1, 1);
    loadimage(&img, "IMAGE", "tur", 0, 0, true);
    putimage(-10, 0, &img, SRCPAINT);
    settextstyle(50, 20, "宋体");
    outtextxy(200, 400, "开始游戏");
    MOUSEMSG m;
    while (true)
    {
        m = GetMouseMsg();
        if (m.uMsg == WM_MOUSEMOVE && m.x >= 200 && m.x <= 360 && m.y >= 400 && m.y <= 450)
        {
            setlinecolor(YELLOW);
            rectangle(200, 400, 360, 450);
 
        }
        if (m.uMsg == WM_LBUTTONDOWN && m.x >= 200 && m.x <= 360 && m.y >= 400 && m.y <= 450)
        {
            cleardevice();
            Sleep(500);
            play();
            break;
        }
        if (!(m.x >= 200 && m.x <= 360 && m.y >= 400 && m.y <= 450))
        {
            setlinecolor(BLACK);
            rectangle(200, 400, 360, 450);
        }
    }
}
 
void play()
{
    graphdefaults();
    setlinecolor(WHITE);
    settextstyle(15, 10, "宋体");
    settextcolor(WHITE);
    outtextxy(460, 80, "play1:红子:");
    outtextxy(460, 100, "步数: ");
    outtextxy(460, 160, "play2:黄子");
    outtextxy(460, 180, "步数: ");
    display();
}
 
void display()
{
    for (int i = 50; i <= 450; i += 50)
    {
        line(i, 50, i, 450);
        line(50, i, 450, i);
    }
    playgame();
}
void playgame()
{
    char str1[5];
    char str2[5];
    int bushu1 = 0, bushu2 = 0;
    memset(a, 0, sizeof(a));
    int play1 = 1;
    int i = 0, j = 0;
    int win = 0;
    MOUSEMSG msg;
    while (win == 0)
    {
        msg = GetMouseMsg();
        if (msg.uMsg == WM_LBUTTONDOWN)
        {
            for (int lie = 50; lie <= 450; lie += 50)
            {
                if (msg.x <= lie + 10 && msg.x >= lie - 10)
                {
                    for (int hang = 50; hang <= 450; hang += 50)
                    {
                        if (msg.y <= hang + 10 && msg.y >= hang - 10)
                        {
                            if (play1 == 1 && a[hang / 50 - 1][lie / 50 - 1] == 0)
                            {
                                setfillcolor(RED);
                                solidcircle(lie, hang, 12);
                                a[hang / 50 - 1][lie / 50 - 1] = 1;
                                play1 = 0;
                                bushu1++;
                                sprintf(str1, "%i", bushu1);
                                outtextxy(520, 100, str1);
                                break;
                            }
                            if (play1 == 0 && a[hang / 50 - 1][lie / 50 - 1] == 0)
                            {
                                setfillcolor(YELLOW);
                                solidcircle(lie, hang, 12);
                                a[hang / 50 - 1][lie / 50 - 1] = 2;
                                play1 = 1;
                                bushu2++;
                                sprintf(str2, "%i", bushu2);
                                outtextxy(520, 180, str2);
                                break;
                            }
                        }
                    }
                }
            }
        }
        //判断是否赢
        for (j = 0; j<9 && (win == 0); j++)
        {
            for (i = 0; i<6; i++)
            {
 
                if ((a[j][i] == 1 && a[j][i + 1] == 1 && a[j][i + 2] == 1 && a[j][i + 3] == 1 && a[j][i + 4] == 1) 
                    || (a[i][j] == 1 && a[i + 1][j] == 1 && a[i + 2][j] == 1 && a[i + 3][j] == 1 && a[i + 4][j] == 1))//横纵是5个子play1 win
                {
                    win = 1;
                    Sleep(100);
                    break;
                }
                if ((a[j][i] == 2 && a[j][i + 1] == 2 && a[j][i + 2] == 2 && a[j][i + 3] == 2 && a[j][i + 4] == 2)
                    || (a[i][j] == 2 && a[i + 1][j] == 2 && a[i + 2][j] == 2 && a[i + 3][j] == 2 && a[i + 4][j] == 2))//横纵是5个子play2 win
                {
                    win = 2;
                    Sleep(100);
                    break;
                }
            }
        }
        for (j = 0; j<6 && (win == 0); j++)
        {
            for (i = 0; i<6; i++)
            {
                if (a[j][i] == 1 && a[j + 1][i + 1] == 1 && a[j + 2][i + 2] == 1 && a[j + 3][i + 3] == 1 && a[j + 4][i + 4] == 1)//向右倾斜时候play1 win
                {
                    win = 1;
                    Sleep(100);
                    break;
 
                }
                if (a[j][i] == 2 && a[j + 1][i + 1] == 2 && a[j + 2][i + 2] == 2 && a[j + 3][i + 3] == 2 && a[j + 4][i + 4] == 2)//向右倾斜时候play2 win
                {
                    win = 2;
                    Sleep(100);
                    break;
                }
            }
            for (i = 4; i<9 && (win == 0); i++)
            {
                if (a[j][i] == 1 && a[j + 1][i - 1] == 1 && a[j + 2][i - 2] == 1 && a[j + 3][i - 3] == 1 && a[j + 4][i - 4] == 1)//向左倾斜时候play1 win
                {
                    win = 1;
                    Sleep(100);
                    break;
                }
                if (a[j][i] == 2 && a[j + 1][i - 1] == 2 && a[j + 2][i - 2] == 2 && a[j + 3][i - 3] == 2 && a[j + 4][i - 4] == 2)//向左倾斜时候play2 win
                {
                    win = 2;
                    Sleep(100);
                    break;
                }
            }
        }
    }
    again(win);
}
void again(int index)
{
    settextstyle(20, 20, "宋体");
    settextcolor(YELLOW);
    if (index == 1)
    {
        outtextxy(220, 500, "play1 win!");
    }
    else
    {
        outtextxy(220, 500, "play2 win!");
    }
    int quit = MessageBox(NULL, "是否继续游戏", "ArchyLi", MB_YESNO);
    if (IDYES == quit)
    {
        cleardevice();
        play();
    }
    else
    {
        cleardevice();
        settextstyle(50, 30, "宋体");
        settextcolor(YELLOW);
        outtextxy(200, 300, "欢迎下次再来");
        Sleep(1000);
        return;
    }
}
 

实现效果如图:

【C++】实现图形界面五子棋游戏源码

【C++】实现图形界面五子棋游戏源码

如需远程调试,可加QQ905733049由专业技术人员远程协助!