中国象棋游戏Chess(2) - 走棋

之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制

现在实现走棋的功能。

首先需要获取点击到的棋子,用QWidget中的函数

mouseReleaseEvent

实现函数:

void Board::mouseReleaseEvent(QMouseEvent *ev)
{
    // 首先要获取鼠标点击的位置
    QPoint pt = ev->pos();

    // 看有没有点中象棋
    // 将pt转化成象棋的行列值
    // 判断这个行列值上面有没有棋子
    int row, col;
    bool bRet = getRowCol(pt, row, col);
    if (bRet == false) { // 点击位置无效
        return;
    }

    int i;
    int clickid = -1;
    for (i = 0; i < 32; ++i) {
        if (_s[i]._row == row &&
            _s[i]._col == col &&
            _s[i]._dead == false) {
            break;
        }
    }
    if (i < 32) {
        clickid = i;
    }

    if (_selectid == -1) { // 如果点中的棋子之前未被选中
        if (clickid != -1) {
            _selectid = clickid;
            update();
        }
    }
    else {
        _s[_selectid]._row = row;
        _s[_selectid]._col = col;
        if (clickid != -1) {
            _s[clickid]._dead = true;
        }
        _selectid = -1;
        update();
    }
}

这里涉及到点击位置的有效性,写了一个函数,根据点击得到的位置判断是否属于所在矩形四个顶点中的某个圆内。

// 判断点击位置是否在某个顶点的圆内
// 返回值为bool类型是为了处理点击在棋盘外的情况
bool Board::getRowCol(QPoint pt, int &row, int &col)
{
    row = pt.y() / (2 * _r) - 1;
    col = pt.x() / (2 * _r) - 1;

    QPoint c = center(row, col);
    int dx = c.x() - pt.x();
    int dy = c.y() - pt.y();
    int dist = dx * dx + dy * dy; // 和鼠标所处矩形左上顶点的距离
    if (dist < _r * _r) {
        return true;
    }

    row += 1;
    c = center(row, col);
    dx = c.x() - pt.x();
    dy = c.y() - pt.y();
    dist = dx * dx + dy * dy; // 和鼠标所处矩形左下顶点的距离
    if (dist < _r * _r) {
        return true;
    }

    row -= 1;
    col += 1;
    c = center(row, col);
    dx = c.x() - pt.x();
    dy = c.y() - pt.y();
    dist = dx * dx + dy * dy; // 和鼠标所处矩形右上顶点的距离
    if (dist < _r * _r) {
        return true;
    }

    row += 1;
    c = center(row, col);
    dx = c.x() - pt.x();
    dy = c.y() - pt.y();
    dist = dx * dx + dy * dy; // 和鼠标所处矩形右下顶点的距离
    if (dist < _r * _r) {
        return true;
    }

    return false;
}

注意更改drawStone函数中的绘制棋子部分。

    if (id == _selectid) {
        painter.setBrush(QBrush(Qt::gray));
    }
    else {
        painter.setBrush(QBrush(QColor(255, 228, 181))); // 将棋子底色设置为鹿皮色
    }

如果是被选中的,把底色设置成灰色。

最终就实现了棋子的选中和走棋,效果为:

此时走棋可以随意走,可以随意吃,还没规则的限制,下一篇中再实现。

完整代码:Github

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 02:40:59

中国象棋游戏Chess(2) - 走棋的相关文章

中国象棋游戏Chess(3) - 实现走棋规则

棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那样每个棋子都可以走到任意位置. 也实现了红先黑后,并且每一方走一步,交替走棋的功能. 直接看代码: // Board.h // Board类实现了棋盘的绘制以及显示 // #ifndef BOARD_H #define BOARD_H #include <QFrame> #include &quo

基于HTML5实现的中国象棋游戏

棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电脑对弈几把吧,相信这HTML5中国象棋游戏的实现算法你比较清楚,可以打开源码来研究一下这款HTML5中国象棋游戏. 在线预览   源码下载 实现的代码. html代码: <div class="box" id="box"> <div class=&qu

C#中国象棋+游戏大厅 服务器 + 客户端源码

来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设置 游戏互不干扰 这个象棋大厅程序完全可以当做是C#委托事件的教程,而且游戏大厅功能也很多,服务器还可设置人数和桌数,大厅客户端也实时更新相关数据. 源码下载地址:http://www.ajerp.com/bbs/forum.php?mod=viewthread&tid=29&extra=pa

GMchess Linux下的中国象棋游戏

gmchess,一款Linux下的中国象棋程序

cocos2dx 3.2 的中国象棋游戏

改编来源:http://www.cnblogs.com/ 在cocos2dx官网看到了这么个教程,是cocos2dx 2.x版本的,于是用 cocos2dx 3.2 照着敲了一遍,原先的代码里面有些bug也顺道修了一下. 实现了个主体功能,开始啦,走棋及其判断,胜负判断. 效果图如下: 代码下载地址: http://files.cnblogs.com/adoontheway/chess.rar 资源可以用这个里面的资源: http://cn.cocos2d-x.org/uploads/20141

HTML5实现中国象棋游戏(无人能敌)

1. [代码][JavaScript]代码    var AI = AI||{}; AI.historyTable =   {};     //历史表  //人工智能初始化AI.init = function(pace){    var bill = AI.historyBill || com.gambit; //开局库    if (bill.length){        var len=pace.length;        var arr=[];        //先搜索棋谱     

团队-中国象棋游戏-设计文档

成员:张明成 张洪剑 张鸿程 赵建辉 徐宏璇 喻政博 目标:1.绘制象棋棋盘 2.在指定位置绘制棋子 3.各棋子按规则行子.马跳"日"字.象走"田"字.士 在九宫内斜行(这里需要特别注意的是卒(兵)的行子规则会随其所在位置的不同而发生变化--过河后可以左右平移). 行子不能越出棋盘的界限.当然所有子都不能走到棋盘的外面,同时某些特定的子还有自己的行棋界限,如将.士不能出九宫,象不能过河. 将帅不能碰面. 行子的半路上不能有其它子阻拦(除了炮需要隔一个子才能打子之外)

中国象棋小游戏(实验三)

一.题目简介 中国象棋历史悠久,本实验的目的是设计一个中国象棋小游戏的java程序,实现中国象棋游戏的基本功能. 二.结对分工及过程 本人和赵岳刚同学分工协作,由一人搜集资料,另一人收集整理,在一人编写代码的同时,由另外一人负责观察代码写的有没有问题,大大提高了工作效率. 三.代码地址 https://github.com/CaesarLH/text3/blob/master/Chess.txt 四.测试情况 过程截图: 1.开始 2.棋子信息 3.棋子走法 4.定义胜利条件 5.其他具体规则

团队-团队编程项目中国象棋-项目总结

一. 项目背景: 中国象棋是一款益智类的游戏.采用html ,css,js,开发一个操作简单,功能较全的"中国象棋"游戏. 二.功能说明 1.使用鼠标对棋子进行控制,让棋子按规则运动. 3.初始场景棋子按照规则摆放,每次落子没有时间限制. 4.可以进行人机对战,按照规则判断胜负 三.设计思路 这个程序的关键是棋子的行走规则和判断胜负的条件.每个棋子都有自己的移动规则.游戏通过鼠标点击控制. 四.技术要点 1.棋子的处理 2.棋子移动的处理 3.棋子被吃掉时的处理 4判断游戏是否胜利 5