How to create a mazepart 1 of 2.docx
- 文档编号:1802657
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:25
- 大小:28.63KB
How to create a mazepart 1 of 2.docx
《How to create a mazepart 1 of 2.docx》由会员分享,可在线阅读,更多相关《How to create a mazepart 1 of 2.docx(25页珍藏版)》请在冰点文库上搜索。
Howtocreateamazepart1of2
Howtocreateamaze:
part1of2
Howtocreateamaze:
part2of2
Author:
DanijelKorzinek
I.Randommazegenerator
Firstletmeexplaintheprocedurethisprogramuses:
∙firstitinitializesandreadstheappropriatearguments(sizeofthemaze)
∙itcreatessomegraphicstuffandthemainmazearray.Italsocreatestwo“coord”objectscalledbeginningandend(theyarenotimportantforthisfirstprogram,butarerequiredforthegame).
∙thenitstartsthemainalgorithm
∙afterthealgorithmfinishedit’sworkitrunsthedraw_maze()procedurethattranslatestheseriesofnumbersintoapictureofthemaze.
∙finallythemazeisshowedonscreenandtheprogramwaitsfor‘esc’tobepressed.
∙afterthe‘esc’beingpressedtheprogramde-initializes,meaningitclearsallthegraphicstuffanddeletesthemaze(freesthememory)
Thedrawingprocedureworkslikethis:
∙itscansthemazearrayandputsacoloredsquareforeachnumberinthatarray(forexample:
yellowforzero[floor],grayforone[wall]).Eventuallyyoucanaddmorenumbersandmorecolors(thiswillbeusefulforthemazesolvingalgorithmlater)
∙optionallyyoucanalsoaddanothersmallersquarethatwillbedrawnonthepositiongivenasanargumentofthefunction(thisisusefulfordeterminingthepositionoftheplayerinthemazegame;I’llexplainitlater)
Nowforthealgorithm:
∙themainalgorithmstartsbycleaningthemazearray(fromallthetrashitmaycontain).Italsodrawstheouterwalls.
∙nextitsearchestherandomstartandgoalpositions.Theyareleveledtohaveequaloddsontheirrandomness,butcanonlybeplacedoncoordinatesthatconsistofoddnumbers(I’llexplainthislater).
∙nowtherealalgorithmstarts.Firstitfindsarandomlegalmoveandmakesit(movesthepositioncoordinatetothatplace,setsthecelltofloorandsetsthewallsbehindthatcell)
∙thenitenterstheloopwhichitrepeatsuntilthecountertellshimhefilledthewholemap(thecounterisalwaysright)
∙itfindsthenextlegalrandommoveandifsuchexistsherepeatsthewholeprocedure(movepos.,setfloor,setwalls)
∙ifnolegalmovefounditmakesabackstepandkeepstracingbackuntilitfindsanemptyspacetwocellsawayfromtheoneheiscurrentlypointingto(inotherwords,anemptycelloverthewall)
∙ifhefindssuchacellhemovesthepositioncoordonthewallseparatinghimfromthatcellandturnsittoafloor.Thenormalloopiscontinued.
Explainingthecode:
Toexplainthefirstpartofthetutorial,wearegoingtousethefilecalledmazefull.cpp(thiswasmyfinalresultofseveralattemptstocreatetheprogram).Firstlet’sexplaintheincludedfiles(usingthe#includedirective):
∙iostream.h-thisistheC++versionofstdio.h.Inmyprogram,itisusedtoprinterrormessages(forfurtherdetailschecksome‘iostream’andfileI/Otutorials).NOTE:
ifIweretorunthisprogramasitis(withonlythebasicarguments)theseerrormessageswouldbeprintedoutonscreen.Iuseasimplestreamre-directionbyadding“>>log.txt”aftertheprogramname,makingitprintoutitsmessagestoatextfile.Idon’tknowwheredoesthismethodoriginatefrom,butIsawitworkonLinuxsoItriedinDOSanditalsoworked…
∙allegro.h-thisistheheaderofthegraphicslibraryIintendtouseduringthistutorial.Itwillbeusedontwooccasionsinthefirstprogram:
uponinitializationofthegraphicsandinthedrawingprocedurecalleddraw_maze()…Ifyoure-implementthesetwopartsofthecodetoanotherlibrary,youmaycomment-out(orevendelete)boththisdirectiveandpartsofthecodeyou’vereplaced.
∙stdlib.h-neededforrandomnumbergeneratorandintegertoASCIIandviceversaconversions(srandom(),random(),itoa(),atoi()).
∙time.h-alsoneededforrandomnumbers.
Alsoonthebeginningofthefileweseethedirectivesthatdefinethemaximumscreenresolution(ifyouareusingWin2korWinNtandcompilethisinAllegro,changethisto320×200soAllegrocouldchosestandardVGAdrivers,asWin2kandWinNtdon’tsupportVesa).Wealsoseedefinitionsof“floor”and“wall”whichmakesourprogrameasiertoread(thechararrayisfilledonlywithnumbers,1and0).Thefirstpartofthefilelookslikethis:
#include
#include
#include
#include
//resolution:
#definemaxx1024
#definemaxy768
#definewall1//intvalueofwallonmap
#definefloor0//intvalueofflooronmap
Thenextpartoftheprogramisadefinitionofaclasscalled“coord”.Forthosethatdon’tknow,aclassisaspecialstructurethatletsusdefineavariablethatholdsseveralothervariablesandfunctionsthatchangethesevariables(socalled“member”variablesandfunctions).FordetaileddescriptionofclassesIrecommendreadingatutorial,becauseclassesaresomethingeveryintermediateprogrammershouldknowinsideout.Toaccessthesevariables-inside-variableswewillfirsthavetocreatetheso-calledobject(definedasimplevariable,butusingthatclassasthetype;that’swhythattypeofprogrammingiscalledObjectOrientedprogramming)andaccessitsmembersbywritingthemafteradot,whichisafterthenameoftheobject.Likeso:
coordCoordinateA;//defininganobject
CoordinateA.x=0;//accesingthemembervariable"x"
CoordinateA.ret(0,-1);//accesingthememberfunction"ret()"
Thecoordinateclassisveryuseful,causenotonlydoesitholdtwodifferentcoordinates(whichpreventsusfordefininguglyvariableslike:
intpos_x,pos_y),butitalsoprovidesacoupleofveryusefulfunctionsforconversionandautomationofthevaluesofthosevariables.Thismakesourcodemorelogicalandmuchmorereadable.Thefulldefinitionoftheclassisasfollows:
//Coordinateclass.Hasxandycoordinatesandsomehelperfunctions..
classcoord
{
public:
intx,
y;
coord():
x(0),y(0){}//emptyconstructor(usedtoshowaNULLcoordinate)
coord(inta,intb):
x(a),y(b){}//integerconstructor
coord(constcoord&c)//copyconstructor
{
x=c.x;
y=c.y;
}
~coord(){}//emptydestructor
voidsetW(char*maze,intn)//setsacoordinagivenmazetowall
{maze[x*n+y]=wall;}
voidsetF(char*maze,intn)//setsacoordinagivenmazetofloor
{maze[x*n+y]=floor;}
coordret(intx_of,inty_of)//returnsacoordinateaftervectorchange
{returncoord(x+x_of,y+y_of);}
intm_pos(intn)//returnstecoord.asanindexinthemaze
{returnx*n+y;}
operatorint()//intconverter(usedtodetermineNULLcoordinates)
{returnint(x+y);}
};
//Somesmallhelperfunctions:
intoperator!
=(coorda,coordb)//unequaloperatorforcoordiates
{
return(a.x==b.x&&a.y==b.y)?
0:
1;
}
intoperator==(coorda,coordb)//equaloperatorforcoordinates
{
return(a.x==b.x&&a.y==b.y)?
1:
0;
}
Ihaveaddedthefirsttwohelperfunctionsonpurpose,becausetheyareoperatorsthatoperateontheobjectoftype“coord”(whichisourclass).Letmeexplaintheclassnow.Aswecanseeitscontentsareprettystraightforward.Allthemembersarepublic,whichmeansthattheycanbeaccessedfromanypartoftheprogramwithnolimitations.
Themembersare:
twointegervariables(xandycoordinates)andacoupleoffunctionsthatdealwitthosevariables.Firstthreefunctionshavenoreturntypeandcarrythenameoftheclassitself.Theyareso-calledconstructors.Eachtimeanobject(variable)oftype“coord”iscreatedacorrespondingconstructorisrun.Theyareusuallyusedtoinitializevalues,butarealsousedfortype-casting(ifwewantforexample,tochangeavalueoftwointegerstoa“coord”wecanjustruncoord(10,20)whichwillcreatea“coord”objectwithoutusingavariable).Iwillmentiontheuseofconstructorswhenitappearsintheprogram.Also,itisimportanttonoticethattherearethreeconstructors.Wecandothatduetofunctionoverload(inotherwords,youcandefineanyvalueoffunctionswiththesamenameaslongastheyhavedifferentarguments).
Thefirstconstructorcreatesanemptycoordinate,whichisusefulforusintwocases.First,whenwedeclareanobjectandnotbotherinitializingitwithanyvalues(likecoorda,b,temp;andsoon).Thesecondtimeweusethisconstructoriswhenwewanttoinformourprogramthatacertaincoordinateisnotvalid.Becausethecellatcoordinate0,0isalwayssettowallatthebeginningoftheprogram(beforethestartofthealgorithm)andisneveraccessedafterthat,weareallowedtousethatvalueasatypeofNULLcoordinate.AnotherthingwecandoisaddingthetwovaluesofacoordinateandiftheyequalzerothenwearesurethatwearedealingwithourNULLcoordinate(noothercoordinate,whensummedgiveszero).Asyoumayhavenoticed,thelastmemberfunctionofourclassisanintegertypeconverter(aspecialfunctionthatconvertsacoordinatetoanint.Toactivateitallwehavetodoiswriteint(coord(20,30))or(int)coord(20,30)).Thesetwofunctionsputtogethergiveusaneasywaytodealwithinvalidvalues.Forexample,ifwegiveourprogramtofindthenextrandommoveandthereisnosuchmove,allthatsuchafunctionhastodoisreturnacoord()(emptycoordinate)andallwehavetodoischeckwhetherthe(int)r(ifristhereturnedcoordvalueofthefunction)isnon-equaltozero.Ifit’strue,thenwecanusethatcoordinate.Ifnotwehavetofindanotherwayaround.Thisisjustasimpletrick.Ofcoursethereareotherwaystodothat,butthisseemsgoodenoughtome(bothincodereadabilityandprogramefficiency).
Thesecondconstructortakestwointegersasarguments.Itisusedwhenwewanttocreateanobjectandinitializeitwithsomesensiblevalues(likecoorda(10,10),b(100,9);andsoon).Itcanalsobeusedtosendvaluesdirectlyasobjec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- How to create mazepart of