Subversion Repositories Kolibri OS

Rev

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