Subversion Repositories Kolibri OS

Rev

Rev 3950 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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