java学习心得 关于如何设计一个拼图游戏

来源:互联网 发布:苹果mac更新系统版本 编辑:程序博客网 时间:2024/05/21 03:25

拼图游戏的设计可以分为如下几个部分:1)ui设计,2)键盘监听,事件处理,3)游戏逻辑。ui设计较为简单,继承panel类即可实现;键盘监听功能继承KeyAdapter类或者实现KeyLisener接口即可实现;而游戏逻辑也并不复杂,可以假设空的拼图块其实真是存在,但只是不显示,空拼图块内容可与周围拼图块内容交换。

假设已经拼好完成的图像如图0所示,每个数字代表了图像各部分对应的内容

0

1

2

3

4

5

6

7

8



图0

因此,拼图游戏就抽象成了数字移动排序的问题,一般情况下拼图游戏开始是乱序的,如图1所示。


1

3

2

6


5

4

7

8

1

要还原成图2

1

2

3

4

5

6

7

8


2

那么问题来了,1)游戏是否有意义,也就是图1是否能够还原成图2呢?

2)如图1所示的随机地图如何生成?

      将问题一般化,在M*N的方格里有M*N-1个不同元素和一个空元素,只有空元素可以与上下左右相邻的元素交换位置。M*N方格中M*N-1个元素和一个空元素的位置确定一个图形。拼图游戏的问题是:一个图形经过一连串的交换能否得到另一个图形,如何得到。从交换方式的可逆性看出这种关系满足等价三性质,如果图形A通过交换变成图形B我们则称它们是等价的。把M*N-1个元素用1M*N-1编号,空元素编号0。然后展成一个排列。每个图形对应一个排列。确定了展开方式,图形和排列是一一对应的。这里用到的展开方式是行优先的顺序(其他方式展开也能到相应的结果)。将例1的两个图形展开有:图1对应1 3 2 6 0 5 4 7 8,图2对应1 2 3 4 5 6 7 8 0

      定理1图形A与图形B等价的充要条件图形A的排列的逆序数加上0元素行号和列号的奇偶性等于图形B的排列的逆序数加上0元素行号和列号的奇偶性。为方便表述,把图形排列的逆序数加上0元素行号和列号的奇偶性称为图形的奇偶性。

这里我们需要考虑程序如何设计了,在程序设计时,我们必须要先写出问题2的答案,才能解决问题1,毕竟我们必须先有随机数组才可能去计算其逆序数的个数。而问题2的答案在我的上篇博客里已经进行讲解,这里就不赘述了。

何为逆序数,123,逆序数为 0 ,而321,逆序数对为(3,2),(3,1),(2,1),逆序数为3.

如何求取逆序数,我这里采用最简单的方法,也就是使用刚刚例子里枚举遍历的方法:

public boolean canSolve(int[] arr,init_x ,init_y){  int cnt = 0 ;  for(int i =0 ;i <arr.length; i++)     for(int j =1 ;j <arr.length - i ; j ++)        if(arr[i]>arr[i+j]) cnt ++;//判断是否有解cnt = cnt + init_x + init_y ;// 目标图案的奇偶性int target_cnt = arr[init_x + init_y*MAX_X] + arr[init_x + init_y * MAX_X]%MAX_X;if(cnt%2==target_cnt%2) return true;else return false;}


方法的三个参数为生成的随机数组、初始空图块位置横坐标和纵坐标。由于需要知道初始空图块的目标位置,因此实际上arr[init_x + init_y*MAX_X]取出了空图块的编号,而对其进行除以最大横坐标和对最大横坐标取余数,即可知道其目标位置的横坐标和纵坐标。





1 0
原创粉丝点击