魔方(ver 0.1)

开发日志:

 

开发日志是按日期写的,主要的一些说明请看最后。

19:15 2006-08-19:思量了很久,还是尝试写一下这个程序。但目前就写一个游戏模式,而不是解决方案。

20:45 2006-08-19:一直在研究透明的效果怎么搞,因为没有网络,也没有带书回来,只能想去反编译程序找API了,但是这里的机子里的反编译程序也不是图形界面,dumpbin与dumppe,虽然是很强的命令行工具,但还是令人比较郁闷。目前机子里有透明效果的程序好像就是千千静听与现在用的万能五笔了,但更为郁闷的是,根本无法从反汇编的程序中找到API,千千静听反编译有1M多,万能五笔更可怕,7M多,我先反编译的千千,一看开头,我就愣了,push esp mov ebp,esp,开头两条指令好像我在书里看过是防静态汇编或跟踪云云,头就大了,二话不说,删。万能五笔我就看了看,最后只好看它们的导入表,万能五笔好点导入表小,千千静听太多了,看不过来,还有一些导入表Masm32v8.2根本就找不到链接库,更别说测试了。

21:52 2006-08-19:终于找到了,好像就是SetBkMode,我原来一直误区在alpha关键字里。经过很多的测试,可以确定这个API就是对图形透明的函数了。累死我了,只摸到一点门,以后有空再继续。PS:在找这个API的过程中,还是学到了不少的东西。

10:55 2006-08-21:无法使用setBkMode,郁闷,主要是我不会用,也不知道应该怎么用。

16:15 2006-08-22:今天我应该吐血N升!!!!我终于深刻地认识到C与C++里的变量、数组是一个多美妙事情,今天下午我花了N个小时在分析数据在内存中的存放顺序以调整我的程序结构。开始有点怀念C了。呜呜~~~
  而且一个十分细小的口算错误,竟让我一直卡在一个点怎么想都想不通,N小时后,天见怜,让我猛然发现了数据竟然在最后一个错掉了。吐血吐血吐血吐血吐血吐血吐血吐血吐血吐血吐血吐血

21:47 2006-08-22:但究竟还是解决了一些问题,按捺不住高兴啊。又做了好久了,今天就做到这里,是一个纪念。我把后、左、下三个面画出来了,因为画的程序还可以精减,但我现在不准备做这个工作,嘿嘿,先把立体图画出来再考虑吧。

14:06 2006-08-23:目前只画了三个面,又出了点问题,正在解决ing...

18:11 2006-08-23:问题的出现是因为有重复计算,最后发现了,郁闷。

16:44 2006-08-24:今天把六个面全部画完了,但是效果并不是很理想,不好看,郁闷。因为dialog无法处理加速键的问题,所以我把dialog改成window了,多了一些处理过程,但在窗口大小改变的时候,在随机次改变后,颜色发生变化以及在窗口外画图了,郁闷。正在解决ing...

22:20 2006-08-24:为了不再发生上面所说的错误,因为我也不知道到底是哪里出错了,所以我把窗口限制大小了。就是禁止调整大小罢了。另外,这里又要记录一个错误,我把info数组放到.const里,左转操作的时候老是出错,调整了好久,程序没错,就是想不到哪里错了,后来又要靠灵光一闪,对了.const,马上拉到.data里,立即正确了。嘿嘿。现在左转操作反应慢,好像send paint消息没什么作用。

21:21 2006-08-26:在我快要放弃的时候,终于尝试成功了一个函数:GetDC。这是一个很简单的API,但之前我却没有去注意它,因为它太平凡,结果证明它的用处。我试了几天,用了一切可想的办法,如createDC...不是毫无作用就是无限循环。用了GetDC,终于解决了在WM_PAINT消息中画面不更新的问题了,哇哈哈。当然,在WM_PAINT里我没有忘记让DC有效起来,原来用v..Rect,后来想想,又用beginPaint了,嘿嘿,画面的背景就回去了,而不是刚刚的黑色。
  过几天把12个转向的函数写完以后就开始着手看看用两个窗口层叠,上层透明来实现画图,嘿嘿,这样画出来的魔方才能叫魔方,我看了一下还没有实现这个技术的程序,当方块转动无序后,画面就是一片花,太难看了。对了,昨天没写日志,因为到姐那里上网查到了一个好API,窗口透明,嘿嘿,这回是真家伙。

13:31 2006-08-27:试验了几次以后,发现些规律,又多学习了几个方面的知识,两个窗口,主与子,只有主窗口的消息函数才能使用,所以子窗口的消息函数完全可以省掉,而且因为消息函数里使用的窗口句柄都是局部变量,对同时处理与分别处理两个窗口的消息很有好处哦。
  然后就是知道了对于我的单线程的话,还是用postmessage比较好而不是sendmessage以等待处理。


15:01 2006-08-27:今天把魔方的六个面分别画正常了,不再采用原来的上层画法。六个面的绘画一切正常。
  新加一个功能,用pageup、pagedown、home、end来控制上层窗口的透明度

17:39 2006-08-27:主要的一些绘画功能都完成了,现在正在精减程序,靠,房间里竟然有一只蚊子,咬死我了,郁闷。停会。

18:20 2006-08-27:转动程序的函数已经精减完毕。
  这里提一下程序的资源消耗问题,当前机器是:AMD Athlon XP 
16001.41G 程序的计算量是很小的,一般的操作都能维持在1%的使用率,就是可以忽略不计,就算是按住绘画命令不放,CPU的使用率也是在60%以下。可见计算量很小。
  而显卡:GeForce 
2 MX 64M的,因为都是画图,所以可能工作都给它承担了,所以看不出来实际绘画需要的计算量是多少,到时回到学校后应该可以看一下。
  窗口只实现了绘图同步,其它还没有同步,这个问题以后再解决。

16:44 2006-08-28:今天把保存当前信息的一些功能写了,原来以为会很麻烦,结果因为我写程序一向比较抠门,写出来的程序一向是力求“小”,所以又把写INI文件的函数处理了一下,很爽,不过多计算了几次,但原始变量就省了很多哦。

16:21 2006-08-30:今天把路径的保存这个功能写了一下,原来在电脑前坐了好久,老是写不成功,结果没电了,在纸上划两下,结果就出来了。看来我还是适合在纸上演算东西。
  因为是对上一步的验证算法,所以,虽然说完全没有错误,但是功能的实现上还是有些瑕疵的,我会再想办法把它做好的。现在能想到的办法就是再加一个last以验证再上一步的过程。
  而要让这个程序成为一个正式的游戏还有一个功能没有实现,就是随机打乱魔方的排布,以让用户自己寻找解决之道。
  对了,绘图的模块还没有精减,这里记一下,免得忘记。

21:20 2006-08-30:新加了一个last1的变量,记录倒数第二次的操作类型,嘿嘿,我在想,如果以后再加上其它6个转向,达到全部的18转,那写程序真是太恐怖了。不过好在我尽量地把程序模块化了。而且,我也不准备去实现18转了,只不过我在现在的程序里尽量给以后还是有可能续写的18转考虑自由的空间了已经。
  现在貌似完成了,对于操作步骤的come back不会要求严格步步顺序了,至少对前两步的判定使之更加“人性化”了。

21:41 2006-08-30:把_draw_fRect函数删掉了,因为用不着了,唉,那可是我花了一个晚上想出来的连点画线的方法啊,可惜现在用不上了。
努力精减draw模块...

22:50 2006-08-30:嘿嘿,模块化设计就是好,draw模块很快就精减完了,函数多了,但程序小了,程序由原来的17.5K飚减到14.5K,整整3K啊,我这个工作就节省了3K的程序空间啊,因为节省空间而增加的运算量所付出的代价是很小的,与这个3K比起来就忽略不计了,再说了,现在的CPU很快了,这点运算量几乎就可以为0。

13:37 2006-08-31:设置了游戏级别,低中高及自定义。刚刚发现一个思路错误,导致路径记录时出现覆盖。正在想办法...

14:18 2006-08-31:成了,嘿嘿,还是要在纸上分析实在,我在纸上一划拉,就把_load函数写好了。高级的过程,50步,完全可以按照步骤提示还原掉,嘿嘿。  但是至于步骤提示怎么还原魔方,我还不想去写,因为如果很快就知道怎么解决游戏的话,无论什么游戏都不会再长久地吸引玩家的兴趣了。只不过我会在“使用说明”里提一下。

14:34 2006-08-31:最后我看这个程序先告一个段落吧,把它的版本改为1.0,嗯。这是迄今为止我写过的最长的程序了,丫的全都是一键一键打出来的。源文件很大,但写出来的程序很小,这就是我的风格。

21:25 2006-9-3:我回来了,经过检验,图形的绘画也基本不需要消耗什么资源,至此,可以证明这个程序做得不错,嘿嘿,自得一下。。。

 

  使用说明:

 


        魔方(ver 
0.1) 使用说明

加速鍵:
  ▲12个转动方向:

      W           ↑        
7    9

   A  S  D     ← ↓ →     
1    3 (小键盘)


  ▲透明度调整:

    Home(不透明)    PageUp(渐不透明)
    End(完全透明)    PageDown(渐透明)

  ▲上下层窗口分离:随意拖动窗口



load提示:从后面往前读
!:D    
1:AA    A:A
":→    2:←←    B:←
#:S    3:WW    C:W
$:↓    4:↑↑    D:↑
%:3    5:11    E:1
&:9    6:77    F:7
照着步骤做,嘿嘿,就能还原魔方。

 

mofang.asm

 

.586 
.model flat
,stdcall 
option casemap:none 

include windows.inc 

include user32.inc 
include kernel32.inc 
include shell32.inc
include    gdi32.inc
include    masm32.inc

includelib user32.lib 
includelib kernel32.lib 
includelib shell32.lib
includelib    gdi32.lib
includelib    masm32.lib

include    C:masm32macrosMACROS.ASM

include    mofang.inc    
;一些变量常数在这里

.code

_colors    proc
    
    LOCAL    @tmp:LOGBRUSH
    
    
;先设定六种颜色笔刷的句柄以及黑色刷与NULL刷
    invoke    CreateSolidBrush,_red
    mov    hBrush
,eax
    invoke    CreateSolidBrush
,_yellow
    mov    hBrush
[4],eax
    invoke    CreateSolidBrush
,_cheng
    mov    hBrush
[8],eax
    invoke    CreateSolidBrush
,_white
    mov    hBrush
[0ch],eax
    invoke    CreateSolidBrush
,_blue
    mov    hBrush
[10h],eax
    invoke    CreateSolidBrush
,_green
    mov    hBrush
[14h],eax
    invoke    CreateSolidBrush
,_black
    mov    hBrush
[18h],eax
    push    
1
    pop    @tmp.lbStyle
    push    0000ff00h
    pop    @tmp.lbColor
    push    
5
    POP    @tmp.lbHatch
    invoke    CreateBrushIndirect
,addr @tmp
    mov    hBrush
[1ch],eax
    
;六色画笔与黑笔&点刷
    invoke    CreatePen,PS_SOLID,1,_red
    mov    hPen
[00h],eax
    invoke    CreatePen
,PS_SOLID,1,_yellow
    mov    hPen
[04h],eax
    invoke    CreatePen
,PS_SOLID,1,_cheng
    mov    hPen
[08h],eax
    invoke    CreatePen
,PS_SOLID,1,_white
    mov    hPen
[0ch],eax
    invoke    CreatePen
,PS_SOLID,1,_blue
    mov    hPen
[10h],eax
    invoke    CreatePen
,PS_SOLID,1,_green
    mov    hPen
[14h],eax
    invoke    CreatePen
,PS_SOLID,1,_black
    mov    hPen
[18h],eax
    invoke    CreatePen
,PS_DOT,1,NULL
    mov    hPen
[1ch],eax
    
;粗的画笔刷以及虚线刷
    invoke    CreatePen,PS_SOLID,3,_red
    mov    hPen2
[00h],eax
    invoke    CreatePen
,PS_SOLID,3,_yellow
    mov    hPen2
[04h],eax
    invoke    CreatePen
,PS_SOLID,3,_cheng
    mov    hPen2
[08h],eax
    invoke    CreatePen
,PS_SOLID,3,_white
    mov    hPen2
[0ch],eax
    invoke    CreatePen
,PS_SOLID,3,_blue
    mov    hPen2
[10h],eax
    invoke    CreatePen
,PS_SOLID,3,_green
    mov    hPen2
[14h],eax
    invoke    CreatePen
,PS_SOLID,3,_black
    mov    hPen2
[18h],eax
    invoke    CreatePen
,PS_DASH,3,NULL
    mov    hPen2
[1ch],eax
    ret

_colors endp

_init    proc
    LOCAL    @tmp
    push    ebx
    push    esi
    push    edi
    
    
;写键名    KeyInfo == info01,0,info02,0,...info27,0
    xor    ebx,ebx
    xor    esi
,esi
    .while    esi    < 
28
        inc    esi
        invoke    lstrcpy
,addr KeyInfo[ebx],addr szKeyInfo
        invoke    wsprintf
,addr tmp_str,addr fmt_info,esi
        invoke    lstrcat
,addr KeyInfo[ebx],addr tmp_str
        add    ebx
,7
    .endw
    
;取得透明度,以取得透明度开始,如果透明度都取不到,说明文件不存在,那么下面就不要忙了。
    invoke    GetPrivateProfileInt,addr szSecName,addr szKeyAlpha,0,addr szFileName
    .if    eax    !
= 0
        mov    nAlpha
,eax
        
        
;取得当前魔方信息
        xor    ebx,ebx
        xor    esi
,esi
        .while    esi    < 
28
            inc    esi
            invoke    GetPrivateProfileInt
,addr szSecName,addr KeyInfo[ebx],0,addr szFileName
            .if    eax !
= 0
                mov    info
[esi*4-4],eax
            .endif
            add    ebx
,7
        .endw
        
;取得当前路径计数
        invoke    GetPrivateProfileInt,addr szSecName,addr szKeyCout_l,0,addr szFileName
        .if    eax !
= 0
            mov    coutl
,eax
            inc    eax
            inc    eax
            mov    @tmp
,eax
            invoke    GetPrivateProfileString
,addr szSecName,addr szKeyLoad,addr load,addr load,@tmp,addr szFileName
            mov    eax
,coutl
            .if    eax > 
1
                mov    ecx
,eax
                dec    eax
                lea    esi
,load[eax]
                lodsb
                movzx    eax
,al
                mov    last1
,eax
                mov    eax
,ecx
            .endif
            lea    esi
,load[eax]
            lodsb
            movzx    eax
,al
            mov    last
,eax    ;定义最近一次操作的类型
        .endif
    .endif
    pop    edi
    pop    esi
    pop    ebx
    ret

_init endp

_out    proc
    pushad
    
;保存当前信息
    ;当前透明度
    invoke    wsprintf,addr tmp_str,addr fmt_num,nAlpha
    invoke    WritePrivateProfileString
,addr szSecName,addr szKeyAlpha,addr tmp_str,addr szFileName
    
;当前魔方信息
    xor    ebx,ebx
    xor    esi
,esi
    .while    esi    < 
28
        inc    esi
        invoke    wsprintf
,addr tmp_str,addr fmt_num,info[esi*4-4]
        invoke    WritePrivateProfileString
,addr szSecName,addr KeyInfo[ebx],addr tmp_str,addr szFileName
        add    ebx
,7
    .endw
    
;当前路径计数
    invoke    wsprintf,addr tmp_str,addr fmt_num,coutl
    invoke    WritePrivateProfileString
,addr szSecName,addr szKeyCout_l,addr tmp_str,addr szFileName
    mov    ecx
,coutl
    mov    eax
,last
    lea    edi
,load[ecx]
    stosb
    xor    eax
,eax
    stosb
    
;当前路径
    invoke    WritePrivateProfileString,addr szSecName,addr szKeyLoad,addr load,addr szFileName

    popad
    ret

_out endp


_load    proc    @last
    push    ecx
    push    edx
    push    esi
    push    edi
    
    mov    eax
,@last
    and    eax
,0fh
    mov    ecx
,last
    and    ecx
,0fh
    xor    eax
,ecx    ;该次操作是否与上次操作相同
    .if    eax == 0        ;如果两次操作类型相同
@@:        mov    eax,@last
        and    eax
,0f0h
        sub    eax
,010h
        mov    ecx
,last
        add    eax
,ecx
        .if    eax >50h        
;如果超出了范围,一是重复,一是已经还原
            sub    eax,40h
            .if    eax < 20h    
;如果操作已经还原成了上步操作
                mov    eax,coutl
                dec    eax
                mov    coutl
,eax
                dec    eax
                .if    eax >
= 0        ;既然还原上步操作,上上步的操作也要还原而对于上上步操作的还原,也要考虑一些因素
                    lea    esi,load[eax]
                    lodsb
                    movzx    eax
,al
                    mov    last1
,eax
                    lodsb
                    movzx    eax
,al
                .else
                    mov    eax
,7eh
                    mov    last1
,eax
                .endif
            .endif
        .endif
    .else        
;如果两次操作类型不同
        mov    eax,last
        mov    ecx
,last1
        and    ecx
,0fh
        and    eax
,0fh
        .if    eax > ecx
            dec    eax
        .else
            dec    ecx
        .endif
        .if    eax 
== ecx    ;上面的操作判定前面两次的操作是否“邻近”,如果邻近,才允许操作置换
            and    eax,01h
            .if    eax !
= 0    ;如果操作邻近,而且是被允许的,则置换
                mov    ecx,@last        ;这里,就要判定该次操作是否与上上次的操作类型相符
                mov    eax,last1
                and    ecx
,0fh
                and    eax
,0fh
                xor    eax
,ecx
                .if    eax 
== 0        ;如果相符的话,那么把last与last1操作置换一下
                    mov    ecx,coutl
                    dec    ecx
                    lea    edi
,load[ecx]
                    mov    eax
,last
                    mov    ecx
,eax
                    stosb
                    mov    eax
,last1
                    mov    last1
,ecx
                    mov    last
,eax
                    jmp    @B            
;这些条件都符合才能置换last与last1,并再记录
                .endif
            .endif
        .endif
        
;一旦有条件不符合就说明是全新操作,记录操作
        mov    ecx,coutl
        mov    eax
,last
        mov    last1
,eax
        lea    edi
,load[ecx]
        stosb
        inc    ecx
        mov    coutl
,ecx
        mov    eax
,@last
    .endif
    mov    last
,eax        ;把这一句拿出来的原因是我觉得把三句节省为一句,也好,毕竟是对mem的操作嘛
    
    pop    edi
    pop    esi
    pop    edx
    pop    ecx
    ret

_load endp

;------------产生随机数的通用程序
iRand   proc uses ecx edx @first:DWORD, @second:DWORD
   invoke GetTickCount 
; 取得随机数种子,当然,可用别的方法代替
   mov    edx,eax
   invoke    nrandom
,@second
   add    edx
,eax
   invoke    nrandom
,@second
   add    edx
,eax
   invoke    nrandom
,@second
   add    edx
,eax
   mov ecx
, 23         ; X = ecx = 23
   mul ecx             ; eax = eax * X
   add eax, 7          ; eax = eax + Y (Y = 7)
   mov ecx, @second     ; ecx = 上限
   sub ecx, @first      ; ecx = 上限 - 下限
   inc ecx             ; Z = ecx + 1 (得到了范围)
   xor edx, edx        ; edx = 0
   div ecx             ; eax = eax mod Z (余数在edx里面)
   add edx, @first      ; 修正产生的随机数的范围
   mov eax, edx        ; eax = Rand_Number
   ret
iRand   endp 



include    draw.asm
include    action.asm

_breakit    proc    @cout
    LOCAL    @lpfunc
[8]:DWORD
    mov    eax
,offset _action1
    mov    @lpfunc
[00h],eax
    mov    eax
,offset _action3
    mov    @lpfunc
[04h],eax
    mov    eax
,offset _action5
    mov    @lpfunc
[08h],eax
    mov    eax
,offset _action7
    mov    @lpfunc
[0ch],eax
    mov    eax
,offset _action9
    mov    @lpfunc
[10h],eax
    mov    eax
,offset _action11
    mov    @lpfunc
[14h],eax
    
    invoke    _resetMofang
    mov    eax
,coutl
    .while    eax < @cout
        invoke    iRand
,0,5
        push    
1
        shl    eax
,1
        shl    eax
,1
        call    @lpfunc
[eax]
        mov    eax
,coutl
    .endw
    invoke    PostMessage
,hWin,WM_PAINT,NULL,NULL
    invoke    PostMessage
,hWinMain,WM_PAINT,NULL,NULL
    ret

_breakit endp


_DLG_proc    proc    hWnd
,wMsg,wParam,lParam
    
    mov    eax
,wMsg
    .if    eax 
==    WM_COMMAND
        mov eax
,wParam 
        .if ax 
== IDOK
            invoke    GetDlgItemInt
,hWnd,IDC_NUM,NULL,TRUE
            mov    _Result
,eax
            invoke    EndDialog
,hWnd,NULL
        .endif
    .elseif    eax 
== WM_CLOSE
        mov    _Result
,0
        invoke    EndDialog
,hWnd,NULL
    .endif
    xor    eax
,eax
    
    ret
    
_DLG_proc    endp

;------------主消息
_MainProc    proc    hWnd,wMsg,wParam,lParam
    
    mov    eax
,wMsg
    .if    eax 
== WM_PAINT
        mov    eax
,hWnd
        .if    eax 
== hWinMain
            invoke    _initMofang
,1        ;统一作初始
        .else
            invoke    _initMofang
,0
        .endif
    .elseif    eax 
==    WM_COMMAND
        mov eax
,wParam 
        .if (ax > IDC_1-
1) &&(ax < IDC_12+1)
            .if    ax 
== IDC_1
                invoke    _action1
,1
            .elseif    ax 
== IDC_2
                invoke    _action1
,3
            .elseif    ax 
== IDC_3
                invoke    _action3
,1
            .elseif    ax 
== IDC_4
                invoke    _action3
,3
            .elseif    ax 
== IDC_5
                invoke    _action5
,1
            .elseif    ax 
== IDC_6
                invoke    _action5
,3
            .elseif    ax 
== IDC_7
                invoke    _action7
,1
            .elseif    ax 
== IDC_8
                invoke    _action7
,3
            .elseif    ax 
== IDC_9
                invoke    _action9
,1
            .elseif    ax 
== IDC_10
                invoke    _action9
,3
            .elseif    ax 
== IDC_11
                invoke    _action11
,1
            .elseif    ax 
== IDC_12
                invoke    _action11
,3
                
;以上一段是转动
            .endif
            invoke    PostMessage
,hWinMain,WM_PAINT,NULL,NULL
            invoke    PostMessage
,hWin,WM_PAINT,NULL,NULL
        .elseif    (ax > IDC_pageup-
1) && (ax < IDC_home+1)
            .if    ax 
==IDC_pageup
                mov    eax
,nAlpha
                add    eax
,08h
                .if    eax > 0ffh
                    push    0ffh
                .else
                    push    eax
                .endif
                pop    nAlpha
            .elseif    ax 
==IDC_pagedown
                mov    eax
,nAlpha
                sub    eax
,08h
                .if    eax < 
0
                    push    
0
                .else
                    push    eax
                .endif
                pop    nAlpha
            .elseif    ax 
==IDC_end
                push    
0
                pop    nAlpha
            .elseif    ax 
==IDC_home
                push    0ffh
                pop    nAlpha
                
;以上一段是透明
            .endif
            invoke    SetLayeredWindowAttributes
,hWinMain,0eeh,nAlpha,2
        .elseif    ax 
== IDC_EXIT
            invoke    PostMessage
,hWnd,WM_CLOSE,NULL,NULL
        .elseif    ax 
== IDC_reset
            invoke    _resetMofang
        .elseif ax 
== IDC_copyright
            MsgBox    hWinMain
,addr szCopyRight,"版权声明",MB_OK or MB_ICONINFORMATION
        .elseif    ax 
== IDC_help
            szText    @szHelpName
,"使用说明.txt"
            invoke    ShellExecute
,0,0,addr @szHelpName,0,0,SW_SHOW
            .if    eax < 
31
                MsgBox    hWinMain
," 使用说明 文件丢失!",NULL,MB_OK or MB_ICONWARNING
            .endif
        .elseif    (ax >IDC_Low-
1) && (ax < IDC_Self+1)
            .if    ax 
== IDC_Low
                push    
10
            .elseif    ax 
== IDC_Mid
                push    
25
            .elseif    ax 
== IDC_High
                push    
50
            .else
                invoke    DialogBoxParam
,hInstance,DLG_MAIN,hWinMain,addr _DLG_proc,NULL
                mov    eax
,_Result
                .if    eax 
== 0
                    jmp    @F
                .endif
                push    eax
            .endif
            call    _breakit
        .endif
    .elseif    eax 
== WM_CLOSE
        invoke    _out
        invoke    DestroyWindow
,hWnd
        invoke    PostQuitMessage
,NULL
    .else
    @@:    invoke    DefWindowProc
,hWnd,wMsg,wParam,lParam
        ret
    .endif
    xor    eax
,eax
    ret
_MainProc    endp

_MAIN    proc
    LOCAL    @stWndClass:WNDCLASSEX
    
    invoke    _colors        
;先设置一些笔刷以备后用
    invoke    _init
    
    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 _MainProc
    mov    @stWndClass.hbrBackground
,2            ;窗口背景颜色
    mov    @stWndClass.lpszClassName,offset szClassName
    invoke    RegisterClassEx
,addr @stWndClass
    invoke    LoadMenu
,hInstance,IDM_MAIN        ;菜单
    mov    hMenu,eax
    
    invoke    CreateWindowEx
,WS_EX_DLGMODALFRAME,
        offset szClassName
,offset _name,
        WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX
,;这里我禁了trickframe,不想让改变大小
        MY_X,MY_Y,MY_W,MY_H,        ;位置,大小
        NULL,hMenu,hInstance,NULL
    mov    hWin
,eax
    invoke    LoadIcon
,hInstance,ICO_MAIN            ;图标
    mov    hIcon,eax
    invoke    SendMessage
,hWin,WM_SETICON,ICON_BIG,hIcon
    invoke    ShowWindow
,hWin,SW_SHOWNORMAL
    invoke    UpdateWindow
,hWin
    
    
;下面这个是子窗口
    mov    @stWndClass.lpfnWndProc,NULL        ;不准备再加个消息处理,也不能重复消息处理
    invoke    CreateWindowEx,WS_EX_DLGMODALFRAME or 80000h,    ;这里加了一个WS_EX_LAYERED的属性
        offset szClassName,offset _name,
        WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX
,
        MY_X
,MY_Y,MY_W,MY_H,
        hWin
,hMenu,hInstance,NULL
    mov    hWinMain
,eax
    invoke    SendMessage
,hWinMain,WM_SETICON,ICON_BIG,hIcon
    invoke    ShowWindow
,hWinMain,SW_SHOWNORMAL
    invoke    UpdateWindow
,hWinMain
    
;上面一坨注册窗口的过程比diglog麻烦多了
    invoke    LoadAccelerators,hInstance,IDA_MAIN
    mov    hAcc
,eax        ;注册了加速键,嘿嘿
    invoke    SetLayeredWindowAttributes,hWinMain,0eeh,nAlpha,2        ;非要设置透明度

    .while    TRUE
        invoke    GetMessage
,addr @stMsg,NULL,0,0
        .break    .if eax    
== 0
        invoke    TranslateAccelerator
,hWinMain,hAcc,addr @stMsg    ;其实无论传给哪个窗口都是统一消息处理
        .if    !eax
            invoke    TranslateMessage
,addr @stMsg
            invoke    DispatchMessage
,addr @stMsg
        .endif
    .endw
    xor    eax
,eax
    ret

_MAIN endp
start:
    invoke    GetModuleHandle
,NULL
    mov    hInstance
,eax
    invoke    _MAIN
    invoke    ExitProcess
,NULL
end start 

 

action.asm

 


_Point_script    proc    @pos
    
    
;对原点进行定位
    mov    eax,@pos
    .if    eax 
== 1
        invoke    GetClientRect
,hWinMain,addr 

@rect_now
    .else
        invoke    GetClientRect
,hWin,addr 

@rect_now
    .endif
    
    mov    eax
,@rect_now.right
    sub    eax
,@rect_now.left
    shr    eax
,1
    add eax
,@rect_now.left
    .if    eax >
0
        mov    Z_X
,eax
    .endif
    
    mov    ecx
,@rect_now.bottom
    sub    ecx
,@rect_now.top
    shr    ecx
,1
    add    ecx
,@rect_now.top
    .if    eax >
0
        mov    Z_Y
,ecx
    .endif
    
    
    
    
;可以对高与宽进行运算设定,但现在不做运算
    push    20
    pop    p_h
    push    
48
    pop    p_w
    
    
    mov    eax
,p_w        ;计算3倍量
    shl    eax,1
    add    eax
,p_w
    mov    p_w3
,eax
    mov    eax
,p_h
    shl    eax
,1
    add    eax
,p_h
    mov    p_h3
,eax
    
    
    
    ret

_Point_script endp

_draw_Block    proc    @nshr
    xor    edi
,edi
    mov    @i
,edi
    .while    ebx    < 
108
        mov    eax
,info[ebx]
        mov    ecx
,@nshr
        shr    eax
,cl
        and    eax
,7
        .if    eax !
= 7
            invoke    

SelectObject
,_hdc,hBrush[eax*4]
            invoke    Polygon
,_hdc,addr 

@p
[edi],4
            add    edi
,10h
            inc    @i
        .endif
        add    ebx
,4
        .break    .if    @i 
== 3
    .endw
    ret

_draw_Block endp

;左右两个侧边
_draw_side    proc    @X,@Y,@nshr
    
    xor    ebx
,ebx
    
    mov    eax
,@X
    
    mov    @p
,eax
    mov    @p
[18h],eax
    mov    @p
[20h],eax
    mov    @p
[38h],eax
    
    mov    eax
,@Y
    
    mov    @p
[4],eax
    add    eax
,p_w
    mov    @p
[1ch],eax
    add    eax
,p_w
    mov    @p
[24h],eax
    add    eax
,p_w
    mov    @p
[3ch],eax
    
    mov    eax
,@p[0]
    add    eax
,p_h
    mov    @p
[8],eax
    mov    @p
[10h],eax
    mov    @p
[28h],eax
    mov    @p
[30h],eax
    
    mov    eax
,@p[4]
    sub    eax
,p_h
    mov    @p
[0ch],eax
    add    eax
,p_w
    mov    @p
[14h],eax
    add    eax
,p_w
    mov    @p
[2ch],eax
    add    eax
,p_w
    mov    @p
[34h],eax
    
    invoke    _draw_Block
,@nshr
    
    mov    eax
,@p[8]
    add    eax
,p_h
    mov    @p
,eax
    mov    @p
[18h],eax
    mov    @p
[20h],eax
    mov    @p
[38h],eax
    
    mov    eax
,@p[0ch]
    sub    eax
,p_h
    mov    @p
[4],eax
    add    eax
,p_w
    mov    @p
[1ch],eax
    add    eax
,p_w
    mov    @p
[24h],eax
    add    eax
,p_w
    mov    @p
[3ch],eax
    
    invoke    _draw_Block
,@nshr
    
    mov    eax
,@p[0]
    add    eax
,p_h
    mov    @p
[8],eax
    mov    @p
[10h],eax
    mov    @p
[28h],eax
    mov    @p
[30h],eax
    
    mov    eax
,@p[4]
    sub    eax
,p_h
    mov    @p
[0ch],eax
    add    eax
,p_w
    mov    @p
[14h],eax
    add    eax
,p_w
    mov    @p
[2ch],eax
    add    eax
,p_w
    mov    @p
[34h],eax
    
    invoke    _draw_Block
,@nshr
    
    ret

_draw_side endp

_draw_r    proc
    
    push    
6
    mov    ecx
,p_h3
    mov    edx
,p_w3
    mov    eax
,Z_Y
    add    eax
,ecx
    sub    eax
,edx        ;Y
    push    eax
    mov    ecx
,p_h3
    mov    edx
,p_w3
    mov    eax
,Z_X
    sub    eax
,ecx
    add    eax
,edx
    push    eax        
;X
    call    _draw_side
    
    ret

_draw_r endp

_draw_l    proc
    
;参数需要反入栈
    push    12
    mov    ecx
,p_h3
    mov    eax
,Z_Y
    add    eax
,ecx
    sub    eax
,p_w3
    push    eax        
;Y
    mov    ecx,p_h3
    mov    eax
,Z_X
    sub    eax
,ecx
    push    eax        
;这是X
    call    _draw_side
    
    ret

_draw_l endp

_draw_updown    proc    @X
,@Y,@nshr
    xor    ebx
,ebx
    
    mov    eax
,@Y
    
    mov    @p
[4],eax
    mov    @p
[1ch],eax
    mov    @p
[24h],eax
    mov    @p
[3ch],eax
    
    mov    eax
,@X
    mov    @p
[0],eax
    add    eax
,p_w
    mov    @p
[18h],eax
    add    eax
,p_w
    mov    @p
[20h],eax
    add    eax
,p_w
    mov    @p
[38h],eax
    
    mov    eax
,@p[4]
    sub    eax
,p_h
    mov    @p
[0ch],eax
    mov    @p
[14h],eax
    mov    @p
[2ch],eax
    mov    @p
[34h],eax
    
    mov    eax
,@p[0]
    add    eax
,p_h
    mov    @p
[8],eax
    add    eax
,p_w
    mov    @p
[10h],eax
    add    eax
,p_w
    mov    @p
[28h],eax
    add    eax
,p_w
    mov    @p
[30h],eax
    
    invoke    _draw_Block
,@nshr
    
    mov    eax
,@p[0ch]
    sub    eax
,p_h
    mov    @p
[4h],eax
    mov    @p
[1ch],eax
    mov    @p
[24h],eax
    mov    @p
[3ch],eax
    
    mov    eax
,@p[8]
    add    eax
,p_h
    mov    @p
[0],eax
    add    eax
,p_w
    mov    @p
[18h],eax
    add    eax
,p_w
    mov    @p
[20h],eax
    add    eax
,p_w
    mov    @p
[38h],eax

    invoke    _draw_Block
,@nshr
    
    
    mov    eax
,@p[4]
    sub    eax
,p_h
    mov    @p
[0ch],eax
    mov    @p
[14h],eax
    mov    @p
[2ch],eax
    mov    @p
[34h],eax
    
    mov    eax
,@p[0]
    add    eax
,p_h
    mov    @p
[8],eax
    add    eax
,p_w
    mov    @p
[10h],eax
    add    eax
,p_w
    mov    @p
[28h],eax
    add    eax
,p_w
    mov    @p
[30h],eax
    
    invoke    _draw_Block
,@nshr

    ret
    
    ret

_draw_updown endp

_draw_u    proc
    push    
0
    mov    ecx
,p_h3
    mov    eax
,Z_Y
    add    eax
,ecx
    mov    ecx
,p_w3
    sub    eax
,ecx
    push    eax        
;Y
    mov    ecx,p_h3
    mov    eax
,Z_X
    sub    eax
,ecx
    push    eax        
;X
    call    _draw_updown
    ret

_draw_u endp

_draw_d    proc
    push    
3
    mov    eax
,p_h3
    add    eax
,Z_Y
    push    eax        
;Y
    mov    eax,p_h3
    mov    edx
,Z_X
    sub    edx
,eax
    mov    eax
,edx
    push    eax        
;X
    call    _draw_updown

    ret

_draw_d endp

_draw_face    proc    @X
,@Y,@nshr
    
    xor    ebx
,ebx
    
    mov    eax
,@X
    mov    @p
,eax
    mov    @p
[8],eax
    
    add eax
,p_w
    mov    @p
[10h],eax
    mov    @p
[18h],eax
    add eax
,p_w
    mov    @p
[20h],eax
    mov    @p
[28h],eax
    add eax
,p_w
    mov    @p
[30h],eax
    mov    @p
[38h],eax


    mov    ecx
,@Y
    
    mov    @p
[4],ecx
    mov    @p
[1ch],ecx
    mov    @p
[24h],ecx
    mov    @p
[3ch],ecx
    add    ecx
,p_w
    mov    @p
[0ch],ecx
    mov    @p
[14h],ecx
    mov    @p
[2ch],ecx
    mov    @p
[34h],ecx
    

    invoke    _draw_Block
,@nshr
    
    mov    ecx
,p_w
    shl    ecx
,1
    add    ecx
,@p[4]
    mov    @p
[4],ecx
    mov    @p
[1ch],ecx
    mov    @p
[24h],ecx
    mov    @p
[3ch],ecx

    invoke    _draw_Block
,@nshr
    
    mov    ecx
,p_w
    shl    ecx
,1
    add    ecx
,@p[0ch]
    mov    @p
[0ch],ecx
    mov    @p
[14h],ecx
    mov    @p
[2ch],ecx
    mov    @p
[34h],ecx

    invoke    _draw_Block
,@nshr
    
    ret

_draw_face endp

_draw_f    proc

    push    
15
    mov    ecx
,p_h3
    mov    eax
,Z_Y
    add    eax
,ecx
    mov    ecx
,p_w3
    sub    eax
,ecx
    push    eax            
;Y
    mov    ecx,p_h3
    mov    eax
,Z_X
    sub    eax
,ecx
    push    eax            
;X
    call    _draw_face
    
    ret

_draw_f endp

_draw_b    proc
    push    
9
    mov    ecx
,p_w3
    mov    eax
,Z_Y
    sub    eax
,ecx
    push    eax        
;Y
    mov    eax,Z_X
    push    eax        
;X
    call    _draw_face

    ret

_draw_b endp

_draw_3side    proc    

@lpfunc1
,@lpfunc2,@lpfunc3,@hWnd
    
    push    esi
    push    edi
    push    ebx
    invoke    BeginPaint
,@hWnd,addr @ps
    invoke    EndPaint
,@hWnd,addr @ps
    invoke    GetDC
,@hWnd
    mov    _hdc
,eax
    call    @lpfunc1
    call    @lpfunc2
    call    @lpfunc3
    invoke    ReleaseDC
,@hWnd,_hdc
    pop    esi
    pop    edi
    pop    ebx
    
    ret

_draw_3side endp

_drawf    proc
    push    hWinMain
    mov    eax
,offset    _draw_f
    push    eax
    mov    eax
,offset    _draw_u
    push    eax
    mov    eax
,offset    _draw_r
    push    eax
    call    _draw_3side
    
    ret

_drawf endp

_drawb    proc
    
    push    hWin
    mov    eax
,offset    _draw_b
    push    eax
    mov    eax
,offset    _draw_d
    push    eax
    mov    eax
,offset    _draw_l
    push    eax
    call    _draw_3side
    ret

_drawb endp

;重置info数组,coutl计数置0,步骤类型记录重置
_resetMofang    proc
    push    ecx
    mov    ecx
,27
@@:    push    source_info
[ecx*4-4]
    pop    info
[ecx*4-4]
    loop    @B
    pop    ecx
    xor    eax
,eax
    mov    coutl
,eax
    mov    eax
,7eh
    mov    last
,eax
    mov    last1
,eax
    invoke    PostMessage
,hWinMain,WM_PAINT,NULL,NULL
    invoke    PostMessage
,hWin,WM_PAINT,NULL,NULL
    ret

_resetMofang endp

;预备从ini文件里读初始化信息,但现在只做reset
_initMofang    proc    @pos
    invoke    _Point_script
,@pos
    mov    eax
,@pos
    .if    eax 
== 1
        call    _drawf
    .else
        call    _drawb
    .endif
    ret
_initMofang endp

 

action.asm

 


;通用程序,实现参数入栈出栈及多次调用
;
入口参数:    @n1~8 八个参加转动的方块代号
;
            @count 重复执行的次数
;
            @lpfunc 计算程序的入口地址
_action_all    proc    @n1,@n2,@n3,@n4,@n5,@n6,@n7,@n8,@count,@lpfunc
    LOCAL    @n
[8]
    push    ecx
    
    push    @n3        
;参数反入栈,顺出栈
    pop    @n[00h]
    push    @n5
    pop    @n
[04h]
    push    @n8
    pop    @n
[08h]
    push    @n2
    pop    @n
[0ch]
    push    @n7
    pop    @n
[10h]
    push    @n1
    pop    @n
[14h]
    push    @n4
    pop    @n
[18h]
    push    @n6
    pop    @n
[1ch]
    
    .while    @count >
0
        mov    ecx
,8
@@:        mov    eax
,@n1[ecx*4-4]
        push    info
[eax]
        loop    @B
        
        mov    ecx
,8
@@:        pop    eax
        push    @n
[ecx*4-4]
        call    @lpfunc
        loop    @B
        
        dec    @count
    .endw

    pop    ecx
    ret

_action_all endp
;这类函数还有一个默认的入口参数:EAX,另外这里不能破坏ecx
_action1_1    proc    @pos
    push    ecx
    
    push    eax
    push    eax
    and    eax
,1c0h
    shl    eax
,12
    pop    edx
    and    edx
,0003fe00h
    or    edx
,eax
    shr    edx
,3
    pop    eax
    and    eax
,03fh
    or    eax
,edx
    mov    ebx
,@pos
    mov    ecx
,info[ebx]
    and    ecx
,0FFFC0000h
    or    eax
,ecx
    mov    info
[ebx],eax
    
    pop    ecx
    ret

_action1_1 endp

;局部通用
_action1    proc    @count
    mov    eax
,offset _action1_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info0
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    21h
    .else
        push    41h
    .endif
    call    _load
    ret

_action1 endp

_action3    proc    @count
    
    mov    eax
,offset _action1_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info1
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    22h
    .else
        push    42h
    .endif
    call    _load
    
    ret

_action3 endp

_action5_1    proc    @pos
    LOCAL    @tmp
    push    ecx
    
    push    eax
    push    eax
    push    eax
    push    eax
    
    push    
0
    pop    @tmp
    
    and    eax
,07h        ;这是上色
    shl    eax,9        ;转到后色
    or    @tmp,eax
    
    pop    eax
    and    eax
,0E00h    ;这是后色
    shr    eax,6        ;变成下色
    or    @tmp,eax
    
    pop    eax
    and    eax
,38h
    shl    eax
,12        ;下色--前色
    or    @tmp,eax
    
    pop    eax
    and    eax
,38000h
    shr    eax
,15
    or    @tmp
,eax
    
    pop    eax
    and    eax
,71C0h    ;保存左右色
    or    eax,@tmp        ;出结果
    
    mov    ebx
,@pos
    mov    ecx
,info[ebx]
    and    ecx
,0FFFC0000h
    or    eax
,ecx
    mov    info
[ebx],eax
    
    pop    ecx
    ret

_action5_1 endp

_action5    proc    @count
    
    mov    eax
,offset _action5_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info2
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    23h
    .else
        push    43h
    .endif
    call    _load
    
    ret

_action5 endp

_action7    proc    @count
    
    mov    eax
,offset _action5_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info3
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    24h
    .else
        push    44h
    .endif
    call    _load
    
    ret

_action7 endp

_action9_1    proc    @pos
    
    LOCAL    @tmp
    push    ecx
    
    push    eax
    push    eax
    push    eax
    push    eax
    
    push    
0
    pop    @tmp
    
    and    eax
,07h        ;这是上色
    shl    eax,12        ;转到左色
    or    @tmp,eax
    
    pop    eax
    and    eax
,7000h    ;这是左色
    shr    eax,9        ;变成下色
    or    @tmp,eax
    
    pop    eax
    and    eax
,38h
    shl    eax
,3        ;下色--右色
    or    @tmp,eax
    
    pop    eax
    and    eax
,1C0h
    shr    eax
,6        ;右--上
    or    @tmp,eax
    
    pop    eax
    and    eax
,38E00h    ;保存前后色
    or    eax,@tmp        ;出结果
    
    mov    ebx
,@pos
    mov    ecx
,info[ebx]
    and    ecx
,0FFFC0000h
    or    eax
,ecx
    mov    info
[ebx],eax
    
    pop    ecx
    ret

_action9_1 endp

_action9    proc    @count

    mov    eax
,offset _action9_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info4
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    25h
    .else
        push    45h
    .endif
    call    _load
    
    ret

_action9 endp

_action11    proc    @count
    
    mov    eax
,offset _action9_1
    push    eax
    mov    ecx
,8
    push    @count
@@:    push    turn_info5
[ecx*4-4]
    loop    @B
    call    _action_all
    mov    eax
,@count
    .if    eax 
== 1
        push    26h
    .else
        push    46h
    .endif
    call    _load
    
    
    ret

_action11 endp

mofang.inc

 



DLG_MAIN    equ    
4210
ICO_MAIN    equ    
4210
IDM_MAIN    equ    
4210
IDA_MAIN    equ    
4210

IDC_copyright    equ    
4210
IDC_1    equ    
4211
IDC_2    equ    
4212
IDC_3    equ    
4213
IDC_4    equ    
4214
IDC_5    equ    
4215
IDC_6    equ    
4216
IDC_7    equ    
4217
IDC_8    equ    
4218
IDC_9    equ    
4219
IDC_10    equ    
4220
IDC_11    equ    
4221
IDC_12    equ    
4222

IDC_reset    equ    
4230
IDC_EXIT    equ    
4231
IDC_help    equ    
4232
IDC_Low        equ    
4233
IDC_Mid        equ    
4234
IDC_High    equ    
4235
IDC_Self    equ    
4236


IDC_pageup    equ    
4301
IDC_pagedown    equ    
4302
IDC_end    equ    
4303
IDC_home    equ    
4304

IDC_NUM    equ    
4401

MY_X    equ    
330
MY_Y    equ    
240
MY_W    equ    
320
MY_H    equ    
340

_red    equ    000000FFh
_yellow    equ    0000FFFFh
_cheng    equ    000080FFh
_white    equ    00FFFFFFh
_blue    equ    00FF0000h
_green    equ    0000FF00h
_black    equ    00000000h


.const
;原始信息,当魔方完全初始的时候的正确信息
source_info    dd    00a81ffdh,01887ffdh,02987efdh
    dd    03281fffh
,044087FFFh,05187effh
    dd    06681fe7h
,07487fe7h,08587ee7h
    
    dd    10a39ffdh
,5183FFFDh,1293fefdh
    dd    53239FFFh
,5403FFFFh,5513FEFFh
    dd    16639fe7h
,5743FFE7h,1853fee7h
    
    dd    20a795fdh
,2187f5fdh,2297f4fdh
    dd    232795ffh
,6407F5FFh,2517f4ffh
    dd    266795e7h
,2747f5e7h,2857f4e7h
    dd    
0,0,0,0
turn_info0    dd    00h
,04h,08h,24h,2ch,48h,4ch,50h
turn_info1    dd    18h
,1ch,20h,3ch,44h,60h,64h,68h
turn_info2    dd    00h
,0ch,18h,24h,3ch,48h,54h,60h
turn_info3    dd    08h
,14h,20h,2ch,44h,50h,5ch,68h
turn_info4    dd    00h
,04h,08h,0ch,14h,18h,1ch,20h
turn_info5    dd    48h
,4ch,50h,54h,5ch,60h,64h,68h
    dd    
0,0,0,0
.data
nAlpha        dd    0d0h        
;透明度,初始为d0
;
正常初始化魔方信息,如果有ini文件,将被覆盖
info    dd    00a81ffdh,01887ffdh,02987efdh
    dd    03281fffh
,044087FFFh,05187effh
    dd    06681fe7h
,07487fe7h,08587ee7h
    
    dd    10a39ffdh
,5183FFFDh,1293fefdh
    dd    53239FFFh
,5403FFFFh,5513FEFFh
    dd    16639fe7h
,5743FFE7h,1853fee7h
    
    dd    20a795fdh
,2187f5fdh,2297f4fdh
    dd    232795ffh
,6407F5FFh,2517f4ffh
    dd    266795e7h
,2747f5e7h,2857f4e7h
    dd    
0,0,0,0
szCopyRight    db    
10,"江西理工大学 环境032班  ",10,10,9,"Triones",10,10,"  版权所有  2006(c)",0
szClassName    db    'MyClass'
,0
_name    db    
"魔方(ver 1.0)",0
fmt_num    db    
"%d",0
fmt_info    db    
"%02d",0
szFileName    db    
".mofang.ini",0
szSecName    db    
"魔方信息",0
szKeyAlpha    db    
"Alpha",0
szKeyInfo    db    
"info",0
szKeyLoad    db    
"Load",0
szKeyCout_l    db    
"cont_l",0
coutl    dd    
0
last    dd    07Eh
last1    dd    07Eh
.data?
hInstance    dd    ?
hWinMain    dd    ?        
;顶层窗口
hWin        dd    ?        ;作为底层窗口使用
hAcc        dd    ?        ;加速键句柄
hIcon        dd    ?        ;图标句柄
hMenu        dd    ?
_Result        dd    ?
p_h    dd    ?                        
;point height
p_w    dd    ?                        ;point width
p_h3    dd    ?
p_w3    dd    ?                    
;3*w
_hdc    HDC    ?        ;设备句柄
Z_X    dd    ?            ;绘画原点的变量
Z_Y    dd    ?
@p    dd    
64    dup    (?)            ;因为程序结构的需要放上来,但它还是小局部使用的共用全局数组
@i    dd    ?
@stMsg    MSG    <>
@ps    PAINTSTRUCT    <>
@rect_now    RECT    <>
hBrush    dd    
8    dup    (?)
hPen    dd    
8    dup    (?)
hPen2    dd    
8    dup    (?)
KeyInfo    db    
256    dup    (?)
tmp_str    db    
360    dup    (?)
_tmp_str    db    
128    dup    (?)
load    db    
2048    dup    (?)

 

mofang.rc

 

#include        <C:masm32include esource.h>

#define    ICO_MAIN    4210
#define    DLG_MAIN    4210
#define    IDM_MAIN    4210
#define    IDA_MAIN    4210

#define    IDC_copyright    4210
#define    IDC_1    4211
#define    IDC_2    4212
#define    IDC_3    4213
#define    IDC_4    4214
#define    IDC_5    4215
#define    IDC_6    4216
#define    IDC_7    4217
#define    IDC_8    4218
#define    IDC_9    4219
#define    IDC_10    4220
#define    IDC_11    4221
#define    IDC_12    4222

#define    IDC_reset    4230
#define    IDC_EXIT    4231
#define    IDC_help    4232
#define    IDC_Low        4233
#define    IDC_Mid        4234
#define    IDC_High    4235
#define    IDC_Self    4236


#define    IDC_pageup    4301
#define    IDC_pagedown    4302
#define    IDC_end    4303
#define    IDC_home    4304

#define    IDC_NUM    4401


ICO_MAIN    ICON        
"cm02_triones.ico"

IDM_MAIN    MENU    discardable
{
 popup    
"操作(&O)"
    
{
     menuitem    
"重置魔方(&R)",IDC_reset
     menuitem    separator
     menuitem    
"退出(&X)",IDC_EXIT
    }

 popup    
"游戏(&G)"
    
{
     menuitem    
"初级(&L)",IDC_Low
     menuitem    
"中级(&M)",IDC_Mid
     menuitem    
"高级(&H)",IDC_High
     menuitem    
"自定义(&S)",IDC_Self
    }

 popup    
"帮助(&H)"
    
{
     menuitem    
"使用说明(&H)",IDC_help
     menuitem    separator
     menuitem    
"关于(&A)",IDC_copyright
    }

}


IDA_MAIN    accelerators
{
 
"a",IDC_1
 
"A",IDC_1
 
"d",IDC_2
 
"D",IDC_2
 VK_LEFT,IDC_3,VIRTKEY
 VK_RIGHT,IDC_4,VIRTKEY
 
"w",IDC_5
 
"W",IDC_5
 
"s",IDC_6
 
"S",IDC_6
 VK_UP,IDC_7,VIRTKEY
 VK_DOWN,IDC_8,VIRTKEY
 
"1",IDC_9
 
"3",IDC_10
 
"7",IDC_11
 
"9",IDC_12
 
 
0x21,IDC_pageup,VIRTKEY    //VK_PGUP与VK_PGDN不知道为什么这里不认识
 0x22,IDC_pagedown,VIRTKEY
 VK_END,IDC_end,VIRTKEY
 VK_HOME,IDC_home,VIRTKEY
 
}


DLG_MAIN DIALOG 
20,15,150,41
STYLE DS_MODALFRAME 
| WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_3DLOOK
CAPTION 
"魔方设置"
FONT 
9"宋体"
{
 LTEXT    
" 请输入打乱魔方的次数:",-1,4,15,100,11
 EDITTEXT IDC_NUM,
100,12,14,11,ES_NUMBER | ES_CENTER
 PUSHBUTTON    
"OK",IDOK,120,10,23,14
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值