C++课程设计报告——简易五子棋游戏-创新互联

一、项目简介

五子棋是是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子在棋盘交替下棋,先形成五子连线者获胜。此次课程设计主要目的是实现五子棋的双人对弈,对战双方通过鼠标点击进行对弈。

成都创新互联公司是一家从事企业网站建设、网站建设、网站设计、行业门户网站建设、网页设计制作的专业网站建设公司,拥有经验丰富的网站建设工程师和网页设计人员,具备各种规模与类型网站建设的实力,在网站建设领域树立了自己独特的设计风格。自公司成立以来曾独立设计制作的站点上千余家。二、系统实现

游戏通过鼠标点击实现下棋,黑白子交替下棋。

三、关键技术 1、类定义

程序通过使用easyx来实现图形界面,在程序中需要调用头文件#include。程序定义类chess,主要包含五个public函数和一个private数组,其功能如图。下面对程序各个函数进行介绍。

2、void chess::buildboard()

主要实现棋盘的建造,通过数学的坐标系知识进行建造。第一个for循环实现打印横线,第二个for循环实现打印竖线。rectangle函数实现加粗边框、通过solidcircle函数打印小圆点便于下棋定位,outtextxy函数打印游戏名称。

打印棋盘结果如图。

3、void chess::printchess()

主要实现棋子的打印,通过for循环遍历数组找出值为-1的元素打印黑子,值为1的元素打印白子。棋子的打印通过solidcircle打印实心圆,通过setfillcolor改变棋子颜色。注意实心圆打印的位置要应用坐标系知识,实现棋盘坐标与窗口坐标的转换。

4、int chess::set1(int x,int y)与int chess::set2(int x, int y)

通过两个函数访问chess数组元素,为元素赋值,再调用

void chess::printchess()函数实现下棋。

5、int chess::judge(int x, int y)

通过for循环遍历数组,找到水平、竖直、斜向上、斜向下四个方向的五子连珠,注意i和j的增减问题。若判定为游戏胜负已分,则返回1.否则返回0。

6、主函数main

主函数中定义类chess的一个变量为wuziqi。通过loadimage、putimage等函数实现窗口大小设定即窗口背景的打印。窗口背景图片应和项目放在一个文件夹,如图。再调用wuziqi.buildboard()实现完整的棋盘打印。程序下棋通过鼠标交互,在主函数中通过获取鼠标消息实现。运用坐标系知识,通过绝对值比较来坐标校准,实现鼠标指定点下棋。再通过flag的奇偶判定与wuziqi.set1(x, y)函数wuziqi.set2(x, y);函数的调用实现玩家交替下棋。调用wuziqi.judge(x,y) == 1函数判定游戏是否胜负已分,若游戏结束,则弹出窗口。窗口名为“恭喜”,窗口内容为“游戏结束,你赢了”,选项为“确定”。

四、源码分享
#include#includeusing namespace std;
class chess {
public:
    void buildboard(); //棋盘绘制
    void printchess();
    int set1(int x, int y);
    int set2(int x, int y);
    int judge(int x, int y);
private:
    int chess[15][15]; //存储棋子状态,初始化为0,-1为黑子,1为白子
};


void chess::buildboard()
{
    setlinecolor(WHITE);   //设置线条颜色
    setlinestyle(PS_SOLID, 2);
    //线条间距为40
    for (int i = 1; i< 16; i++) {
        line(30, i * 40, 30 + 40 * 14, 40 * i);
    }
    for (int i = 0; i< 15; i++) {
        line(30 + i * 40, 40, 30 + i * 40, 40 * 15);
    }
    //绘制边框与棋盘定点
    setlinestyle(PS_SOLID, 4);
    rectangle(30, 40, 30 + 14 * 40, 40 * 15);
    setfillcolor(WHITE);
    solidcircle(30 + 7 * 40, 40 * 8, 5);  //中间
    solidcircle(30 + 3 * 40, 40 * 4, 5);  //左上
    solidcircle(30 + 3 * 40, 40 * 12, 5);  //左下
    solidcircle(30 + 10 * 40, 40 * 4, 5); //右上
    solidcircle(30 + 10 * 40, 40 * 12, 5);  //右下
    settextstyle(30, 0, "宋体");
    outtextxy(600, 60, "五子棋游戏");
    outtextxy(600, 100, "玩家一:黑子");
    outtextxy(600, 140, "玩家二:白子");
}

void chess::printchess() {
    for (int i = 0; i< 15; i++) {
        for (int j = 0; j< 15; j++) {
            if (chess[i][j] == -1) {
                setfillcolor(BLACK);
                solidcircle(30 + i * 40, 40 * (j + 1), 10);
            }
            else if (chess[i][j] == 1) {
                setfillcolor(WHITE);
                solidcircle(30 + i * 40, 40 * (j + 1), 10);
            }
        }
    }
}

int chess::set1(int x, int y) {
    chess[x][y] = -1;
    chess::printchess();
    return 0;
}

int chess::set2(int x, int y) {
    chess[x][y] = 1;
    chess::printchess();
    return 0;
}

int chess::judge(int x, int y)
{
    for (int i = 0; i< 15; i++) {
        for (int j = 0; j< 15; j++) {
            if (chess[i][j] == 1
                && chess[i][j + 1] == 1
                && chess[i][j + 2] == 1
                && chess[i][j + 3] == 1
                && chess[i][j + 4] == 1) {
                return 1;
            }
            if (chess[i][j] == -1
                && chess[i][j + 1] == -1
                && chess[i][j + 2] == -1
                && chess[i][j + 3] == -1
                && chess[i][j + 4] == -1) {
                return 1;
            }
            if (chess[i][j] == 1
                && chess[i + 1][j] == 1
                && chess[i + 2][j] == 1
                && chess[i + 3][j] == 1
                && chess[i + 4][j] == 1) {
                return 1;
            }
            if (chess[i][j] == -1
                && chess[i + 1][j] == -1
                && chess[i + 2][j] == -1
                && chess[i + 3][j] == -1
                && chess[i + 4][j] == -1) {
                return 1;
            }
            if (chess[i][j] == 1
                && chess[i + 1][j - 1] == 1
                && chess[i + 2][j - 2] == 1
                && chess[i + 3][j - 3] == 1
                && chess[i + 4][j - 4] == 1) {
                return 1;
            }
            if (chess[i][j] == -1
                && chess[i + 1][j - 1] == -1
                && chess[i + 2][j - 2] == -1
                && chess[i + 3][j - 3] == -1
                && chess[i + 4][j - 4] == -1) {
                return 1;
            }
            if (chess[i][j] == 1
                && chess[i + 1][j + 1] == 1
                && chess[i + 2][j + 2] == 1
                && chess[i + 3][j + 3] == 1
                && chess[i + 4][j + 4] == 1) {
                return 1;
            }
            if (chess[i][j] == -1
                && chess[i + 1][j + 1] == -1
                && chess[i + 2][j + 2] == -1
                && chess[i + 3][j + 3] == -1
                && chess[i + 4][j + 4] == -1) {
                return 1;
            }
        }
    }
}

int main() {
    chess wuziqi;
    initgraph(800, 720); //绘图窗口样式默认为NULL
    IMAGE background;
    loadimage(&background, "beijin.jpg");  //从文件中读取图片
    putimage(0, 0, &background);   //输出图片
    wuziqi.buildboard();
    ExMessage m;  //定义一个消息变量
    int flag = 0;
    while (1) {
        m = getmessage(EX_MOUSE);//获取鼠标消息
        int x = 0, y = 0;
        for (int i = 0; i< 15; i++)
        {
            for (int j = 0; j< 15; j++)
            {
                if (abs(m.x - 30 - i * 40)< 20 && abs(m.y - 40 - j * 40)< 20)  //将点击的范围内的值取整
                {
                    x = i; //坐标
                    y = j;
                }
            }
        }
        if (m.message == WM_LBUTTONDOWN) {
            flag++;
            if (flag % 2 != 0) {
                wuziqi.set1(x, y);
            }
            else {
                wuziqi.set2(x, y);
            }
            if (wuziqi.judge(x, y) == 1) {
                MessageBox(GetHWnd(), "游戏结束,你赢了", "提示", MB_OK);   //窗口句柄,消息内容,消息标题,按钮类型
                exit(1);
            }
        }
    }
    system("pause");
    return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:C++课程设计报告——简易五子棋游戏-创新互联
分享链接:http://scyanting.com/article/djecsi.html