文章目录

  • 一、项目简介
  • 二、效果演示
  • 三、程序设计
    • 1. 定义主窗口类 ( MainWindow )
    • 2. 创建主窗口 ( mainwindow )
    • 3. 绘制棋盘 ( DrawChinessBroad )
    • 4. 定义棋子类 Item
    • 5. 绘制棋子 ( DrawItems )
    • 6. 获取同方向上棋子数量 ( CountRoundItems )
    • 7. 鼠标点击落子,判断输赢 ( mousePressEvent )
    • 8. 重绘下棋事件 ( paintEvent )

一、项目简介

五子棋起源于中国,是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后不得移动或拿走。
(5)黑方的第一枚棋子必须下在天元点上,即中心交叉点
五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

二、效果演示

1. 对局开始

2. 棋手对弈

3. 黑棋胜利

三、程序设计

1. 定义主窗口类 ( MainWindow )

class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void DrawChessBroad();//绘制棋盘void DrawItems();//绘制棋子QVector<Item> m_items;//记录我们的落子bool m_bIsBlackTun;//记录落子颜色int CountRoundItems(Item it, QPoint pt);//获取一个方向上的棋子数量void mousePressEvent(QMouseEvent *event);//鼠标点击落子void paintEvent(QPaintEvent *event);private:Ui::MainWindow *ui;
};

2. 创建主窗口 ( mainwindow )

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);//比18*25.5稍微大一些resize(480,480);m_bIsBlackTun = 0;//初始化落子颜色 0 为白色 1为黑色m_items.clear();//清空我们的落子
}

3. 绘制棋盘 ( DrawChinessBroad )

void MainWindow::DrawChessBroad(){//鼠标光标定位到QPainter,按F1查看帮助文档,找到drawRect函数QPainter painter(this);QPen pen;//画笔pen.setColor(Qt::black);//定义画笔颜色pen.setWidth(2);//设置画笔的宽度QBrush brush(QColor(Qt::darkYellow));//画刷并设置颜色painter.setPen(pen);//添加画笔painter.setBrush(brush);//添加画刷//因为我们要绘制18*18的棋盘,所以我们使用双重for循环来绘制18*18个棋盘格子for(int j = 0;j<CHESS_COLUMES;j++){for(int i = 0;i<CHESS_ROWS;i++){//我们使用drawRect(int x, int y, int width, int height)来绘制一个矩形(棋盘格子)//前两个参数代表矩形的左上顶点,后两个参数代表矩形的宽高painter.drawRect((i+0.5)*RECT_WIDTH,(j+0.5)*RECT_HEIGHT,RECT_WIDTH,RECT_HEIGHT);}}
}

4. 定义棋子类 Item

class Item
{public:Item();Item(QPoint pt,bool bBlack);//棋子类的有参构造QPoint m_pt;//棋子坐标//重写==bool operator ==(const Item &t1) const{return (m_bBlack == t1.m_bBlack && m_pt == t1.m_pt);}bool m_bBlack;//是黑方还是白方下棋
};

5. 绘制棋子 ( DrawItems )

void MainWindow::DrawItems(){QPainter painter(this);QPen pen;QBrush brush;pen.setColor(Qt::transparent);//设置画笔颜色为透明色painter.setPen(pen);//循环我们的所有落子,并绘制出来for(int i = 0;i<m_items.size();i++){Item item = m_items[i];//判断是黑方还是白方落子if(item.m_bBlack){painter.setBrush(Qt::black);}else {painter.setBrush(Qt::white);}//获取棋子的位置QPoint ptCenter((item.m_pt.x()+0.5)*RECT_WIDTH,(item.m_pt.y()+0.5)*RECT_HEIGHT);//绘制棋子,棋子的半径为宽高的一半painter.drawEllipse(ptCenter,RECT_WIDTH/2,RECT_HEIGHT/2);}
}

6. 获取同方向上棋子数量 ( CountRoundItems )

int MainWindow::CountRoundItems(Item it, QPoint pt)
{Item it1 = it;//通过it1来获取当前棋子it1.m_pt += pt;//获取对应方向的棋子int counter = 0;while (m_items.contains(it1)) {//判断it1是否在m_items中counter++;//在这个方向的棋子数it1.m_pt += pt;}return counter;//返回棋子数量
}

7. 鼠标点击落子,判断输赢 ( mousePressEvent )

void MainWindow::mousePressEvent(QMouseEvent *event)
{QPoint pt;//定义一个点int chess_x = event->pos().x();//获取鼠标点击的x坐标int chess_y = event->pos().y();//获取鼠标点击的y坐标pt.setX(chess_x/RECT_WIDTH);//设置棋子x坐标pt.setY(chess_y/RECT_HEIGHT);//设置棋子y坐标//循环所有棋子判断落子处是否存在棋子for(int i = 0;i<m_items.size();i++){Item item = m_items[i];if(item.m_pt == pt){return;}}Item item(pt,m_bIsBlackTun);//设定棋子坐标及颜色m_items.append(item);//添加棋子到所有的棋子//判定是否赢int Left = CountRoundItems(item,QPoint(-1,0));//获取左边棋子的数量int Right = CountRoundItems(item,QPoint(+1,0));int Up = CountRoundItems(item,QPoint(0,-1));int Down = CountRoundItems(item,QPoint(0,+1));int LeftUp = CountRoundItems(item,QPoint(-1,-1));int LeftDown = CountRoundItems(item,QPoint(-1,+1));int RightUp = CountRoundItems(item,QPoint(+1,-1));int RightDown = CountRoundItems(item,QPoint(+1,+1));//判定四种情况if((Left+Right >= 4)|| (Up+Down)>=4 || (LeftUp+RightDown)>=4||(RightUp + LeftDown>=4)){QString strTip = item.m_bBlack?"黑棋胜出!":"白棋胜出!";//判断当前落子的颜色给出相应的获胜提示QMessageBox::information(this,"提示胜利",strTip,QMessageBox::Yes);m_items.clear();//清空所有落子return;}m_bIsBlackTun = !m_bIsBlackTun;//切换棋子颜色
}

8. 重绘下棋事件 ( paintEvent )

void MainWindow::paintEvent(QPaintEvent *event)
{//绘制棋盘DrawChessBroad();//绘制棋子DrawItems();//更新update();
}

Qt的简单应用:五子棋游戏相关推荐

  1. 【QT项目】简易五子棋游戏(人机对战)— 完整源码

    文章目录 前言 一.游戏实现效果 二.需求分析 三.解决方案 四.核心步骤 1.插入棋盘图 2.双方落子 3.输赢判定 4.重新开始 五.完整源码 1.main.cpp 2.chessboard.h ...

  2. 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏

    原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...

  3. 五子棋下法C#语言,C#实现简单的五子棋游戏

    最近利用业余时间写了一个简单的五子棋游戏,没有利用深层次的面向对象技术,自学一年,代码和程序设计有不妥之处,还望大神指出,先看下实现的功能,三个button按钮,黑棋和白棋选择先出,和重置. 其他的不 ...

  4. c语言实现简单的五子棋游戏

    摘要: 基于c语言以及esayx库的五子棋游戏 操作说明: 将图片保存为test.jpg,并放在程序根目录下. 使用左键下黑棋,使用右键下白棋,中键进行棋子的覆盖并实现悔棋. 源代码: /****** ...

  5. VUE+Canvas实现简单的五子棋游戏

    之前的canvas小游戏系列欢迎大家戳: <VUE实现一个Flappy Bird~~~> <VUE+Canvas实现上吊火柴人猜单词游戏> <VUE+Canvas 实现桌 ...

  6. QT:简单的小游戏开发日记

    最近在b站上学了下GUI开发 (实在不想看黑框了 ),做出来一个翻金币的小游戏.虽然写完了但是不会打包,一直也没有给别人帮我debug.在我会打包之前现在这里复盘一下程序是怎么写出来的. 说实话,Qt ...

  7. 用74l138实现一个一位全减器_用pygame实现一个简单的五子棋游戏

    准备 python基础相关准备: pygame的基础知识,参考目光博客的"用Python和Pygame写游戏-从入门到精通" 安装python 3.8.0 在python官网下载, ...

  8. python五子棋游戏from tkinter import_使用Python的tkinter库,做简单的五子棋游戏

    初学tkinter,感觉功能还是太少了,建议想要深入研究用户界面的话,还是选QT,VB之类的吧.要是跟我一样平时随便玩玩,就图个方便,那就将就着用吧. 2019-05-20:之前的版本是刚学pytho ...

  9. python写游戏棋牌游戏_使用python实现简单五子棋游戏

    使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...

  10. h5+css3简单实现网页端五子棋游戏1.0版

    H5+css3简单实现五子棋游戏 原理 主要使用H5的拖拽接口功能,通过拖拽移动棋子,目标位置通过接收拖拽棋子的拷贝元素,实现棋子摆放. 效果图如下 步骤 第一步:简单排版五子棋游戏页面,设定好棋盘排 ...

最新文章

  1. HDU1051Wooden Sticks
  2. 开了一论坛,专门讨论控件技术
  3. 好玩的东西——一个代码片段
  4. 基于android模拟led发光,LED通知灯模拟app
  5. linux下提示libpng12-0缺失
  6. 关于在Webservice里使用LinqToSQL遇到一对多关系的父子表中子表需要ToList输出泛型而产生循环引用错误的解决办法!...
  7. 如何面试一位前端工程师
  8. 百度二年级手工机器人_使用盈首AI炒股机器人,能获得超高超额收益率
  9. mybatis 3的TypeHandler深入解析(及null值的处理)
  10. PHP json_decode($json, TRUE) TRUE使数据格式化为Array,而非object
  11. 100项PPT制作技术
  12. 小米手机扩容教程_小米笔记本硬盘扩容教程:5分钟搞定,存储容量瞬间翻倍...
  13. 纯干货万字长文,(强烈建议收藏)一文通读Git使用教程
  14. 微信小程序--分享并设置分享链接的有效时间
  15. matlab—赋值具有的非单一 rhs 维度多于非单一下标数
  16. 第五回:样式色彩秀芳华
  17. 零基础也能看懂的五大网络安全技术,学网络真的可以很简单
  18. Mixly for Mac米思齐安装过程遇到的问题(已解决)
  19. Springboot 精髓
  20. 百度乐播音乐真实地址查找api接口

热门文章

  1. win11资源管理器总是自动重启的解决方法
  2. dll控件安装方法(仅供参考)
  3. scratch的官方版本和其他的改编版本/小喵科技Kittenblock/snap!/TurboWarp
  4. kaggle-2美国人口普查年收入50K分类
  5. 数据结构与算法实验01-使用链表实现多项式乘法
  6. JAVA自行车类代码_租借自行车RentBikeController
  7. 调研报告与调查报告的区别及写作技巧
  8. 毕业设计开题报告撰写方法
  9. CNCF的中国云原生调查报告
  10. c语言 数组 常数,在c中创建一个常数数组