• 汇编贪吃蛇


    .386
    .model flat,stdcall
    option casemap:none
        
        include windows.inc
        include user32.inc
        includelib user32.lib
        include kernel32.inc
        includelib kernel32.lib
        include gdi32.inc
        includelib gdi32.lib
        
    .data?
        hInstance dd ? ;模块句柄
        hWinMain  dd ?    ;窗口句柄
        
        hBegin      dd ? ;按钮句柄
    
    .data
        dSxarr    dd  100 dup ( ? )   ;x轴
        dSyarr  dd  100 dup ( ? )  ;y轴
        dSize  dd  1;蛇的长度
        
        
        
        
    .const
        szClassName  db 'MyClass',0
        szCaptionMain db '汇编版贪吃蛇',0
        szText       db   '写在中间试试',0
        
        szButton    db 'button',0
        szButtonText    db 'begin',0
        
        
    .code
        ;绘制线条
    _FrameColor proc @hdc
        
        invoke MoveToEx,@hdc,10,10,NULL
        invoke LineTo,@hdc,450,10
        invoke LineTo,@hdc,450,350
        invoke LineTo,@hdc,10,350
        invoke LineTo,@hdc,10,10
            
        ret
    _FrameColor endp
    ;画蛇头
    _SnakePro proc @hdc
        local @x
        local @y
        LOCAL @xa
        LOCAL @ya
        ;初始化i
        LOCAL @i
        mov eax,0
        mov @i,eax
        
        
        ;数组地址    
        mov ebx,offset dSxarr
        mov esi,offset dSyarr
        ;长度,不能取地址
        ;mov eax, dSize
        mov eax,dSize
        ;    
        mov edi,0
            
        .while(@i<eax)
        
        ;先将x,y 值取出, 然后各减去9或者+9, 就得到圆的大小;  现在蛇只有1的长度;
        push eax
        
        mov eax,[ebx]
        sub eax,9
        mov @x,eax
        
        add eax,18
        mov @xa,eax
        
        
        mov eax,[esi]
        sub eax,9
        mov @y,eax
        
        add eax,18
        mov @ya,eax
        
        
        add ebx,4
        add esi,4
        ;这里递增地址, 可以考虑 进栈保存
        
        invoke Ellipse,@hdc,@x,@y,@xa,@ya
        inc @i    
        
        pop eax
        .endw
        
        ret
    
    _SnakePro endp
    
    
        
    _ProcWinMain  proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
    local @stPs:PAINTSTRUCT
    
    local @hDc
        mov eax,uMsg
        
        .if  eax==WM_PAINT
            invoke BeginPaint,hWnd,addr @stPs
            mov @hDc,eax
            
        
            ;invoke TextOut,@hDc,10,10,offset szText,sizeof szText
            
            invoke _FrameColor,@hDc   ;绘制线条
            
            invoke _SnakePro,@hDc ;绘制蛇
            
            invoke EndPaint,hWnd,addr @stPs
        .elseif eax==WM_COMMAND
            mov eax,lParam
            .if eax==hBegin
                mov eax,wParam
                .if eax==BS_PUSHBUTTON
                    invoke MessageBox,0,0,0,0
                .endif
                
            .endif
        .elseif eax==WM_KEYDOWN
            mov eax,wParam
            .if eax==38
            ;up
                mov ebx,offset dSyarr
                mov eax,10
                sub [ebx],eax
                
            .elseif eax==39
                mov ebx,offset dSxarr
                mov eax,10
                add [ebx],eax
            
            .elseif eax==40
                mov ebx,offset dSyarr
                mov eax,10
                add [ebx],eax
            
            .elseif eax==37
            ;left    
                mov ebx,offset dSxarr
                mov eax,10
                sub [ebx],eax
            .endif
            invoke InvalidateRect,hWinMain,NULL,TRUE
                
        .elseif eax==WM_CLOSE
            
            invoke DestroyWindow,hWinMain
            
            invoke PostQuitMessage,NULL
            
        .else
            invoke DefWindowProc,hWnd,uMsg,wParam,lParam
            ret
        .endif
        
        xor eax,eax
        ret
    _ProcWinMain  endp
        
    _WinMain   proc
    local @stWndClass:WNDCLASSEX
    local @stMsg:MSG
        
        invoke GetModuleHandle,NULL
        mov hInstance,eax
        invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
        invoke LoadCursor,0,IDC_ARROW
        mov @stWndClass.hCursor,eax
        push hInstance
        pop @stWndClass.hInstance
        mov @stWndClass.cbSize,sizeof WNDCLASSEX
        mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
        mov @stWndClass.lpfnWndProc,offset _ProcWinMain
        mov @stWndClass.hbrBackground,COLOR_WINDOW+1
        mov @stWndClass.lpszClassName,offset szClassName
        invoke RegisterClassEx,addr @stWndClass
        
        
        ;   初始化;
        mov ebx,offset dSxarr
        
        mov eax,50
        
        mov [ebx],eax
        
        mov ebx,offset dSyarr
        
        mov eax,50
        
        mov [ebx],eax
        
        
        invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
        offset szClassName,offset szCaptionMain,
        WS_OVERLAPPEDWINDOW,
        100,100,600,400,
        NULL,NULL,hInstance,NULL
        mov hWinMain,eax
        invoke ShowWindow,hWinMain,SW_SHOWNORMAL
        invoke UpdateWindow,hWinMain
        
        ;开始按钮    
        invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
        offset szButton,offset szButtonText,WS_CHILD or WS_VISIBLE or WS_BORDER,500,10,70,35,hWinMain,NULL,NULL,NULL
        mov hBegin,eax
        
        
        ;这里加入    
        .while TRUE
            invoke GetMessage,addr @stMsg,NULL,0,0
            .break .if eax == 0
            invoke TranslateMessage,addr @stMsg
            invoke DispatchMessage,addr @stMsg
        .endw
        ret
    _WinMain  endp
    start:
        call _WinMain
        invoke ExitProcess,NULL
    end start
        
  • 相关阅读:
    4. Git撤销修改
    3. Git如何管理修改
    2. Git的工作区、暂存区和版本库
    1. Git创建仓库、查看工作区状态
    微信平台接入Web页面功能接口(C#)
    Python之路【第六篇】:Python运算符
    Python之路【第五篇】:Python基本数据类型
    Python之路【第四篇】:Pycharm集成开发环境
    Python之路【第二篇】:Python简介、解释器与编码
    Python之路【第七篇】:Python流程控制
  • 原文地址:https://www.cnblogs.com/herizai/p/3121001.html
Copyright © 2020-2023  润新知