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.解决回归.分类问题 最重要的特性:能明确指出, ...
随机推荐
- ThreadLocal详解(实现多线程同步访问变量)
ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量. 这个玩意有什么用处,或者说为什么要有这么一个东东?先解释一下,在并发编程的时候,成员变量如果不做任何处理其实是线程不安全的,各个线 ...
- html中拼接字符串问题
hmtl拼接问题: 今天在同事解决问题的时候发现 html <lable id="p"+@item.id></label> 拼接出来的是 p+5 <l ...
- TCP连接——爱的传声筒
TCP连接——爱的传声筒 TCP通信最重要的特征是:有序(ordering)和可靠(reliable).有序是通过将文本流分段并编号实现的.可靠是通过ACK回复和重复发送(retransmission ...
- (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...
- ecshop 重置后台密码 MD5+salt
ecshop密码加密方式: MD5 32位+salt,简单来说就是明文密码用MD5加密一次,然后在得到的MD5字符后边加上salt字段值(salt值为系统随机生成,生成以后不再改变)再进行一次MD5加 ...
- 【BZOJ-3555】企鹅QQ 字符串Hash
3555: [Ctsc2014]企鹅QQ Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1545 Solved: 593[Submit][Statu ...
- JSP生命周期
1.编译阶段:servlet容器编译servlet源文件,生成servlet类.观察一个JSP页面在第一次访问的时候会由servlet容器会生成.java文件,最终编译成.class字节码文件,如果打 ...
- Linux/Windows下如何退出telnet
[Ctrl+]]->[quit] linux下和windows上一样
- SQL Server在更改计算机名后的设置
把原来的账号删除 再添加现有的账号 添加权限 搞定了上面的账号配置,接下来就是设置服务器名称 参考:http://www.cnblogs.com/EasonJim/p/6114249.html 后话: ...
- RabbitMQ 通过记日志来看routingkey
RoutingKey 每个项目都需要记录日志,日志则一般会分为多种级别,常见的是 Info.debug.warn.Error 对于前三种日志,在项目运行中会产生大量的消息,但是一般多数情况下是不会用到 ...