首页 > 其他分享 >.....

.....

时间:2023-03-14 09:24:02浏览次数:42  
标签:void ChessItem ..... black ui MainWindow painter

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->centralwidget->setMouseTracking(true);
this->setMouseTracking(true);
InitUI();
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::InitUI(){
//棋盘大小
this->resize((CHESS)*MAX, (CHESS)*MAX);
this->setMaximumSize((CHESS)*MAX+200, (CHESS)*MAX);
this->setMinimumSize((CHESS)*MAX+200, (CHESS)*MAX);
this->setWindowTitle("五子棋");

//信号槽将按钮与函数联系起来
connect(ui->huiqi,&QPushButton::clicked,this,&MainWindow::backStep);
connect(ui->change,&QPushButton::clicked,this,&MainWindow::change);
connect(ui->clear,&QPushButton::clicked,this,&MainWindow::clear);
connect(ui->PVP,&QPushButton::clicked,this,&MainWindow::PVP);
connect(ui->PVE,&QPushButton::clicked,this,&MainWindow::PVE);
connect(ui->EVE,&QPushButton::clicked,this,&MainWindow::EVE);
b_black = false;
}

void MainWindow::paintEvent(QPaintEvent *event){
DrawChessBoard();
FivePoint();
DrawChessItem();

if(p_ChessItem.size()!=0){
ui->change->setEnabled(false);//下棋后不能交换
ui->PVP->setEnabled(false);
ui->PVE->setEnabled(false);
ui->EVE->setEnabled(false);
}else{
ui->change->setEnabled(true);
ui->PVP->setEnabled(true);
ui->PVE->setEnabled(true);
ui->EVE->setEnabled(true);
}
if(p_ChessItem.size()!=0){
ui->huiqi->setEnabled(true);//下棋后允许悔棋
ui->clear->setEnabled(true);//下棋后允许清空
}else{
ui->huiqi->setEnabled(false);
ui->clear->setEnabled(false);
}
DrawHandChess();
NextChessItem();
update();//强制更新
}

void MainWindow::FivePoint(){
QPainter painter(this);
painter.setBrush(QBrush(Qt::black));
painter.drawEllipse(375-7,375-7,14,14);
painter.drawEllipse(175-7,175-7,14,14);
painter.drawEllipse(575-7,575-7,14,14);
painter.drawEllipse(175-7,575-7,14,14);
painter.drawEllipse(575-7,175-7,14,14);
}

void MainWindow::DrawChessBoard(){
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);//抗锯齿
painter.drawPixmap(rect(),QPixmap(":/new/prefix1/image/board.png"));//背景
// painter.drawPixmap(rect(),QPixmap(":/new/prefix1/image/bachong.png"));
painter.setPen(QPen(QColor(Qt::black),1));//网格
for (int i = 0; i < CHESS-1; ++i) {
for (int j = 0; j < CHESS-1; ++j) {
painter.drawRect((i+0.5)*MAX, (j+0.5)*MAX, MAX,MAX);
}
}

}

void MainWindow::mouseMoveEvent(QMouseEvent *event){
Px = event->pos().x()/MAX;
Py = event->pos().y()/MAX;
qDebug()<<"---("<<event->pos().x()<<","<<event->pos().y()<<")"<<Qt::endl;
qDebug()<<"("<<Px<<","<<Py<<")"<<Qt::endl;
}

void MainWindow::DrawHandChess(){
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
painter.translate(-24,-24);//图像居中
if(Px<15)
if(b_black){
painter.drawPixmap(mapFromGlobal(QCursor::pos()),QPixmap(":/new/prefix1/image/white.png"));
}else{
painter.drawPixmap(mapFromGlobal(QCursor::pos()),QPixmap(":/new/prefix1/image/black.png"));
}

}

void MainWindow::DrawChessItem(){
QPainter painter(this);
for (int i = 0; i < p_ChessItem.size(); ++i) {
ChessItem item = p_ChessItem[i];//当前的棋子样式位置赋值
if(item._black){
painter.drawPixmap(item._pt*50,QPixmap(":/new/prefix1/image/white.png"));
}else{
painter.drawPixmap(item._pt*50,QPixmap(":/new/prefix1/image/black.png"));
}
DrawChessPoint(item._pt);
}
}

void MainWindow::DrawChessPoint(QPoint &point){
//获取位置
QPoint ptCenter((point.x() + 0.5) * MAX , (point.y() + 0.5) * MAX);
}

void MainWindow::NextChessItem(){
QPoint next;
next.setX(860);next.setY(645);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
if(b_black){
painter.drawPixmap(next,QPixmap(":/new/prefix1/image/white.png"));
}else{
painter.drawPixmap(next,QPixmap(":/new/prefix1/image/black.png"));
}

}

void MainWindow::mousePressEvent(QMouseEvent *event){
//获取点击位置
QPoint pt,ptMachine;
pt.setX(event->pos().x()/MAX);
pt.setY(event->pos().y()/MAX);
qDebug()<<"("<<pt.x()<<","<<pt.y()<<")"<<Qt::endl;
if(pt.x()>14||pt.y()>14){
return;//超越边界直接返回空
}

//已存在棋子位置
for (int i = 0; i < p_ChessItem.size(); ++i) {
ChessItem item = p_ChessItem[i];
if(item._pt == pt){
return;//存在直接返回空
}
}

//否则进行绘制
ChessItem item(pt,b_black);
ChessItem itemMachine(ptMachine,!b_black);

if(playmode==0){
p_ChessItem.append(item);
//乙方下棋
b_black = !b_black;

//统计4个点位连接情况判断五子连接
if(Support.FiveCheck(item,p_ChessItem)){
QString str = b_black?"黑子胜利":"白子胜利";
QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
playmode=4;
return;
}

}else if(playmode==1){
p_ChessItem.append(item);//人下

Support.ValueSet(itemMachine, p_ChessItem);

QEventLoop eventloop;//非阻塞等待
QTimer::singleShot(300, &eventloop, SLOT(quit()));
eventloop.exec();

p_ChessItem.append(itemMachine);//机器下

//统计4个点位连接情况判断五子连接
if(Support.FiveCheck(item,p_ChessItem)){
QString str = !b_black?"黑子胜利":"白子胜利";
QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
playmode=4;
return;
}
if(Support.FiveCheck(itemMachine,p_ChessItem)){
QString str = b_black?"黑子胜利":"白子胜利";
QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
playmode=4;
return;
}

}

//平局
if(p_ChessItem.size()==225){
QMessageBox::information(NULL,"GAME OVER","平局!",QMessageBox::Yes);
playmode=4;
}
}


//按钮
void MainWindow::change(){
b_black=false;
QPoint ptfirst;
ptfirst.setX(7); ptfirst.setY(7);
ChessItem itemfirst(ptfirst,b_black);
p_ChessItem.append(itemfirst);
b_black=!b_black;
}

void MainWindow::backStep(){
qDebug()<<"悔棋";
if(playmode==0){
p_ChessItem.pop_back();
b_black=!b_black;
}else if(playmode==1){
p_ChessItem.pop_back();
p_ChessItem.pop_back();
}else{
ui->huiqi->setEnabled(false);
}
}

void MainWindow::clear(){
b_black=false; EVEa=0;
p_ChessItem.clear();//清空棋盘
playmode=playm;
}

void MainWindow::PVP(){
playm=playmode=0;
}

void MainWindow::PVE(){
playm=playmode=1;
}

void MainWindow::EVE(){
playm=playmode=2; EVEa=1;
QPoint ptfirst;
ptfirst.setX(7); ptfirst.setY(7);
ChessItem itemfirst(ptfirst,b_black);
p_ChessItem.append(itemfirst);

while(EVEa){
QPoint ptMachine1,ptMachine2;
ChessItem itemMachine1(ptMachine1,!b_black);
ChessItem itemMachine2(ptMachine2,b_black);

Support.ValueSet(itemMachine1, p_ChessItem);

p_ChessItem.append(itemMachine1);//机器下

QEventLoop eventloop;//非阻塞等待
QTimer::singleShot(300, &eventloop, SLOT(quit()));
eventloop.exec();

Support.ValueSet(itemMachine2, p_ChessItem);
p_ChessItem.append(itemMachine2);//机器下

QTimer::singleShot(300, &eventloop, SLOT(quit()));
eventloop.exec();
//统计4个点位连接情况判断五子连接
if(Support.FiveCheck(itemMachine1,p_ChessItem)){
QString str = b_black?"黑子胜利":"白字胜利";
QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
return;
}
if(Support.FiveCheck(itemMachine2,p_ChessItem)){
QString str = b_black?"黑子胜利":"白子胜利";
QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
return;
}
//平局
if(p_ChessItem.size()==225){
QMessageBox::information(NULL,"GAME OVER","平局!",QMessageBox::Yes);
b_black=false;
p_ChessItem.clear();//清空棋盘
}
}
}

标签:void,ChessItem,.....,black,ui,MainWindow,painter
From: https://www.cnblogs.com/zero-one---/p/17213684.html

相关文章