Subversion Repositories Kolibri OS

Rev

Rev 1824 | Rev 3950 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;http://sources.ru/pascal/gamestxt/go-moku.zip
  2.  
  3. N equ 19                ; Size of the board
  4.  
  5. use32
  6.         org     0x0
  7.         db      'MENUET01'
  8.         dd      0x1
  9.         dd      START
  10.         dd      I_END
  11.         dd      (I_END+200+13*N*N) and not 3
  12.         dd      (I_END+200+13*N*N) and not 3
  13.         dd      0x0,0x0
  14.  
  15. include '../../../macros.inc'
  16. include 'lang.inc'
  17.  
  18. AttackFactor dw 1       ; Importance of attack (1..16)
  19.  
  20. START:
  21.  
  22.         mcall   40,100111b
  23.         mcall   40,100111b
  24.         mcall   3
  25.         mov     [rsx1],ax
  26.         shr     eax,16
  27.         mov     [rsx2],ax
  28.  
  29. redraw_all:
  30.         mcall   9,proc_info,-1
  31.         test    [proc_info.wnd_state], 0x04             ; is rolled_up?
  32.         jz      @f
  33.         mcall   0,100*65536+(16*N+12),,0x34FFFFFF,,title
  34.         jmp     still
  35.   @@:
  36.         mcall   12,1
  37.         mcall   48,4
  38.         xchg    eax,ecx
  39.         add     ecx,100*65536+(16*N+26)
  40.         mcall   0,100*65536+(16*N+12),,0x34FFFFFF,,title
  41.         mcall   38,2*65536+(16*N),20*65536+20,0x00a0a0a0;000000
  42.         mov     edi,N
  43.   @@:   add     ecx,16*65536+16
  44.         mcall
  45.         dec     edi
  46.         jnz     @b
  47.         push    cx
  48.         mov     ecx,20*65536
  49.         pop     cx
  50.         mcall   ,1*65536+1
  51.         mov     edi,N
  52.   @@:   add     ebx,16*65536+16
  53.         mcall
  54.         dec     edi
  55.         jnz     @b
  56.  
  57.         mcall   8,3*65536+40,3*65536+12,2,0xFFFFFF
  58.         mcall   ,50*65536+40,,3,
  59.         mcall   4,7*65536+5,0x80000000,txt_buttons
  60.         mcall   12,2
  61.  
  62.  
  63. draw_pole:
  64. ;       mcall   48,4
  65. ;       xchg    eax,ecx
  66. ;       add     ecx,100*65536+(16*N+26)
  67. ;       mcall   0,100*65536+(16*N+12),,0x74FFFFFF,,title
  68.  
  69.         mov     esi,Board
  70.         mov     edi,N*N-N
  71.         mov     ebp,N
  72.         mov     ebx,(1+5)*65536+(21+5-1)
  73.         call    print_board
  74.         bt      [flags],0
  75.         jnc     @f
  76.         mcall   4,100*65536+6,0x800000ff,txt_go
  77. @@:     bt      [flags],3
  78.         jnc     @f
  79.         mcall   4,100*65536+6,0x800000ff,txt_tie
  80.         jmp     still
  81. @@:
  82.         bt      [flags],2
  83.         jnc     still
  84.         ret
  85. still:
  86.         mcall   10
  87.  
  88.         dec     al
  89.         jz      redraw_all
  90.         dec     al
  91.         jz      key
  92.         dec     al
  93.         jz      button
  94.         sub     al,3
  95.         jz      mouse
  96.         jmp     still
  97.  
  98. key:
  99.         mcall   2
  100.         btr     [flags],2
  101.         cmp     ah,97
  102.         jne     @f
  103. .auto:  bts     [flags],2
  104.         jmp     mouse.auto
  105. @@:     cmp     ah,110
  106.         je      button.new_game
  107.         jmp     still
  108.  
  109. button:
  110.         mcall   17
  111.         cmp     ah,1
  112.         jne     @f
  113.         mcall   -1
  114. @@:     cmp     ah,2
  115.         jne     key.auto
  116. .new_game:
  117.         mov     [TotalLines],2 * 2 * (N * (N - 4) + (N - 4) * (N - 4))
  118.         mov     [WinningLine],0x0
  119.         mov     [X],(N + 1)/2
  120.         mov     [Y],(N + 1)/2
  121.         mov     [flags],0
  122.         mov     edi,Board
  123.         mov     ecx,(13*N*N/4)+1
  124.         xor     eax,eax
  125.         cld
  126. @@:     stosd
  127.         loop    @b
  128.         jmp     redraw_all
  129.  
  130. print_board:
  131.         cmp     byte [esi],0    ;ïóñòî
  132.         je      .null
  133.         cmp     byte [esi],1    ;X
  134.         je      .one
  135.         cmp     byte [esi],2    ;O
  136.         je      .two
  137.         bts     [flags],4
  138.         cmp     byte [esi],3    ;Õ âûèãðàë
  139.         je      .one
  140.         jmp     .two            ;0 âûèãðàë
  141.  
  142. .end:
  143.         inc     esi
  144.         dec     ebp
  145.         jnz     print_board
  146.         test    edi,edi
  147.         jz      @f
  148.         sub     edi,N
  149.         mov     ebp,N
  150.         add     ebx,-N*16*65536+16
  151.         jmp     print_board
  152. @@:     ret
  153.  
  154. .one:
  155.         mov     ecx,0xd04ba010
  156.         bt      [flags],4
  157.         jnc     @f
  158.         mov     ecx,0xd0ff0000
  159.         btr     [flags],4
  160. @@:     push    edi
  161.         mcall   4,,,txt_x,,0xffffff
  162.         pop     edi
  163. .null:
  164.         add     ebx,16*65536;+16
  165.         jmp     .end
  166. .two:
  167.         mov     ecx,0xd000459a
  168.         bt      [flags],4
  169.         jnc     @f
  170.         mov     ecx,0xd0ff0000
  171.         btr     [flags],4
  172. @@:     push    edi
  173.         mcall   4,,,txt_o,,0xffffff
  174.         pop     edi
  175.         jmp     .null
  176.  
  177.  
  178. draw_one_symbol:
  179.         movzx   eax,[X]
  180.         mov     ebx,16
  181.         mul     ebx
  182.         shl     eax,16
  183.         add     eax,(1+5)*65536;
  184.         mov     ax,[Y]
  185.         mov     ecx,16
  186.         mul     cx
  187.         add     ax,(21+5-1)
  188.         xchg    eax,ebx
  189.  
  190.         movzx   eax,[Y]
  191.         push    ebx
  192.         mov     ebx,N
  193.         mul     bx
  194.         mov     bx,[X]
  195.         add     ax,bx
  196.         pop     ebx
  197.         mov     esi,Board
  198.         add     esi,eax
  199.         mov     edi,0
  200.         mov     ebp,1
  201.         call    print_board
  202. ret
  203.  
  204.  
  205. mouse:
  206.         bt      [flags],5
  207.         jc      still
  208.         mcall   37,2
  209.         test    eax,eax
  210.         jz      still
  211.         mcall   37,1
  212.         mov     dx,ax
  213.         shr     eax,16
  214.         cmp     dx,20
  215.         jbe     still
  216.         cmp     dx,(16*N+20)
  217.         jge     still
  218.         cmp     ax,1
  219.         jbe     still
  220.         cmp     ax,(16*N)
  221.         jge     still
  222.  
  223.         bt      [flags],0
  224.         jc      still
  225.         bt      [flags],3
  226.         jc      still
  227.         sub     ax,1
  228.         push    dx
  229.         xor     edx,edx
  230.         mov     cx,16
  231.         div     cx
  232.         pop     dx
  233.         mov     [X],ax
  234.         push    ax
  235.         sub     dx,20
  236.         mov     ax,dx
  237.         xor     dx,dx
  238.         div     cx
  239.         mov     [Y],ax
  240.         xor     dx,dx
  241.         mov     cx,N
  242.         mul     cx
  243.         pop     dx
  244.         add     ax,dx
  245.         cmp     ax,N*N
  246.         jge     still
  247.         mov     esi,Board
  248.  
  249.         cmp     byte [esi+eax],0
  250.         jne     still
  251.  
  252. .auto:  bt      [flags],0
  253.         jc      .end
  254.         bt      [flags],3
  255.         jc      .end
  256.  
  257.         btr     [flags],1       ;0 - 室 ¤¥« ¥â ¨£à®ª
  258.         bt      [flags],2
  259.         jnc     @f
  260.         call    FindMove
  261. @@:     call    MakeMove
  262.         call    draw_one_symbol
  263.         bt      [flags],0
  264.         jc      .end
  265.  
  266.         bts     [flags],1       ;1 - 室 ¤¥« ¥â cpu
  267.         call    FindMove
  268.         call    MakeMove
  269.         call    draw_one_symbol
  270. .end:   bt      [flags],0
  271.         jnc     @f
  272.         call    BlinkRow
  273.         btr     [flags],2
  274. @@:;    mcall   12,1
  275.         bt      [flags],3
  276.         jc      @f
  277.         bt      [flags],2
  278.         jnc     @f
  279.         call    draw_pole
  280.         jmp     .auto
  281. @@:     jmp     draw_pole
  282.  
  283.  
  284.  
  285.  
  286. winline: dw 1,0, 1,1, 1,-1, 0,1  ;X,Y
  287. BlinkRow:
  288.         movzx   ecx,[WinningLine]
  289.         mov     eax,[winline+(ecx-1)*4]
  290.         push    ax      ;Dx
  291.         shr     eax,16
  292.         push    ax      ;Dy
  293.         movzx   eax,[Y]
  294.         mov     si,N
  295.         mul     si
  296.         add     ax,[X]
  297.         mov     cl,[Board+eax]
  298. @@:     movzx   eax,[Y]
  299.         add     ax,[esp]
  300.         mov     [Y],ax
  301.         test    eax,eax
  302.         jz      .ret
  303.         cmp     eax,N-1
  304.         jg      .ret
  305.         movzx   ebx,[X]
  306.         add     bx,[esp+2]
  307.         mov     [X],bx
  308.         test    ebx,ebx
  309.         jz      .ret
  310.         cmp     ebx,N-1
  311.         jg      .ret
  312.         mov     si,N
  313.         mul     si
  314.         add     ax,bx
  315.         cmp     byte [Board+eax],cl
  316.         je      @b
  317.  
  318. .ret:   mov     edi,5
  319.         mov     esi,N
  320. @@:     movzx   eax,[Y]
  321.         sub     ax,[esp]
  322.         mov     [Y],ax
  323.         mul     si
  324.         movzx   ebx,[X]
  325.         sub     bx,[esp+2]
  326.         mov     [X],bx
  327.         add     ax,bx
  328.         cmp     byte [Board+eax],cl
  329.         jne     .1
  330.         add     byte [Board+eax],2
  331. .1:     dec     edi
  332.         jnz     @b
  333.         add     esp,4
  334. ret
  335.  
  336.  
  337.  
  338. Max dw ?
  339.  
  340. FindMove:
  341.         mov     [Max],0
  342.         mov     [X],((N+1) / 2)
  343.         mov     [Y],((N+1) / 2)
  344.         movzx   eax,[Y]
  345.         mov     ah,N
  346.         mul     ah
  347.         add     ax,[X]
  348.         cmp     byte [Board+eax],0
  349.         jne     @f
  350.         mov     [Max],4
  351. @@:     xor     ecx,ecx
  352. .loop:
  353.         cmp     byte [Board+ecx],0
  354.         jne     .check_loop
  355.                 movzx   eax, word [Value+ecx*2]
  356.                 bt      [flags],1
  357.                 jc      @f
  358.                 movzx   eax, word [Value+(N*N+ecx)*2]
  359.                 @@:
  360.                 mov     ebx,16
  361.                 add     bx,[AttackFactor]
  362.                 mul     bx
  363.                 shr     eax,4 ;div 16
  364.                 mov     bx,[Value+2*(N*N+ecx)]
  365.                 bt      [flags],1
  366.                 jc      @f
  367.                 mov     bx,[Value+2*(ecx)]
  368.                 @@:
  369.                 add     bx,ax
  370.                 mov     eax,4
  371.                 call    random
  372.                 add     bx,ax
  373.                 cmp     bx,[Max]
  374.                 jbe     .check_loop
  375.                         mov     [Max],bx
  376.                         xor     edx,edx
  377.                         mov     eax,ecx
  378.                         mov     ebx,N
  379.                         div     ebx
  380.                         mov     [X],dx
  381.                         mov     [Y],ax
  382. .check_loop:
  383.         inc     ecx
  384.         cmp     ecx,N*N
  385.         jb      .loop
  386. ret
  387.  
  388.  
  389. MakeMove:
  390.         xor     eax,eax
  391.         mov     esi,N
  392.  
  393. .1:     movzx   ecx,[X] ;ecx=X1, eax=K, edx=Y1
  394.         inc     cl
  395.         movzx   edx,[Y]
  396.         inc     dl
  397.         sub     cl,al
  398.         xor     edi,edi
  399.         test    ecx,ecx
  400.         jz      .1_
  401.         cmp     ecx,N-4
  402.         jg      .1_
  403.                 dec     cl
  404.                 dec     dl
  405.                 push    eax edx
  406.                 mov     eax,edx
  407.                 mul     esi
  408.                 add     eax,ecx
  409.                 call    .Add
  410.                 bt      [flags],0
  411.                 jnc     .11
  412.                 cmp     [WinningLine],0x0
  413.                 jne     .11
  414.                 mov     [WinningLine],1
  415.         .11:    mov     eax,[esp];edx
  416.                 mul     esi
  417.                 add     eax,ecx
  418.                 push    eax
  419.                 mov     eax,[esp+4];edx
  420.                 mul     esi
  421.                 add     eax,edi
  422.                 add     eax,ecx
  423.                 mov     ebx,eax
  424.                 pop     eax
  425.                 call    .Update
  426.                 inc     edi
  427.                 cmp     edi,4
  428.                 jbe     .11
  429.                 pop     edx eax
  430. .1_:    inc     eax
  431.         cmp     eax,4
  432.         jbe     .1
  433.  
  434.         xor     eax,eax
  435.  
  436. .2:     movzx   ecx,[X]
  437.         inc     cl
  438.         movzx   edx,[Y]
  439.         inc     dl
  440.         xor     edi,edi
  441.         sub     cl,al
  442.         sub     dl,al
  443.         test    ecx,ecx
  444.         jz      .2_
  445.         cmp     ecx,N-4
  446.         jg      .2_
  447.         test    edx,edx
  448.         jz      .2_
  449.         cmp     edx,N-4
  450.         jg      .2_
  451.                 dec     cl
  452.                 dec     dl
  453.                 push    eax edx
  454.                 mov     eax,edx
  455.                 mul     esi
  456.                 add     eax,ecx
  457.                 add     eax,1*N*N
  458.                 call    .Add
  459.                 bt      [flags],0
  460.                 jnc     .21
  461.                 cmp     [WinningLine],0x0
  462.                 jne     .21
  463.                 mov     [WinningLine],2
  464.         .21:    mov     eax,[esp];edx
  465.                 mul     esi
  466.                 add     eax,ecx
  467.                 add     eax,1*N*N
  468.                 push    eax
  469.                 mov     eax,[esp+4];edx
  470.                 add     eax,edi
  471.                 mul     esi
  472.                 add     eax,edi
  473.                 add     eax,ecx
  474.                 mov     ebx,eax
  475.                 pop     eax
  476.                 call    .Update
  477.                 inc     edi
  478.                 cmp     edi,4
  479.                 jbe     .21
  480.                 pop     edx eax
  481. .2_:    inc     eax
  482.         cmp     eax,4
  483.         jbe     .2
  484.  
  485.         xor     eax,eax
  486.  
  487. .3:     movzx   ecx,[X]
  488.         inc     cl
  489.         movzx   edx,[Y]
  490.         inc     dl
  491.         xor     edi,edi
  492.         add     cl,al
  493.         sub     dl,al
  494.         cmp     ecx,5
  495.         jb      .3_
  496.         cmp     ecx,N
  497.         jg      .3_
  498.         test    edx,edx
  499.         jz      .3_
  500.         cmp     edx,N-4
  501.         jg      .3_
  502.                 dec     cl
  503.                 dec     dl
  504.                 push    eax edx
  505.                 mov     eax,edx
  506.                 mul     esi
  507.                 add     eax,ecx
  508.                 add     eax,3*N*N
  509.                 call    .Add
  510.                 bt      [flags],0
  511.                 jnc     .31
  512.                 cmp     [WinningLine],0
  513.                 jne     .31
  514.                 mov     [WinningLine],3
  515.         .31:    mov     eax,[esp];edx
  516.                 mul     esi
  517.                 add     eax,ecx
  518.                 add     eax,3*N*N
  519.                 push    eax
  520.                 mov     eax,[esp+4];edx
  521.                 add     eax,edi
  522.                 mul     esi
  523.                 add     eax,ecx
  524.                 sub     eax,edi
  525.                 mov     ebx,eax
  526.                 pop     eax
  527.                 call    .Update
  528.                 inc     edi
  529.                 cmp     edi,4
  530.                 jbe     .31
  531.                 pop     edx eax
  532. .3_:    inc     eax
  533.         cmp     eax,4
  534.         jbe     .3
  535.  
  536.         xor     eax,eax
  537.  
  538. .4:     movzx   ecx,[X]
  539.         inc     cl
  540.         movzx   edx,[Y]
  541.         inc     dl
  542.         xor     edi,edi
  543.         sub     dl,al
  544.         test    edx,edx
  545.         jz      .4_
  546.         cmp     edx,N-4
  547.         jg      .4_
  548.                 dec     cl
  549.                 dec     dl
  550.                 push    eax edx
  551.                 mov     eax,edx
  552.                 mul     esi
  553.                 add     eax,ecx
  554.                 add     eax,2*N*N
  555.                 call    .Add
  556.                 bt      [flags],0
  557.                 jnc     .41
  558.                 cmp     [WinningLine],0
  559.                 jne     .41
  560.                 mov     [WinningLine],4
  561.         .41:    mov     eax,[esp];edx
  562.                 mul     esi
  563.                 add     eax,ecx
  564.                 add     eax,2*N*N
  565.                 push    eax
  566.                 mov     eax,[esp+4];edx
  567.                 add     eax,edi
  568.                 mul     esi
  569.                 add     eax,ecx
  570.                 mov     ebx,eax
  571.                 pop     eax
  572.                 call    .Update
  573.                 inc     edi
  574.                 cmp     edi,4
  575.                 jbe     .41
  576.                 pop     edx eax
  577. .4_:    inc     eax
  578.         cmp     eax,4
  579.         jbe     .4
  580.  
  581.         movzx   eax,[Y]
  582.         mul     esi
  583.         add     ax,[X]
  584.         bt      [flags],1
  585.         jc      @f
  586.         mov     byte [Board+eax],1
  587.         jmp     .end
  588. @@:
  589.         mov     byte [Board+eax],2
  590. .end:   cmp     [TotalLines],0
  591.         jne     @f
  592.         bts     [flags],3
  593. @@:
  594. ret
  595.  
  596. .Add:
  597.         bt      [flags],1
  598.         jnc     .Add_player
  599.         inc     byte [Line+eax]
  600.         cmp     byte [Line+eax],1
  601.         jne     @f
  602.                 dec     [TotalLines]
  603. @@:     cmp     byte [Line+eax],5
  604.         jb      @f
  605.         bts     [flags],0       ;¨£à  ®ª®­ç¥­ 
  606. @@:
  607. ret
  608. .Add_player:
  609.         inc     byte [Line+eax+4*N*N]
  610.         cmp     byte [Line+eax+4*N*N],1
  611.         jne     @f
  612.                 dec     [TotalLines]
  613. @@:     cmp     byte [Line+eax+4*N*N],5
  614.         jb      @f
  615.         bts     [flags],0       ;¨£à  ®ª®­ç¥­ 
  616. @@:
  617. ret
  618.  
  619. .Update:
  620. ;eax ¯¥à¢ë© ¯ à ¬¥âà, ebx ¢â®à®©
  621.         push    edi
  622.         bt      [flags],1
  623.         jnc     .Update_player
  624.         cmp     byte [Line+eax+4*N*N],0
  625.         jne     .else_cpu
  626.                 push    eax
  627.                 movzx   edi, byte [Line+eax]
  628.                 mov     ax, word [edi*2+2+Weight]
  629.                 sub     ax, word [edi*2+Weight]
  630.                 add     [Value+ebx*2],ax
  631.                 pop     eax
  632.         jmp     .Update_end
  633.         .else_cpu:
  634.         cmp     byte [Line+eax],1
  635.         jne     .Update_end
  636.                 push    eax
  637.                 movzx   edi, byte [Line+eax+4*N*N]
  638.                 mov     ax, word [edi*2+2+Weight]
  639.                 sub     [Value+ebx*2+N*N*2],ax
  640.                 pop     eax
  641.         jmp     .Update_end
  642. .Update_player:
  643.         cmp     byte [Line+eax],0
  644.         jne     .else_player
  645.                 push    eax
  646.                 movzx   edi, byte [Line+eax+4*N*N]
  647.                 mov     ax, word [edi*2+2+Weight]
  648.                 mov     di, word [edi*2+Weight]
  649.                 sub     ax,di
  650.                 add     [Value+ebx*2+2*N*N],ax
  651.                 pop     eax
  652.         jmp     .Update_end
  653.         .else_player:
  654.         cmp     byte [Line+eax+4*N*N],1
  655.         jne     .Update_end
  656.                 push    eax
  657.                 movzx   edi, byte [Line+eax]
  658.                 mov     ax, word [edi*2+2+Weight]
  659.                 sub     [Value+ebx*2],ax
  660.                 pop     eax
  661. .Update_end:
  662.         pop     edi
  663. ret
  664.  
  665.  
  666. align 4
  667. rsx1 dw ?;0x4321
  668. rsx2 dw ?;0x1234
  669. random:         ; ¨§ ASCL
  670.         push ecx ebx edi edx
  671.         mov cx,ax
  672.         mov ax,[rsx1]
  673.         mov bx,[rsx2]
  674.         mov si,ax
  675.         mov di,bx
  676.         mov dl,ah
  677.         mov ah,al
  678.         mov al,bh
  679.         mov bh,bl
  680.         xor bl,bl
  681.         rcr dl,1
  682.         rcr ax,1
  683.         rcr bx,1
  684.         add bx,di
  685.         adc ax,si
  686.         add bx,0x62e9
  687.         adc ax,0x3619
  688.         mov [rsx1],bx
  689.         mov [rsx2],ax
  690.         xor dx,dx
  691.         cmp ax,0
  692.         je nodiv
  693.         cmp cx,0
  694.         je nodiv
  695.         div cx
  696. nodiv:
  697.         mov ax,dx
  698.         pop edx edi ebx ecx
  699.         and eax,0000ffffh
  700. ret
  701.  
  702.  
  703.  
  704. txt_x db 'X',0
  705. txt_o db 'O',0
  706. if lang eq ru
  707. title db 'ƒ®¬®ªã',0
  708. txt_buttons db '®¢ ï   €¢â®',0
  709. txt_go db 'ˆ£à  ®ª®­ç¥­ ',0
  710. txt_tie db '¥â 室®¢',0
  711. else
  712. title db 'Gomoku',0
  713. txt_go db 'Game over',0
  714. txt_tie db 'Tie game',0
  715. txt_buttons db 'New     Auto',0
  716. endf
  717.  
  718.  
  719. Weight dw 0,0,4,20,100,500,0
  720.  
  721.  
  722. WinningLine db 0
  723. TotalLines dw 0
  724.  
  725. X dw 0
  726. Y dw 0
  727.  
  728. flags rw 1
  729. ;¡¨â 0: ¨£à  ®ª®­ç¥­ 
  730. ;1: 0-室 ¨£à®ª , 1-æ¯ã
  731. ;2: autoplay
  732. ;3: å®¤ë ¨áç¥à¯ ­ë
  733. ;4: ¢ print_board - ¢ë¤¥«¥­¨¥ ªà á­ë¬ 梥⮬ 5-⨠¢ àï¤ ª«¥â®ª
  734.  
  735. proc_info process_information   ; it should be after I_END, but i'm afraid of lines 11-12. dunkaist
  736. I_END:
  737. align 16
  738. Board   rb N*N
  739. Value   rw N*N*2        ;¯¥à¢ ï ¯®«®¢¨­  - ¤«ï ª®¬¯ , ¢â®à ï - ¤«ï ¨£à®ª 
  740. Line    rb 4*N*N*2
  741.  
  742.  
  743.