首页
论坛
课程
招聘
[原创]许源华游戏之贪吃蛇
2009-8-23 20:00 16011

[原创]许源华游戏之贪吃蛇

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

  下面是程序

[2022冬季班]《安卓高级研修班(网课)》月薪两万班招生中~

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 522
活跃值: 活跃值 (176)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2009-8-24 09:38
2
0
自己写代码的..就定为社交软件吧....虽然好象没有什么社交性....其实我会觉得,能互动,或者能比较酷的展示自己会是很不错的一种选择....

程序员应该更有创造力...象GridWars就用非常简单的图形,做出非常眩的战斗效果

http://you.video.sina.com.cn/b/1719169-1411323635.html

有兴趣的可以看看,体验一下有多震撼
雪    币: 2262
活跃值: 活跃值 (584)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2009-8-24 20:32
3
0
想不通这东西为啥加精??!
雪    币: 522
活跃值: 活跃值 (176)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2009-8-25 09:55
4
0
你写了什么,把源码发出来,只要有一定代码量的,都会是精华

可能只有短短几行代码,但是你也应该知道,有时候短短几行代码,精神不好的时候,出错了,还是会因为调试,烦上一小时.

总之,既然有人共享自己的劳动成果,为何不加精?
雪    币: 262
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rayleigh 活跃值 2009-8-25 15:41
5
0
来支持一下……
还是汇编做的短小精悍
雪    币: 4327
活跃值: 活跃值 (576)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
b23526 活跃值 2009-8-25 15:48
6
0
支持加精的,毕竟是楼主的原创
雪    币: 599
活跃值: 活跃值 (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yzlong 活跃值 2009-8-25 17:29
7
0
楼主很强

3个帖子 两个精。

真是出手不凡,

我对你的汇编真是佩服,

这么长的代码。。
雪    币: 2262
活跃值: 活跃值 (584)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
非虫 活跃值 7 2009-8-25 17:45
8
0
学习了....
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
foresee 活跃值 2 2009-8-28 08:38
9
0
尊重别人的成果
雪    币: 206
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
飞鹰ao 活跃值 2009-8-29 21:06
10
0
这种加精有点勉强,呵呵,不过支持~
游客
登录 | 注册 方可回帖
返回