use32 org 0x0 db 'MENUET01' dd 0x01 dd _preSTART dd I_END dd 0x4000 dd 0x4000 dd 0x0,0x0 include '../../macros.inc' include 'lang.inc' ; Language support for locales: ru_RU (CP866), en_US. include 'draw_window.inc' include 'ball_operations.inc' include 'basic_alg.inc' _preSTART: mcall 66, 1, 1 ;принимаем скан-коды mcall 3 ;randomize ror eax, 16 mov [TC_U_SYSTEM_RANDSEED], eax ;from PPro "system.inc" new_game: ;обнуление матрицы mov eax, 0 mov ecx, 81 / 4 mov edi, lineBall rep stosd stosb mov [score], 0 mov [countAllBall], 0 mov [current], 0 @@: mov ebx, 7 call random inc dl call add_new_ball call test_new_ball cmp [countAllBall], 5 jb @b call generate_new___new_color START: draw_window still: mcall 10 dec eax jz START ; перерисовать окно dec eax jnz button ;если не клавиша - значит кнопка key: ; нажатие клавиши mcall 2 ; получаем код клавиши cmp ah, 60 je new_game jmp still button: ; нажатие кнопки mcall 17 shr eax, 8 cmp ax, 1 ; если кнопка выхода? je .exit ;проверим, не пуста ли клетка mov edx, [current] test byte [eax + lineBall - 2], 0x7 jz .blank ;проверим не была ли эта клетка уже выбрана cmp eax, edx je .double_choice mov [current], eax call choice_ball call paint_ball ;сначала прорисуем новый выбранный шарик test edx, edx ;cmp [current], 0 jz still mov eax, edx @@: call redraw_cell ;а уже потом уберем рамку от старого call paint_ball jmp still .double_choice: mov [current], 0 jmp @B .blank: ;нажатая кнопка - пуста test edx, edx ;cmp [current], 0 jz still mov [dest], eax ;кнопку назначения -> в [dest] mov eax, edx ;параметр в eax call test_path ;вызываем рекурсию test_path call zero_cheked jnc still ;^^^^^^^^^^^^^^^^^ move_ball proc mov eax, [current] mov cl, byte [eax + lineBall - 2] mov byte [eax + lineBall - 2], 0 mov eax, [dest] mov byte [eax + lineBall - 2], cl mov eax, [current] call redraw_cell mov eax, [dest] call paint_ball mov [current], 0 ;^^^^^^^^^^^^^^^^^ move_ball endp call find_line call vanish_balls call zero_cheked cmp [countVanishBall], 0 je new_3_balls movzx eax, [countVanishBall] inc eax add [score], eax sub [countAllBall], al call redraw_score jmp still .exit: mcall -1 ;выходим new_3_balls: rept 3 num { mov dl, [newColor#num] call add_new_ball call test_new_ball cmp [countAllBall],81 je .record_li } call generate_new___new_color call paint_new_color jmp still .record_li: mov eax, [score] cmp eax, [record] jbe still mov [record], eax jmp START zero_cheked: ;обнуление матрицы cheked pushfd mov eax, lineBall mov ecx, 81 @@: and byte [eax], 0x7 inc eax loop @B popfd ret random: ; edx := random [0..(ebx-1)] mov eax, 134775813 mul [TC_U_SYSTEM_RANDSEED] inc eax mov [ TC_U_SYSTEM_RANDSEED], eax xor edx, edx div ebx ret generate_new___new_color: rept 3 num { mov ebx, 7 call random inc dl mov [newColor#num], dl } ret add_new_ball: ;в dl - цвет шарика mov ebp, edx mov ebx, 81 sub bl, [countAllBall] call random mov ecx, edx mov eax, lineBall-1 inc ecx @@: inc eax test byte [eax], 0x7 jnz @B loop @B ;теперь у нас в eax - адрес нашего шарика mov edx, ebp or byte [eax], dl inc [countAllBall] ;получим ID кнопки sub eax, lineBall-2 mov [dest], eax ret test_new_ball: call paint_ball call find_line call vanish_balls call zero_cheked cmp [countVanishBall], 0 je @F movzx eax, [countVanishBall] inc eax add [score], eax sub [countAllBall], al call redraw_score @@: ret if lang eq ru_RU szTitle db 'Цветные линии v 0.3',0 szNewGame db 'F2 - новая игра',0 szRecord db 'Рекорд',0 szScore db 'Очки',0 else ; Default to en_US szTitle db 'Color lines v 0.3',0 szNewGame db 'F2 - new game',0 szRecord db 'Record',0 szScore db 'Score',0 end if blank = 0xB8C2D3 brown = 0x804000 red = 0xff0000 yellow = 0xffff00 green = 0x008000 cyan = 0x00ffff blue = 0x0000ff purple = 0x800080 tableColor dd blank,brown,red,yellow,green,cyan,blue,purple lineCoord: rept 9 coory:0 { rept 9 coorx:0 \{ dw coorx*256+coory \} } record dd 25 lineBall db 81 dup ? score dd ? baseAddr dd ? current dd ? dest dd ? newColor1 db ? newColor2 db ? newColor3 db ? countVanishBall db ? countAllBall db ? TC_U_SYSTEM_RANDSEED dd ? bitID dd ? I_END: