;;******************************************************************************** ;; SNAKE GAME Assembly Main File ;;******************************************************************************** if1 ;agar k Assembler dar gozar-e avval(Pass#1) bashe ezafe kon include RC~SM.LIB ;this ASM file is using SM.lib (includes needed macros in the current path) endif .model small .stack 128 .data ;Colors: _COLOR_BLACK EQU 0000 _COLOR_WHITE EQU 0111B _COLOR_GRAY EQU 1000B _COLOR_RED EQU 0100B _COLOR_RED_BLINK EQU 10000100B _COLOR_GREEN EQU 0010B ;Delays : _DELAY_N_NOVICE EQU 05FE0H ;Delay ziad _DELAY_N_PRO EQU 03FE0H ;normal delay _DELAY_N_EXPERT EQU 02FE0H ;Delay kam -- 02FE0H * 15.085 (micro second) GameDifficulty dw _DELAY_N_NOVICE ;Default ;_SNAKE_FACE EQU 177 ;#177 _SNAKE_BACK EQU ' ' ;Taile snake ro pak kone ba in character _MAX EQU 0FFh ;Maximum arrayehaye marboot b snake _SNAKE_FACE_UPDOWN_0 EQU 221 ;#221 ascii _SNAKE_FACE_UPDOWN_1 EQU 222 ;#222 ascii _SNAKE_FACE_LEFTRIGHT_0 EQU '-' ;219;220 ;#220 _SNAKE_FACE_LEFTRIGHT_1 EQU '_' ;219;223 ;#223 SnakeFaceLeftRight1DarMioon db 0 ;age 0 bashe _ va age 1 bashe - (baraye Display jaleb-tar) SnakeFaceUpDown1DarMioon db 0 ;age 0 bashe | va age 1 bashe #220 (baraye Display jaleb-tar) ;Keys & Coordinates : _LEFT_DIRECTION EQU 4bh ;left arrow key _RIGHT_DIRECTION EQU 4dh ;right arrow key _UP_DIRECTION EQU 48h ;up arrow key _DOWN_DIRECTION EQU 50h ;down arrow key _ONE EQU 49 ;'1' _TWO EQU 50 ;'2' _THREE EQU 51 ;'3' ; _LEFTRIGHT_DIRECTION EQU _RIGHT_DIRECTION ;rast b chap ba chap b rast farghi nemikone baraye Display -_-_-_-_ _UPDOWN_DIRECTION EQU _UP_DIRECTION ;bala b payin ba payin b bala farghi nemikone baraye Display ; _MIN_COLUMN EQU 0FFh _MIN_ROW EQU 0FFh _MAX_COLUMN EQU 80 _MAX_ROW EQU 24 ; _ZERO EQU 1 ;baraye Step-ha _PLUS EQU 2 ;ex: age XStep[si]==_NEGATIVE , YStep[si]==_ZERO bashe yani b samte bala dare mire _NEGATIVE EQU 3 ;yani XStep[si]+= -1 (--) beshe va YStep[si]+=0 _INVALID_VAL EQU 99 ;invalid value baraye bazi Arrayeha k mikham meghdareshoon ro Invalid konam ;Snake : snakeLength db ? ;SNKAE LENGTH _SNAKE_DEFAULT_LEN EQU 5 ;Default Len _SNAKE_COLOR db _COLOR_WHITE ; XPoints db _MAX dup(_INVALID_VAL) ;X-haye Snake ro negah midare YPoints db _MAX dup(_INVALID_VAL) ;Y-haye Snake ro negah midare ; XPointsStep db _MAX dup(_ZERO) ;step marboot b har khooneye Snake ro negah midare .albate X esho ; YPointsStep db _MAX dup(_PLUS) ;step marboot b har khooneye Snake ro negah midare .albate Y esho (default=_PLUS yani b samte rast) PointsDirections db _MAX dup(_RIGHT_DIRECTION) ;baraye Display -e makhsoose har kodoom LastDirection db _RIGHT_DIRECTION ;jahate ghabli ro negah midare (baraye vaghtayi k khalafe jahat bezane ro check kone) ; XChangingPoints db _MAX dup(_INVALID_VAL) ;X changingPoints -ha ro negah midare..yani noghati k bayad SnakeBody dar inja ChangeDirection bede YChangingPoints db _MAX dup(_INVALID_VAL) ;Y .... ; XChangingPointsStep db _MAX dup(_INVALID_VAL) ;Step marboot b ChangingPoint -ha ro negah midare ..yani SnakeBody dar changingPoint morede nazar b che Direction-i bayad taghire jahat bede YChangingPointsStep db _MAX dup(_INVALID_VAL) ;.... ; tailX db ? ;Snake Tail X tailY db ? ; Y ; ;Foods: XFood db _INVALID_VAL ;x food YFood db _INVALID_VAL ;y food ;_FOOD_FACE EQU '*' _MAX_FOOD_SCORE EQU 5 ;1..5 score baraye foods _FOOD_LIFE_TIME_DIV EQU 250 ;in adad bar FoodScore Div mishe va AL (kharej-ghesmat) ro dar FoodLifeTime mirize FoodScore db 0 ;scroe har food k PUT_CHAR mishe tooye in gharar migire FoodRemaind db 0 ;baghimandeye Food k hey bayad b Snake ezafe beshe (az tail-esh migire va ezafe mikone b akhare Snake) FoodLifeTime db 0 ;yani che meghdar zamani rooye safhe bashe va bad napadid beshe (baraye har food ba score bishtar kamtare- 1 nesbat-e aks dare bar FoodScore) UserScore db 0 ;user's Score UserSumScore db 0 ;Sum score of all levels (tooye LevelGameMode) blnNewFood db FALSE ;har vaght ghazaye jadid biad 1 mishe ;Walls & Levels : _WALL_FACE EQU 219 ;Ascii#219 _WALL_COLOR EQU _COLOR_GRAY _MAX_WALL EQU 90 ;maximum tedad khoonehaye Wall baraye wallX,wallY _LEVEL_1 EQU 1 _LEVEL_2 EQU 2 _LEVEL_3 EQU 3 wallCount db 0 currentLevel db 0 ;current level blnLevelPassed db FALSE ;har level k pass beshe TRUE mishe va level# k pass shode ro ham dar level gharar migire LevelOKScore db 0 ;emtiazi k dar current level bayad user begire ta pass beshe (har marhale k miad maghadire oon marhale dar CurrentVariable-ha gharar migiran) wallX db _MAX_WALL DUP (_INVALID_VAL) ;Wall Coordinates wallY db _MAX_WALL DUP (_INVALID_VAL) ; Level_Border db 67,48,68,69,68, 32,98,121,32,77 ,97,104,100,105,46 ,71,104,97,114,100 ,97,104,112,111,111, 114,36,32,32 ;Wall Level1 : Level_1_X db 0 , 1, 2, 3, 4 , 5, 6, 7, 0, 1 , 2, 3, 4, 5, 6 , 7,23,23,22,22 ,21,21,20,20,19 ,19,18,18,17,17 Level_1_Y db 19,19,19,20,20 ,20,19,19,20,20 ,20,21,21,21,20 ,20,50,49,49,48 ,49,48,49,48,48 ,49,48,49,48,49 Level_1_Wall_Count db 30 _Level_1_OKScore EQU 10 ;emtiaz baraye oboor az Level1 ;Wall Level2 : Level_2_X db 23,22,21,20,20 ,10,11,12,13,14 ,10,11,12,13,14 ,10,11,12,13,14 ,10,11,12,13,14 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 , 4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,10,10,10,10,10 ,10,10,10,10,10 ,14,14,14,14,14 ,14,14,14,14,14 Level_2_Y db 20,20,20,20,21 ,35,35,35,35,35 ,36,36,36,36,36 ,37,37,37,37,37 ,38,38,38,38,38 ,75,75,75,75,75 ,76,76,76,76,76 ,77,77,77,77,77 ,78,78,78,78,78 ,79,79,79,79,79 ,34,33,32,31,30 ,29,28,27,26,25 ,39,40,41,42,43 ,44,45,46,47,48 Level_2_Wall_Count db 70 _Level_2_OKScore EQU 20 ;emtiaz baraye oboor az Level2 ;Wall Level3 : Level_3_X db 0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 , 4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14 ,15,16,17,18,19 ,10,11,12,13,14 ,10,11,12,13,14 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14 ,15,16,17,18,19 þ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3 ,4 ,0 ,1 ,2 ,3, 4 ,0 ,1 ,2 ,3 ,4 Level_3_Y db 75,75,75,75,75 ,76,76,76,76,76 ,77,77,77,77,77 ,78,78,78,78,78 ,79,79,79,79,79 ,21,21,21,21,21 ,21,21,21,21,21 ,21,21,21,21,21 ,27,27,27,27,27 ,52,52,52,52,52 ,58,58,58,58,58 ,58,58,58,58,58 ,58,58,58,58,58 ,37,37,37,37,37 ,38,38,38,38,38 ,39,39,39,39,39 ,40,40,40,40,40 ,41,41,41,41,41 Level_3_Wall_Count db 90 _Level_3_OKScore EQU 30 ;emtiaz baraye oboor az Level3 ;The Others: FALSE EQU 0 TRUE EQU 1 blnLevelGame db FALSE ;GameMode b soorat-e Level-i ya Normal (ta vaghti k besooze) cnt1 db 0 cnt2 db 0 cnt3 db 0 pressedKey db 4DH ;har kelid k feshar dade beshe codesh dar in gharar migire -default 2 right blnLoose db FALSE ;agar k b khodesh ya wall bekhore true blnPlayAgain db FALSE Temp1 db ? Temp2 db ? ; ;strings : msgGameModeSelect db "Select Game Mode : $" msgGameModeNormal db "1. Normal (while u loose)$" msgGameModeLevel db "2. Level (3 levels)$" msgGameModeDiff db "Select game difficulty : $" msgGameModeDiffNovice db "1. Novice $" msgGameModeDiffPro db "2. Professional $" msgGameModeDiffExpert db "3. Expert $" msgPressAnyKey db "press any key...$" msgLoose db "::::::Game Over:::::$" msgLevel1Completed db "Level 1 Completed.$" msgLevel2Completed db "Level 2 Completed.$" msgLevel3Completed db "Level 3 Completed.$" msgWinner db "(:*****U:WIN:THE:GAME*****:)$" msgYourScore db "Your Score : $" msgPlayAgain db "Do u want 2 play again? (y/n) : $" ;====BEGIN OF C0DE :==================================================================================================================================== .code MAIN proc far mov ax, @data mov ds, ax ;--------- _MainSelectGameMode: call Select_Game_Mode ;Normal game || Level game? ... Beginner || Pro || Expert? call Clr_Scr cmp blnLevelGame,TRUE ;agar k : je _LevelGame ;Level bashe JMP _LevelGame call Normal_Game ;age NormalGame ro entekhab kone : jmp _MainLoop ;az in 2 khat bepar _LevelGame: mov bl, _LEVEL_1 ;Proc parameter call Goto_Level_bl ;Level morede nazar ro misaze (level 1) _MainLoop: call Display_Snake ;namayesh SnakeBody - har ja k hastesh -faghat karesh namayesh XPoints ,YPoints hastesh dec foodLifeTime ;bayad kam beshe..vaghti 0 beshe az rooye safhe pak beshe cmp foodLifeTime , 0 ;age 0 hast ya na : jne _MainNewFoodOrNot ;No > JMP _MainNewFoodOrNot - az in 3 khat zir bepar ... call Hide_Last_Food ;Yes> food ro hide kon va... call Make_Random_Point ;1 food jadid besaz... jmp _MainNoNewFood ;hala continue kon - az in 4 khat zir bepar _MainNewFoodOrNot: ;hanooz foodLifeTime 0 nashode va hala check mikone bebine Snake Food ro khorde ya na : cmp blnNewFood , 0 ;age 0 bashe yani NewFood nist...yani food khorde shode..pas bayad 1 food dige bezare jne _MainNoNewFood ;agar 1 bashe > agar k hanooz food hast dige food nazar call Make_Random_Point ;age Food jadid nabashe (khorde bashe) bayad besaze _MainNoNewFood: DO_DELAY GameDifficulty ;delay b andazeye GameDifficulty ;check for any keyPressed : CHECK_KEY_PRESSED ;agar k har kelidi feshar dade shode bashe ok => code scan kelid ro dar pressedKey mizare va sub Add_New_Changing_Point ro fara mikhoone ta ;check kone avval bebine kelid VALID zade shode va agar ok bood SnakeHead mishe 1 ChangingDirectionPoint...SnakeHead ro b List ChangingPoints ezafe mikone ;----------temp Label----------- mov cl,FALSE ;1 temp label...:D.. _MainSelectGameModeTmp0: ; cmp cl,TRUE ; je _MainSelectGameMode ; ;----------/tempLabel/---------- _MainSkip1: call Move_Snake ;move snake body...XPoints[si]+=XPointsStep[si] ,YPoints[si]+=YPointsStep[si] ;;albate mohemtarin Sub hamin hastesh...karaye dige ham mikone cmp blnLoose, TRUE ;bad az SnakeMoving age k SnakeBody b khodesh khorde bashe va ya b Wall khorde bashe blnLoose ro TRUE mikone va inja check mishe agar TRUE bashe : je _MainLoose ;agar TRUE bashe GAME~OVER ;agar k GameMode Level nabashe bayad Normal edame bede : cmp blnLevelGame, TRUE ;agar k noe bazi Level-i bashe bayad level-ha ro test kone vagarna jne _MainLoop ;bazi ro Normal edame bede - az in chand khatte payin (baraye check kardane Level-ha begzar) ;agar k 1 Level tamoom shode bashe : cmp blnLevelPassed, TRUE ;agar k Level tamoom shode jne _MainLoop ;NO > edameye bazi mov al, currentLevel ;YES (1 level tamoom shode bashe ) > current level to al _MainLevelPassed1: ;agar Level 1 pass shode bashe bayad b Level 2 bere cmp al, _LEVEL_1 jne _MainLevelPassed2 ;goto the next level (level2) : mov bl, _LEVEL_2 ;sub parameter (level 2) call Goto_Level_bl ;Goto Level 2 jmp _MainLoop ;edameye bazi _MainLevelPassed2: ;agar k Level 2 pass shode bashe bayad b Level 3 bere cmp al, _LEVEL_2 jne _MainLevelPassed3 ;goto the next level (level3) : mov bl, _LEVEL_3 ;sub parameter (level 3) call Goto_Level_bl ;Goto Level 3 jmp _MainLoop ;edameye bazi _MainLevelPassed3: ;ok game finished... :) WINNER (: **there's no next level..************************ call U_Win ;call U_WIN jmp _MainStopGame ;bazi ro tamoom kon ;;--LOOSE :--------------- _MainLoose: ;age blnLoose ==TRUE beshe ..mipare b in label call Clr_Scr SHOW_MSG msgLoose,1,1 ; ): LOOOS :( call wait_4_Any_Key ;;--EXIT THE GAME :------ _MainStopGame: call Clr_Scr call show_Score ;show user score (age leveli bashe userSumScore else userScore) call wait_4_Any_Key ;wanna play again ? call wait_4_Any_Key call wanna_Play_Again ;question from user ...wants to play agian? cmp blnPlayAgain,TRUE jne _MainExit ;NO > Exit the game mov cl,TRUE ;bayad bere b SelectGameMode Label amma chon rahesh doore az in label komak migiram :D jmp _MainSelectGameModeTmp0 ; _MainExit: EXIT ;ret2os Main endp ;--End of MAIN--------------------------------------------------------------------------------------------------------- ;====================================================================================================== ;====================================================================================================== ;Move_Snake( Parameter[s]: NULL) ReturnValue: NULL ;Snake ro harkat mide..har XPoint && YPoint ro ba step marboot b khodesh (b tore movazi dar arrayehaye XPointsStep,YPointsStep gharar daran) ;+ mikone va dar XPoints,YPoints gharar mide ta injoori Snake harkat kone ;albate ghablesh miad va check mikone har XPoint,YPoint ro agar k reside bashan b 1 noghteye ChangingDirectionPoint dar natije... ;step marboot b oon noghte ro dar step current gharar mide ;bad az harkat tamame khooneha, check mikone k b khodesh nakhorde bashe va ya b Walls nakhorde bashe ;va hamintor agar k b Foood reside bashe oono noosh-e jan mikone va roshd mikone ;va agar k userScore b emtiaze morede niaz baraye Current Level reside bashe blnLevelPassed=TRUE mizare ta level tamoom beshe ;... ;====================================================================================================== Move_Snake proc near PUSH_ALL ;----tail jadid ro dar tailX,tailY mirize : mov al,snakeLength mov ah,0 dec ax mov ah,0 mov si,ax mov al,XPoints[si] mov ah,YPoints[si] mov tailX , al mov tailY , ah ;/ mov si,0 mov al,snakeLength ;b andazeye snakeLength mov cnt2,al ;b andazeye snakeLength mov bx,0 ;reset bx _MovLoop: mov al,XPoints[si] ;next X mov ah,YPoints[si] ;next Y ;//////////////FINDING 1 changingDirectionPoint in the List : FIND_IN_CHANGING_POINTS al,ah ;agar k Point Current reside b 1 noghteyi k bayad taghire jahat bede? cmp cl,1 ;agar peida kone cl ro ==1 mizare jne _NewStep ;NO > agar k peida nakone bikhial beshe..bayad hamoon step ghablish ro hefz kone va ba oon + beshe ;----changing direction (step-hashoon o taghir bede...step-haye marboot b oon ChangingDirectionPoint ro dar Step-haye current bezar) : ;new X: mov al,XChangingPointsStep[di] ;new Step X mov XPointsStep[si],al ;new Y: mov al,YChangingPointsStep[di] ;new Step Y mov YPointsStep[si],al ;/ ;---hala agar k noghteye akhare Snake hastesh bayad ChangingPoint ro az listesh pak konam (chonke tamame Snake az oon noghte gozashtan): mov al,snakeLength mov ah,00 dec ax cmp si, ax ;snakeLength-1 jne _NewStep ;NO > deletesh nakon ;DELETE_CHANGING_POINT_BECAUSE_ALL_CROSSED_IT ...tamame noghat azash gozashtan=>bayad pak beshe mov XChangingPoints[di], _INVALID_VAL mov YChangingPoints[di], _INVALID_VAL ;/ _NewStep: ;------baraye tayine Direction (LEFT2RIGHT || UP2DOWN) baraye Display : mov al,XPointsStep[si] mov ah,YPointsStep[si] cmp al, _NEGATIVE jne _DirectionUp2Down01 mov PointsDirections[si],_UPDOWN_DIRECTION jmp _MakeNewStep _DirectionUp2Down01: cmp al, _PLUS jne _DirectionLeft2Right mov PointsDirections[si],_UPDOWN_DIRECTION jmp _MakeNewStep _DirectionLeft2Right: cmp ah, _NEGATIVE jne _DirectionLeft2Right01 mov PointsDirections[si],_LEFTRIGHT_DIRECTION jmp _MakeNewStep _DirectionLeft2Right01: cmp ah, _PLUS ;dar har soorat 1 jahat ro peida mikone jne _MakeNewStep mov PointsDirections[si],_LEFTRIGHT_DIRECTION jmp _MakeNewStep ;-----Temp Label baraye Jump b _MovLoop mov cx,0 _TempLbl01: cmp cx,1 je _TempLbl02;_MovLoop ;/TempLabel ;---------har x,y ro ba Step khodesh jam mikone va mizare too khodesh (momkene dar chand khatte bala current step esh taghir karde bashe): ; ...dar har soorat in ghesmat faghat miad va XPoints+= XPointsStep _MakeNewStep: mov al,XPoints[si] ;x mov bl,XPointsStep[si] ;----new X : mov bh,_NEGATIVE ;agar k az balaye safhe bezane biroon cmp bl,bh ;YES > agar k X jadid beshe -1 bayad =23 bezaramesh ta az payin dar biad jne _over00 cmp al,0 jne _Norm00 mov al,_MAX_ROW-1 jmp _movSkip00 _Norm00: dec al ;x-- jmp _movSkip00 _over00: mov bh,_PLUS cmp bl,bh ;agar k az payine safhe bezane biroon jne _movSkip00 cmp al,_MAX_ROW jne _Norm01 mov al,0 ;YES > agar k X jadid beshe 24 bayad az balaye safhe dar biad jmp _movSkip00 _Norm01: inc al ;x++ _movSkip00: mov XPoints[si],al ;X jadid (ya -- || ++ || 0 ro bezar too khodesh) ;/newX ;---new Y: mov al,YPoints[si] ;y mov bl,YPointsStep[si] mov bh,_NEGATIVE cmp bl,bh jne _over001 cmp al,0 jne _Norm02 mov al,79 jmp _movSkip01 _Norm02: dec al ;y-- jmp _movSkip01 _over001: mov bh,_PLUS cmp bl,bh jne _movSkip01 cmp al,_MAX_COLUMN-1 jne _Norm03 mov al,0 jmp _movSkip01 _Norm03: inc al ;y++ _movSkip01: mov YPoints[si],al ;Y jadid (ya -- || ++ || 0 ro bezar too khodesh) ;/new Y inc si mov cx,1 dec cnt2 jnz _TempLbl01;_MovLoop b andazeye Snake bayad tamame khoonehasho Move bede ;---hala agar k Head Snake tooye 1ki az khoonehaye khodesh bashe yani LOOSE: mov al,XPoints[0] ;Snake Head X mov ah,YPoints[0] ;Snake Head Y mov si,1 ;az khooneye 2vom bayad harkat konam va har ja k X,Y ba Head barabar bood yani LOOSE mov cl,snakeLength ;b andazeye SnakeLength 1ki kamtar-chon avvalish Head hast mov ch,0 dec cx _movCheckLooseBodyAgain: cmp XPoints[si],al jne _movChkLooseBodyResumeNext cmp YPoints[si],ah jne _movChkLooseBodyResumeNext ;agar k peida shod mov blnLoose , 1 jmp _movCheckLooseWall _movChkLooseBodyResumeNext: inc si LOOP _movCheckLooseBodyAgain ;/ ;****************WALL Checking : _movCheckLooseWall: cmp blnLevelGame , TRUE ;agar k bazi Normla bashe k in ghesmat ro rad kon jne _movFood ;agar k bazi b soorat-e Normal hast in tike ro rad sho ;---hala agar k Head Snake tooye 1ki az khoonehaye WALL bashe yani LOOSE: mov al,XPoints[0] ;Snake Head X mov ah,YPoints[0] ;Snake Head Y mov si, 0 ;az khooneye 2vom bayad harkat konam va har ja k X,Y ba Head barabar bood yani LOOSE mov cl, wallCount ;b andazeye wallCount mov ch, 0 _movCheckLooseWallAgain: cmp al,WallX[si] jne _movChkLooseWallResumeNext cmp ah,WallY[si] jne _movChkLooseWallResumeNext ;agar k peida shod mov blnLoose , 1 jmp _movFood ;dige bakhte _movChkLooseWallResumeNext: inc si LOOP _movCheckLooseWallAgain ;/ ;*******/Wall checking _movFood: cmp foodRemaind,1 ;age hanooz Food hastesh k bayad b akharesh ezaef beshe : jng _movIfNewFood ;NO > agar k namoonde bayad bebine b Food jadid reside ya na dec foodRemaind ;YES > az Food moonde 1ki kam kon (haminjoori hey Teil-esh ro b Snake ezafe kon) jmp _movAddRemainingFoods ;YES > baghie Food ro ham b Snake ezafe kon(az tail-esh migire va hamoon ro mikone edameye Snake) ;***************hala agar k Head Snake resid b FOOD (XFood,YFood) : _movIfNewFood: mov al, XFood ;xfood mov ah, YFood ;yfood cmp XPoints[0],al jne _movNoFood ;NO > cmp YPoints[0],ah jne _movNoFood ;NO > ;YES ..resid b Food : ;----reside b FOOD: ;agar k peida shod ;hala b Food reside va bayad b andazeye foodScore b SnakeLen ezafe beshe : mov blnNewFood , 0 ;0 mikone ta dafeye dige dobare Random_Point bezare mov al,FoodScore mov ah,0 mov FoodRemaind,al ;/resid b food _movAddRemainingFoods: ;age hanooz Food i hast k bayad b Tail-esh ezafe beshe mov al,snakeLength ; mov ah,0 ; mov si,ax ;gozashtan-e index tail dar si inc snakeLength ; inc UserScore ;emtiaz-e user ziad beshe mov al,TailX ;tail mov ah,TailY ; ; x,y Tail ro mirizam tooye khooneye jadid : mov XPoints[si], al ;Tail-esh mishe Point jadid mov YPoints[si], ah ; ;hala bayad step jadid ro ham besazam (az rooye step tail): mov al,XPointsStep[si-1] ;step-e tail (bayad az rooye hamin step, tail-e jadid ro besazam) mov ah,YPointsStep[si-1] ; mov XPointsStep[si],al ;step-haye tail ro beriz tooye khooneye jadid mov YPointsStep[si],ah ; ;If resid b LevelOkScore : mov al,UserScore cmp al, LevelOKScore jl _movNoFood ;ok : resid b LEVELokScore : mov blnLevelPassed , true ;********/ _movNoFood: NOP POP_ALL ret Move_Snake endp ;====================================================================================================== ;====================================================================================================== ;Add_New_Changing_Point ( Parameter[s]: pressedKey=Kelide feshorde shode tavassote user) ReturnValue: NULL ;avval check mikone k khalaf-e Jahat nazade bashe..if YES then return mikone.... ;badesh check mikone ValidKeyPressed bashe then jayi k SnakeHead hastesh ro b onvane 1 ChangingPointDirection dar ;nazar migire va b hamrahe step marboot b in noghte b list ezafe mikone ... ;ta har vaght k SnakeBody(1ki az XPoints || YPoints) b in noghte residan bayad ;XPointsStep && YPointsStep oon noghte ro begiran...yani taghire jahat bedan.OK? ;====================================================================================================== Add_New_Changing_Point proc near PUSH_ALL ;----agar k jahat-e khalaf zad (dare chap mire bezane rast) bayad hichkar nakone : mov al,PressedKey mov ah,0 CMP al, _LEFT_DIRECTION ;LEFT jne _AddOver02 cmp LastDirection, _RIGHT_DIRECTION jne _AddOver02 jmp _EndMove ;age k jahat-e ghabli Right boode va alan Left zade bikhial _AddOver02: CMP al, _RIGHT_DIRECTION ;RIGHT jne _AddOver03 cmp LastDirection, _LEFT_DIRECTION jne _AddOver03 jmp _EndMove ;age k jahat-e ghabli Left boode va alan Right zade bikhial _AddOver03: CMP al, _UP_DIRECTION ;UP jne _AddOver04 cmp LastDirection, _DOWN_DIRECTION jne _AddOver04 jmp _EndMove ;age k jahat-e ghabli Down boode va alan UP zade bikhial _AddOver04: CMP al, _DOWN_DIRECTION ;DOWN jne _AddNewChangingDirection cmp LastDirection, _UP_DIRECTION jne _AddNewChangingDirection jmp _EndMove ;age k jahat-e ghabli UP boode va alan Down zade bikhial ;/ ;----Check if VALID keypressed : _AddNewChangingDirection: ;check kone bebine 1ki az 4 jahat bashe else _endMove mov al,PressedKey mov ah,0 CMP al, _LEFT_DIRECTION ;LEFT JE _AddNewChangingDirectionOK CMP al, _RIGHT_DIRECTION ;RIGHT JE _AddNewChangingDirectionOK CMP al, _UP_DIRECTION ;UP JE _AddNewChangingDirectionOK CMP al, _DOWN_DIRECTION ;DOWN JE _AddNewChangingDirectionOK jmp _endMove ;age hich kodom naboodan bikhial. ;/ ;---Add newChangingDirectionPoint 2 the list: _AddNewChangingDirectionOK: ;1ki az 4 ta jahat ro zade..hala bayad 1 NewChangingDirectionPoint bezaram tooy List mov al, XPoints[0] ;X marboot b Snake Head ;bayad noghteye marboot b head snake ro bezaram too list mov ah, YPoints[0] ;Y marboot b Snake Head ;;ta harvaght k SnakeBody b in noghte berese ChangeDirection bede ;------Find an empty cell in list 4 adding new ChaningPoint : mov si,0 _AddNewFindAgain: cmp XchangingPoints[si],99 je _FoundEmptyCell inc si jmp _AddNewFindAgain ;------/Find _FoundEmptyCell: mov XChangingPoints[si], al ;gharar dadane ChangingPoint jadid dar 1 khaneye khali list mov YChangingPoints[si], ah mov al,PressedKey mov ah,0 CMP al, _LEFT_DIRECTION ;LEFT JE _LeftDirection CMP al, _RIGHT_DIRECTION ;RIGHT JE _RightDirection CMP al, _UP_DIRECTION ;UP JE _UpDirection CMP al, _DOWN_DIRECTION ;DOWN JE _DownDirection ;---lbl Temp baraye JUMP: _AddNewLblTemp: jmp _endMove ;age hich kodom naboodan bikhial ;---lblTemp/ _LeftDirection: mov XChangingPointsStep[si] , _ZERO mov YChangingPointsStep[si] , _NEGATIVE ;b jaye (0ffh)-1 3 mizaram - b jaye 0 > 1 - b jaye 1 > 2 mov LastDirection , _LEFT_DIRECTION jmp _endMove _RightDirection: mov XChangingPointsStep[si] , _ZERO mov YChangingPointsStep[si] , _PLUS mov LastDirection , _RIGHT_DIRECTION jmp _endMove _UpDirection: mov XChangingPointsStep[si] , _NEGATIVE mov YChangingPointsStep[si] , _ZERO mov LastDirection , _UP_DIRECTION jmp _endMove _DownDirection: mov XChangingPointsStep[si] , _PLUS mov YChangingPointsStep[si] , _ZERO mov LastDirection , _DOWN_DIRECTION jmp _endMove ;/AddNewChangingPoint2theList _endMove: POP_ALL ret Add_New_Changing_Point endp ;====================================================================================================== ;====================================================================================================== ;Display_Snake( Parameter[s]: NULL) ReturnValue: NULL ;SnakeBody ro neshoon mide..har koja k bashe.. ;b soorat-e 1darMioon va Pelleyi va neshoon mide Snake ro..SnakeFace monaseb ro entekhab mikone va dar ;AL mireze va PUT_CHAR mikone oono dar position [XPoints+si][YPoints+si] ;====================================================================================================== Display_Snake proc near PUSH_ALL mov si,0 mov al,snakeLength mov cnt2,al ;count _disLoop0: ;loop 4 drawing snakes's body Set_Pos [XPoints+si],[YPoints+si] ;set position ;***************Display bar asase Direction : mov dl , [PointsDirections+si] ;direction Point ro dar dl gharar midae baraye moghayesehaye lazem cmp dl , _LEFTRIGHT_DIRECTION jne _disDirectionUpDown ;if (chap b rast bashe :) cmp snakeFaceLeftRight1DarMioon,0 ;age chap b rast (rast b chap) hastesh : jne _disDirection00 ;NO mov snakeFaceLeftRight1DarMioon, 1 ;YES > baraye dafeye bad avazesh kon mov al, _SNAKE_FACE_LEFTRIGHT_0 ;Display marboot b oon ro bezar jmp _disPutChar _disDirection00: mov snakeFaceLeftRight1DarMioon, 0 ;baraye dafeye bad avazesh kon mov al, _SNAKE_FACE_LEFTRIGHT_1 ;character marboot b oon ro baraye PUT_CHAR bezar dar AL jmp _disPutChar ;} ;else if (bala b payin bashe) ;{ _disDirectionUpDown: cmp snakeFaceUpDown1DarMioon,0 ;age bala b payin(payin b bala) hastesh : jne _disDirection01 mov snakeFaceUpDown1DarMioon, 1 ;baraye dafeye bad avazesh kon mov al, _SNAKE_FACE_UPDOWN_0 ;Display marboot b oon ro bezar jmp _disPutChar _disDirection01: mov snakeFaceUpDown1DarMioon, 0 ;baraye dafeye bad avazesh kon mov al, _SNAKE_FACE_UPDOWN_1 ;Display marboot b oon ro bezar ;} _disPutChar: Put_Char al, _SNAKE_COLOR ;print SnakeFace with Color inc si dec cnt2 jnz _disLoop0 ;b andazeye SnakeLength edame bede ;/******** ;----erase tail: SET_POS tailX,tailY ;set to Tail's Position Put_Char _SNAKE_BACK, _COLOR_BLACK ;print character ;/ POP_ALL ret Display_Snake endp ;====================================================================================================== ;====================================================================================================== ;====================================================================================================== ;Make_Random_Point ( Parameter[s]: NULL) ReturnValue: NULL ;ba komake sadomSecond % 24 baraye Row , sadomSecond%80 baraye Column ;check mikone agar k rooye SnakeBody ya Walls bashe dobare rndPoint ro besaze ;rndX ro tooye CL va rndY ro tooye CH mizare va dar oon position PUT_CHAR mikone FoodScore ro ;====================================================================================================== Make_Random_Point proc near PUSH_ALL ;----make random x,y _RndAgain: ;agar k point ro k mizare rooye safhe, rooye Wall bashe || rooye SnakeBody bashe miad inja va dobare mikeshe mov bl,24 ;MAX_ROW mov bh,80 ;MAX_COL mov ah,2ch ;service baraye gereftane s@t int 21h ;gereftane s@t mov ah,0 mov al,dl ;sadom sanie(k dar DL hast) ro tooye AL beriz DIV bl ;DIV...kharej-ghesmat dar AH, Baghi-mande dar AL mov XFood,ah ;baghimande (ROW) dar XFood ; mov ah,2ch ;service baraye gereftane s@t int 21h ;gereftane s@t mov ah,0 mov al,dl ;sadom sanie(k dar DL hast) ro tooye AX beriz DIV bh ;kharej-ghesmat dar AH, Baghi-mande dar AL mov YFood,ah ;baghimande (COL) dar YFood Set_Pos XFood,YFood ;set position to Food X,Y ;/ ;**************bayad check konam age 1vaght rooye SnakeBody nazare : mov al, XFood mov ah, YFood mov cl,snakeLength mov ch,0 mov si,0 _RndCheckAgain: cmp XPoints[si],al jne _RndResumeNext cmp YPoints[si],ah jne _RndResumeNext ;age hamin noghte bashe ;hala bayad 1 bare dige noghte ro bezaram jmp _RndAgain _RndResumeNext: inc si LOOP _RndCheckAgain ;***************/ ;***************bayad check konam rooye Wall nazare : mov al, XFood mov ah, YFood mov cl, WallCount mov ch, 0 mov si, 0 _RndCheckAgain2: cmp WallX[si],al jne _RndResumeNext2 cmp WallY[si],ah jne _RndResumeNext2 ;age hamin noghte bashe ;hala bayad 1 bare dige noghte ro bezaram jmp _RndAgain _RndResumeNext2: inc si LOOP _RndCheckAgain2 ;*******************/ ;----random score point : mov bh, _MAX_FOOD_SCORE ;foodScore= rnd( 1 .. _MAX_FOOD_SCORE ) mov ah,2ch ;service baraye gereftane s@t int 21h ;gereftane s@t mov ah,0 mov al,dl ;sadom sanie(k dar DL hast) ro tooye AX beriz DIV bh ;kharej-ghesmat dar AH, Baghi-mande dar AL inc ah ;0 nashe (1..5) mov FoodScore,ah ;baghimande (COL) dar YFood mov ah,0 mov al,_FOOD_LIFE_TIME_DIV DIV FoodScore mov foodLifeTime , al ;kharej ghesmat dar foodLifeTime ...ta b hamin andaze rooye safhe bashe...badesh pak beshe va 1 food jadid sakhte beshe mov bl, _COLOR_GREEN ;color green (normal food scroe (<5)) mov al, FoodScore cmp al,5 jne _RndNormalColor mov bl, _COLOR_RED_BLINK ;baraye 5 score Blink RED bezar _RndNormalColor: add al, 48 ;convert digit to ascii (3 > '3') Put_Char al,bl ;Put Food mov blnNewFood , 1 ;Food jadid oomade... new food hast POP_ALL ret Make_Random_Point endp ;====================================================================================================== ;====================================================================================================== ;====================================================================================================== ;U_Win( Parameter[s]: NULL) ReturnValue: NULL ;vaghti k level 3 tamoom beshe in sub call mishe ;1 msg tabrik neshoon mide faghat :D ;====================================================================================================== U_Win proc near;MACRO call Clr_Scr SHOW_MSG msgWinner , 9,24 SET_POS 0 ,0 DO_DELAY 0bffh call wait_4_Any_Key ret U_Win ENDp ;====================================================================================================== ;====================================================================================================== ;Show_Score( Parameter[s]: NULL) ReturnValue: NULL ;if blnLevelGame==TRUE then userScore else userSumScore ro namayesh mide vasate safhe ;ba DIV motavali bar 10 Remainders ro mikeshe biroon va tabdil b ASCII mikone va namayesh mide ;====================================================================================================== Show_Score proc PUSH_ALL ;SET_POS 11,24 SHOW_MSG msgYourScore , 11,24 mov dh,11 mov dl,40 cmp blnLevelGame,TRUE jne _ShowScoreAgain mov al, userSumScore add userScore , al _ShowScoreAgain: push dx mov bx,000Ah mov al, userScore CBW ;change byte 2 word () CWD ;change word 2 double 4 DIV div bx mov userScore,al add dx,48 mov ax,dx ; pop dx dec dl Set_Pos dh,dl Put_Char al , 10000111b cmp userScore,0 jne _ShowScoreAgain ; SET_POS 0,0 DO_DELAY 5ffh POP_ALL ret Show_Score endp ;====================================================================================================== ;=========================================================== ;PAINT_LEVEL ( Parameter[s]: bl=Level#) ReturnValue: NULL ;maghadir-e tarif shode baraye har Level ro dar maghadire WallCurrents mizare bar asase bl ;bar asase parametre voroodi bl ,original wallX,wallY ,wallCount ro misaze ;then call PAINT_WALL to display currentLevel(walls) on the screen ;=========================================================== Paint_Level proc near PUSH_ALL mov si,0 cmp bl , _LEVEL_2 je _PaintLevel2Copy cmp bl , _LEVEL_3 je _PaintLevel3Copy ;---MAke Level 1 : _PaintLevel1Copy: mov LevelOkScore , _LEVEL_1_OKSCORE ; mov al, Level_1_Wall_Count ;bayad b andazeye _wallCount bashe mov ah,0 mov wallCount , al mov cx,ax _PaintLevel1CopyAgain: ;copy Level1 variables into CurrentsLevels(Walls) variables mov al, Level_1_X[si] ; mov ah, Level_1_Y[si] ; mov wallX[si], al ; mov wallY[si], ah ; inc si LOOP _PaintLevel1CopyAgain jmp _MakeLevelFinish ;/ ;---MAke Level 2 : _PaintLevel2Copy: mov LevelOkScore , _LEVEL_2_OKSCORE mov al, Level_2_wall_Count mov ah,0 mov wallCount , al mov cx,ax _PaintLevel2CopyAgain: mov al, Level_2_X[si] ;copy Level2 variables into CurrentsLevels(Walls) variables mov ah, Level_2_Y[si] mov wallX[si], al mov wallY[si], ah inc si LOOP _PaintLevel2CopyAgain jmp _MakeLevelFinish ;/ ;---MAke Level 3 : _PaintLevel3Copy: mov LevelOkScore , _LEVEL_3_OKSCORE mov al, Level_3_Wall_Count mov ah,0 mov wallCount , al mov cx,ax _PaintLevel3CopyAgain: ;copy Level3 variables into CurrentsLevels(Walls) variables mov al, Level_3_X[si] mov ah, Level_3_Y[si] mov wallX[si], al mov wallY[si], ah inc si LOOP _PaintLevel3CopyAgain ;/ _MakeLevelFinish: PAINT_WALL ;ok,wall arrays por shodan..now let's paint walls POP_ALL ret Paint_Level ENDp ;=========================================================== ;=========================================================== ;Make_Default_Snake( Parameter[s]: NULL) ReturnValue: NULL ;1 Snake ba maghadire Default misaze (SnakeLen=5) ;=========================================================== Make_Default_Snake proc near mov snakeLength,5 mov blnLevelPassed,FALSE mov lastDirection ,_RIGHT_DIRECTION mov dl,0 ;baraye taghire Direction baraye har point ;---Make default snake Arrays: mov cl,snakeLength mov ch,0 mov si,0 mov al,10 mov ah,78 _DefAgain: mov XPoints[si], al mov YPoints[si], ah mov XPointsStep[si],_ZERO mov YPointsStep[si],_PLUS mov PointsDirections[si],_RIGHT_DIRECTION ;baraye Display -e makhsoose har kodoom ; cmp dl,0 jne _DefUpDownDirection mov dl,0 mov PointsDirections[si], _LEFTRIGHT_DIRECTION jmp _DefResumeNext _DefUpDownDirection: mov dl,1 mov PointsDirections[si], _UPDOWN_DIRECTION _DefResumeNext: inc si dec ah LOOP _DefAgain ;/ ;---make default ChangingPoints Arrays : mov cx,_MAX mov si,0 _DefResAgain: mov XChangingPoints[si], _INVALID_VAL ;1 meghdare na-motabar (99) mov YChangingPoints[si], _INVALID_VAL ; ; mov XChangingPointsStep[si],_INVALID_VAL ; mov YChangingPointsStep[si],_INVALID_VAL ; inc si LOOP _DefResAgain ;/ ret Make_Default_Snake ENDp ;=========================================================== ;=========================================================== ;Normal_Game( Parameter[s]: NULL) ReturnValue: NULL ;agar hengame SelectGameMode Normal ro bezane in sub call mishe va bazi normal ro misaze ... ;ta vaghti k user nasooze bazi edame dare ;=========================================================== Normal_Game proc near mov blnLoose,FALSE mov blnLevelPassed ,FALSE mov FoodScore,0 mov FoodRemaind,0 mov FoodLifeTime,0 mov UserScore,0 mov UserSumScore,0 mov blnNewFood ,FALSE call Clr_Scr call MAKE_DEFAULT_SNAKE ;1 Snake Default misaze ret Normal_Game endp ;=========================================================== ;====================================================================================================== ;Init_Game( Parameter[s]: bl=_LEVEL_#) ReturnValue: currentLevel=bl ;variables ro reset mikone va level bl ro misaze ;====================================================================================================== Init_Game proc near mov blnLoose,FALSE mov blnLevelPassed ,FALSE mov FoodScore,0 mov FoodRemaind,0 mov FoodLifeTime,0 mov UserScore,0 mov blnNewFood ,FALSE call Clr_Scr call MAKE_DEFAULT_SNAKE mov currentLevel , bl ;current level beshe _Level call Paint_Level ;currentLevel ro mikeshe roo safhe ret Init_Game ENDp ;====================================================================================================== ;=========================================================== ;Clr_Scr( Parameter[s]: NULL) ReturnValue: NULL ;clear the screen with White on Black colors ;=========================================================== Clr_Scr proc near ; mov ah,00 ; mov al,3 ; int 10h ;set monitor mode 1 mov ah,06 mov al,00 mov bh,00000111b ;White on black mov cx,0000h mov dx,184fh int 10h ret Clr_Scr ENDp ;=========================================================== ;=========================================================== ;Goto_Level_1( Parameter[s]: NULL) ReturnValue: NULL ;bazi ro b level 1 mibare (if blnLevel==TRUE) ;=========================================================== Goto_Level_1 proc near call Clr_Scr mov GameDifficulty , _DELAY_N_NOVICE mov bx,1 ;parameter morede niaz baraye Init_Game call Init_Game ;Init_Game (_LEVEL_1) mov userSumScore,0 ;dar level 1 userSumScore=0 hastesh ret Goto_Level_1 endp ;=========================================================== ;=========================================================== ;Goto_Level_2( Parameter[s]: NULL) ReturnValue: NULL ;bazi ro b level 2 mibare (if blnLevel==TRUE) ;=========================================================== Goto_Level_2 proc near call Clr_Scr SHOW_MSG msgLevel1Completed , 12,30 call Wait_4_Any_Key DO_DELAY 0affh mov GameDifficulty , _DELAY_N_PRO mov al,userScore add userSumScore,al ;emtiaz kolli user ro dar userSumScore negah midare(dar vaghte userSumScore+=userScore) mov bx,2 ;parameter morede niaz baraye Init_Game call Init_Game ;Init_Game (_LEVEL_2) ret Goto_Level_2 endp ;=========================================================== ;=========================================================== ;Goto_Level_3( Parameter[s]: NULL) ReturnValue: NULL ;bazi ro b level 3 mibare (if blnLevel==TRUE) ;=========================================================== Goto_Level_3 proc near call Clr_Scr SHOW_MSG msgLevel2Completed , 12,22 call Wait_4_Any_Key DO_DELAY 0affh mov GameDifficulty , _DELAY_N_EXPERT mov al,userScore add userSumScore,al ;emtiaz kolli user ro dar userSumScore negah midare(dar vaghte userSumScore+=userScore) mov bx, _LEVEL_3 ;parameter morede niaz baraye Init_Game call Init_Game ;Init_Game (_LEVEL_3) ret Goto_Level_3 endp ;=========================================================== ;=========================================================== ;Goto_Level_bl( Parameter[s]: bl=Level#) ReturnValue: NULL ;bazi ro b level# mibare ...age bazi b soorat-e Level i bashe (blnLevel==TRUE) then vaghti k 1 level tamoom beshe in sub call mishe ;va bazi ro b level badi mibare ;=========================================================== Goto_Level_bl proc near call Clr_Scr cmp bl,_LEVEL_1 ;age Level 1 bashe jne _GotoLevel2 ;NO call Goto_Level_1 ;YES > GotoLevel1 ret _GotoLevel2: cmp bl,_LEVEL_2 ;age Level 2 bashe jne _GotoLevel3 ;NO call Goto_Level_2 ;YES > GotoLevel2 ret _GotoLevel3: ;age Level 3 bashe call Goto_Level_3 ;YES ret Goto_Level_bl endp ;=========================================================== ;====================================================================================================== ;Wai_4_Any_Key( Parameter[s]: NULL ) ReturnValue: NULL ; wait for any key.... ;====================================================================================================== Wait_4_Any_Key proc near ;MACRO push ax mov ah, 1 int 21h pop ax ret Wait_4_Any_Key ENDp ;=========================================================== ;=========================================================== ;Hide_Last_Food( Parameter[s]: XFood , YFood ) ReturnValue: NULL ;Food i k rooye safhe hastesh (dar XFood o YFood) ro pak mikone ;=========================================================== Hide_Last_Food proc near Set_Pos XFood,YFood ;boro Xfood , YFood current Put_Char _SNAKE_BACK , _COLOR_BLACK ;pakesh kon ret Hide_Last_Food ENDp ;=========================================================== ;=========================================================== ;Wanna_Play_Again (Parameters : NULL) ReturnValue: blnPlayAgain =TRUE||FALSE ;vaghti k bekhad az bazi kharej beshe (momkene LOOSE shode bashe va ya vasaste bazi ESC zade bashe va ya WINNER shode) ;dar in soorat in sub call mishe va az user miporse k mikhad dobare bazi kone ya na... ;=========================================================== Wanna_Play_Again proc near call Clr_Scr SHOW_MSG msgPlayAgain , 1,1 DO_DELAY 0effh _wannaPlayAgain: ;agar kelide zade shode user gheir az 'Y' || 'y' || 'N' || 'n' bashe b inja bar migarde ;check keys : ;ta dobare az user voroodi begire mov ah, 00h int 16h ;get key from user without display it cmp al, 121 ;'y' je _wannaPlayAgainYES cmp al, 89 ;'Y' je _wannaPlayAgainYES cmp al, 110 ;'n' je _wannaPlayAgainNO cmp al, 78 ;'N' je _wannaPlayAgainNO jmp _wannaPlayAgain ;agar k kelide gheir az 'y' || 'Y' || 'n' || 'N' zade bashe dobare begir _wannaPlayAgainYES: mov blnPlayAgain , TRUE ;blnPlayAgain ro ==TRUE mizare va return mikone..dar Main check mikone agar ret ;blnPlayAgain==TRUE then dobare hame chi ro misaze va az avval bazi shoroo mishe _wannaPlayAgainNO: mov blnPlayAgain , FALSE ; ret wanna_Play_Again endp ;====================================================================================================== ;Select_Game_Mode ( Parameter[s]: NULL ) ReturnValue: blnLevelGame=TRUE || FALSE ;Game mode ro migire az user (Level || Normal) ...dar Main check mikone agar age blnLevelGame==TRUE bashe 1 bazie 3-Level misaze ;====================================================================================================== Select_Game_Mode proc near call Clr_Scr PUT_CHAR 126 , 4 SHOW_MSG msgGameModeSelect , 5 , 4 ;namayesh msgGameModeSelect SHOW_MSG msgGameModeNormal , 7 , 9 SHOW_MSG msgGameModeLevel , 8 , 9 _SelectGameModeAgain: ;agar k kelidi gheir az '1' || '2' bezane b inja bar migarde ;check keys : get Level_Border , 02h , 02h mov ah, 00h int 16h ;get key from user without display it cmp al, _ONE ; if '1' : je _SelectGameModeNormal ;YES goto _SelectGameModeNormal cmp al, _TWO ;|| '2' : je _SelectGameModeLevel ;YES goto _SelectGameModeLevel jmp _SelectGameModeAgain ;NO .... agar k kelide gheir az 1,2 zade bashe dobare az user begir ;--------- _SelectGameModeLevel: ;bazi b soorat-e Levels bashe mov blnLevelGame , TRUE ;in variable ro TRUE mizare va Return mikone ret ;dar Main check mikone agar k blnLevelGame == TRUE Then bazi b soorat-e Level i ejra beshe ;-------- _SelectGameModeNormal: mov blnLevelGame , FALSE ;bazi b soorate Normal (ta vaghti k user Loose beshe) ;select difficulty : call Clr_Scr SHOW_MSG msgGameModeDiff , 5 ,5 SHOW_MSG msgGameModeDiffNovice , 7 ,9 SHOW_MSG msgGameModeDiffPro , 8 ,9 SHOW_MSG msgGameModeDiffExpert , 9 ,9 _SelectGameModeDiffAgain: ;agar k user kelide eshtebah bezane (gheir az '1' || '2' || '3') bar migarde b inja mov ah, 00h int 16h ;get key from user without display it cmp al, _ONE ;if '1' : je _SelectGameModeDiffNovice ;YES > Novice cmp al, _TWO ;else if '2' je _SelectGameModeDiffPro ;YES > Pro cmp al, _THREE ;else if '3' je _SelectGameModeDiffExpert ;YES > Expert jmp _SelectGameModeDiffAgain ;agar k kelid eshtebah zade bashe dobare begir az user ret _SelectGameModeDiffNovice: mov GameDifficulty , _DELAY_N_NOVICE ;Delay dar hadde NOVICE (mobtadi) ret _SelectGameModeDiffPro: mov GameDifficulty , _DELAY_N_PRO ;Delay dar hadde Professional ret _SelectGameModeDiffExpert: mov GameDifficulty , _DELAY_N_EXPERT ;Delay dar hadde Expert ret Select_Game_Mode endp ;====================================================================================================== ;:::End of Program ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: end MAIN