(一)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