#VB实现可调节难度的九宫格拼图

实现本游戏需要熟练掌握paintpicture函数的应用,如果读者对该函数不熟练,需要读一下前面两篇博客哦
http://blog.csdn.net/wf824284257/article/details/53221631
http://blog.csdn.net/wf824284257/article/details/53222996

源码可以在博主资源页下载

https://download.csdn.net/download/wf824284257/9692559

九宫格拼图,这个游戏,怎么说呢,第一感觉就是给小孩子玩的,很弱智。。。。但是我们是练习代码,所以就拿这个来练练手了,结果在博主写完整个代码并且调试好了以后,自己玩了一下,发现真提莫的难玩。。感觉3*3就是自己的极限了。。。。

先把效果图给出,下面是难度设定为3的时候(3*3)

好,下面我们来分析一下如何做出这个游戏。

##1.游戏功能分析

九宫格拼图游戏,默认难度为3,在开始的时候给出一个窗体,用户选择一张图片载入,之后程序会把图片切割成3*3块,并且拿掉右上角这块,之后随机打乱顺序显示在窗体上,这个时候用户可能会点击 显示 菜单 来显示原图,并且根据原图来拼。在拼图过程中,用户会点击某小块图片,如果该图片周围有空位,则交换这块图片以及空位的位置。每次点击后都要判断是否已经拼好了,如果拼好了,就给出胜利提示。

##2.抽象化,数据化

可以理解为内层表示与外层表示,内层是基础层或者说运算层,而外层是显示层。

内层主要用到2个矩阵,一个是正确顺序矩阵,一个是随机顺序矩阵,用户点击图片块,相当于对该随机矩阵进行元素交换,每次点击都程序都会将随机矩阵与正确矩阵元素一一对比,若完全相同,则表明拼图成功。

外层是显示层,主要用到paintpicture函数来实现对源图片的切割显示,在随机矩阵元素交换后,相应控件显示的图片也要交换。

##3.控件,界面

这里用到2个窗体和一个模块。form1是主窗体,form2用来显示原图,module1用来定义变量以及写一些代码。窗体如下图所示

form1 上设置2个菜单按钮,以及一个picture控件,改名为pic,设置index为0,要在游戏开始后动态加载该pic数组

form2 上放一个picture控件,改名picshow,用来显示原图

##3.变量参数

主要游戏变量:

Public MatrixRight() As Integer '正确矩阵
Public MatrixNow() As Integer   '当前随机矩阵
Public level As Integer         '难度
Public i, j, k As Integer  '循环变量

主要界面参数:

Public BW, BH As Integer '大格子宽高,(所有小格子的总宽高)
Public sw, sh As Integer  '小格子的宽高
Public lk As Integer '留空
Public ssw, ssh As Integer ' 源图片的每个小格子宽高 source picture’s sw and sh

使用这些界面参数作为基底可以很方便的设计各个控件的位置

##4.功能代码介绍

默认难度为3(level=3),切割成3*3共9块,我们需要一个pic控件来存放源图片并且不可见,9个pic控件来显示切割出来的小图片并且可见,所以我们除了放在form1上的pic(0)以外,还需要动态加载9个pic ,pic(0)用来加载源图片,其他9个pic显示的图片都用paintpicture从pic(0)上切割显示。这里pic(0)的autosize和autoredraw 都要设置为true,这是为了完整的加载图片。

首先我们matrixright矩阵赋值如下

1    2   3
4   5   6
7   8   9

再把右上角这一块赋值为-1,用来标识不显示的那块图片

然后通过随机产生matrixnow矩阵,并且把里面的3换成-1。这里随机产生可以通过这样的方式:首先定义一个一维数组randnum(9),则下标为0到8,我们对于矩阵元素1到9来循环。对于1,先产生一个0到8的随机数r,再检测randnum®是否有数字了,如果没有就把1放进去,如果有了就再次产生随机数重复以上过程,直到找到一个空位放进去为止,然后再看2. 通过这样的方式在randnum中产生了1到9的随机序列。然后对于matrixnow矩阵,把randnum中的数字一个一个放进去就好了。代码如下

Dim randnum() As Integer
ReDim randnum(1 To level ^ 2)
Dim r As Integer
'creat random num array
For i = 1 To level ^ 2r = Int(level ^ 2 * Rnd) + 1If randnum(r) = 0 Thenrandnum(r) = iElsei = i - 1End If
Next i
' change "level" to "-1"
For i = 1 To level ^ 2If randnum(i) = level Thenrandnum(i) = -1Exit ForEnd If
Next i
'put the num array into the matrixnow
p = 1
For i = 0 To level - 1For j = 0 To level - 1MatrixNow(i, j) = randnum(p)p = p + 1Next j
Next i

比如产生了这样的随机矩阵

5    4   6
8   2   7
9   3   1

把3变成-1,然后初始的图片就按这个顺序切割显示,-1的那块不显示,就好了。

这样我们内层的初步工作就做完了,下面要显示form1,并且动态加载好控件,设置好他们的位置,以及窗体大小。

lk = 200   '留空200
Form1.Width = 9000  '窗体宽9000,高8000
Form1.Height = 8000
BW = Me.ScaleWidth - 2 * lk '窗体中减去左右的留空,作为所有图片块的总宽
BH = Me.ScaleHeight - 2 * lk
sw = BW \ level  '每个图片块的宽,高
sh = BH \ levelFor i = 1 To level ^ 2 '加载picture控件,并按index设置位置Load pic(i)j = (i - 1) \ levelk = (i - 1) Mod levelpic(i).Top = lk + j * shpic(i).Left = lk + k * swpic(i).Width = swpic(i).Height = shpic(i).Visible = True
Next i

当用户点击 打开 时,我们调用commondialog控件来打开图片,该控件需要手动添加

On Error GoTo errhandler
cmdlg.InitDir = App.Path
cmdlg.Filter = "所有文件(*.*)|*.*"
cmdlg.ShowOpen
pic(0).Picture = LoadPicture(cmdlg.FileName)
ssw = pic(0).ScaleWidth / level
ssh = pic(0).ScaleHeight / level

这里我们相当于把pic(0)也进行了3*3切割,ssw表示source pic’s small width ,源图片的小块的宽,ssh表示源图片小块的高。pic(0)的属性要设置为不可见,autosize为true,这样就把源图片原原本本的加载到pic(0)了。

接下来在pic( 1 to 9)中画出相应的图片,这里我们把源图片拉伸到BW*BH的大小后切割,再画出来的,代码为

' paint the level^2 pics out of orderDim p As Integer
p = 1      '  pic's pointer hereFor i = 0 To level - 1For j = 0 To level - 1Dim mn As Integermn = MatrixNow(i, j)If mn <> -1 Then ' when -1 no picDim m, n As Integerm = (mn - 1) \ leveln = (mn - 1) Mod levelpic(p).PaintPicture pic(0).Picture, 0, 0, pic(p).ScaleWidth, pic(p).ScaleHeight, n * ssw, m * ssh, ssw, sshEnd Ifp = p + 1Next j
Next i

这里的paintpicture函数将源图片的相应小块拉伸放入了pic§中,关于这个函数如果看不懂,可以参考本文最上面给出的2个链接,这里就不再讲述。

图片的点击事件是比较关键的一点,我们需要判断被点击图片的4个方向是否存在空位,如果存在,就交换位置

Private Sub pic_Click(index As Integer)i = (index - 1) \ levelj = (index - 1) Mod level'click on the -1 picIf MatrixNow(i, j) = -1 Then Exit Sub'swap judge on 4 derectionsDim m, n As Integer'leftm = i - 1n = jIf Judge(m, n, index) Then Exit Sub'rightm = i + 1n = jIf Judge(m, n, index) Then Exit Sub'upm = in = j - 1If Judge(m, n, index) Then Exit Sub'downm = in = j + 1If Judge(m, n, index) Then Exit Sub'cannot swap,do nothingEnd Sub

Judge函数用来判断该方向是否存在空位,如果存在就交换,并判断是否已拼完,返回true,否则返回false。

Private Function Judge(ByVal m As Integer, ByVal n As Integer, ByVal index As Integer) As Boolean'judge if the matrixnow(i,j) (m,n) can swapIf (m >= 0 And m <= level - 1) And (n >= 0 And n <= level - 1) ThenIf MatrixNow(m, n) = -1 Then'swap picSavePicture pic(index).Image, "temp.jpg"pic(m * level + n + 1).Picture = LoadPicture("temp.jpg")pic(index).Picture = LoadPicture("")'swap matrixnow 's valueDim temp As Integertemp = MatrixNow(i, j)MatrixNow(i, j) = MatrixNow(m, n)MatrixNow(m, n) = tempJudge = TrueDim x, y As IntegerDim victory As Booleanvictory = TrueFor x = 0 To level - 1For y = 0 To level - 1If MatrixNow(x, y) <> MatrixRight(x, y) Thenvictory = FalseExit ForEnd IfNext yIf victory = False Then Exit ForNext xIf victory ThenMsgBox "victory!", , "caguatations!"Kill "temp.jpg"End IfExit FunctionEnd IfEnd IfJudge = FalseEnd Function

这里的图片交换我们是通过这样的方式

SavePicture pic(index).Image, "temp.jpg"
pic(m * level + n + 1).Picture = LoadPicture("temp.jpg")
pic(index).Picture = LoadPicture("")

通过保存后再载入,可以很方便的实现图片的交换。这里为什么不用paintpicture来做呢?原因有2个:一是如果想直接将pic(1)中的图片画到pic(2)中,那pic(1)中的图片不可以是用paintpicture画上去的,也就是说用paintpicture画上去的图片是不算图片的,picture属性仍未0;二是如果想从pic(0)中将对应部分的图片画上去,那还要再进行坐标的转换,好麻烦。。。

所以最终是利用了中间文件的思路,再最后退出的时候,再将"temp.jpg" kill掉就可以了。

##5难度设置

写代码的时候要考虑代码的通用性,可变性等,所以虽然游戏的难度默认为3,但是代码中都是用level来表示的,只要之前加个level=3就好了。需要其他难度可以直接改变level值,或者用inputbox输入。

不过博主玩了一下,感觉3*3已经非常难了- -,哎,虽然玩了几遍找到一点技巧,感觉还不错,但是博主把level调成10以后,是这个样子的

啊,对这个游戏绝望了,这个可能拼起来嘛!!

##结束

关于这个游戏的主要部分已经说完啦,该游戏源代码在博主的主页http://www.dawufan.cn/下载

VB实现可调节难度的九宫格拼图相关推荐

  1. android实现九宫格拼图小游戏

    贴一下效果图 接下来随便用一张图片就好 以下是全代码 自定义View GameView类 import android.content.Context; import android.graphics ...

  2. 九宫格拼图怎么拼?分享两个简单的操作

    日常生活中发朋友圈的时候,小伙伴是不是有很多照片想分享到朋友圈呢?但是因为朋友圈的限制,不能一次全发.有很多朋友发现很多朋友可以把一张图片剪成9格!看起来很棒,那九宫格拼图怎么拼的呢?今天就和大家分享 ...

  3. java设计九宫格拼图软件哪个好用_九宫格拼图软件下载_抖音很火的九宫格拼图软件app下载_易玩网...

    最近抖音里面好多小伙伴都在晒自己的九宫格拼图照片,小编就为您寻找到了这款APP,软件名字就是分图,能够轻松实现九宫格拼图的制作,你可以随时选择九宫格或者二宫格.三宫格.四宫格以及六宫格,轻松一键制作你 ...

  4. 软件工程作业---结对编程の九宫格拼图扩展

    程序下载:九宫格拼图扩展.exe 想必大家都熟悉九宫格拼图,传统的九宫格拼图就是九个格子,而其中有一个是空的,旁边的可以移动到空的位置,然后通过移动来把乱的图片拼成一个完整的图片,看似简单但其中又有技 ...

  5. java编写九宫格拼图游戏_九宫格拼图游戏

    九宫格拼图游戏设计文档 一.综合设计目的.条件.任务和内容要求: 1.设计目的 <Windows程序设计>是计算机科学与技术专业本科生的一门学科基础课程.Windows程序以图形用户界面( ...

  6. 九宫格拼图游戏设计,及代码时序问题解决

    目录 1. 需求简述 2. 大方向思路 3. 具体实现思路 4. 问题描述 5. 问题解决 1. 需求简述 需求是一个九宫格拼图的游戏,每两张图都可以随意对换,当拖动图片经过被交换图片时,拖动图片不动 ...

  7. java设计九宫格拼图软件哪个好用_十亿人都在拼的拼图软件,这八款最好用

    Hey,各位喵友好,我是33. 作为一个喜欢拍照的人,不仅要熟悉掌控各种美颜滤镜APP,保证自己能随时P好照片发朋友圈,更要让自己的朋友圈也精致起来~ 可是,简单地发图片功效其实是不够滴,(而且万一想 ...

  8. 九宫格拼图游戏初版(练练手)

    最近自己看完了java初级篇,课堂上讲的太少了,有那么一会儿灵感蹦出就写了九宫格游戏,只是初版,有些细节未处理,但整体功能都已实现,贴截图: 程序有三个.class文件,依次是程序主体Nine,图片方 ...

  9. java设计九宫格拼图软件哪个好用_八款超好用的拼图工具

    文 | 刘星文 Unfold 我最近非常喜欢的一款App,清爽简洁,优雅美观,设计很出色. 可以用它来拼图,也可以拼视频,效果很出色,比如下面这样的效果. Storyluxe 如果想做出一些炫酷的效果 ...

最新文章

  1. 2020大部分知名公司Java面试题(一)
  2. 微信突然更新,新增了这些功能...
  3. python运行程序-用Python执行程序的4种方式,编程必备
  4. Python数值类型:小数与百分数的转换
  5. java运算符 —(9)
  6. MultipartFile和CommonsMultipartFile的区别!
  7. 蛮力法 字符串匹配
  8. *使用配置类定义Codeigniter全局变量
  9. 利用before伪元素创建图标
  10. 转:So Easy!让开发人员更轻松的工具和资源
  11. HTML+CSS项目实践五:使用纯CSS实现点击文字切换图片效果(不使用JS)
  12. postman常用断言
  13. php性格属于哪类,狗狗性格分为6大类,你家是属哪一类?快来是看聪明型还是粘人型...
  14. 【论文】 Deep Learning Architecture for Short-Term Passenger Flow Forecasting in Urban Rail Transit
  15. Julia学习笔记(一)——入门
  16. Entity Alignment between Knowledge Graphs Using Attribute Embeddings
  17. Delphi使用ADOconnection连接mysql数据库时的Connectionstring问题
  18. Android开发最佳实践
  19. 小鱼鱼的 Python 学习笔记(第一周)
  20. 64位Ubuntu安装PPStream

热门文章

  1. 抛弃爬下来的灰色数据,有门槛的风控怎么做?
  2. CCNU ACM 2016夏季集训·day3比赛
  3. 成立子公司 联想欲重铸互联网思维
  4. 20、【易混淆概念集】-第十二章 采购甲乙双方的职责 合同类型 采购工作说明书 索赔管理 采购管理
  5. 【问链财经-区块链基础知识系列】 第三十七课 区块链智能合约重新认识:不再智能
  6. 悉尼科技大学2020qs计算机排名,2020年QS世界大学排名悉尼科技大学排名第140
  7. 【转】干货分享-100个shell脚本
  8. 0056-【R-bioconductor】-KEGG通路分析R包安装失败解决-pathview
  9. 提高动作节拍:一、让气缸速度更快: 1.快速排气阀
  10. Org-mode 简明手册