Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44330
  • 博文数量: 20
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 230
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-21 22:20
文章分类
文章存档

2011年(1)

2009年(19)

我的朋友
最近访客

分类:

2009-02-17 08:00:30

华容道的场景字符串
 
    先说一说场景字符串的构成。作一个华容道游戏,有这么几大内容:
一.画出可以翻页显示的图形群,供浏览,供选择。一般都是色块图;
二.选出图形,构成操作图形。操作图形可以是色块图,而一般是有图画的或是有汉字的;
三.可以用鼠标拖曳移动操作图形,完成游戏结局;
四.可以用鼠标拖曳自由作图佈阵,设计新的开局场景。一般为了与操作图形区别,也用色块;
五.自动完成最佳步数的走步方法,并演示。
 
    每个项目都离不开数据的操作。而且需要符合操作要求的数据字符串。
    色块图一般用四种颜色,加上空位共五种颜色,所以只要用“0”,“1”,“2”,“3”,“4”就够了。但在字符串中,每个字符还要能够表示色块的位置。我们知道华容道棋盘是由20个格子组成的,每个格子填上一个字符,然后再自上而下,自左向右的连起来。就是一个20个字符由“0“---”4”组成的字符串。以民间广传的“横刀立马”为例:这个字符串就是“24422442233221121001”,称为“数据方式1”,如下图(一)。
     但是,有一个不足,一个竖条用两个“2”,一个横条用两个“3”,一个大方快用四个“4”,这对画有框的色块是不利的,无框的色块没关系。因而改动一下,把不需要的字符改为“*”,这个字符串就成了“24*2****23*2*11*1001”,称为“数据方式2”,甚至改成“242232111001”也无不可,称为“数据方式3”,如下图(二)。
 
  
 
      那么是不是“数据方式1”不好,不,它在后台运行,内存运行中是很必要的。“数据方式2”不足的是,这个字符串不是纯数字结构,但它在画图上有绝对的优越性,每个字符都体现了它的位置。“数据方式3”是纯数字结构,又短小精简,不足的是,每个字符都体现不了它的位置,但在“搜索华容道全部场景”中功不可没。
     单有这些数据字符串还不够,操作图形往往是有图画的或是有汉字的,如上图(三)。用鼠标拖曳移动操作图形,用“Move”方法也需要一组“图形控件”,所以再设计一个数据字符串给“操作图形”使用。具体方法如下:
     横条关羽存入图形控件组(1);
      横条赵云存入图形控件组(2); 
     横条黄忠存入图形控件组(3);
     横条马超存入图形控件组(4);
     横条张飞存入图形控件组(5);
     兵存入图形控件组(6);
    丁存入图形控件组(7);
    士存入图形控件组(8);
    勇存入图形控件组(9);
     曹操存入图形控件组(10);
     竖条张飞存入图形控件组(11);
     竖条马超存入图形控件组(12);
     竖条黄忠存入图形控件组(13);
     竖条赵云存入图形控件组(14);
     竖条关羽存入图形控件组(15);
 
    这样这个字符串就成了“1110**12********1301**14**0607**08000009”,其中以图形控件的下标扩充为两个字符为一个单位。至于这样安排是为了保持五虎将的完整不重复。
 
     综上所叙,我设计了四种华容道的数据字符串,各有千秋,各为所用。但它们不应该是孤立的,应该是可以相互转换的。下面用 VB 程序来进行相互转换。
 

Private yx(-1 To 7, -1 To 6) As String
Private sj1 As String, sj2 As String, sj3 As String, sj4 As String
Private i As Integer, j As Integer
Private a As Integer, b As Integer

'A. 数据方式1 转换为数据方式2,3
Private Sub Form_Click()
 For j = 1 To 5
  For i = 1 To 4
   yx(j, i) = ""
  Next i
 Next j

 sj2 = "": sj3 = ""
 For j = 1 To 5
  For i = 1 To 4
   If yx(j, i) <> "*" Then
    yx(j, i) = Mid$(sj1, (j - 1) * 4 + i, 1): sj3 = sj3 & yx(j, i)
    Select Case yx(j, i)
     Case Is = "4"
      yx(j, i + 1) = "*"
      yx(j + 1, i) = "*": yx(j + 1, i + 1) = "*"
     Case Is = "3"
      yx(j, i + 1) = "*"
     Case Is = "2"
      yx(j + 1, i) = "*"
    End Select
   End If
   sj2 = sj2 & yx(j, i)
  Next i
 Next j
 Print "数据方式2 "; sj2
 Print "数据方式3 "; sj3

'b.数据方式1 转换为数据方式4
 For j = 1 To 5
  For i = 1 To 4
   yx(j, i) = ""
  Next i
 Next j

 a = 0: b = 5: C = 10
 sj4 = ""
 For j = 1 To 5
  For i = 1 To 4
   If yx(j, i) <> "**" Then
    yx(j, i) = Mid$(sj1, (j - 1) * 4 + i, 1)
    Select Case yx(j, i)
     Case Is = "4"
      yx(j, i) = "10": yx(j, i + 1) = "**"
      yx(j + 1, i) = "**": yx(j + 1, i + 1) = "**"
     Case Is = "3"
      a = a + 1: yx(j, i) = "0" & LTrim$(Str$(a)): yx(j, i + 1) = "**"
     Case Is = "2"
      C = C + 1: yx(j, i) = LTrim$(Str$(C)): yx(j + 1, i) = "**"
     Case Is = "1"
      b = b + 1: yx(j, i) = "0" & LTrim$(Str$(b))
     Case Is = "0"
      yx(j, i) = "00"
    End Select
   End If
   sj4 = sj4 & yx(j, i)
  Next i
 Next j
 Print "数据方式4 "; sj4

'C.数据方式2 转换为数据方式1
 For j = 1 To 5
  For i = 1 To 4
   yx(j, i) = ""
  Next i
 Next j
 
 sj1 = ""
 For j = 1 To 5
  For i = 1 To 4
   If yx(j, i) = "" Then
    yx(j, i) = Mid$(sj2, (j - 1) * 4 + i, 1)
    Select Case yx(j, i)
     Case Is = "4"
      yx(j, i + 1) = "4": yx(j + 1, i) = "4": yx(j + 1, i + 1) = "4"
     Case Is = "3"
      yx(j, i + 1) = "3"
     Case Is = "2"
      yx(j + 1, i) = "2"
    End Select
   End If
   sj1 = sj1 & yx(j, i)
  Next i
 Next j
 Print "数据方式1 "; sj1

'D.数据方式3 转换为数据方式1
 For j = 1 To 5
  For i = 1 To 4
   yx(j, i) = ""
  Next i
 Next j
 
 a = 0
 sj1 = ""
 For j = 1 To 5
  For i = 1 To 4
   If yx(j, i) = "" Then
    a = a + 1: yx(j, i) = Mid$(sj3, a, 1)
    Select Case yx(j, i)
     Case Is = "4"
      yx(j, i + 1) = "4": yx(j + 1, i) = "4": yx(j + 1, i + 1) = "4"
     Case Is = "3"
      yx(j, i + 1) = "3"
     Case Is = "2"
      yx(j + 1, i) = "2"
    End Select
   End If
   sj1 = sj1 & yx(j, i)
  Next i
 Next j
 Print "数据方式1 "; sj1
 
'E.数据方式4 转换为数据方式1
 For j = 1 To 5
  For i = 1 To 4
   yx(j, i) = ""
  Next i
 Next j
 
 sj1 = ""
 For j = 1 To 5
  For i = 1 To 4
   If yx(j, i) = "" Then
    yx(j, i) = Mid$(sj4, (j - 1) * 8 + (i - 1) * 2 + 1, 2)
    Select Case yx(j, i)
     Case Is = "10"
      yx(j, i) = "4": yx(j, i + 1) = "4"
      yx(j + 1, i) = "4": yx(j + 1, i + 1) = "4"
     Case Is = "11", "12", "13", "14", "15"
      yx(j, i) = "2": yx(j + 1, i) = "2"
     Case Is = "01", "02", "03", "04", "05"
      yx(j, i) = "3": yx(j, i + 1) = "3"
     Case Is = "06", "07", "08", "09"
      yx(j, i) = "1"
     Case Is = "00"
      yx(j, i) = "0"
    End Select
   End If
   sj1 = sj1 & yx(j, i)
  Next i
 Next j
 Print "数据方式1 "; sj1
End Sub

 
                                   自然牛2009年2月18日
未完待续
阅读(689) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~