admin 管理员组

文章数量: 1086019


2024年4月30日发(作者:手机淘宝一返回就回到顶部)

|¨ ≥ j 

 r

— 

维普资讯

蓼cram-麓黼浆纂 

: 

呦《I悖 r 殴 

一 

i 

? ㈣ 

图形图像处理与游 

GRA llCS& AM PR《 )(j}乏A 

然 毫蠢棼 § 黪  

用VB开发“穿越彩色危险地带”益智游戏 

袁晓虎 

摘要给出概念游戏的定义。并举例说明。 

游戏概念,概念游戏,VB程序 关键词

概念游戏 

玩过游戏的人都有这样的体会,如果一个游戏的想法不吸 

(1)每次初始一个出发点和一个目标点,用“ ’号标 

记,并给出出发点和其正上方三个格的提示(如果不提示第一 

步完全靠运气,没有意义。如果其正上方三个格中没有颜色提 

示的是陷阱) 引人,你不会去玩的。而且相同构思的游戏,玩过一款后,就 

不会对另一款同类游戏感兴趣。所以游戏的构思很重要,应该 

作为游戏开发首先考虑的问题,举例来说,对于战略游戏,其 

想法构思不外乎资源、建设、造兵、开战,不同的只是实现这 

些想法的方法而已。所以实现方法可以千变万化,可构思只有 

(2)每次只能走一个格,不能跳格!即使你想后退,也 

得一格一格地退! 

(3)鼠标左键走格,右键进行标记! (右键标记没有实 

际意义,即使格上标记了,仍可以走那一格!不过标记可以帮 

个,我们通常称为构思概念! 

助你记忆,便于分析。) 

(4)每一步都会有提示(像扫雷一样),本程序使用颜 

色给出形象直观的提示。你可以根据窗体左侧的颜色进行判 

断。如亮绿色表示周围(周围指的是与其相邻的8个格)没有 

陷阱,深绿色表示周围有一个陷阱,深黄色表示周围有两个陷 

阱等。 

如果有了某一个游戏概念,就可以通过使用简单的程序使 

其实现,将这一概念表现出来,通常这种概念游戏可以作为构 

思的初级给出,让人了解,然后让有想法的人通过其他方法来 

实现、丰富和强化,使其成为真正的游戏。 

二、设计思路 

大家对扫雷游戏一定不陌生吧,其实这就是一种很好的初 

级概念,我们可以根据这一概念,做出另一款游戏,同样是方 

格地图,地图上随机放置地雷,不同的是游戏的方法,扫雷是 

将所有地雷找出,而我这里初始一个出发点和一个目标点,让 

(5)因为游戏有难度,如果总是觉得思考的时间不够,可 

以作弊,单击窗体上“永恒时间”,就可以不考虑时间的限 

制! 

三、关于游戏 

这款益智游戏便是概念游戏的一个例子,同样是扫雷的概 

念,但实现的方法不同,当然这个程序可以加以强化,可以像 

扫雷那样设定三个级别,可以加上每走一步的走步声音,使其 

更加生动和形象,也可以加上背景音乐等等。如果有兴趣,可 

其由出发点开始,穿过雷场, 到达目标点,能到就算取胜。制 

定一定的游戏规则并给出有趣的游戏背景。这是一款益智游 

戏,下面就是这款游戏的内容。 

1.游戏背景 ‘ 

为了完成任务,你现在需要穿过一片危险地带(布满了陷 

以加许多东西!就像开始所讲的那样:这种概念游戏可以作为 

阱),当你踏上这片土地的第一步,危险就开始笼罩着你,你 

的每一步都危机四伏,你需要仔细留意你的脚下,大地会通过 

构思的初级给出,让人了解,然后让有想法的人通过其他方法 

来实现、丰富和强化,使其成为真正的游戏。 

变化颜色来告诉你,你距离危险的程度,现在你能做的只有考 

虑,仔细考虑,这里没有侥幸,完全依靠你的大脑,时间在一 

分一秒地过去,你必须快点,否则你的任务在也将无法完成。 

2.游戏规则 

四、程序实现 

程序中通过数组来标记格子,并用数组的取值来标记陷阱 

的有无,使用颜色来给出提示。具体的请看程序上的注释。 

葡 嚣 与 

维普资讯

照攀 馨懋静藤 

形图像处 与游戏 程 

RA S&(iila l l 妖《)( RAM 

程序在Windows系列下均通过。游戏经人测试可行。过关 

画面如下图。 

初始陷阱数据标志位置 

Dim x

trap As Integer,ytrap As Integer 

_

_

过关画面 

程序如下: 

Dima《一5To20,一5To20)AsDouble 标记格子 

DimhAsInteger.mAsInteger.SAsInteger 

DimD

_

timeAsSingle 

Dim Fore_x As Integer,Fore

_

yAs Integer 标记上一步 

Dim S_P As Integer 

Dim D PAs lnteger 

Private Sub Form Load《) 

给出提示颜色的定义 

Picture2《0)BackColor=QBColor《1 0) 

Picture2《1).BackColor=QBColor《3) 

Picture2《2).BackColor QBColor《6) 

Picture2《3).BackColor;QBColor《14) 

Picture2f4).BackColor=QBCotorf4) 

Picture2《5).BackColor=QBCotor《5) 

Picture2《6).BackColor QBColor《13) 

Picture2《7).BackCotor=QBColor《12) 

Command2.Enabled=False 

EndSub 

Private Sub Form Resize《) 

Picture1.Scale《0,18)一《18,0) 初始地图范围 

EndSub 

Private Sub Command 1_j=lick《) 

初始场景 

Picture1 Enabled=True 

Picture1.CIs 

画地图格子 

D{m iAs Integer 

Fori=1 TO 17 

Picture1.Line《1,i)一《1 7.i),RGB《0.0,1 91) 

Picture1.Line《i,1)一《l,1 7).RGB《 0.0,191) 

Nexti 

Dfm f0 As Integer.j0 As Integer 

Dim_1 Aslnteger 

Dim ii As Integer 

Dim;2 As Integer,j2 As Integer 

Dim sum As Integer 

Do 

i0=0 

sum=0 

Fori0=一5To20 

Fori0=一5To20 

a(i0,i0)=0 

Nextj0 

Nexti0 

用1表示陷阱在这个位置,初始45个陷阱 

Forii 1 TO50 

Randomize:x_trap=Rnd 15+1 

Randomize:y_trap=Rnd¥15+1 

a《x__trap y_trap)=1 

Nextii 

Fori2=1 T0 16 

Forl2=1 TO16 

sum=¥um+a《i2,I2) 

Nextj2 

Nexti2 

LoopUntilsum>=45 

初始起点 

DO 

Randomize:S

_

P;Rnd, 16+1 

LoopUntila《S_P,1)<>1 AndS_P>0AndS_p<1 7 

Fore

_

x;S_P:Fore

_

y=1 

CallDegree__dangerous(S_P.1) 给出起点位置的提示 

CallShow

_

trail《S_P 1) 

Call Line_Redraw 

初始终点 

Do 

Randomize:D_P=Rnd¥16+1 

LoopUntila《D_f),16)<>1 AndD_P>0AndD-P<1 7 

CallShow

_

trail《D—P,16) 

Call Line_Redraw 

初始时间 

h 0:m=1 5:S=0 

Picture1.Enabled=False 

对按钮作用 

Command 1.Enabled;False 

Command2.Enabled=True 

EndSub 

Private Sub Command2

_

Click《) 

开始游戏 

D ime=h 3600+m%60+S+Timer 

Time门.Enabled=True 

Timer1,Interval;1 000 

Picture1.Enabled=True 

Command2.Enabled False 

l _lll_ 

获爝黪~嚣麓密 

j : 

l| 

H 

维普资讯

熊蛰鬻 

 }

圈形图像处理 

与游戏编程  。

GRAp}lll 菠(jA 

EndSub 

Private Sub Timer1 J{mer《) 

记录时间 

Dimh1 AsInteger。ml AsSingle。sl AsInteger 

Dim R

_

time As Single 

R 

_

time D time 

一Timer

h1=R time\3600 

ml=(R_timeMod3600l\60 

s1 R time Mod60 

Text1.Text; &FOrmat《h1. OO )& : &FOrn1at《m1, 

OO )& : &Form宕t《s1, 00 ) 

判断是否到时间 

lfh1= 00 Andm1= 00 Andsl= 00 Then 

MsgBox( youarefailing! ) 

Timer1.Enabled;False 

Text1 Text=… 

Cal lShowyap 

Call Line Redraw 

Picture1.Enabled=False 

Command1.Enabled True 

EndIf 

EndSub 

Private Sub picture1 MouseDown(Button As lnteger,Shift As 

lnteger,xAsSingle.yAsSingle) 

对鼠标左右键的判断 

IfButton 1 Then 

是否跳步的判断 

…nt《x)>=1 AndInt《x)<=1 6AndInt《Y)> 1 AndInt《Y) 

< 16Then 

IfAbs《Int《x)一Fore_x)<2AndAbs《l nt《Y)一Fore3/)<2Then 

取胜与否的判断 

IfInt《x)=D-PAndInt《Y)=16Then 

MsgBox《 congratulation!you are successful I ) 

Picture1.Enabled=False 

Timer1.Enabled=False 

Text1 Text 

Picture1.CIs 

Command 1.Enabled=True 

Command2.Enabled False 

ExitSub 

EndIf 

没有走到陷阱上的判断 

Ifa《Int《x),Int《Y))=0Then 

CallDegree_dangerous《l九t《x),Int《Y)) 

FOrm1.FillStyle=0 

Form1 FillColor;QBColor(¨ 

Picture1.Circle《Int《x)+0.5,Int《Y)+0,5)。0.2 

Fore x=Int《x):Fore_y=Int(Y) 

Call Une Redraw 

EndIf 

走到陷阱上的判断 

Ifa《Int《x),Int《Y))=1 Then 

MsgBox《 game over! ) 

Call Show

_

Map 

÷ 圬与II 

Cal lLine

_

Redraw 

Picture1.Enabled=False 

Timer1.Enabled=False 

Text1.Text ~ 

Command1.Enabled=True 

ExitSub 

EndIf 

走过的格子的判断 

lfa《lnt《x).1nt《Y))=0.1 Then 

Form1.FillStvle 0 

Form1.FillColor z QBColorl 1) 

Picture1.Circle《lnt《x)+0.5,Int《Y)+0.5),O.2 

Fore x Int《x):Fore_y Int《Y) 

Endlf 

Else 

MIsgBox( youcan notdothis! ) 

EndIf 

Endlf 

Else 

标记“×”方便判断 

Picture1.CurrentX=lnt(x)+0.3 

Picture1.CurrentY#lnt(Y)+O.7 

Picture1.Print × 

EndIf 

EndSub 

PublicSubDegree dangerous(d_xAsInteger d_yAsInteger) 

显示危险程度 

Dim symbo As Double 

symbo。《a《d 一1,d_y+1)+a《d x;d_y+1)+a《d +1, 

_

y 4-1)+jId_x一1,d_y)4-aId x,d )+eI 4-1,d_y)+ 

j《d 一1,d_y一1)+a《d .d_y一1)+a(d +1,d_y一1)) 

Call Colour Display《d .d_y.symbo) 

a《d_x.d_y) 0.1 

IfIntlsymbo)>0Then 

Else 

Call Sho Jip《d ,d_y) 

symbo=0 

Endlf 

EndSub 

显示颜色的子程序 

PublicSubColour Display《c_xAsInteger,,c_yAsInteger,.symAs 

Double) 

Dim Colour_NumberAs Integer 

SelectCase Int(sym) 

Case0 

Colour.Nlumber 10 

Case1 

Colour

_

Number=3 

Case2 

Colour_Number;6 

Cas(e3 

Colour_Number 14 

Case4 

维普资讯

Colour Number=4 

Case5 

Colour Number=5 

Case6 

Colour

_

Number=13 

Case7 

Colour Number 1 2 

Case8 

Colour Number=0 

End Select 

Picture1.Line(c x,c y)一(c_x+1.c_y+1).QBColor 

(Colour_Number).BF 

EndSub 

PublicSubSho ]ip(t_xAsInteger t_yAsInteger) 

给出提示信息 

给出所在格子和其周围8个格子的颜色提示 

#, 球 : : : : 

: 4{3 :2:。 

{ :{ ;, , 0代表当前点击格子 

:i:5¥0 1 

: 巾水, 水 

6 7 8 

术啦, ; 水乖水 }= 

1 

Dimt..xxAs Integer,t

_

yyAs Integer 

Form1.Refresh 

t_xx=t_x+1:t__yy=t

_

v 

Ift

_

xx>墨1 Andt

_

xx< 16And t_yy>=1 Andt_W<=16 

Then 

Ifa(t_xx,t_yy);0Then 

Call Degree

_

dangerous(t_xx,t_yy) 

EndIf 

EndIf 

2 

Form1.Refresh 

t_xx=t +1:t

_

yy t_y+1 

Ift_xx>=1 Andt

_

xx<=16Andt

_

yy> 

1 Andt

_

yy<= 

16Then 

Ifa(t_xx.t_yy)=0Then 

Call Degree

_

dangerous(t_xx t_yy) 

Endlf 

Endlf 

3 

FOrm1.Refresh 

_

xx=t x:t

_

yy=t_y+1 

Ift

_

xx>=1 Andt

2(x<=16Andt

_

yy> 

1 Andt

_

yy<= 

16Then 

Ifa(t_xx,t_yy)=0Then 

Cal lDegree

_

dangerous(t_xx,t

_

yy) 

EndIf 

Endlf 

4 

FOrm1.Refresh 

t_xx=t x一1:t

_

yy=t_y+1 

阁隳~溺撩黔蘖 

图形图像处理与游戏 程 

G ^ “fCS&“^ ; RO(]RAM 

Ift

_

xx> 1 And Lxx<=16Andt

_

yy> 1 And t

__

yy<=16 

Then 

Ifa(t..xx.t_yy)=0Then 

Call Degree

_

dangerous(t_xx.t ) 

EndIf 

EndIf 

5 

Form1.Refresh 

_

xx=t

_

x一1:t_yy=t

_

y 

Ift

_

xx> 1 Andt

_

xx<=16 And t

_

yy>=1 And t_yy<=16 

Then 

Ifa(t_xx.t_yy)=0Then 

Cal lDegree_dangerous(t xx,t

_

yy) 

EndIf 

EndIf 

6 

FOrm1.Refresh 

_

xx=t

_

x一1:t

_

yy t_y一1 

Ift

..

xx>=1 Andt

_

xx<=16Andt

_

yy>=1 Andt

_

yy<z 

16Then 

Ifa(t.,xx,t_yy) 0Then 

Call Degree

_

dangerous(t_xx.t_yy) 

EndIf 

EndIf 

7 

Form1.Refresh 

t..xx=t :t

_

yy=t_y一1 

Ift_xx> 1 Andt

_

xx<兰16Andt_yy>=1 Andt_yy< 

16Then 

Ifa(t_,xx,t_yy)=0Then 

Call Degree

_

dangerous(t

_

xx,t_yy) 

EndIf 

EndIf 

8 

FOrm1.Refresh 

_

xx=t

_

x+1:t_yy=t

_

y一1 

Ift

_

xx> 1 Andt_xx< 16Andt_yy>=1 AndtYY<= 

16Then 

Ifa(t xx.tWY)=0Then 

Call Degree_dangerous(t_xx,t_yy) 

EndIf 

End If 

EndSub 

失败后最示陷阱 . 

Public Sub Show_Map() 

Dim i4As Integer,j4As Integer 

Fori4=1 TO16 

Fori4=1 TO16 

Ifa(i4,j4) 1 Then 

Picture1.Line(i4,j4)一(i4+1,j4+1) QBColor(0),BF 

Else 

Picture1.Line(i4,j4)一(i4+1,j4+1),QBColor(15),BF 

EndIf 

(下转第86页) 

20

06.

r电脯-毽技

与簟

护 _- 

毋 

维普资讯

0.50000).V/8 

pingfangcha=temp; 

{0.33333.0.37500.0 33333.0.50000.0.22222. 

0.41667)//9 

} 

} 

cu rrentN=j: 

l: 

2.数字校验码程序识别 

gNumber【k】=currentN;//保存结果 

输入图像模块,预处理模块和分割字符模块与训练集样品 

库的建立一节所对应的模块函数是一样的,不再赘述。F面讲 

解根据特征码识别校验码模块功能函数。处理流程如图3所 

示 

三、其它类型校验码识别 

应该说,上面提到的校验码是比较简单的,I韭壁蔓皇 这类 

校验码虽然加_r点噪声,但去掉噪声并不难识别。如果一卟黑 

图3处理流程 

色像素上下左右四个方向没有黑色像素,则认为是噪声,计算 

图像中各个连通体面积,如果面积小于某个设定的阚值,则认 

为是噪声。图4是微软hotmail注册的校验码,用本文提到的方 

法识别出来比较困难。 

添加一个全局变量: 

intgNumber[4】://保存识别出的4个数字 

void CJUSTIFYCODEDIg::GetResult() 

f 

int k,j,t,currentN; 

for《k=0:k<4:k++)//4个字符 

{ 

if(gNumber【k1==1OO)//没处理过 

{ 

float pingfangcha 1 00; 

图4 hotmail注册校验码 

四、结论, 

本文论述了数字校验码的模式识别,并给出了核心代码, 

同时也阐述了其它类型校验码的模式识别。作者希望从纯技术 

的角度看待校验码模式识别,一些人不要用于非法用途。 

for(』=O:j<1O j++)//依次比较每个样品的特征码 

{ 

floattemp=O: 

for(t z O:t<6:t++) 

{ 

temp+ (gRatio【klIt】一gSample[j】【t】)十(gRatio 

【kl【t】一gSample【j】【t1)://依据最小距离法判断 

} 

参考文献 

1.图像模式识别——Vc++技术实现.清华大学出版社 

2.MSDN开发文档 

if(temp<pingfangcha)//找到特征值相差最小的 

{ 

(收稿日期:2006年3月28日) 

(上接第69页) 

Nexti4 

Nexti4 

Unload Form 1 

EndSub 

让时间停止 

Private Sub Label2 Click() 

EndSub 

MsgBox( 永恒时间! ) 

Timer1.Enabled=False 

Timer1.1nterval=0 

重画地图和格子 

Public Sub Line

Redraw() 

_

DIm iAs Integer 

Fori 1 TO17 

EndSub 

初始起点和终点的标记 

PublicSubShow

tra_l(s_t_xAsInteger.s_t_yAsInteger) 

Picture1.CurrentX s_j +0.4 

._

Picture1.Line(1,i)一《17,i),RGB(0,O,191) 

Picture1.Line i 1】一(i,17),RGBf0,0,191) 

Nexti 

Picture1.CurrentY;sjJ/+0.7 

Picture1.Print 

EndSub 

EndSub 

Private Sub Command3

Cliok f) 

_

(收稿日期:2006年3月26日) 

与 


本文标签: 游戏 给出 概念 校验码 模块