Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2010, 15:59   #1
konstahntin
Пользователь
 
Регистрация: 28.11.2010
Сообщений: 10
По умолчанию Игра змейка, меню

1. О программе
2. Старт игры
3. Выход

Последний раз редактировалось konstahntin; 29.11.2010 в 16:04.
konstahntin вне форума Ответить с цитированием
Старый 29.11.2010, 16:39   #2
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
По умолчанию

ну что-то типа такого:
Код:
mov ah, 1 ;считываем клавишу
int 21h
sub al, 30h ;переводим в цифру

cmp al, 1 ; если 1 то...
jz O_Programme

cmp al, 2 ; если 2 то...
jz Start_igri

cmp al, 3 ; если 3 то...
jz exit

Последний раз редактировалось Alex1991; 29.11.2010 в 16:42.
Alex1991 вне форума Ответить с цитированием
Старый 29.11.2010, 16:56   #3
konstahntin
Пользователь
 
Регистрация: 28.11.2010
Сообщений: 10
По умолчанию

Помогите пожал. реализовать в коде, я если честно в ассемблере почти ничего не понимаю.
[ASM]
cgroup group CODE_SEG, DATA_SEG
assume cs:cgroup, ds:cgroup
title PITON
.186 ; для команды push 0A00h

CODE_SEG segment byte public
org 100h ; COM-файл
public start
start proc near
mov ax,cs
add ax,1000h
mov ds,ax
push 0A000h ;
pop es ;
mov ax,13h
int 10h

mov di,320*200
mov cx,600h

rep stosb

xor si,si ; начальный адрес хвоста в DS:SI
mov bp,10 ; начальная длина питона - 10
jmp init_food ; создать первую еду
main_cycle:

; AX - различное
; BX - адрес головы, хвоста или еды на экране
; CX - 0 (старшее слово числа микросекунд для функции задержки)
; DX - не используется (модифицируется процедурой random)
; DS - сегмент данных программы (следующий после сегмента кода)
; ES - видеопамять
; DS:DI - адрес головы
; DS:SI - адрес хвоста
; BP - добавочная длина (питон растет, пока BP > 0, BP уменьшается на каждом шаге,
; пока не станет нулем)

mov dx,40000 ; пауза - 20 000 микросекунд
mov ah,86h ; (CX = 0 после REP STOSB и
; больше не меняется)
int 15h ; задержка

mov ah,1 ; проверка состояния клавиатуры
int 16h
jz short no_keypress ; если клавиша не нажата -
xor ah,ah ; AH = 0 - считать скан-код
int 16h ; нажатой клавиши в AH,
cmp ah,48h ; если это стрелка вверх,
jne short not_up
mov word ptr cs:move_direction,-320 ; изменить
; направление движения на "вверх",
not_up:
cmp ah,50h ; если это стрелка вниз,
jne short not_down
mov word ptr cs:move_direction,320 ; изменить
; направление движения на "вниз",
not_down:
cmp ah,4Bh ; если это стрелка влево,
jne short not_left
mov word ptr cs:move_direction,-1 ; изменить
; направление движения на "влево",
not_left:
cmp ah,4Dh ; если это стрелка вправо,
jne short no_keypress
mov word ptr cs:move_direction,1 ; изменить
; направление движения на "вправо",
no_keypress:
and bp,bp ; если питон растет (BP > 0),
jnz short advance_head ; пропустить стирание хвоста,
lodsw ; иначе: считать адрес хвоста из
; DS:SI в AX и увеличить SI на 2
xchg bx,ax
mov byte ptr es:[bx],0 ; стереть хвост на экране,
mov bx,ax
inc bp ; увеличить BP, чтобы следующая
; команда вернула его в 0,
advance_head:
dec bp ; уменьшить BP, так как питон
; вырос на 1, если стирание хвоста было пропущено, или чтобы вернуть его в 0 - в
; другом случае
add bx,word ptr cs:move_direction
; bx = следующая координата головы
mov al,es:[bx] ; проверить содержимое экрана в точке с
; этой координатой,
and al,al ; если там ничего нет,
jz short move_worm ; передвинуть голову,
cmp al,0Dh ; если там еда,
je short grow_worm ; увеличить длину питона,
mov ax,3 ; иначе - питон умер,
int 10h ; перейти в текстовый режим
retn ; и завершить программу

move_worm:
mov [di],bx ; поместить адрес головы в DS:DI
inc di
inc di ; и увеличить DI на 2,
mov byte ptr es:[bx],09
cmp byte ptr cs:eaten_food,1
; ходом была съедена еда,
je if_eaten_food
jmp short main_cycle


grow_worm:
push bx ; сохранить адрес головы
mov bx,word ptr cs:food_at ; bx - адрес еды
xor ax,ax ; AX = 0
call draw_food ; стереть еду
call random ; AX - случайное число
and ax,3Fh ; AX - случайное число от 0 до 63
mov bp,ax ; это число будет добавкой к
; длине питона
mov byte ptr cs:eaten_food,1 ; установить флаг
; для генерации еды на следующем ходе
pop bx ; восстановить адрес головы BX
jmp short move_worm ; перейти к движению питона

if_eaten_food: ; переход сюда, если еда была съедена
mov byte ptr cs:eaten_food,0 ; восстановить флаг
init_food: ; переход сюда в самом начале
push bx ; сохранить адрес головы
make_food:
call random ; AX - случайное число
and ax,0FFFEh ; AX - случайное четное число
mov bx,ax ; BX - новый адрес для еды
xor ax,ax
cmp word ptr es:[bx],ax ; если по этому адресу
; находится тело питона
jne make_food ; еще раз сгенерировать случайный адрес
cmp word ptr es:[bx+320],ax ; если на строку ниже
; находится тело питона
jne make_food ; то же самое
mov word ptr cs:food_at,bx ; поместить новый адрес
; еды в food_at,
mov ax,0D0Dh ; цвет еды в AX
call draw_food ; нарисовать еду на экране
pop bx
jmp main_cycle
start endp


; процедура draw_food
; изображает четыре точки на экране - две по адресу BX и две на следующей
; строке. Цвет первой точки из пары - AL, второй - AH

public draw_food

draw_food proc near
mov es:[bx],ax
mov word ptr es:[bx+320],ax
retn
draw_food endp
; генерация случайного числа
; возвращает число в AX, модифицирует DX

public random

random proc near
mov ax,word ptr cs:seed
mov dx,8E45h
mul dx
inc ax
mov cs:word ptr seed,ax
retn
random endp

CODE_SEG ends
DATA_SEG segment para public
; переменные

eaten_food db 0
move_direction dw 1 ; направление движения: 1 - вправо,
; -1 - влево, 320 - вниз, -320 - вверх
seed: ; это число хранится за концом, программы
food_at equ seed+2 ; а это - за предыдущим
DATA_SEG ends

end start[/ASM]
konstahntin вне форума Ответить с цитированием
Старый 30.11.2010, 18:39   #4
konstahntin
Пользователь
 
Регистрация: 28.11.2010
Сообщений: 10
По умолчанию

Последняя просьба, очень нужно, чтобы меню было с навигацией, преподаватель требует. Пункты те же, но например пункт о программе должен выдавать инфу о универе, авторе, к примеру, но должен открываться отдельно от основного меню и клавишей возвращ. в главное обратно. Выручите последний раз пожалуйста, очень нужно.. скоро защита.
Пример меню:
Изображения
Тип файла: jpg 1.JPG (31.6 Кб, 143 просмотров)
konstahntin вне форума Ответить с цитированием
Старый 30.11.2010, 18:41   #5
konstahntin
Пользователь
 
Регистрация: 28.11.2010
Сообщений: 10
По умолчанию

Реализуйте пожалуйста в самом коде, если можно, я в ассемблере если честно почти ничего не понимаю)
konstahntin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler.Игра "змейка". Пупкин Помощь студентам 0 27.05.2010 00:08
Игра змейка на С++ Duran- Помощь студентам 2 10.08.2009 12:14
Игра "Змейка" spamer Общие вопросы Delphi 1 09.01.2009 04:22
Ещё одна игра "Змейка" Simply-Art Софт 17 05.07.2007 04:10