Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Змейка, Игра 
V
    Опции темы
Сый
Дата 4.4.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Написал вот такую реализацию змейки (ряда квадратиков), ползающей по загону:
Код

ОТДЕЛ Змейка+; 

ИСПОЛЬЗУЕТ 
  ОС     ИЗ "...\Отделы\Обмен\", 
  Матем  ИЗ "...\Отделы\Числа\", 
  Ввод   ИЗ "...\Отделы\Обмен\", 
  Вывод  ИЗ "...\Отделы\Обмен\", 
  Поле   ИЗ "...\Отделы\Поле\", 
  Надел  ИЗ "...\Отделы\Поле\", 
  Метка  ИЗ "...\Отделы\Поле\", 
  Кнопка ИЗ "...\Отделы\Поле\"; 

ПОСТ 
  Выход  = 1; 
  Начали = 2; 

ПЕР 
  Напр:ЦЕЛ; 
  Змея:РЯД 20 ИЗ КЛЮЧ; 
  КоордЗмеи:РЯД 20 ИЗ РЯД 2 ИЗ ЦЕЛ; 
  НачВремя:ЦЕЛ; 
  Метка1:Метка.Доступ; 
  Играем:КЛЮЧ; 

(******************************************************************************) 
ЗАДАЧА Оформить(); 
УКАЗ 
  Вывод.Цвет(1,1,30,20,0) 
КОН Оформить; 

(******************************************************************************) 
ЗАДАЧА Поражение(); 
УКАЗ 
  Играем:=ОТКЛ 
КОН Поражение; 

(******************************************************************************) 
ЗАДАЧА ЦветнойКвадрат(ху,ух:ЦЕЛ); 
УКАЗ 
  Вывод.Цвет(ху,ух,ху+2,ух+1,УЗК(ВШИРЦЕЛ((Матем.случ()*14)+1))*16); Вывод.Рамка(ху,ух,ху+2,ух+1) 
КОН ЦветнойКвадрат; 

(******************************************************************************) 
ЗАДАЧА ЧёрныйКвадрат(ху,ух:ЦЕЛ); 
УКАЗ 
  Вывод.Цвет(ху,ух,ху+2,ух+1,0) 
КОН ЧёрныйКвадрат; 

(******************************************************************************) 
ЗАДАЧА Хвост():ЦЕЛ; 
ПЕР 
  ч:ЦЕЛ; 
УКАЗ 
  ОТ ч:=0 ДО 19 ВЫП 
    ЕСЛИ НЕ Змея[ч] ТО ВОЗВРАТ ч-1 КОН 
  КОН; 
  ВОЗВРАТ 19 
КОН Хвост; 

(******************************************************************************) 
ЗАДАЧА Вывести(); 
ПЕР 
  ч:ЦЕЛ; 
  Занято:КЛЮЧ; 
УКАЗ 
  ОТ ч:=0 ДО 19 ВЫП 
    ЕСЛИ Змея[ч] ТО ЦветнойКвадрат(КоордЗмеи[ч][0]*3-2,КоордЗмеи[ч][1]*2-1) КОН 
  КОН 
КОН Вывести; 

(******************************************************************************) 
ЗАДАЧА Врезались():КЛЮЧ; 
ЗАДАЧА СамаВСебя():КЛЮЧ; 
ПЕР 
  ч:ЦЕЛ; 
УКАЗ 
  ОТ ч:=1 ДО 19 ВЫП 
    ЕСЛИ ((КоордЗмеи[0][0]=КоордЗмеи[ч][0]) И ((КоордЗмеи[0][1]=КоордЗмеи[ч][1]))) И Змея[ч] ТО ВОЗВРАТ ВКЛ КОН; 
  КОН; 
  ВОЗВРАТ ОТКЛ 
КОН СамаВСебя; 
УКАЗ 
ЕСЛИ СамаВСебя() ТО ВОЗВРАТ ВКЛ ИНАЧЕ 
  ВОЗВРАТ ((КоордЗмеи[0][0]>10) ИЛИ (КоордЗмеи[0][0]<1)) ИЛИ ((КоордЗмеи[0][1]>10) ИЛИ (КоордЗмеи[0][1]<1)) 
КОН 
КОН Врезались;

(******************************************************************************) 
ЗАДАЧА Сдвинуть(); 
ПЕР 
  ч:ЦЕЛ; 
УКАЗ 
  ЧёрныйКвадрат(КоордЗмеи[Хвост()][0]*3-2,КоордЗмеи[Хвост()][1]*2-1); 
  ОТ ч:=19 ДО 1 ПО -1 ВЫП КоордЗмеи[ч][0]:=КоордЗмеи[ч-1][0]; КоордЗмеи[ч][1]:=КоордЗмеи[ч-1][1] КОН; 
  ВЫБРАТЬ Напр ИЗ 
    0: УВЕЛИЧИТЬ(КоордЗмеи[0][1]) 
  | 1: УМЕНЬШИТЬ(КоордЗмеи[0][1]) 
  | 2: УМЕНЬШИТЬ(КоордЗмеи[0][0]) 
  | 3: УВЕЛИЧИТЬ(КоордЗмеи[0][0]) 
  ИНАЧЕ КОН; 
  ЕСЛИ Врезались() ТО Метка.Изменить(Метка1,"Врезались!"); Поражение ИНАЧЕ Вывести КОН 
КОН Сдвинуть; 

(******************************************************************************) 
ЗАДАЧА Начать(); 
УКАЗ 
  Оформить(); Метка.Изменить(Метка1,"Поехали!"); 
  Змея[0]:=ВКЛ; Змея[1]:=ВКЛ; Змея[2]:=ВКЛ; 
  КоордЗмеи[0][0]:=3; КоордЗмеи[0][1]:=1; 
  КоордЗмеи[1][0]:=2; КоордЗмеи[1][1]:=1; 
  КоордЗмеи[2][0]:=1; КоордЗмеи[2][1]:=1; 
  Напр:=3; 
  Играем:=ВКЛ; 
  НачВремя:=ОС.Время(); 
  Вывести 
КОН Начать; 

(******************************************************************************) 
ЗАДАЧА Перехват(поле:Поле.Доступ; посылка+:Ввод.Посылка); 
УКАЗ 
  ДЛЯ посылка ВИДА 
    Кнопка.Посылка: 
      ВЫБРАТЬ посылка.действие ИЗ 
        Выход: поле.состояние:=Поле.выход 
      | Начали: Начать 
      ИНАЧЕ 
      КОН; 
  | Ввод.ОтКлавиш: 
      ВЫБРАТЬ посылка.код ИЗ 
        28H: Напр:=0 
      | 26H: Напр:=1 
      | 25H: Напр:=2 
      | 27H: Напр:=3 
      ИНАЧЕ КОН; 
  ИНАЧЕ 
  КОН              
КОН Перехват; 

(******************************************************************************) 
ЗАДАЧА СоздатьПоле():Поле.Доступ; 
ПЕР 
  поле:Поле.Доступ; 
  Кнопка1,Кнопка2:Кнопка.Доступ; 
  наделы:Надел.Доступ; 
УКАЗ 
  Метка1:=Метка.Создать(33,3,""); 
  Кнопка1:=Кнопка.Создать(33,20,"[ Выход ]",Выход); 
  Кнопка2:=Кнопка.Создать(33,18,"[ Начать ]",Начали); 
  Надел.Добавить(наделы,Метка1); 
  Надел.Добавить(наделы,Кнопка1); 
  Надел.Добавить(наделы,Кнопка2); 
  поле:=Поле.Создать(" Змейка ",наделы,0,0,45,21,Перехват); 
  ВОЗВРАТ поле 
КОН СоздатьПоле; 

(******************************************************************************) 
ЗАДАЧА Поехали; 
ПЕР 
  поле:Поле.Доступ; 
УКАЗ 
  поле:=СоздатьПоле(); 
  Поле.Рисовать(поле); 
  Оформить; 
  ПОВТОРЯТЬ 
    ЕСЛИ (ОС.Время() >= НачВремя+100) И Играем ТО 
      НачВремя:=ОС.Время(); 
      Сдвинуть; 
    КОН; 
    Поле.Выполнить(поле) 
  ДО поле.состояние = Поле.выход 
КОН Поехали; 

(******************************************************************************) 
УКАЗ 
  Играем:=ОТКЛ; 
  Поехали 
КОН Змейка.

Тут пока нет еды, но есть одна проблема. Змея имеет возможность врезаться сама в себя. Но разворот в противоположную сторону происходит так: голова меняет направление движения и тащит за собой (через себя) квадратики. Выходит, врезается в себя. Как позволить ей менять направление на противоположное, не сталкиваясь с собой?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
maxim1000
Дата 4.4.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



например, поменять порядок элементов в массиве квадратиков на обратный...
правда, это приведет не к тому, что голова будет проходить по всему телу, а к тому, что змейка развернется мгновенно...


--------------------
qqq
PM WWW   Вверх
Сый
Дата 4.4.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



И как это лучше сделать на Глаголе (поменять порядок элементов)?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
SoWa
Дата 5.4.2006, 04:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Ну слушай, мы на глаголе не пишем.
к примеру:
Код

a:=mas[i];
b:=mas[count-i];
mas[count-i]:=a;
mas[i]:=b;



--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Сый
Дата 5.4.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Лучше так:
Код

ЗАДАЧА Перевернуть();
ПЕР
  ч, б: ЦЕЛ;
УКАЗ
  ОТ ч := 0 ДО (РАЗМЕР(Ряд)-1) ДЕЛИТЬ 2 ВЫП
    б := Ряд[ч];
    Ряд[ч] := Ряд[(РАЗМЕР(Ряд)-1)-ч];
    Ряд[(РАЗМЕР(Ряд)-1)-ч] := б;
  КОН
КОН Перевернуть;

--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
SoWa
Дата 5.4.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Я единицу не прибавлял(пример: 1-й и последний элемент массива):
Код

a:=mas[i];
b:=mas[count-i+1];
mas[count-i+1]:=a;
mas[i]:=b;

Похоже так. Я с единицами вечно путаюсь.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Сый
Дата 5.4.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Ну, допустим, i - это счётчик (ОТ i:=0 ДО РАЗМЕР(Ряд)-1 ВЫП...). А что за переменная "count"?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 5.4.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Сделал. Теперь другой вопрос. При расположении змеи буквой С:
Код

О О
ООО

при движении в обратном направлении хвост врезается в тело. Должно ли так быть (вообще-то должно, а вот правил игры не знаю).
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
SoWa
Дата 6.4.2006, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



count это количество элементов массива.


Цитата(Сый @ 5.4.2006, 20:42 Найти цитируемый пост)
вост врезается в тело

Не понимаю. Куда движется, с какого конца. Обозначь голову (*). И стрелочкой напраление движения.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Сый
Дата 6.4.2006, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Код

*  О
О  О    
ОООО

Движение вверх, после смены направления - вниз.
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
SoWa
Дата 6.4.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Забавно...
Видимо, такую ситуацию, а именно вхождение хвоста в тело, надо обрабатывать отдельно. Например подредактировать функцию
Цитата(Сый @ 4.4.2006, 19:44 Найти цитируемый пост)
ЗАДАЧА Врезались():КЛЮЧ; ЗАДАЧА СамаВСебя():КЛЮЧ; 




--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Сый
Дата 6.4.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Просто не могу придумать вариант разрешения этой ситуации. Некуда этот кусок хвоста девать. Ну пусть врезается в тело, видимо, так и должно быть.
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
SoWa
Дата 6.4.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Думаю, надо змейку просто направо повернуть. Или это не удовлетворяет условиям?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Сый
Дата 7.4.2006, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Нажимаю вниз, она едет направо... Бред.
Ладно, пусть будет как есть.
Следующий вопрос: как организовать систему еды для змеи?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 15.4.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Сделал еду, всё как надо, но две проблемы: старая (змея врезается при движении хвоста в тело) и появление квадратиков еды в теле змеи. Как избавиться от последней (или так и должно быть)?
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.