这个也是我自己写的,上次用于取邀请码,也写一个贪吃蛇,那是用链表来做的(郁闷的,那个没计入我的帖子) 而这个是用数列来做。
先看源码:
.386
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include gdi32.inc
include winmm.inc
includelib winmm.lib
includelib kernel32.lib
includelib gdi32.lib
includelib user32.lib
.data
msg MSG <>
handle dd ?
hwnd dd ?
hdc dd ?
direction dd ?
canmove dd ?
canset dd 0
speed dd 0
speed1 dd 0
number dd 0
food dd 0
foodx dd 0
foody dd 0
xy1 dd 0
pxy dd 0
pxynew dd 0
xy2 dd 0
xy dd 63 dup (0)
bBrush dd 0
wBrush dd 0
.const
file1 db 'step.wav',0
file2 db 'eat.wav',0
wall equ 512
boxsize equ 14
maxnumber equ 53
number1 equ 10
number2 equ 25
wcname db '华提醒您:空格键-开始/暂停 方向键-方向 Esc-关闭',0
setfood proto
init proto
.code
start proc
local wc:WNDCLASSEX
local rect:RECT
invoke GetModuleHandle,0
mov handle,eax
mov wc.hInstance,eax
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,0
mov wc.lpfnWndProc,offset DefWindowProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
invoke LoadIcon,0,IDI_APPLICATION
push eax
mov wc.hIcon,eax
pop eax
mov wc.hIconSm,eax
invoke LoadCursor,0,IDC_ARROW
mov wc.hCursor,eax
mov wc.hbrBackground ,COLOR_WINDOW
mov wc.lpszMenuName,0
mov wc.lpszClassName,offset wcname
invoke RegisterClassEx,addr wc
invoke GetSystemMetrics,SM_CYSCREEN
push eax
invoke GetSystemMetrics,SM_CXSCREEN
sub eax,wall
shr eax,1
pop ebx
sub ebx,wall
shr ebx,1
push eax
push ebx
invoke CreateWindowEx,WS_EX_TOPMOST,offset wcname,offset wcname,0,eax,ebx,wall,wall,0,0,handle,0
mov hwnd,eax
invoke ShowWindow,hwnd,SW_NORMAL
invoke GetClientRect,hwnd,addr rect
mov ecx,wall
shl ecx,1
mov edx,ecx
sub ecx,rect.right
sub edx,rect.bottom
pop ebx
pop eax
invoke MoveWindow,hwnd,eax,ebx,ecx,edx,TRUE
invoke GetDC,hwnd
mov hdc,eax
invoke GetStockObject,NULL_PEN
invoke SelectObject,hdc,eax
invoke GetStockObject,WHITE_BRUSH
mov wBrush,eax
invoke GetStockObject,BLACK_BRUSH
mov bBrush,eax
invoke init
invoke ShowCursor,FALSE
invoke SetTimer,hwnd,0,10,0
;;;;;;;;;;;;;;;;;;;循环开始处;;;;;;;;;;;;;;;;;;;;;;;;;
start1:
invoke GetMessage,addr msg,hwnd,0,0
mov eax,msg.message
cmp canmove,1
jnz notimer
cmp eax,WM_TIMER
jnz notimer
dec speed1
cmp speed1,0
jns notimer
push speed
pop speed1
mov eax,xy1
mov edx,pxy
add eax,[edx]
and eax,1ff01ffh ;;;;;;;;;;;;;;;;;穿墙;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ebx,pxynew
mov ecx,edx
@@:
add edx,4
cmp edx,ebx
jnz noturnback
lea edx,xy
noturnback:
cmp edx,ecx
jz @f
cmp eax,[edx]
jnz @b
invoke init
jmp start1
@@:
cmp eax,food
jnz nofood
pushad
invoke PlaySound,offset file1,0,SND_FILENAME or SND_ASYNC
popad
mov ebx,pxy
add ebx,4
cmp ebx,pxynew
jz istail
mov edi,pxynew
mov esi,edi
sub esi,4
mov ecx,edi
sub ecx,ebx
shr ecx,2
std
rep movsd
cld
istail:
mov pxy,ebx
mov [ebx],eax
add pxynew,4
invoke setfood
inc number
cmp number,maxnumber
js @f
invoke ExitProcess,0
@@:
cmp number,number1
js start1
cmp number,number2
js @f
mov speed,2
mov speed1,2
@@:
mov speed,3
mov speed1,3
jmp start1
nofood:
push eax
invoke SelectObject,hdc,bBrush
mov ecx,pxy
add ecx,4
cmp ecx,pxynew
jnz @f
lea ecx,xy
@@:
mov pxy,ecx
mov edx,[ecx]
pop ebx
push ebx
mov [ecx],ebx
xor ecx,ecx
mov cx,dx
mov eax,ecx
add ecx,boxsize
shr edx,16
mov ebx,edx
add edx,boxsize
invoke Rectangle,hdc,eax,ebx,ecx,edx
invoke SelectObject,hdc,wBrush
pop edx
xor ecx,ecx
mov cx,dx
mov eax,ecx
add ecx,boxsize
shr edx,16
mov ebx,edx
add edx,boxsize
invoke Rectangle,hdc,eax,ebx,ecx,edx
mov ecx,foodx
add ecx,boxsize
mov edx,foody
add edx,boxsize
invoke Rectangle,hdc,foodx,foody,ecx,edx
mov canset,1
jmp start1
notimer:
cmp eax,WM_KEYDOWN
jnz nokeydown
mov eax,msg.wParam
cmp eax,VK_UP
jnz @f
mov ebx,direction
cmp ebx,VK_UP
jz @f
cmp ebx,VK_DOWN
JZ @F
mov direction,eax
mov xy1,1f00000h
jmp start1
@@:
cmp eax,VK_DOWN
jnz @f
cmp canset,1
jnz nodirection
mov ebx,direction
cmp ebx,VK_UP
jz @f
cmp ebx,VK_DOWN
JZ @F
mov direction,eax
mov xy1,100000h
jmp start1
@@:
cmp eax,VK_LEFT
jnz @f
mov ebx,direction
cmp ebx,VK_LEFT
jz @f
cmp ebx,VK_RIGHT
JZ @F
mov direction,eax
mov xy1,1f0h
jmp start1
@@:
cmp eax,VK_RIGHT
jnz @f
mov ebx,direction
cmp ebx,VK_LEFT
jz @f
cmp ebx,VK_RIGHT
JZ @F
mov direction,eax
mov xy1,10h
jmp start1
@@:
nodirection:
cmp eax,VK_SPACE
jnz @f
xor canmove,1
mov canset,0
jmp start1
@@:
cmp eax,VK_ESCAPE
jnz @f
invoke ExitProcess,0
@@:
nokeydown:
invoke DispatchMessage,addr msg
jmp start1
ret
start endp
;;;;;;;;;;;;;;;;;;;;;;;;;;随机数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
setfood proc
local time : SYSTEMTIME
invoke GetSystemTime,addr time
xor eax,eax
mov ax,time.wMilliseconds
mov ebx,31
and ebx,eax
shl ebx,4
mov foodx,ebx
shr eax,5
shl eax,4
mov foody,eax
shl eax,16
mov food,eax
add food,ebx
mov ecx,foodx
add ecx,boxsize
mov edx,foody
add edx,boxsize
invoke Rectangle,hdc,foodx,foody,ecx,edx
@@:
ret
setfood endp
init proc
mov direction,VK_RIGHT
mov speed,4
mov speed1,4
mov canmove,0
mov canset,0
mov xy1, 16
mov number,3
lea ebx,xy
mov pxy,ebx
mov dword ptr [ebx], 32
mov dword ptr [ebx+4], 16
mov dword ptr [ebx+8], 0
add ebx,12
mov pxynew,ebx
invoke SelectObject,hdc,bBrush
invoke Rectangle,hdc,0,0,513,513
invoke SelectObject,hdc,wBrush
invoke setfood
invoke Rectangle,hdc,0,0,14,14
invoke Rectangle,hdc,16,0,30,14
invoke Rectangle,hdc,32,0,46,14
ret
init endp
end start
这个没什么好说,看时,注意下,蛇吃到子时的处理
还有,有空,有好源码CALL下我
522165473@qq.com
下面是程序
- 标 题:许源华游戏之贪吃蛇
- 作 者:huagame
- 时 间:2009-08-23 20:00
- 链 接:http://bbs.pediy.com/showthread.php?t=96359