#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include "logo.h"
#include <QMediaPlayer>
#include <QTimer>
#include <QTime>
#include <QMessageBox>
#define GetRowCol(__row, __col, __id) \
int __row = _s[__id]._row;\
int __col = _s[__id]._col
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
player->setMedia(QUrl::fromLocalFile("../mychess/obj_wo3DlMOGwrbDjj7DisKw_9399701661_ce61_5623_fa71_91ff035713763226ff669a820b802bfc.mp3"));
// 播放媒体文件
player->play();
for(int i=0;i<32;++i){
_s[i].init(i);
}
selectid=-1;
QTimer*timer = new QTimer(this);
// 连接 QTimer 的 timeout 信号到槽函数
connect(timer, &QTimer::timeout, this, &Widget::updateLabel);
// 设置计时间隔,单位为毫秒
timerInterval = 1000; // 1 秒
timer->start(timerInterval);
// 重置计时器
timeElapsed = new QTime(0, 0, 0);
// 开始计时
*timeElapsed = timeElapsed->addSecs(1); // 使用 QTime 类的方法
timer->start(timerInterval);
updateTimerLabel();
connect(timer, &QTimer::timeout, this, &Widget::updateLabel2);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent*) {
QPainter painter(this); // 创建一个 QPainter 对象,并将其指向当前窗口的绘图设备
// 创建一个较粗的画笔
QPen boldPen;
boldPen.setWidth(3); // 设置边框宽度为3像素
boldPen.setColor(Qt::black); // 设置颜色为黑色
// 保存原来的画笔设置
QPen originalPen = painter.pen();
painter.setPen(boldPen);
painter.setRenderHint(QPainter::Antialiasing, true); // 开启抗锯齿
painter.drawLine(QPoint(d-10, d-10), QPoint((9 * d)+10, d-10));
painter.drawLine(QPoint(d-10, 10*d+10), QPoint((9 * d)+10, 10*d+10));
painter.drawLine(QPoint(d-10,d-10),QPoint(d-10,(10*d)+10));
painter.drawLine(QPoint((9*d)+10,d-10),QPoint((9*d)+10,(10*d)+10));
// 绘制十条横线
for (int i = 1; i <= 10; ++i) {
painter.setPen(originalPen); // 恢复原来的画笔设置
painter.drawLine(QPoint(d, i * d), QPoint(9 * d, i * d));
}
painter.setPen(originalPen);
for(int i=1;i<=9;++i){
if(i==1||i==9){
painter.drawLine(QPoint(i*d,d),QPoint(i*d,10*d));
}
else {
painter.drawLine(QPoint(i*d,d),QPoint(i*d,5*d));
painter.drawLine(QPoint(i*d,6*d),QPoint(i*d,10*d));
}
}
painter.setPen(originalPen);
//九宫格
painter.drawLine(QPoint(4*d,1*d),QPoint(6*d,3*d));
painter.drawLine(QPoint(4*d,3*d),QPoint(6*d,1*d));
painter.drawLine(QPoint(4*d,10*d),QPoint(6*d,8*d));
painter.drawLine(QPoint(4*d,8*d),QPoint(6*d,10*d));
// 在指定区域内绘制居中对齐的文本
QRect textRect(80, 240, 340, 60); // 设置矩形区域
QFont font("萝莉体", 16, QFont::Bold); // 设置字体为“楚河汉界”并指定字号为16
painter.setFont(font);
// 绘制"楚河"
painter.drawText(textRect.adjusted(0, 0, -170, 0), Qt::AlignCenter, "楚河");
// 绘制"汉界"
painter.drawText(textRect.adjusted(170, 0, 0, 0), Qt::AlignCenter, "汉界");
//绘制32颗棋子
for(int i=0;i<32;++i){
drawstone(painter,i);
}
}
QPoint Widget::center(int _row, int _col){
QPoint ret;
ret.rx() = (_col + 1) * d;
ret.ry() = (_row + 1) * d;
return ret;
}
QPoint Widget::center(int id){//返回id棋子中心点
return center(_s[id]._row,_s[id]._col);
}
void Widget::drawstone(QPainter &painter, int id){
if(_s[id]._death==true)
return;
//绘制椭圆
int r=d/2;
QPoint c=center(id);
QRect rect=QRect(c.x()-r,c.y()-r,r*2,r*2);
if(id==selectid){
painter.setBrush(QBrush(QColor(Qt::gray)));
}
else{
painter.setBrush(QBrush(QColor(Qt::yellow)));// 象棋背景
}
QPen boldPen,firstpen;
boldPen.setWidth(2); // 设置边框宽度为2像素
boldPen.setColor(Qt::red); // 设置颜色为黑色
firstpen.setWidth(2); // 设置边框宽度为2像素
firstpen.setColor(Qt::black); // 设置颜色为黑色
if(_s[id]._red){
//painter.setPen(Qt::red);//画笔
painter.setPen(boldPen);
}
else{
painter.setPen(firstpen);
}
painter.setFont(QFont("system",r));
painter.drawEllipse(center(id),r,r);
painter.drawText(rect,_s[id].getText(),QTextOption(Qt::AlignCenter));
}
//扫描棋盘所有点
bool Widget::getrowcol(QPoint pt,int &row,int &col){
for (row = 0; row <=9; row++) {
for (col=0;col<=8;col++) {
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;
}
}
}
return false;
}
int Widget::getStoneCountAtLine(int row1, int col1, int row2, int col2)
{
int ret = 0;
if(row1 != row2 && col1 != col2)
return -1;
if(row1 == row2 && col1 == col2)
return -1;
if(row1 == row2)
{
int min = col1 < col2 ? col1 : col2;
int max = col1 < col2 ? col2 : col1;
for(int col = min+1; col<max; ++col)
{
if(getStoneId(row1, col) != -1) ++ret;
}
}
else
{
int min = row1 < row2 ? row1 : row2;
int max = row1 < row2 ? row2 : row1;
for(int row = min+1; row<max; ++row)
{
if(getStoneId(row, col1) != -1) ++ret;
}
}
return ret;
}
int Widget::getStoneId(int row, int col)
{
for(int i=0; i<32; ++i)
{
if(_s[i]._row == row && _s[i]._col == col && !isDead(i))
return i;
}
return -1;
}
bool Widget::isDead(int id)
{
if(id == -1)return true;
return _s[id]._death;
}
bool Widget::canmovejv(int moveid,int row,int col){
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
GetRowCol(row1, col1, moveid);
int ret = getStoneCountAtLine(row1, col1, row, col);
if((d==10||d==20||d==30||d==40||d==50||d==60||d==70||d==80||d==90||d==1||d==2||d==3||d==4||d==5||d==6||d==7||d==8||d==9)&&ret==0){
return true;
}
return false;
}
bool Widget::canmovema(int moveid,int row,int col){
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
if(d==12||d==21)
return true;
return false;
}
bool Widget::canmovepao(int moveid,int row,int col,int killid){
GetRowCol(row1, col1, moveid);
int ret = getStoneCountAtLine(row, col, row1, col1);
if(killid != -1)
{
if(ret == 1) return true;
}
else
{
if(ret == 0) return true;
}
return false;
}
bool Widget::canmoveshi(int moveid,int row,int col){
if(_s[moveid]._red){
if(row<7){return false;}
}
else{
if(row>2){return false;}
}
if(col<3)return false;
if(col>5)return false;
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
if(d==11)
return true;
return false;
}
bool Widget::canmovejiang(int moveid,int row,int col){
if(_s[moveid]._red){
if(row<7){return false;}
}
else{
if(row>2){return false;}
}
if(col<3)return false;
if(col>5)return false;
int dr=_s[moveid]._row-row;
int dc=_s[moveid]._col-col;
int d=abs(dr)*10+abs(dc);
if(d==1||d==10)
return true;
return false;
}
bool Widget::canmovexiang(int moveid,int row,int col){
if(_s[moveid]._red){
if(row<5