PuzzleGame部分核心算法
#include
"mainwindow.h"
#include
<QGridLayout>
#include
<QPushButton>
#include
<QSizePolicy>
#include
<QButtonGroup>
#include
<QDebug>
#include
<QString>
#include
<qdir.h>
MainWindow
::
MainWindow
(
QWidget
*
parent
)
:
QWidget
(
parent
)
{
init
();
this
->
setFixedSize
(
500
,
500
);
}
void
MainWindow
::
init
(){
gridLayout
=
new
QGridLayout
(
this
);
buttonGroup
=
new
QButtonGroup
(
this
);
int
index
=
0
;
for
(
int
j
=
0
;
j
<
MAX_Y
;
j
++){
//4
for
(
int
i
=
0
;
i
<
MAX_X
;
i
++){
//3
//
qDebug()
<<
i
<<
j;
index
++;
button
=
new
QPushButton
(
QString
::
number
(
index
),
this
);
//
button
=
new
QPushButton(QString::number(i),
this);
//
qDebug()
<<
i
<<
j;
//
button->setText(QString::number(index));
button
->
setSizePolicy
(
QSizePolicy
::
Expanding
,
QSizePolicy
::
Expanding
);
button
->
setStyleSheet
(
"border-image:url(':/test/1.png')"
);
qDebug
()
<<
QDir
::
currentPath
();
//
button->setText("empty");
gridLayout
->
addWidget
(
button
,
j
,
i
);
buttonGroup
->
addButton
(
button
,
index
);
//
buttons[j][i]
=
new
QPushButton(this);
//
buttons[j][i]
=
button;
}
}
buttonGroup
->
button
(
MAX_X
*
MAX_Y
)->
hide
();
buttonGroup
->
button
(
MAX_X
*
MAX_Y
)->
setText
(
"empty"
);
connect
(
buttonGroup
,
SIGNAL
(
buttonClicked
(
int
)),
this
,
SLOT
(
slotClick
(
int
)));
this
->
setLayout
(
gridLayout
);
}
void
MainWindow
::
slotClick
(
int
id
){
QPushButton
*
button
=
(
QPushButton
*)
buttonGroup
->
button
(
id
);
//
qDebug()
<<
button->text();
if
(
id
%
MAX_X
!=
0
){
x
=
id
/
MAX_X
;
y
=
id
-
(
x
*
MAX_X
)
-
1
;
}
else
{
x
=
id
/
MAX_X
-
1
;
y
=
id
-
(
x
*
MAX_X
)
-
1
;
}
qDebug
()
<<
"id:"
<<
id
;
qDebug
()
<<
MAX_X
<<
MAX_Y
;
qDebug
()
<<
"x:"
<<
x
<<
"y:"
<<
y
;
if
(
x
==
0
){
//第一行
if
(
y
==
0
){
//第一列.即左上角。
右移、下移
qDebug
()
<<
"第一列.即左上角。
右移、下移"
;
if
(
right
(
x
,
y
)){
moveRight
();
}
else
if
(
down
(
x
,
y
)){
moveDown
();
}
}
else
if
(
y
==
MAX_X
-
1
){
//第一行最后一列,右上角。左移’下移
qDebug
()
<<
"最后一列,右上角。左移’下移"
;
if
(
left
(
x
,
y
)){
moveLeft
();
}
else
if
(
down
(
x
,
y
)){
moveDown
();
}
}
else
{
//第一行,除了头和尾的两个。左移’右移‘下移
qDebug
()
<<
"第一行,除了头和尾的两个。左移’右移‘下移"
;
if
(
left
(
x
,
y
)){
moveLeft
();
}
else
if
(
right
(
x
,
y
)){
moveRight
();
}
else
if
(
down
(
x
,
y
)){
moveDown
();
}
}
}
else
if
(
x
==
MAX_Y
-
1
){
//最后一行
if
(
y
==
0
){
//第一列。左下角。上移‘右移
qDebug
()
<<
"第一列。左下角。上移‘右移"
;
if
(
up
(
x
,
y
)){
qDebug
()
<<
"可以上移"
;
moveUp
();
}
else
if
(
right
(
x
,
y
)){
moveRight
();
}
}
else
if
(
y
==
MAX_X
-
1
){
//最后一列,即右下角。左移’上移
qDebug
()
<<
"最后一列,即右下角。左移’上移"
;
if
(
left
(
x
,
y
)){
moveLeft
();
}
else
if
(
up
(
x
,
y
)){
moveUp
();
}
}
else
{
//最后一行,除了头和尾的两个。上移‘左移’右移
qDebug
()
<<
"最后一行,除了头和尾的两个。上移‘左移’右移"
;
if
(
up
(
x
,
y
)){
moveUp
();
}
else
if
(
left
(
x
,
y
)){
moveLeft
();
}
else
if
(
right
(
x
,
y
)){
moveRight
();
}
}
}
else
{
if
(
y
==
0
){
//第一列。除了头和尾的两个。上移‘下移’右移
qDebug
()
<<
"第一列。除了头和尾的两个。上移‘下移’右移"
;
if
(
up
(
x
,
y
)){
moveUp
();
}
else
if
(
down
(
x
,
y
)){
moveDown
();
}
else
if
(
right
(
x
,
y
)){
moveRight
();
}
}
else
if
(
y
==
MAX_X
-
1
){
//最后一列,除了头和尾的两个。上移‘下移’左移。
qDebug
()
<<
"最后一列,除了头和尾的两个。上移‘下移’左移。"
;
if
(
down
(
x
,
y
)){
qDebug
()
<<
"可以下移"
;
moveDown
();
}
else
if
(
up
(
x
,
y
)){
moveUp
();
}
else
if
(
left
(
x
,
y
)){
moveLeft
();
}
}
else
{
//中间的,可以上下左右移动的按钮。
qDebug
()
<<
"中间的,可以上下左右移动的按钮。"
;
if
(
up
(
x
,
y
)){
moveUp
();
}
else
if
(
left
(
x
,
y
)){
moveLeft
();
}
else
if
(
right
(
x
,
y
)){
moveRight
();
}
else
if
(
down
(
x
,
y
)){
moveDown
();
}
}
}
}
bool
MainWindow
::
up
(
int
x
,
int
y
){
//if(buttonGroup->button(x-1,
y))
qDebug
()
<<
"text:"
<<
buttonGroup
->
button
(
MAX_X
*
(
x
-
1
)
+
y
+
1
)->
text
();
if
(
buttonGroup
->
button
(
MAX_X
*
(
x
-
1
)
+
y
+
1
)->
text
()
==
"empty"
){
return
true
;
}
return
false
;
}
bool
MainWindow
::
down
(
int
x
,
int
y
){
if
(
buttonGroup
->
button
(
MAX_X
*
(
x
+
1
)
+
y
+
1
)->
text
()
==
"empty"
){
return
true
;
}
return
false
;
}
bool
MainWindow
::
left
(
int
x
,
int
y
){
if
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
-
1
)->
text
()
==
"empty"
){
return
true
;
}
return
false
;
}
bool
MainWindow
::
right
(
int
x
,
int
y
){
if
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
+
1
)->
text
()
==
"empty"
){
return
true
;
}
return
false
;
}
void
MainWindow
::
moveUp
(){
buttonGroup
->
button
(
MAX_X
*
(
x
-
1
)
+
y
+
1
)->
setText
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
text
());
buttonGroup
->
button
(
MAX_X
*
(
x
-
1
)
+
y
+
1
)->
show
();
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
setText
(
"empty"
);
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
hide
();
}
void
MainWindow
::
moveDown
(){
buttonGroup
->
button
(
MAX_X
*
(
x
+
1
)
+
y
+
1
)->
setText
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
text
());
buttonGroup
->
button
(
MAX_X
*
(
x
+
1
)
+
y
+
1
)->
show
();
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
setText
(
"empty"
);
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
hide
();
}
void
MainWindow
::
moveLeft
(){
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
-
1
)->
setText
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
text
());
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
-
1
)->
show
();
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
setText
(
"empty"
);
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
hide
();
}
void
MainWindow
::
moveRight
(){
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
+
1
)->
setText
(
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
text
());
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
+
1
)->
show
();
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
setText
(
"empty"
);
buttonGroup
->
button
(
MAX_X
*
(
x
)
+
y
+
1
)->
hide
();
}
650) this.width=650;" title="QQ截图20140610180652.png" src="http://s3.51cto.com/wyfs02/M00/2D/65/wKiom1OW2SaAZ9SzAALK-rjef_g562.jpg" alt="wKiom1OW2SaAZ9SzAALK-rjef_g562.jpg" />
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1424700
PuzzleGame部分核心算法的更多相关文章
- SQL关键字转换大写核心算法实现
1 不跟你多废话 上代码! /// <summary> /// SQL关键字转换器 /// </summary> public class SqlConverter : IKe ...
- 用Java实现MVPtree——MVPtree核心算法代码的搭建
项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写 ...
- x264代码剖析(十三):核心算法之帧间预測函数x264_mb_analyse_inter_*()
x264代码剖析(十三):核心算法之帧间预測函数x264_mb_analyse_inter_*() 帧间预測是指利用视频时间域相关性,使用临近已编码图像像素预測当前图像的像素,以达到有效去除视频时域冗 ...
- x264代码剖析(十五):核心算法之宏块编码中的变换编码
x264代码剖析(十五):核心算法之宏块编码中的变换编码 为了进一步节省图像的传输码率.须要对图像进行压缩,通常採用变换编码及量化来消除图像中的相关性以降低图像编码的动态范围.本文主要介绍变换编码的相 ...
- Unity3D_(游戏)甜品消消乐02_游戏核心算法
甜品消消乐01_游戏基础界面 传送门 甜品消消乐02_游戏核心算法 传送门 甜品消消乐03_游戏UI设计 传送门 GameManager脚本上修改Fill Time可以改变消消乐移动速度 实现过 ...
- [转帖]RSYNC 的核心算法
RSYNC 的核心算法 https://coolshell.cn/articles/7425.html rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并 ...
- Python机器学习——预测分析核心算法PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7qi1 在学习和研究机器学习的时候,面临令人眼花缭乱的算法,机器学习新手往往会不知所措.本书从算法和Python语言实现的角度,帮助读者认识机器学习. 本书专注于两类核心的" ...
- 游戏2048的核心算法c#版本的实现
接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常.完美运行.当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面 ...
- 《python机器学习—预测分析核心算法》笔记1
参见原书 1.1-1.4节 一.惩罚线性回归模型 基本特性: 1.训练时间快,使用训练好的模型进行预测的时间也快2.应用于高速交易.互联网广告的植入等3.解决回归.分类问题 最重要的特性:能明确指出, ...
随机推荐
- 【Codeforces 723D】Lakes in Berland (dfs)
海洋包围的小岛,岛内的有湖,'.'代表水,'*'代表陆地,给出的n*m的地图里至少有k个湖,求填掉面积尽量少的水,使得湖的数量正好为k. dfs找出所有水联通块,判断一下是否是湖(海水区非湖).将湖按 ...
- 绘制图形与3D增强技巧(二)----直线图元
一. glBegin(GL_LINES); glend(); 二.线带和线环 glBegin(GL_LINE_STRIP); glend(); glBegin(GL_LINE_LOOP); glend ...
- 让人又爱又恨的char(字符型)
今天来总结一下char型,平常写算法的时候对这个东西感觉都有一点绕着走,说到底还是对这部分的知识不熟悉所以有点怕他,不过以后不要怕,今天来总结一下 首先,说到字符型数据类型,char型,恩它是一种数据 ...
- Linux解压命令(tar)
tar zxvf phddns_raspberry.tgz tar默认解压到当前目录 参数: 运行tar时必须要有下列参数中的至少一个才可运行 -A, --catenate, --concatenat ...
- poj2284 欧拉公式
题意:给出一图形,求该图形把平面分成了几部分 欧拉公式: http://blog.csdn.net/wangxiaojun911/article/details/4586550 对于二维平面上的情况. ...
- iptables实现反向代理
拓扑图 实现目标 公网用户通过Firewall服务器(iptables实现)访问内网http服务 配置 #iptables iptables -t nat -A PREROUTING -p tcp - ...
- 控件的invoke和beginInvoke方法
System.Windows.Forms.Timer 的timer是在主线程上执行的,因此在timer的tick事件中操作界面上的控件不会发生线程的安全性检测. Control的invoke和begi ...
- Swift 函数做参数和闭包做参数的一个细节差别
函数作参数,示例为传入一个String和一个添加前缀的函数,返回一个添加完前缀的String: func demo(str:String,addPrefix:(String)->String)- ...
- Spring 文件上传功能
本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId> ...
- 第5.5次Scrum会议
会议信息 时间:2016.10.25 21:30 时长:0.5h 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 会议内容 鉴于团队推进受阻,原PM 邓 与 原后端 冯 协商后决定之后一段时间 ...