这个也是我自己写的,上次用于取邀请码,也写一个贪吃蛇,那是用链表来做的(郁闷的,那个没计入我的帖子)  而这个是用数列来做。
  先看源码:
   .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

  下面是程序

上传的附件 w.rar