1. 程式人生 > >(一)QT實現中國象棋(棋盤實現)

(一)QT實現中國象棋(棋盤實現)

功能實現:1、包含兩個ui介面,登陸介面包含人機對戰和人人對戰;2、實現棋盤的編輯,都是使用QT自帶的類畫線,實現象棋棋盤線路。

1、新建工程的框架如下圖所示

2、login.h

#ifndef LOGIN_H
#define LOGIN_H
#include<QDialog>

#include <QMainWindow>
#include <QPushButton>
namespace Ui {
class Login;
}

class Login : public QDialog
{
    Q_OBJECT
    
public:
    explicit Login(QWidget *parent = 0);
public slots:
    void selecthuman();
    void selectcomputer();
private:
    QPushButton *human;
    QPushButton *computer;
private:
    Ui::Login *ui;
public:
    void paintEvent(QPaintEvent *);
private:
    int mode;
};

#endif // LOGIN_H

3、login.cpp

#include "login.h"
#include "ui_login.h"
#include <QPainter>
Login::Login(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Login)
{
    //ui->setupUi(this);
    this->resize(600,600);
    this->move(400,50);
    QPixmap pixmap("./pic/4.jpg");
    pixmap = pixmap.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio);
    QPalette palette;
    palette.setBrush(QPalette::Background,QBrush(pixmap));
    this->setPalette(palette);
    human=new QPushButton(tr("VS Human"),this);
    computer=new QPushButton(tr("VS Computer"),this);
    human->setGeometry(20,500,90,50);
    computer->setGeometry(20,420,90,50);

    //具體來說:如果一個事件處理函式呼叫了一個事件物件的accept()函式,這個事件就不會被繼續傳播給其父元件
    connect(human,SIGNAL(clicked()),this,SLOT(accept()));
    connect(human,SIGNAL(clicked()),this,SLOT(selectcomputer()));

    connect(computer,SIGNAL(clicked()),this,SLOT(accept()));
    connect(computer,SIGNAL(clicked()),this,SLOT(selecthuman()));
}

void Login::selecthuman()
{
    mode = 0;
}
void Login::selectcomputer()
{
    mode = 1;
}
void Login::paintEvent(QPaintEvent *)
{
    //1、畫字
    QPainter painter(this);
    //painter.setPen(Qt::blue);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 50));
    painter.drawText(rect(), Qt::AlignCenter, "中國象棋");
}
4、mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
private:
    short size;
    QPixmap pic[32];
protected:
    void paintEvent(QPaintEvent *);
};

#endif // MAINWINDOW_H

5、mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QPen>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    size = 60;
    this->setWindowTitle(tr("楚河漢界"));
    this->setFixedSize(size*10+100,size*10+100);
    this->move(400,0);
}

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

void MainWindow::paintEvent(QPaintEvent *)                                   //繪製棋盤格線
{
    QPainter p;
    p.begin(this);

    QPen pen;
    pen.setWidth(10);
    pen.setColor(Qt::green); // 設定畫筆為黃色
    p.setPen(pen); // 設定畫筆
    p.drawPoint(size-5,size-5);
    p.drawPoint(size*9+5,size-5);
    p.drawPoint(size-5,size*10+5);
    p.drawPoint(size*9+5,size*10+5);
    //設定畫筆顏色和寬度
    QPen background=p.pen();
    background.setColor(Qt::black);
    background.setWidth(2);
    p.setPen(background);
    qDebug() << size << endl;
    //畫棋盤的輪廓線
    p.drawLine(size-5,size-5,size*9+5,size-5);
    p.drawLine(size-5,size-5,size-5,size*10+5);
    p.drawLine(size-5,size*10+5,size*9+5,size*10+5);
    p.drawLine(size*9+5,size-5,size*9+5,size*10+5);
    background.setWidth(1);
    p.setPen(background);
    short n=1;
    //畫棋盤的18條垂直線
    for(;n<10;n++)
    {
        p.drawLine(size*n,size,size*n,size*5);
        p.drawLine(size*n,size*6,size*n,size*10);//Vertical
    }
    //畫楚河漢界的兩條短垂直線
    p.drawLine(size,size*5,size,size*6);
    p.drawLine(size*9,size*5,size*9,size*6);
    //畫棋盤的10條水平線
    for(n=1;n<=10;n++)
        p.drawLine(size,size*n,size*9,size*n);//Horizon
    //畫棋盤“士”行走的斜線
    p.drawLine(size*4,size,size*6,size*3);              //斜線軌跡
    p.drawLine(size*6,size,size*4,size*3);
    p.drawLine(size*4,size*8,size*6,size*10);
    p.drawLine(size*6,size*8,size*4,size*10);
    //畫楚河漢界
    QPointF point(size*2.6, size*5.7);
    p.setFont(QFont("Arial", 30));
    p.drawText(point, "楚河            漢界");
    p.end();
}
6、main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <login.h>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");//情況2
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
    QApplication a(argc, argv);
    MainWindow w;
    //w.show();
    Login c;
    //c.show();
    if(c.exec()==QDialog::Accepted)                        //當選擇對話方塊上的button被單擊呼叫了accept槽時,顯示主視窗
    {
        w.show();
        return a.exec();
    }
    return a.exec();
}

7、執行結果


相關推薦

QT實現中國象棋棋盤實現

功能實現:1、包含兩個ui介面,登陸介面包含人機對戰和人人對戰;2、實現棋盤的編輯,都是使用QT自帶的類畫線,實現象棋棋盤線路。1、新建工程的框架如下圖所示2、login.h#ifndef LOGIN_H#define LOGIN_H#include<QDialog&g

QT中國象棋1

因為一直喜歡下象棋,今天動手實踐一下用QT實現中國象棋!先看下效果。。。。。 1.我採用c++實現的,有以下幾個類: 棋盤類 #include <QWidget> #include <QPainter> #include "stone.h" class Bo

使用Qt開發中國象棋:走棋

        在整個遊戲中,走棋是最複雜的部分,也是最麻煩的。開發這個程式,大概花了三分之一的時間在這個上面。在這個遊戲中,走棋是通過滑鼠點選事件來完成的,當然也可以通過拖動滑鼠事件來弄。假設我們自己先走,整個走棋的邏輯如下:         (1)點選滑鼠。      

使用Qt開發中國象棋:網路對戰

關於Qt網路程式設計 QTcpServer用於建立TCP伺服器端。當newConnection訊號激發時,我們呼叫指定的槽建立一個通訊的套接字。 QTcpSocket用於建立TCP通訊套接字。當connected訊號激發時,我們向伺服器端傳送訊息,當read

中國象棋軟體-引擎實現局面評估

前面已經講過了棋局表示、著法生成、搜尋演算法(包括搜尋輔助), 在象棋程式中如果說搜尋演算法是心臟,那麼局面評估就是大腦。搜尋演算法負責驅動整個程式,而局面評估則負責對搜尋的內容進行判斷評價。因而搜尋與局面評估是整個程式的核心。 首先,先介紹一下在局面評估中需要考慮的因素。就不同的棋類可能要考慮的因素略有差

Unity中國象棋——初始化棋子

新建一個plane,作為背景,新建一個StoneManager指令碼,掛在plane上 初始化32個棋子,每個棋子自帶6個屬性值:ID,x軸的座標位置,y軸的座標位置,是否為紅子,是否死亡,棋子的型別。通過結構體Stone實現; 由於每個棋子的位置、型別難以通過ID區分,

Unity中國象棋——網路對戰的實現服務端的基本功能

博主主要是用了socket的方法去實現了伺服器和客戶端之間的通訊,由於樓主對於socket網路程式設計這一方面的基礎相當薄弱,故也是邊學邊學,有些地方的程式碼不夠完善還請大神指正!博主還需學習。 首先,先說說服務端方面:服務端採用的是VS的windows form窗體應用

[luoguP2051] [AHOI2009]中國象棋DP

show include ble 當前 一個 () print long www. 傳送門 註釋寫明了一切 #include <cstdio> #define N 111 #define p 9999973 #define LL lo

【BZOJ】1801 [Ahoi2009]chess 中國象棋dp

發現 lin max def %d print class () line 題目 傳送門:QWQ 分析 發現我們關心的不是棋子的位置,我們只關心棋子數量就ok。 首先每行每列最多兩個棋子。這是顯然的。 然後我覺得本題最難的部分就是對行進行討論,蒟蒻

中國象棋AHOI2009

傳送門 簡單思路:dp 用f[i][j][k]表示前i行有j列放了一個子,有k列放了兩個子 轉移,只要列舉每一行的放置情況即可,有:不放、在空列放一個,在有一個子的列放一個,在兩個空列各放一個,在兩個一子列各放一個,在空列和一子列各放一個。 列舉ijk即可,最後求和 注意:逆元只有在

2018.10.05 bzoj1801: [Ahoi2009]chess 中國象棋狀壓dp

傳送門 dp好題。 定義狀態f(i,j,k)f(i,j,k)f(i,j,k)表示前i行,有j行放一個棋子,k行放兩個棋子。 然後分當前放0/1/20/1/20/1/2個棋子轉移。 程式碼: #inclu

P2051 [AHOI2009]中國象棋動態規劃

思路 好像是一道挺水的計數的,不知道為什麼會是紫題 顯然每行和每列最多放兩個 首先考慮狀壓,然後發現三進位制狀壓可做,但是三進位制太麻煩了,可以拆成兩個二進位制,一個表示該列是否是放了一個的,一個表示該列是否是放了兩個的 可以發現並不需要知道具體每列放了什麼,只需要知道有幾個即可,所以把有幾列放了一個

【BZOJ 1801】【AHOI 2009】中國象棋遞推DP

(誰告訴我是狀壓的????) 一行/列最多能放三個炮 30分是讓你爆搜的 50分是讓你狀壓的 假設有8列 dp[i][j]表示到第i行且前面列的狀態為j (沒有/有一個/有兩個炮) 然後刷表 100分其實就是在50分的基礎上修改了一點 因為發現 並不需要準確的知道之前擺放情況到底是什麼樣子的 於是dp[i][

洛谷P2051 [AHOI2009]中國象棋動態規劃

dp[i][j][k]表示放了前i行,有j列是有1個棋子,有k列有兩個棋子 #include <bits/stdc++.h> #include <algorithm> #include <cstdio> #include <iostream> #i

Entity Framework學習筆記——EF簡介篇文章告訴你什麽是EF

比較 編程 ast 定義 .aspx b2c 文件創建 發送 ase Entity Framework是以ADO.NET為基礎,面向數據的“實體框架”。以下簡稱EF。 它利用了抽象化數據結構的方式,將每個數據庫對象都轉換成應用程序對象 (entity),

不使用fastreport自帶的條碼組件打印快遞單款很不錯的條碼組件下載

安裝 tof dial 沒有 .cn als cep win rep 由於沒有正確安裝fastreport組件,導致沒法使用fastreport中的條碼組件,如何解決:思路:1、雖然條碼組件不能使用,但有fastreport中picture組件可用。2、查找可以生成一維碼圖

Just Too Lucky個數能被其各位的和整除

題目連結https://vjudge.net/problem/Gym-100623J 題目大意:求1-n中,有多少個數,可以被其各位的和整除 n<=1e12   設x為數位和 x的範圍為[1,108] 也就是說要讓一個數n mod x = 0 &nbs

C語言 資料型別、儲存類、分配空間

C語言是一種移植性強,面向過程的語言,最初由丹尼斯創立,用於編寫UNIX作業系統,移植性強指的是它的程式碼通用性強。 特點:操作簡易,結構化語言,適合處理底層事件。 我的第一個C語言程式 #include <stdio.h> /*前處理器指令,在實際編譯之前執行的*

在Ubuntu安裝和使用Anbox完整說明種在Linux使用Android應用的方法

在Ubuntu安裝和使用Anbox完整說明(一種在Linux使用Android應用的方法) Anbox是一種基於容器的方法,用於在常規GNU/Linux系統 https://anbox.io上啟動完整的Android系統,相似但不同的專案還有Shashlik和Genimob

PostgreSQL應用,環境搭建和客戶端工具安裝

一,PostgreSQL下載 官方下載地址: https://www.postgresql.org/download/ pgAdmin4客戶端工具下載地址:https://www.pgadmin.org/download/pgadmin-4-windows/ 二,安裝 本次PostgreSQ