بازی مار در اسمبلی - Snake Game in Assembly ( گرافیکی - کنسولی و ورژن Emu8086 )
سلام .
اینجا سه سورس کد مختلف از بازی مار یا همون Snake رو در اسمبلی براتون قرار میدم .
ورژن اول اون بازی بصورت گرافیکی هست و ورژن های بعدی بصورت کنسولی . از ورژنهای کنسولی ( یا بهتر بگم غیر گرافیکی ) یکی مخصوص emu8086 هست و یکی دیگه هم با Masm قابل کامپایل هست .
در انتها هم میتونید کل پروژه رو دنلود کنید .
برنامه اول :
;________IN THE NAME OF GOD___________
;Dos Graphical Snake game in Assembly
;Snake Game in Assembly
;Ustmb.ir
;Feb 18 2012 6:56 Pm
;_____________________________________
escape equ 01h ;scan code
up equ 48h
down equ 50h
right equ 4dh
left equ 4bh
data segment
speed db 70,55,40,25,10 ;speed of game
level db 0
color db 0
msg db 'Nibbling Snake Ver1.0',0ah,0dh
db ' 1.Easier',0ah,0dh
db ' 2.Easy',0ah,0dh
db ' 3.Normal',0ah,0dh
db ' 4.Hard',0ah,0dh
db ' 5.Harder',0ah,0dh
db 'Choose your level:','$'
sx db 200 dup(0) ;position of snake
sy db 200 dup(0)
fx db 0 ;position of food
fy db 0
x db 20 ;position of temparary head of snake
y db 20
d db right ;direction
dtemp db right ;temparary direction
ls db 4 ;length of the snake
lord db 1 ;living of dead
N1 DB 29
N2 DB 217
N3 DB 40
SEED DB 0 ;random number
data ends
code segment
assume cs:code,ds:data
go:
mov ax,data ;load data segment
mov ds,ax
mov ah,0 ;clear screen
mov al,4
int 10h
mov ah,0
mov al,3
int 10h
mov ah,9 ;output messege
mov dx,offset msg
int 21h
mov ah,1 ;input level
int 21h
mov level,al
sub level,30h
mov ah,0 ;screen mode:320*200*4
mov al,4
int 10h
mov ah,0bh ;No.0 color panel
mov bh,1
mov bl,0
int 10h
mov bh,0 ;black background
int 10h
mov sx[1],20 ;initial four node
mov sy[1],17
mov sx[2],20
mov sy[2],18
mov sx[3],20
mov sy[3],19
mov sx[4],20
mov sy[4],20
mov dx,4
mov cx,4
ground: ;draw red background
mov ah,0ch ;(4,4)->(163,163)
mov al,2
int 10h
inc cx
cmp cx,164
jne ground
mov cx,4
inc dx
cmp dx,164
jne ground
newfood:
mov ah,0 ;read the time of system
int 1ah
mov seed,dl ;move to seed
call food ;draw new food
call score ;output score
direct:
call direction ;get new direction
call liveordie ;judge whether the snake is living or dead
cmp lord,0 ;if lord==0,game over
je quit
draw:
mov bl,4 ;push position of new head into stack
mov al,x
mul bl
push ax
mov al,y
mul bl
push ax
mov color,1 ;green color
call pix ;draw new snake head
mov ah,0 ;judge whether snake has eaten food
mov al,fx
cmp x,al
jne tail ;no,go to erase tail
mov al,fy
cmp y,al
je inclength ;yes,go to increase length
tail:
call newsnake ;modify every node of the snake,erase tail
call delay ;keep screen for some time
jmp direct ;get next direction
inclength:
inc ls ;increase length
lea si,sx ;load effective address of position
lea di,sy
mov ah,0
mov al,ls
add si,ax
add di,ax
mov al,x ;move new position to new head
mov [si],al
mov al,y
mov [di],al
call delay ;keep screen for some time
jmp newfood ;go to crease new food
quit:
mov ah,1 ;press any key to exit
int 21h
mov ah,0 ;screen mode:text
mov al,3
int 10h
mov ah,4ch
int 21h
pix proc near ;two parameters
push bp ;save bp,ax,bx,cx,dx
push ax
push bx
push cx
push dx
mov bp,sp ;get parameter from stack
mov dx,[bp+14]
mov cx,[bp+12]
line: ;draw a 4*4 square
mov ah,0ch
mov al,color ;color
int 10h
inc cx
mov ax,[bp+12]
add ax,4
cmp cx,ax
jne line
mov cx,[bp+12]
inc dx
mov ax,[bp+14]
add ax,4
cmp dx,ax
jne line
pop dx
pop cx
pop bx
pop ax
pop bp
ret 4 ;two parameters=4 bytes
pix endp
foodpix proc near
push bp
push ax
push cx
push dx
mov bp,sp
mov dx,[bp+12]
mov cx,[bp+10]
inc cx
mov ah,0ch
mov al,color
int 10h
inc cx
int 10h
inc cx
inc dx
int 10h
inc dx
int 10h
inc dx
dec cx
int 10h
dec cx
int 10h
dec cx
dec dx
int 10h
dec dx
int 10h
pop dx
pop cx
pop ax
pop bp
ret 4
foodpix endp
delay proc near
push ax
push bx
push si
push dx
mov ah,2ch ;read time saved by DOS,1/100s
int 21h
mov bx,dx
lea si,speed ;load EA of speed
mov al,level
mov ah,0
add si,ax ;point to certain speed chosen by user
dec si
time:mov ah,2ch ;read time again
int 21h
sub dl,bl ;subtract old time
jns compare
add dl,100 ;if negtive,carry 1s=add 100
compare:
cmp dl,[si] ;compare to speed
jl time ;if less,time is not up
pop dx
pop si
pop bx
pop ax
ret
delay endp
rand proc near ;time as one parameter,return random number
push ax
push bx
push cx ;seed=(seed*N1+N2) mod N3
MOV CX,10
MOV AL,SEED
MOV BL,N1
MUL BL
MOV BL,N2
MOV BH,0
ADD AX,BX
DIV N3
MOV SEED,AH
pop cx
pop bx
pop ax
ret
rand endp
food proc near
push ax
push bx
push cx
push si
push di
food1:
call rand ;get new position of food
mov al,seed
mov fx,al
inc fx
call rand
mov al,seed
mov fy,al
inc fy
mov bx,1
lea si,sx
lea di,sy
effect:
mov al,[si+bx]
cmp al,fx
jne next1
mov al,[di+bx]
cmp al,fy
je food1 ;if new food is on snake,go to get new position
next1:
inc bl
cmp bl,ls
jle effect
drawfood:
mov bl,4
mov al,fx
mul bl
push ax
mov al,fy
mul bl
push ax
mov color,1
call foodpix
pop di
pop si
pop cx
pop bx
pop ax
ret
food endp
direction proc near ;return new direction and new head
push ax
push si
push di
lea si,sx
lea di,sy
mov ah,0
mov al,ls
add si,ax
add di,ax
mov al,[si]
mov x,al ;move old head to x and y
mov al,[di]
mov y,al
mov ah,1 ;scan keyboard
int 16h
jz kup ;no input,go to kup,use old derection
mov al,d ;save old direction to dtemp
mov dtemp,al
mov d,ah
cmp d,escape ;want to escape?
je nodirection ;yes,escape
cmp dtemp,up ;if new direction is oppisite to the old,go back
jne ndown
cmp d,down
je back
ndown:
cmp dtemp,down
jne nleft
cmp d,up
je back
nleft:
cmp dtemp,left
jne nright
cmp d,right
je back
nright:
cmp dtemp,right
jne kup
cmp d,left
jne kup
back:mov al,dtemp ;use old direction
mov d,al
kup: cmp d,up ;create new head according to new direction
jne kdown
dec x
jmp dend
kdown:
cmp d,down
jne kleft
inc x
jmp dend
kleft:
cmp d,left
jne kright
dec y
jmp dend
kright:
cmp d,right
jne back
inc y
jmp dend
nodirection: ;if input is escape,game over
mov d,0
dend:
mov ah,0ch ;clear keyboard buffer
mov al,6
mov dl,0ffh
int 21h
pop di
pop si
pop ax
ret
direction endp
newsnake proc near
push ax
push bx
push si
push di
mov bl,4
mov al,sx[1]
mul bl
push ax
mov al,sy[1]
mul bl
push ax
mov color,2 ;red,same to background
call pix ;erase tail
mov bl,1
lea si,sx
lea di,sy
inc si
inc di
news: ;save preceding node to succeeding
cmp bl,ls
je newhead
mov al,[si+1]
mov [si],al
mov al,[di+1]
mov [di],al
inc bl
inc si
inc di
jmp news
newhead: ;save temparary head to head
mov al,x
mov [si],al
mov al,y
mov [di],al
pop di
pop si
pop bx
pop ax
ret
newsnake endp
liveordie proc near
push ax
push bx
push si
push di
cmp d,0 ;if press escape,game over
je die
cmp x,0 ;if(x==0||y==0||x==41||y==41)
je die ;out of range
cmp x,41 ;game over
je die
cmp y,0
je die
cmp y,41
je die
mov bx,1
lea si,sx
lea di,sy
itself: ;if new head is on itself,game over
mov al,[si+bx]
cmp al,x
jne next2
mov al,[di+bx]
cmp al,y
je die
next2:
inc bl
cmp bl,ls
jl itself
jmp ldend
die:
mov lord,0
ldend:
pop di
pop si
pop bx
pop ax
ret
liveordie endp
score proc near ;output score
push ax
push bx
push cx
push dx
mov ah,2
mov dh,5
mov dl,22
mov bh,0
int 10h
mov al,ls
sub al,4
mul level
mov cx,ax
mov dl,0
L1: cmp cx,100
jnae L2
inc dl
sub cx,100
jmp L1
L2: add dl,30h
mov ah,2
int 21h
mov dl,0
L3: cmp cx,10
jnae L4
inc dl
sub cx,10
jmp L3
L4: add dl,30h
mov ah,2
int 21h
mov dl,cl
add dl,30h
mov ah,2
int 21h
pop dx
pop cx
pop bx
pop ax
ret
score endp
code ends
end go
برنامه دوم : (بازی مار غیر گرافیکی )
;|---------------------------
;|In the name of GOD
;|Snake game
;|C0DED
;|by
;|(Mahdi.Ghardashpoor)
;|USTMB.ir
;|---------------------------
;;********************************
;; SNAKE GAME Assembly Main File
;;********************************
if1 ;agar k Assembler dar gozar-e
;avval(Pass#1) bashe ezafe kon
include snake.LIB ;this ASM file is using SM.lib
;(includes needed macros in the current path)
endif
;_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
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
db 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
db 38,38,38,38,38 ,75,75,75,75,75 ,76,76,76,76,76 ,77,77,77,77,77
db 78,78,78,78,78 ,79,79,79,79,79 ,34,33,32,31,30 ,29,28,27,26,25
db 39,40,41,42,43 ,44,45,46,47,48
Level_3_Y db 75,75,75,75,75 ,76,76,76,76,76 ,77,77,77,77,77 ,78,78,78,78,78
db 79,79,79,79,79 ,21,21,21,21,21 ,21,21,21,21,21 ,21,21,21,21,21
db 27,27,27,27,27 ,52,52,52,52,52 ,58,58,58,58,58 ,58,58,58,58,58
db 58,58,58,58,58 ,37,37,37,37,37 ,38,38,38,38,38 ,39,39,39,39,39
db 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
_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
_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
;;--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
;/
_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
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
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] ;
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
_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,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
_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
;======================================================================================================
;======================================================================================================
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
;===========================================================
;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
;===========================================================
;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
;======================================================================================================
;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
برنامه سوم : (بازی مار قابل استفاده در Emu8086)
; Snake Game for Emu8086
; you can control the snake using arrow keys on your keyboard.
; all other keys will stop the snake.
; press esc to exit.
; Ustmb.ir
name "snake"
org 100h
; jump over data section:
jmp start
; ------ data section ------
s_size equ 7
; the snake coordinates
; (from head to tail)
; low byte is left, high byte
; is top - [top, left]
snake dw s_size dup(0)
tail dw ?
; direction constants
; (bios key codes):
left equ 4bh
right equ 4dh
up equ 48h
down equ 50h
; current snake direction:
cur_dir db right
wait_time dw 0
; welcome message
msg db "==== how to play ====", 0dh,0ah
db "this game was debugged on emu8086", 0dh,0ah
db "but it is not designed to run on the emulator", 0dh,0ah
db "because it requires relatively fast video card and cpu.", 0dh,0ah, 0ah
db "if you want to see how this game really works,", 0dh,0ah
db "run it on a real computer (click external->run from the menu).", 0dh,0ah, 0ah
db "you can control the snake using arrow keys", 0dh,0ah
db "all other keys will stop the snake.", 0dh,0ah, 0ah
db "press esc to exit.", 0dh,0ah
db "====================", 0dh,0ah, 0ah
db "press any key to start...$"
; print ' ' at the location:
mov al, ' '
mov ah, 09h
mov bl, 0eh ; attribute.
mov cx, 1 ; single char.
int 10h
check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key
mov ah, 00h
int 16h
cmp al, 1bh ; esc - key?
je stop_game ;
mov cur_dir, ah
no_key:
; === wait a few moments here:
; get number of clock ticks
; (about 18 per second)
; since midnight into cx:dx
mov ah, 00h
int 1ah
cmp dx, wait_time
jb check_for_key
add dx, 4
mov wait_time, dx
; === eternal game loop:
jmp game_loop
stop_game:
; show cursor back:
mov ah, 1
mov ch, 0bh
mov cl, 0bh
int 10h
ret
; ------ functions section ------
; this procedure creates the
; animation by moving all snake
; body parts one step to tail,
; the old tail goes away:
; [last part (tail)]-> goes away
; [part i] -> [part i+1]
; ....
move_snake proc near
; set es to bios info segment:
mov ax, 40h
mov es, ax
; point di to tail
mov di, s_size * 2 - 2
; move all body parts
; (last one simply goes away)
mov cx, s_size-1
move_array:
mov ax, snake[di-2]
mov snake[di], ax
sub di, 2
loop move_array
cmp cur_dir, left
je move_left
cmp cur_dir, right
je move_right
cmp cur_dir, up
je move_up
cmp cur_dir, down
je move_down
jmp stop_move ; no direction.
move_left:
mov al, b.snake[0]
dec al
mov b.snake[0], al
cmp al, -1
jne stop_move
mov al, es:[4ah] ; col number.
dec al
mov b.snake[0], al ; return to right.
jmp stop_move
move_right:
mov al, b.snake[0]
inc al
mov b.snake[0], al
cmp al, es:[4ah] ; col number.
jb stop_move
mov b.snake[0], 0 ; return to left.
jmp stop_move
move_up:
mov al, b.snake[1]
dec al
mov b.snake[1], al
cmp al, -1
jne stop_move
mov al, es:[84h] ; row number -1.
mov b.snake[1], al ; return to bottom.
jmp stop_move
move_down:
mov al, b.snake[1]
inc al
mov b.snake[1], al
cmp al, es:[84h] ; row number -1.
jbe stop_move
mov b.snake[1], 0 ; return to top.
jmp stop_move
علاقه مندی ها (Bookmarks)