1. 程式人生 > >【C++】實現圖形介面五子棋

【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;
    }
}

實現效果如圖: