Помощь - Поиск - Пользователи - Календарь
Полная версия: С какой игры начать?
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
Страницы: 1, 2
Гелла
Я вот хочу научится программировать..один очень хороший человек на этом форуме подсказал, что лучше учиться программировать в процессе написания игр........какую самую простую игру вы можете посоветовать..Заранее Большое Спасибо....Не умею правильно пользоваться поиском по форуму..поэтому не отсылайте плиз в поиск........ no1.gif unsure.gif
Lapp
Я тут попробовал провести небольшую классификацию компьютерных игр. Этим термином я называю не только традициоонные компьютерные, но и обычные игры, которые можно так или иначе привязать к компу. А также не только игры.. smile.gif КИ прошли довольно большой эволюционный путь, результаты поражают. Но если подходить с точки зрения обучения программированию, то имеет смысл вспомнить и давно забытые КИ. Моя классификация, конечно, неполная, не особо научная и, по большому счету, не очень нужная - но не сыпать же названиями просто так без всякой системы, перебивая друг друга: "..а вот еще есть такая игрушка - ..". Так что я приглашаю всех дополнять меня, исправлять и т.п. Но главное, следуя просьбе автора темы - стараться характеризовать достоинства и недостатки с программерской точки зрения. Кстати, большинство из того, что я перечисляю, обсуждалось здесь, и даже совсем недавно. Но мне кажется, это не повод отсылать к поиску. Просто нужно посоветовать ту игру, которая каким-то боком может быть интересна всем (или многим), и участвовать в общем базаре.. smile.gif (В скобках ставлю свою субъективную оценку по 10-бальной шкале - не самой игры, а ее ценности для начала изучения программирования)

1. Игры на реакцию.
а. Стрелялки.
В основном модель как бы реальной войнушки (пусть даже и в далеком космосе). Ничего особенного, но уже нужно одновременное управление несколькими движущимися объектами. (Оценка 5)

б. Лабиринты (диггер)
Очень обширная область. Обычно нужно обежать весь лабиринт, пока тебя не съели. Очень хорошо с точки зрения оттачивания техники программирования, особенно в графике. Сюда же включаю и знаменитую "змейку" через написание которой прошли, наверное, все. (Оценка 6)
Есть много комбинаций стрелялок и лабиринтов, но это уже навороты.

в. Тетрис
Очень удачная попытка привнести геометрическое воображение в тупое нажимание кнопок. Народу нравится. Релизация не очень сложная и довольно хороша с точки зрения обучения. Но скучновато.. (Оценка 4)

г. Ксоникс (Xonix).
Чрезвычайно удачная игрушка, сейчас несправедливо забытая. Нужно отрезать куски от изначального прямоугольника (пока он не уменьшится до типа 10%) и уворачиваться от врагов. Очень хороша для обучения программированию, включает непростые математические концепции. (оценка 7)

2. КИ на размышления.
а. Ну, можно упомянуть Сапера - реализация довольно простая, практически вся игра есть интерфейс, очень желательно в графике. Когда-то я написал всю ее за пару часов - можно посоревноваться в скорости написания smile.gif. (Оценка 5)

б. Головоломки. Снова практически только интерфейс, рисование. Но не всегда - область довольно разнообразная! Кто знаком с "Судоку"? Довольно забавно оказалось написать модуль для решения, еще забавнее - для составления головоломок. (Оценка 3)

3. Настольные игры. Карты, шахматы, кости
Настольные игры имеют две стороны в реализации: интерфейс и игра против компьютера. Первое просто как бы служит заменой доски и фишек, а второе позволяет порезвиться с алгоритмами оптимизации и всего, чего угодно smile.gif. Конечно, второе обычно происходит при поддержке первого (классический пример - ChessMaster и Deep Blue smile.gif ). Реализация интерфейса очень полезна новичкам. Хороша тем, что ее можно улучшать, начав с самой простой модели.

а. С элементом случайности (кости, карты).
Отличаются присутствием случайного процесса, что практически сделать несложно (стандартными методами). Лично меня не привлекают sad.gif (Оценка 1)

б. Детерминированные (шахматы, шашки, рендзю).
Заслуживает максимального внимания.
i. Рендзю (в просторечии - "кретики-нолики") - игра, которую нетрудно начать, а потом интересно развивать. В зависимости от предпочтений, можно углубиться в интерфейс или наоборот, при очень простом интерфейсе сделать высокий уровень интеллекта. (Оценка 8)
ii. Каллах (манкала) - восточная игра, тоже может быть представлена очень простым интерфейсом, но сложной начинкой. В свое время я делал самообучающуюся версию, и успешно. (Оценка 9)

4. Стратегии.
Про это ничего не пишу. Хоть это очень популярно сейчас, я не люблю и не играю. Наверняка кто-то может дописать этот пункт. (Оценка 0)

5. Квесты.
Одна из самых старых категорий. Она существовала еще на первых мейнфреймах в режиме командной строки. У игрока есть описание текущей ситуации ("вы стоите перед закрытой дверью, налево и направо уходит коридор, у ваших ног лежит странный предмет.."). Игрок вводит команду (типа "открыть дверь" или "поднять предмет"). Если команда распознана, выдается описание следующей ситуации и т.д. На первых персональных компьютерах они уже привлекали простую графику. Очень здорово вплетать в квесты головоломки (классика - "7-й гость"). (Оценка 2)

6. Чисто компютерные игры.
На заре копьютеризации была такая игра, "бой в памяти". Две проги разных авторов загружались в память машины, управление передавалось по очереди, по одному такту. Надо было выжить, заняв всю память. В таких играх основной интерес именно в программировании, а игра сама по себе практически незаметна. Но я не могу представить, как это можно организовать под Виндой.. smile.gif Но зато можно заставить играть между собой две программы для игры в крестики-нолики. Можно и соревнование устроить.. (Оценка 6)

7. Этот тип затрудняюсь определить в двух словах.
Во-первых, это игры без выигрыша. Во-вторых, они захватывающе интересны. В третьих, основной представитель - игра Жизнь. Эту игру придумал примерно в конце 60-х Джон Конвей. Формально она представляет собой так называемый клеточный автомат, существующий на дискретном пространстве. Клетки живут и умирают по поределенным (совсем простым) правилам. В те времена компьютеры были почти фантастикой, и тем более странно, как тогда люди умудрялись вычислять громадные конфигурации на протяжении сотен квантов времени - на клетчатой бумаге с карандашом и ластиком?? В те времена в США выходил журнал Life про эту игру. Сделать ее не сложно, но есть риск потом увязнуть и просиживать часы и дни, задавая все новые конфигурации и ища в Инете себе подобных smile.gif. Шутка, конечно. В моем рейтинге игры для новичка Жизнь получает максимальный балл (по блату, конечно smile.gif ). (Оценка 10).

Я понимаю, что чересчур обильный выбор может только ухудшить ситуацию.. sad.gif Но не смог удержаться!
Ozzя
Гелла
Морской бой. Я начинал именно с него.
Далее можно попробовать
Карточную игру BlackJack (Очко).
Удав (Змейка).
Бродяжник
Гелла
Добро пожаловать в клуб игроделов-любителей! smile.gif
Начните со змейки. Это дешево и сердито. Для начала - в текстовом режиме. Потом в графическом. Если хотите - один совет: не пренебрегайте тем, чтобы вначале записывать все алгоритмы на бумаге - на обычном человеческом языке. В ответ на вопрос "на каком языке вы программируете?" кто-то сказал - "На русском. А на Паскале и Си я кодирую". Чем лучше Вы все вначале обдумаете, тем быстрее пойдет дело. Если что - спрашивайте!
Lapp
А еще есть такой жанр, как RPG. Не путать с квестами!
Ozzя
lapp
5. Еще есть синоним (?) - adventure

Interactive Fiction - к этому же жанру относится.
Гелла
Блин...боюсь мне не под силу даже змейка и морской бой...вообще не представляю с чего начать...
volvo
Гелла, ты ответы ЧИТАЕШЬ, или БЕГЛО ПРОСМАТРИВАЕШЬ?

Тебе Бродяжник дал совет, лучше которого, поверь, быть ничего не может, а ты его либо проигнорировала (тогда расскажи, почему? Чем тебе он не приглянулся, и ЧТО ты хочешь, чтобы тебе советовали? Особенности реализации? Но если тебе подсказывать каждый шаг, ты НИКОГДА не научишься делать что-то самостоятельно), либо просто не заметила. Тогда какой смысл что-то тебе советовать, если ты это не читаешь.

Цитата(Бродяжник @ 31.03.2006 8:04)
Если хотите - один совет: не пренебрегайте тем, чтобы вначале записывать все алгоритмы на бумаге - на обычном человеческом языке.
Гелла
unsure.gif

Цитата
Гелла, ты ответы ЧИТАЕШЬ, или БЕГЛО ПРОСМАТРИВАЕШЬ?

Не надо так нервничать..... no1.gif unsure.gif


Я это прочитала..и приняла к сведению.....я имею ввиду другое...я не представляю какие возможности паскаля нужно использовать для этого... unsure.gif
hardcase
К теме. Видел книгу по созданию 3д стратегии на С++ с использованием DirectX 9.0, вроде как для новичков.
http://netlib.narod.ru/library/book0031/toc.htm
Мне она понравилась: написана доступно и легко читается ;-)
Если пошарить на том сайте, то книжку можно и скачать отдельным файлом.
Ozzя
Гелла
Морской бой
Давай по порядку
Алгоритм игры следующий

1. Инициализация
2. Расстановка кораблей_противника
3. Расстановка кораблей_Игрока

4. Пока Не_Конец_Игры
ход_игрока
ход_противника
5. Вывод результата

Упростим игру до предела
Текстовый режим, корабли только однопалубные (10)
1. Инициализация
переменных понадобятся два массива 10Х10
очистка экрана
2. Расстановка кораблей_противника
Обнуляем массив - ноль - в нашем случае море
Заполняем массив 10 значениями
номер_столбца:= случайное_ значение_от_1_до_10 (или от 2 до 9, если не ставить корабли к берегу)
номер_строки := случайное_ значение_от_1_до_10 (или от 2 до 9, если не ставить корабли к берегу)
Использовать random
Визуализация
Использовать функции псевдографики
Для вывода gotoxy, write

Вот попробуйте сделать эту часть. Помогу, если буду затруднения.
Бродяжник
Гелла, не расстраивайтесь. Вы сказали: "не знаю, какие возможности Паскаля для этого использовать". Теперь нужно уточнить - для чего "для этого"? То есть первое, что нужно, это довести Ваши смутные представления до стадии "мне нужно сделать то-то и то-то. А как?" Попробуйте сформулировать хотя бы два-три таких вопроса в отношении той игры, которую Вы выберете. Как только появятся такие вопросы, Вам помогут. Ну, например: Как очистить экран? Где хранить позиции кораблей на игровых полях? Как обработать нажатие клавиши "стрелка-вверх"? Дойдите в своих размышлениях до этой стадии.
Lapp
Гелла, постарайся быть все же поактивнее! Тебе накидали столько проектов - хоть бы в один ткнула пальцем наугад.. Мне придется сделать выбор за тебя smile.gif

В этом деле главное - это не бездействовать. Поэтому я начну. И все вместе продолжим. Извините, но я склоняюсь в сторону змейки - она динамичная. Морской бой (и все остальное) можно реализовать позже (или параллельно). Итак, я написал самый простой код, который явится даже не базой (поскольку он будет переделан в процессе совершенно), а скорее первым импульсом.

Гелла (всех желающих тоже приглашаю присоединяться к классу), пожалуйста, не копируй текст программы, набери его пальчиками. При наборе волей-неволей обратишь внимание на мелочи, которые трудно заметить при копировании. Если программа не пойдет сразу - внимательно проверь, найди ошибку. Это все очень полезно для начала, даже тупой (извини) набор и сличение двух текстов. При наборе соблюдай отступы, как в моем тексте - правильное оформление программы сильно помогает в ее создании (хотя и не влияет на компиляцию). Потом ты сама поймешь, насколько удобнее работать с правильно структурированным текстом.

Код реализует движение символа по экрану. Символом можно управлять, нажимая клавиши i,j,k,m. Выбор клавиш почти случаен - просто я не хотел сразу делать стрелки, чтобы не запутывать ученицу (стрелки производят двойные коды). Скорость движения символа постоянная, меняется только направление. При натыкании на стенку игра заканчивается.

Где же тут змейка? Очень просто: это только ее голова пока smile.gif. Чуть позже мы добавим звенья, из которых состоит тело. Змейка будет расти при поедании пищи, будет выводиться ее длина, время игры, результаты будем записывать в файл, так что можно будет соревноваться.

Я не стал помещать много комментариев в код, поскольку наверняка будут сложности с русскими буквами (не у всех, так у многих). Вот подробные пояснения.

Декларируем использование модуля CRT для работы с текстовым экраном.
Далее определяем некоторые числовые значения.
Но сначала условимся о названиях: x - горизонтальная координата, y - вертикальная (отсчет начинается из левого верхнего угла, точка (1,1) )
Введем еще и следующее соглашение: буква n в имени переменной означает Min (например, xn), а буква x - Max (например, yx). Таким образом, в строчках с 6 по 9 мы определяем границы экрана.
Далее определяем символ для вывода головы змейки.
Теперь задержка. Ее величиной можно регулировать скорость движения змейки по экрану.
А потом задаем начальное положение змейки и ее направление движения.

Наконец, сама программа.
Сначала чистим экран и инициализируем координаты змейки.
Потом начинаем основной цикл, который продолжаем, пока координаты змейки не выходят за пределы нашей области.
Стираем старое положение символа.
Рисуем символ в новом положении.
Перекладываем новые координаты в старые.
Ждем некоторое время, иначе символ будет бегать слишком быстро.
Если нажата клавиша, читаем ее.
Если это был управляющий символ - производим изменение направления движения.
Вычисляем новое положение змейки.
Идем в начало цикла...


{snake-01}
uses
CRT;

const
xn=1; {Left screen limit}
xx=80; {Right screen limit}
yn=1; {Top screen limit}
yx=25; {Bottom screen limit}
H='8'; {Snake head}
dt=500; {Delay}

var
x0:integer=xn; {Snake location}
y0:integer=yx div 2;
vx:integer=1; {Snake direction}
vy:integer=0;

var
x,y:integer; {New snake location}
c:char;

begin
ClrScr;
x:=x0;y:=y0;
while (x>=xn)and(x<=xx)and(y>=yn)and(y<=yx) do begin
GoToXY(x0,y0);Write(' ');
GoToXY(x,y);Write(H);
x0:=x;y0:=y;
Delay(dt);
if KeyPressed then begin
c:=ReadKey;
case c of
'i':begin vx:=0;vy:=-1 end;
'm':begin vx:=0;vy:=1 end;
'j':begin vx:=-1;vy:=0 end;
'k':begin vx:=1;vy:=0 end;
end;
end;
Inc(x,vx);Inc(y,vy);
end
end.


Программу я проверял в FPC, все работало.
Рекомендую сохранять каждую версию в своем файле с соответствующем номере. Например, эту программу сохрани в файле snake-01.pas . Потом в процессе доработки номер версии будет увеличиваться. exe-файлы (а также обжекты) лучше уничтожать, чтоб не загаживать диск, а вот паскалевский текст лучше сохранять.
Можешь поэкспериментировать, сама попробовать развить идею дальше, для этого лучше сделай отдельный файл.

Давай сюда все свои вопросы - как по технике программирования, так и по идеологии. Или просто типа "а это че??"
Ну а потом, живы будем - продолжим.. smile.gif
FreeMan
Идея дальше - нужны яблоки smile.gif заодно и работа с массивами будет. то есть массив 80х25. если ячейка = 1, то там яблоко, если 0 - нету. потом дабы отточить понимание байта как 8 бит можно запихать это всё и в одномерный массив из 250 байт.
Гелла
program zmeika;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=500;

var
x0,y0,vx,vy,x,y:integer;
c:char;

begin
clrscr;
x0:=xn;
y0:=yx div 2;
vx:=1;
vy:=0;
x:=x0;
y:=y0;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x0,y0);
write(H);
x0:=x;
y0:=y;
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i': begin vx:=0; vy:=-1 end;
'm': begin vx:=0; vy:=1 end;
'j': begin vx:=-1; vy:=0 end;
'k': begin vx:=1; vy:=0 end;
end;
end;
Inc(x,vx); Inc(y,vy);
end;
end.

Тэги. GoodWind

А змейка не появляется..Только целая строчка восьмерок..(символов головы змейки)…а когда я пытаюсь её передвинуть при помощи клавиш i,m,j,k то появляется окно с текстом программы….А процедура Inc(x,vx); Inc(y,vy)вычисляет новое положение змейки чтоли??
volvo
Гелла, ты пропустила 2 оператора, которые как раз и занимаются тем, что стирают символ "8" в старой позиции перед тем, как отобразить его в новой... Вот эти:
Цитата
GoToXY(x0,y0);Write(' ');
GoToXY(x,y);
Write(H);
Lapp
Цитата(Гелла @ 4.04.2006 21:36)
А змейка не появляется..Только целая строчка восьмерок..(символов головы змейки)…а когда я пытаюсь её передвинуть при помощи клавиш i,m,j,k то появляется окно с текстом программы….А процедура Inc(x,vx); Inc(y,vy)вычисляет новое положение змейки чтоли??

Молодец!! Хвалю! smile.gif
Если честно, я особо не рассчитывал, что с первого раза все получится.. Если совсем честно - то не рассчитывал даже на то, что ты последуешь моему указанию и станешь набирать пальцами, а не скопируешь smile.gif. Ты превосходишь все (ну, почти..) ожидания! Спасибо smile.gif

Итак, учебный процесс идет пока по графику. Отвечаю на твои вопросы (возможно, незаданные). Попутно некоторые советы.

1. Змея по-английски будет snake (снэйк). Я очень рекомендую употребление английских слов в программировании. Русские слова, написанные латиницей, гораздо хуже читаются и могут иметь много вариантов написания. Там, где это уместно или необходимо - надо использовать русский (кирилицу или латиницу - зависит от конкретного случая), то есть я не против использования русского. Но все же делай акцент на английский для названий переменных и для коротких пояснений. Заодно и английский подучишь! Здесь я постараюсь пояснять английские слова, которые буду употреблять.

2. Оператор program не является обязательным в Паскале, поэтому я его не употребил. Но если ты его используешь, назови программу snake. Ok?

3. Я уже говорил, но еще разок не помешает - пока наша змейка состоит из одной только головы. Для головы я выбрал символ "8" потому, что восьмерка похожа на глаза или очки (пусть наша змейка будет очковой коброй smile.gif ). Но ты можешь, ессно, заменить этот символ на любой, который тебе нравится.

5. При наборе текста естественно допускать ошибки - человеку свойственно ошибаться. Но при этом имей в виду, что мой код был проверен, и вероятность, что он не работает по объективной причине довольно мала. Поэтому после набора, если программа не заработала - тщательно проверь, правильно ли набран текст. Volvo указал тебе на твою ошибку в этот раз, исправь ее. Открою тебе секрет: я потому и просил набирать руками, что думал, что ты сделаешь ошибки. Исправление таких ошибок - лучший способ обучения. Пока ты оправдываешь мои надежды.. ;)

4. Когда помещаешь текст программы сюда, в сообщение, будь добра, окружай его тегами [рascode] перед текстом и [/рascode] после текста (учти, что тут я вместо английской "p" употребил русскую "р", иначе теги бы сработали, и ты не увидела бы их тут, а вместо них был бы прямоугольник вставки, а в нем "перед текстом и"). Сами теги не показываются при выводе, а в программном тексте будет сохранено форматирование текста, и даже подсвечен синтаксис. Теги можно писать вручную, а можно сделать так:
- выдели текст программы блоком;
- кликни кнопку с буквой P в ряду кнопок над окном набора текста (примерно посредине окна).
Выделенный текст будет окаймлен тегами. Не забудь нажать "Предварительный просмотр", чтобы убедиться, что все получилось как надо. Если не получилось - ищи ошибку (незакрытый тег, ошибка в названии тега..). Сейчас я помещу ниже твой программный текст, и ты увидишь, как он выглядел бы, если бы ты все сделала правильно.

program zmeika;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=500;

var
x0,y0,vx,vy,x,y:integer;
c:char;

begin
clrscr;
x0:=xn;
y0:=yx div 2;
vx:=1;
vy:=0;
x:=x0;
y:=y0;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x0,y0);
write(H);
x0:=x;
y0:=y;
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i': begin vx:=0; vy:=-1 end;
'm': begin vx:=0; vy:=1 end;
'j': begin vx:=-1; vy:=0 end;
'k': begin vx:=1; vy:=0 end;
end;
end;
Inc(x,vx); Inc(y,vy);
end;
end.


Видишь? Совсем же другое дело!..
И тут выясняется, что:
- разделы var и const ты не сдвигала... Рекомендую это делать!
- размер сдвига у тебя пляшет: то 2, то 4, то 3..
Последнее совершенно недопустимо!! Ибо бывают ситуации, когда разобраться, к какому логическому блоку относится оператор можно только по суммарному сдвигу (размер сдвига умножить на вложенность блока). Уверяю тебя, это делается не для красоты (хотя красота идет попутно). Выбери стандарт для себя и не отступай от него никогда! Я рекомендую 2 (один сдвиг - два пробела). Если ты работаешь в FPC (кстати - обязательно скажи, в чем ты работаешь), то зайди в Options - Environment - Editor, и там поставь Tab Size = 2 и Indent Size = 2. После этого выполни Options - Save. Возможно, тебе придется переоткрыть рабочее окно, чтоб это подействовало..

5. Процедура Inc(i) - это, грубо говоря, увеличение на 1 (для целых чисел). Происходит от английского increase (увеличивать, возрастать). Иначе говоря, это эквивалентно оператору i:=i+1 . Строго говоря, такая операция производится быстрее, чем сложение, но практически все оптимизирующие компиляторы все равно заменят сложение на инкриментирование, так что все равно, что писать. Я предпочитаю пользоваться Inc'ом, и тебе советую. Есть ситуации, где это действительно упрощает дело (если говорить о перечисляемых типах, например, или даже просто о типе char). Кстати, аналогично ей, есть процедура для уменьшения, Dec(i) (от английского decrease - уменьшать, убывать), которая эквивалентна i:=i-1 .

Ну вот, на сегодня хватит. Пожалуйста, все проверь, исправь и постарайся разобрать что делает каждый оператор (мои пояснения смотри в предыдущем сообщении). Жду следующих вопросов - и пора уже двигаться дальше!
Успехов!
Бродяжник
Гелла
Поздравляю с тем, что Вы таки начали это дело!
Небольшая подсказка: попробуйте увеличить значение константы dt. Поставьте эдак 5000 вместо 500. А может быть, и все 25000. Или еще больше. Я подозреваю, что у Вас быстрый компьютер и непропатченная версия модуля CRT. Словом, попробуйте. Попытка не пытка...
Lapp
Гелла, интерес пропал? Скажи, что именно тебя смутило и заставило молчать. Слишком много? Слишком резко? Что-то конкретное непонятно? Что-то непонятно, но не знаешь, что именно? Непонятно, о чем вообще речь? Говори в любой форме, но говори. Либо уж скажи, что это тебе не нужно..

Понимаешь, польза будет только при постоянных ежедневных упражнениях. Хоть час, хоть полчаса, хоть даже 15 мин, если совсем уж некогда. Это как обычный иностранный язык - успех резко повышается, при учащении занятий, и полностью сводится к нулю при перерыве между ними больше трех дней. И я со своей настойчивостью тут ни при чем, просто так устроен мозг. Любая информация, воспринятая им, сначала кладется в кратковременную память. Даже если все понятно, она будет забыта через 4-5 дней. Но если в течение нескольких последующих дней она была вызвана / использована / дополнена - она перекладывается на долговременный уровень. Так работает мозг, и изменить это не в наших силах. Если действительно хочешь добиться успеха - учитывай это простое правило. Идти против - бессмысленно и странно.

Как видишь, люди тут готовы тебе помочь - но нужна адекватная реакция.
Твой выбор?..
Гелла
Цитата
Гелла, интерес пропал? Скажи, что именно тебя смутило и заставило молчать. Слишком много? Слишком резко? Что-то конкретное непонятно? Что-то непонятно, но не знаешь, что именно? Непонятно, о чем вообще речь? Говори в любой форме, но говори. Либо уж скажи, что это тебе не нужно..


Нет, всё в порядке....конечно мне это очень нужно..когда я была на форуме посл раз 2 дня назад я только сохранила эту страницу..читала всё в авономном режиме....на след день у интернет фирмы, где я покупаю карты доступа что то случилось с центральным компьтером как мне сказали в службе технической поддержки.. какая то авария...когда модем набирал номер всё время было занято.....я подождала 2 дня...они не устранили неполадку..вообщем в итоге пришлось покупать другую карту другого првайдера...

Цитата
Если честно, я особо не рассчитывал, что с первого раза все получится.. Если совсем честно - то не рассчитывал даже на то, что ты последуешь моему указанию и станешь набирать пальцами, а не скопируешь . Ты превосходишь все (ну, почти..) ожидания! Спасибо


Это Тебе Большое Спасибо:-)


program snake;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=5000;

var
x0,y0,vx,vy,x,y:integer;
c:char;

begin
clrscr;
x0:=xn;
y0:=yx div 2;
vx:=1;
vy:=0;
x:=x0;
y:=y0;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x0,y0);
write(' ');
GoToXY(x,y);
write(H);
x0:=x;
y0:=y;
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i': begin vx:=0; vy:=-1 end;
'm': begin vx:=0; vy:=1 end;
'j': begin vx:=-1; vy:=0 end;
'k': begin vx:=1; vy:=0 end;
end;
end;
Inc(x,vx); Inc(y,vy);
end;
end.


Исправила ошибку, теперь появляется одна восьмерка..она двигается по прямой и когда доходит до конца монитора останавливается....не реагирует на нажатие клавиш i,m,j,k, при этом появляется окно с текстом программы...

Цитата
Если ты работаешь в FPC (кстати - обязательно скажи, в чем ты работаешь), то зайди в Options - Environment - Editor, и там поставь Tab Size = 2 и Indent Size = 2. После этого выполни Options - Save. Возможно, тебе придется переоткрыть рабочее окно, чтоб это подействовало..


А что такое FPC? Я работаю в обычном Turbo Pascal 7.0 под DOS(на синем экране).


Цитата
5. Процедура Inc(i) - это, грубо говоря, увеличение на 1 (для целых чисел). Происходит от английского increase (увеличивать, возрастать). Иначе говоря, это эквивалентно оператору i:=i+1 . Строго говоря, такая операция производится быстрее, чем сложение, но практически все оптимизирующие компиляторы все равно заменят сложение на инкриментирование, так что все равно, что писать. Я предпочитаю пользоваться Inc'ом, и тебе советую. Есть ситуации, где это действительно упрощает дело (если говорить о перечисляемых типах, например, или даже просто о типе char). Кстати, аналогично ей, есть процедура для уменьшения, Dec(i) (от английского decrease - уменьшать, убывать), которая эквивалентна i:=i-1 .


Т.е. если в скобках мы пишем Inc(x,vx), это значит vx:=x+1 или x:=x+1 тогда зачем мы пишем ещё и vx?
suriv
Цитата
Т.е. если в скобках мы пишем Inc(x,vx), это значит vx:=x+1 или x:=x+1 тогда зачем мы пишем ещё и vx?


X:=X+VX


после той запятой ставиться то число на которое хотим увеличть или уменьшить
если не ошибаюсь...
Lapp
Гелла, тебе не нужно было оправдываться.. Мне (да и никому особенно) не важно, почему тебя нет. Я не декан, просто интерес должен быть обоюдный. Если мне покажется, что тебе неинтересно - интерес иссякнет и у меня.. Да и к тому же я видел твои заходы в форум оба дня, когда ты молчала... Ладно, не будем препираться smile.gif.
Цитата(Гелла @ 7.04.2006 14:32) *

Исправила ошибку, теперь появляется одна восьмерка..она двигается по прямой и когда доходит до конца монитора останавливается....не реагирует на нажатие клавиш i,m,j,k, при этом появляется окно с текстом программы...

Это странно. Я скопировал твой код и прогнал его и в FPC, и в BP7. В обоих случаях голова (восьмерка) дигалась и поворачивала при нажатиях i, j, k, m - короче, вела себя адекватно. Может, у тебя был нажат Caps Lock? Или ты ждала, когда она дойдет до края, а потом нажимала? Смысл в том, что змейка в этой игре не должна натыкаться на стены - это для нее смерть. Поэтому я и сделал выход из программы по выходу восьмерки на край. Если ты управляешь ей и не даешь ей натыкаться на стенку, то она будет бегать вечно. Попробуй еще разок. И поставь задежку поменьше, типа 200 (хотя ТР может неправильно ее отрабатывать), чтобы все было подинамичнее..
Цитата(Гелла @ 7.04.2006 14:32) *

А что такое FPC? Я работаю в обычном Turbo Pascal 7.0 под DOS(на синем экране).

FPC - это Free Pascal, Бесплатный Паскаль. Он тоже на синем экране, но под Dos работать не будет. Он вообще очень сильно похож на ТР, но есть одно главное отличие: ТР - это 16-разрядный компилятор, а FPC - это полностью 32-битный компилятор. Улавливаешь разницу? Например, ты сделала прогу в ТП7, потом запустила FPC, и в нем скомпилировала тот же самый программный текст. Когда ты запустишь эту прогу, ты не увидишь разницы - то же обычное черное досовское текстовое окошко (можно переключиться в полноэкранный режим нажатием Ctrl-Enter). Но внутри программа совершенно другая - 32-разрядная! Например, ты сможешь использовать гораздо больше памяти (я свободно использую весь свой гигабайт), причем не блоками по 64КБ, а одним массивом! Ощущаешь выгоду?

Но для программки типа нашей змейки пока что разницы нету, в чем ты работаешь. Если хочешь все же установить себе FPC - пожалуйста, качай его совершенно бесплатно с их сайта http://www.freepascal.org/ , только учти, что дистрибутив весит 25 МБ. По диалапу это будет качаться много часов, и он выйдет сильно небесплатный.. Если ты живешь в Москве, я бы советовал тебе бросить клич, кто может записать его на CD, а потом пересечься с тобой где-нить в метро. Сам я, увы, не могу..

Но, повторяю, для змейки FPC не обязателен. Что касается отступов, то совершенно аналогично ты можешь настроить свой ТП7. Иди в Options - Environment - Editor, и там поставь Tab size равным 2. Мне кажется, это идеальный размер для сдвига (при 4 на глубокие вложения не хватит экрана). Дальше для сдвига просто нажимай клавишу Tab. Можно сдвигать и куски текста (это часто бывает нужно). Для этого отметь нужный кусок блоком, а потом нажми (Ctrl-K, I). То есть К при нажатом Ctrl, а I -потом можно при нажатом и ненажатом. Еще раз повторяю: сдвиг должен быть одинаковым, а у тебя он пляшет - то 4, то 5.

Далее, структура программы у тебя нарушена. Каждый END должен быть ровно на том же сдвиге, как и BEGIN (точнее, та строчка, в которой стоит этот BEGIN), который открыл этот блок. Если END относится не к BEGINу, а к CASE, то он должен быть на том же сдвиге, как и CASE. У тебя последние ENDы сдвинуты. Посмотри мой текст для образца, разберись, какой END относится к какому BEGINу. Ок?

Конечно, сдвиги не влияют на компиляцию. Но они очень помогают при написании. Вот когда начнешь сама отыскивать ошибки в тексте (а не с помощью Volvo smile.gif ), тогда поймешь и оценишь.

Цитата(Гелла @ 7.04.2006 14:32) *

Т.е. если в скобках мы пишем Inc(x,vx), это значит vx:=x+1 или x:=x+1 тогда зачем мы пишем ещё и vx?

Процедуры Inc и Dec могут иметь один параметр, а могут два (в прошлый раз я это не сказал). Если параметр один, то он увеличивается (уменьшается) на единицу. Если параметров два, то первый параметр увеличивается (уменьшается) на величину второго (как сказал suriv). Если второй параметр отрицательный, то реально происходит уменьшение (увеличение). В нашем случае, если змейка движется вправо, то значение х нужно увеличивать, а если влево, то уменьшать. Но писать отделные блоки кода, один из которых использует Inc, а другой - Dec, для движения вправо и влево - неразумно. Я использую vx (по аналогии со скоростью). Если vx=1, то оператор Inc(x,vx) увеличит значение х (движение вправо), а если vx=-1, то уменьшит (движение влево). Понятно? Аналогично для y (учти, что y увеличивается по экрану сверху вниз!).

Разберись детально, дотошно, въедливо, что делает каждая строчка, каждый оператор. Все вопросы задавай. Экспериментируй сама тоже. Например, неясно, почему vy задается равным -1 (см. строчку 37 твоего файла). Ну, в натуре, берешь и заменяешь это значение на 0 или 2... Потом запускаешь и смотришь, что будет..

Ну, пока. Жду рапорта о том, что все работает, как часы - и что тебе все понятно! smile.gif
Гелла
Цитата
Да и к тому же я видел твои заходы в форум оба дня, когда ты молчала...


а вот этого точно быть не может.. wink.gif не могу с этим согласиться...

Цитата
Разберись детально, дотошно, въедливо, что делает каждая строчка, каждый оператор. Все вопросы задавай. Экспериментируй сама тоже. Например, неясно, почему vy задается равным -1 (см. строчку 37 твоего файла). Ну, в натуре, берешь и заменяешь это значение на 0 или 2... Потом запускаешь и смотришь, что будет..


так и сделаю... unsure.gif
Lapp
Цитата(Гелла @ 8.04.2006 12:20) *

а вот этого точно быть не может.. wink.gif не могу с этим согласиться...

Мож глюк какой..
Цитата(Гелла @ 8.04.2006 12:20) *

так и сделаю... unsure.gif

Ок, давай! Нас ждет много интерсного впереди! smile.gif
Гелла
Цитата
Ок, давай! Нас ждет много интерсного впереди!

good.gif
Гелла
Программа работает!У меня был неправильный паскаль...стоило переустапновить паскаль и всё заработало...вроде во всём разобралась...

Goodwind: "..это неправильные пчелы.. "© Винни-Пух
Lapp
Гелла, привет. Режь меня - не могу представить ситуацию, чтоб "неправильный" Паскаль компилил прогу так, чтоб она неправильно работала! Мистика какая-то.. У Турбо Паскаля и установки-то как таковой нету - просто копируй файлы, да и все.

Ну, что ж - можно топать вперед.. Но только движение вперед всегда относительно. Сейчас мы сделаем программу, которая делает в точности то же самое smile.gif.
Мы оптимизируем, или просто улучшим программу. Любая сколь-нибудь серьезная программа может быть улучшена сразу после написания. Сначала ты пишешь текст, отлаживаешь, видишь - все работает. Но после этого замечаешь, что программа может быть улучшена.. Посмотри текст внизу. Запусти его (можешь на этот раз скопировать), убедись, что все действительно работает по-старому.
После этого сравни его со старым текстом. Найди, как грится, десять отличий. И попытайся тут высказать, какие улучшения мне удалось сделать в этой совсем небольшой программке smile.gif. Ок?
{Version 02}
uses
CRT;

const
xn=1; {Left screen limit}
xx=80; {Right screen limit}
yn=1; {Top screen limit}
yx=25; {Bottom screen limit}
H='8'; {Snake head}
dt=500; {Delay}

var
x:integer=xn; {Snake location}
y:integer=yx div 2;
vx:integer=1; {Snake direction}
vy:integer=0;

var
c:char;

begin
ClrScr;
while (x>=xn)and(x<=xx)and(y>=yn)and(y<=yx) do begin
GoToXY(x,y);Write(H);
Delay(dt);
if KeyPressed then begin
c:=ReadKey;
case c of
'i':begin vx:=0;vy:=-1 end;
'm':begin vx:=0;vy:=1 end;
'j':begin vx:=-1;vy:=0 end;
'k':begin vx:=1;vy:=0 end;
end;
end;
GoToXY(x,y);Write(' ');
Inc(x,vx);Inc(y,vy);
end
end.
Гелла
Цитата
Гелла, привет. Режь меня - не могу представить ситуацию, чтоб "неправильный" Паскаль компилил прогу так, чтоб она неправильно работала! Мистика какая-то.. У Турбо Паскаля и установки-то как таковой нету - просто копируй файлы, да и все.

все удивляются..но так и было...на том старом паскале программа неправильно работала...а в этом всё отлично...мож я конечсно что неправильно поняла...или неправильно установила........

Цитата
После этого сравни его со старым текстом. Найди, как грится, десять отличий. И попытайся тут высказать, какие улучшения мне удалось сделать в этой совсем небольшой программке . Ок?


Сегодня этим займусь....
Гелла
program snake_2;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=500;


var x,y,vx,vy:integer;
c:char;

begin
clrscr;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x,y);
write(H);
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i':begin vx:=0; vy:=-1 end;
'm':begin vx:=0; vy:=1 end;
'j':begin vx:=-1; vy:=0 end;
'k':begin vx:=1; vy:=0 end;
end;
end;
GoToXY(x,y);
write('');
Inc(x,vx);
Inc(y,vy);
end;
end.

Она не работает...только не понимаю почему..ошибок никаких, а на экране вообще ничего не появляется...
просто чёрный экран...
Lapp
Цитата(Гелла @ 13.04.2006 16:42)
Она не работает...только не понимаю почему..ошибок никаких, а на экране вообще ничего не появляется...
просто чёрный экран...
Гелла, привет!
Ты молодец, я бы принес тебе большую конфету, если бы был твоим учителем! smile.gif Кроме шуток..
Ты не воспользовалась данным мной разрешением копировать текст (copy-paste), а набрала руками! Это оказалось неожиданно очень полезно - вылезла ошибка (не ошибка, скорее пробел), которую я бы пропустил. Слушай, если уж ты такая усердная - давай я тебя еще об одном попрошу, а? Пожалуйста, отвечай хотя бы коротко на все пункты (явные и неявные) в моих постах. Типа - "это - поняла, это просто!". Или: "а это - кажется, понятно но может не совсем.." Договорились? smile.gif

Итак, про тот пробел. В Паскале есть декларация CONST. Она означает, что величины в ней изменяться никогда не будут, всегда сохраняя значение, заданное в тексте программы. У меня такими константами заданы границы игрового поля (которое сейчас занимает весь текстовый экран), а также промежуток времени и символ головы. Поскольку величины, заданные в этом разделе, никогда не изменяются, то компилятор реально не отводит для них ячейки памяти. Он поступает проще: везде, где эта константа (скажем, xn или xx) встретится в тексте, он подставит число, которому она равна (в данном случае 1 или 80). То есть программа компилируется как если бы мы сразу написали 1 вместо xn и 80 вместо xx. Так зачем они тогда нужны, спрашивается? А нужны они для удобства программирования (как и вообще все языки smile.gif ). А именно, если завтра ты захочешь изменить игровое поле - сузить, отодвинув его от краев экрана - то тебе придется, если ты не использовала константы, ползать по всему тексту проги и искать, где вместо 1 поставить 2, а вместо 80 поставить 79.. При этом, если 80 отследить просто, то единиц в тексте может быть гораздо больше, ибо не все они означают границу поля. Так что тебе придется думать, что есть что. Если же использовать константы (как мы и сделали), то для изменения границ поля достаточно заменить xn=1 на xn=2, а также xx=80 на xx=79, а компилятор сам подставит нужные числа в нужных местах. smile.gif Это понятно?

Есть еще один большой плюс констант. Они могут использоваться в качестве границ при определении массивов. Более того, можно даже использовать арифметические выражения с ними при проеделении размерности массива (типа N*2+3). Это очень удобно, так как обычно в программе обычно присутствуют несколько массивов, размерности которых связаны между собой каким-либо образом (не обязательно равны).

Но это еще не есть тот самый пробел. Это присказка. Двигаемся дальше..
Я начал разговор о константах потому, что причина того, почему программа у тебя не заработала, связана с константами. В Паскале есть еще понятие "типизированные константы". С ними может возникнуть путаница, так как это совсем не константы. Для них отводится память, как для переменных, они используются, как переменные. И их нельзя использовать в определении размерности массива. Почему они тогда называются константы? Это никому неизвестно. Но они действительно помещаются в раздел CONST. Вот так:
const
a:integer=5;
e:real=2.17;

По сути, эти штуки лучше было бы назвать "инициализированные переменные", так как смысл именно тот: это обычная переменная, но имеющая определенное начальное значение (значение обычных переменных перед выполнением программы не определено). Так вот, в ТР7 это делается именно так, как я описал выше.

Теперь идем еще дальше.. В FreePascal (FPC), которым пользуется твой покорный слуга, видимо, решили исправить это досадное недоразумение. Они разрешили инициировать переменные, то есть делать так:
var
a:integer=5;
e:real=2.17;

Замечаешь разницу? Теперь заголовок var, а не const. То есть в FPC можно использовать и const, и var. Ну и я, ессно, использовал var! smile.gif А ТР7, коим пользуется юная леди, этого не пропускает! И вот упомянутая мисс, берет, да и просто отрезает значения.. smile.gif Так было?.. сознайся! smile.gif

Когда ты набирала первую версию, ты вышла из этого положения корректно: ты перенесла инициализацию в исполняемый блок (молодец!). А во второй версии ты этого не сделала (теряюсь в догадках, почему).

Собственно, ты сейчас должна догадаться, как исправить мой текст Версии 2. Да, правильно - изменить словечко var на const (первое из них, второе не надо).
Теперь понятно? smile.gif
Уфф... пойду перекушу перед походом в зал - иначе упаду в середине игры.. smile.gif
Жду ответа с нетерпением. С отметками - что ясно, что нет..
Чао!
volvo
Цитата(lapp @ 14.04.2006 6:06)
Теперь идем еще дальше.. В FreePascal (FPC), которым пользуется твой покорный слуга, видимо, решили исправить это досадное недоразумение. Они разрешили инициировать переменные, то есть делать так:
var
a:integer=5;
e:real=2.17;
Замечаешь разницу? Теперь заголовок var, а не const. То есть в FPC можно использовать и const, и var.

lapp, я понимаю, что это мое замечание немного не в тему, этому можно посвящать отдельную ветку, но все же... Я увидел, как ты, сам того не подозревая, даешь не совсем верную информацию, и просто не мог пройти мимо. Насчет:
Цитата(lapp @ 14.04.2006 6:06)
То есть в FPC можно использовать и const, и var.
Можно-то можно, но это же не одно и то же... Ты здесь не столкнулся с проблемой только потому, что использовал ГЛОБАЛЬНЫЕ переменные/константы. И не только поэтому... Дело все в том, что FPC милостиво разрешает тебе использовать и
Var a: integer = 1;

и
Const a: integer = 1;

по одной простой причине: это делается для совместимости с Дельфи. И у тебя, скорее всего, в настройках среды установлена по-умолчанию именно совместимость с Дельфями... А я уже говорил, и опять повторяю, что нельзя надеяться, что у всех среда настроена так же, как у тебя. Если я хочу, чтобы у всех, кто попробует откомпилировать мою программу, результат был одинаков - я не буду полагаться на настройки IDE, а буду использовать ключи и режимы компиляции. Так вот попробуй свою программу откомпилировать при установленном первой строкой ключе
{$mode TP}

и ты увидишь, что FPC может и кусаться, не всегда он ласково трется об руку и мурлычет smile.gif

Кроме того, вот тебе пример, иллюстрирующий разницу между типизированными константами и переменными с начальным значением (при использовании их ЛОКАЛЬНО):
1)
procedure a;
const
x: integer = 10;
px : ^integer = @x;

begin
px := @x;
px^ := 12;
writeln('x = ', x);
end;

begin
a;
end.

2)
procedure a;
var
x: integer = 10;
px : ^integer = @x;

begin
px := @x;
px^ := 12;
writeln('x = ', x);
end;

begin
a;
end.


Вроде, одно и то же, правда? Откомпилируй, и почувствуй разницу...
Lapp
volvo, спасибо, мне действительно недоставало ясности по этому вопросу - теперь, кажется, она есть.
Кстати, сообщение твое вполне в тему, я вообще не вижу особых ограничений. Я, кстати, не очень рад, что остался один на один с ученицей.. Боюсь, я и не сдюжу в нужном темпе довести все до конца (а хотелось бы). Так что - помогайте, кто чем! smile.gif Конечно, слишком тонкие материи могут оказаться действительно лешневатыми Гелле в ее начальном состоянии (да еще и с ТР). Но ошибки (мои) - есть ошибки, их нужно исправлять.
Я все же замечу Гелле для большей ясности, что в ТР (ВР) инициализированных переменных все же нет вообще, а типизированные константы работают, как я описал.
И снова жду ответа.. smile.gif
Гелла
Привет lapp!

Цитата
Слушай, если уж ты такая усердная - давай я тебя еще об одном попрошу, а? Пожалуйста, отвечай хотя бы коротко на все пункты (явные и неявные) в моих постах. Типа - "это - поняла, это просто!". Или: "а это - кажется, понятно но может не совсем.." Договорились?

Договорились...

Цитата
В Паскале есть декларация CONST. Она означает, что величины в ней изменяться никогда не будут, всегда сохраняя значение, заданное в тексте программы. У меня такими константами заданы границы игрового поля (которое сейчас занимает весь текстовый экран), а также промежуток времени и символ головы. Поскольку величины, заданные в этом разделе, никогда не изменяются, то компилятор реально не отводит для них ячейки памяти. Он поступает проще: везде, где эта константа (скажем, xn или xx) встретится в тексте, он подставит число, которому она равна (в данном случае 1 или 80). То есть программа компилируется как если бы мы сразу написали 1 вместо xn и 80 вместо xx. Так зачем они тогда нужны, спрашивается? А нужны они для удобства программирования (как и вообще все языки ).


это мне понятно..



Цитата
В Паскале есть еще понятие "типизированные константы". С ними может возникнуть путаница, так как это совсем не константы. Для них отводится память, как для переменных, они используются, как переменные. И их нельзя использовать в определении размерности массива. Почему они тогда называются константы? Это никому неизвестно. Но они действительно помещаются в раздел CONST


с самого начала путаюсь в этих разновидностях констант...

Цитата
А ТР7, коим пользуется юная леди, этого не пропускает! И вот упомянутая мисс, берет, да и просто отрезает значения.. Так было?.. сознайся!

да TP 7.0 не пропускает такую фому записи..я их убрала оттуда, а потом про них просто забыла...

Цитата
Собственно, ты сейчас должна догадаться, как исправить мой текст Версии 2. Да, правильно - изменить словечко var на const (первое из них, второе не надо).

так у меня всего одно слово var... unsure.gif

Цитата
Теперь понятно?

unsure.gif unsure.gif I'm not sure...

program snake_2;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=500;


var x,y,vx,vy:integer;
c:char;

begin
x:=xn
y:=yx div 2;
vx:=1;
vy:=0;


clrscr;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x,y);
write(H);
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i':begin vx:=0; vy:=-1 end;
'm':begin vx:=0; vy:=1 end;
'j':begin vx:=-1; vy:=0 end;
'k':begin vx:=1; vy:=0 end;
end;
end;
GoToXY(x,y);
write('');
Inc(x,vx);
Inc(y,vy);
end;
end
volvo
Гелла, делаешь очень опасную ошибку... Она никак не контролируется компилятором TP (более новые компиляторы выдают Warning, но большинство программистов, особенно начинающих, на предупреждения внимания не обращает, главное - что ошибок нет...)

А вот на правильность работы программы эта ошибка повлиять ох как может... Ты забыла инициализировать переменную X. То есть, описать ты ее описала, но какое значение ей будет присвоено при запуске программы? Хотя TP и должен обнулять (присваивать НУЛЮ) все глобальные переменные, все-таки, это лучше брать под свой контроль.

Кроме всего прочего, я не уверен, что значение X = 0 тебя устроит по логике работы программы: ты даже не войдешь внутрь цикла While, потому что уже в самом начале условие (x >= xn) ложно, потому как:

X = 0, xn = 1 что получили? (X >= xn) является проверкой (0 >= 1), естественно - ЛОЖЬ

соответственно, цикл While выполняться не будет, и программа закончится, даже не начавшись...

Там, где ты присвоила начальное значение переменной Y, сделай такое же действие для X...
Гелла
Цитата
Гелла, делаешь очень опасную ошибку... Она никак не контролируется компилятором TP (более новые компиляторы выдают Warning, но большинство программистов, особенно начинающих, на предупреждения внимания не обращает, главное - что ошибок нет...)

А вот на правильность работы программы эта ошибка повлиять ох как может... Ты забыла инициализировать переменную X. То есть, описать ты ее описала, но какое значение ей будет присвоено при запуске программы? Хотя TP и должен обнулять (присваивать НУЛЮ) все глобальные переменные, все-таки, это лучше брать под свой контроль.

Кроме всего прочего, я не уверен, что значение X = 0 тебя устроит по логике работы программы: ты даже не войдешь внутрь цикла While, потому что уже в самом начале условие (x >= xn) ложно, потому как:

X = 0, xn = 1 что получили? (X >= xn) является проверкой (0 >= 1), естественно - ЛОЖЬ

соответственно, цикл While выполняться не будет, и программа закончится, даже не начавшись...

Там, где ты присвоила начальное значение переменной Y, сделай такое же действие для X...


Спасибо, я даже не знала, что в TP cтолько тонкостей....я думала, что раз нет ошибок, то программа не может быть неверно написанной.. unsure.gifя сделала такое же действие для x, но программа не работает...
Бродяжник
Привет, Гелла!
Возможно, эта ошибка содержится только в тексте, выложенном на форуме, но в самом начале программы в строке
x:=xn

недостает точки с запятой. Наверное, в рабочей программе она есть. Далее, как в точности выглядит строка в программе, где записано
GoToXY(x,y);
write('');
?
Там между кавычками должен быть пробел. Он есть?
И наконец (я уже об этом писал). На моем компьютере я компилировал эту программу под ТР 6.0. И у меня она нормально работает при dt = 60000. В модуле CRT в свое время был применен такой алгоритм для функции Delay, который на более новых компьютерах перестал работать. По-моему, были какие-то патчи для этого дела, но я не уверен. Так вот, как же должна работать эта программа? - на экране появляется цифра 8, которая движется по экрану слева направо. Если ничего не нажать, то она доедет до края экрана и программа завершится. Если нажимать клавиши управления, она будет менять направление движения. И если Вы видите, что на экране почти мгновенно возникает полоса '8', и на этом все - это значит, что программа работает чересчур быстро. Чтобы ее замедлить, увеличьте значение dt.
З.Ы. Читать здесь:
Процедура Delay
Гелла
Привет Бродяжник!

Цитата
Там между кавычками должен быть пробел. Он есть?

поставила ....
Цитата
На моем компьютере я компилировал эту программу под ТР 6.0. И у меня она нормально работает при dt = 60000. В модуле CRT в свое время был применен такой алгоритм для функции Delay, который на более новых компьютерах перестал работать.


Ура!Она работает,я написала dt = 60000, как Вы говорили, и программа зараБотала!! Спасибо give_rose.gif



Цитата
По-моему, были какие-то патчи для этого дела, но я не уверен. Так вот, как же должна работать эта программа? - на экране появляется цифра 8, которая движется по экрану слева направо. Если ничего не нажать, то она доедет до края экрана и программа завершится. Если нажимать клавиши управления, она будет менять направление движения. И если Вы видите, что на экране почти мгновенно возникает полоса '8', и на этом все - это значит, что программа работает чересчур быстро. Чтобы ее замедлить, увеличьте значение dt.

теперь понятно....

Вот она...

program snake_2;
uses crt;

const
xn=1;
xx=80;
yn=1;
yx=25;
H='8';
dt=60000;


var x,y,vx,vy:integer;
c:char;

begin
x:=xn;
y:=yx div 2;
vx:=1;
vy:=0;


clrscr;
while (x>=xn) and (x<=xx) and (y>=yn) and (y<=yx) do
begin
GoToXY(x,y);
write(H);
Delay(dt);
if KeyPressed then
begin
c:=ReadKey;
case c of
'i':begin vx:=0; vy:=-1 end;
'm':begin vx:=0; vy:=1 end;
'j':begin vx:=-1; vy:=0 end;
'k':begin vx:=1; vy:=0 end;
end;
end;
GoToXY(x,y);
write(' ');
Inc(x,vx);
Inc(y,vy);
end;
end.


lapp!!Программа работает!!!
Бродяжник
Молодица!
smile.gif
Теперь подумайте, чем эта программа отличается от взаправдашней змейки, и спросите: "А как мне сделать, чтобы...?"
Гелла
Цитата
Теперь подумайте, чем эта программа отличается от взаправдашней змейки, и спросите: "А как мне сделать, чтобы...?"


Нужно, чтобы змейка кушала, и становилась длиннее с каждым съеденным кусочком...?!?!
Бродяжник
Угу.
Для этого нужно, чтобы:
а) было что кушать;
б) змейка могла это кушать;
в) змейка умела расти.
Вот и давайте начнем сначала. Введем понятие поля. На этом поле будем расставлять яблоки (а в будущем, возможно и препятствия). Пожалуйста, напрягите соображение, и скажите, как мы будем в программе представлять поле? Поле у нас прямоугольное, клетчатое, размерами 80 на 25. Только не говорите, что не знаете. Выдайте любую идею.
Гелла
Цитата
Пожалуйста, напрягите соображение, и скажите, как мы будем в программе представлять поле? Поле у нас прямоугольное, клетчатое, размерами 80 на 25. Только не говорите, что не знаете. Выдайте любую идею.

я думаю, это будет двумерный массив?!?
Lapp
Вот это я понимаю - коллективная работа!
Гелла, тебе можно позавидовать - столько учителей! smile.gif
Но вынужден тебя огорчить: есть и обратная сторона медали (как в той песенке: "но когда на бровях прихожу домой, предстоит мне скандал с каждою женой" (с) Кавказская Пленница).
Так и знай: я от тебя не отстану! smile.gif
Хорошо, второй вариант программы заработал. Но задание было сравнить оба варианта, найти отличия и проанализировать их.

Подсказка. Читать только после того, как подумаешь сама! Для прочтения выделить блоком строчку ниже:
некоторые переменные исчезли. Чтобы это стало возможным, пришлось переставить некоторые операторы. Какие и почему?

Кроме прочего, хорошо бы сейчас уже составить блок-схемку.. Пока она несложная. Сумеешь? Это факультативно, но все же подумай и пришли свой вариант.
Бродяжник
Гелла, слушайте Lappa smile.gif
А я пока отдохну пойду... closedeyes.gif
А насчет массива это правильно, да... думайте дальше...
Гелла
Цитата
Кроме прочего, хорошо бы сейчас уже составить блок-схемку.. Пока она несложная. Сумеешь?


Что то я так запуталась в этой блок схеме...хочется её добить, чтоб все ок было....ещё попробую...
Гелла
Привет lapp!

Цитата
задание было сравнить оба варианта, найти отличия и проанализировать их.


Вообщем мы убрали переменные x0 и y0(как я понимаю начальное положение змейки).Чтоб программа работала мы в начала цикла while do поставили оператор GoTo(x,y) вместо GoTo(x0,y0)

было:

GoToXY(x0,y0);
write(' ');
GoToXY(x,y);
write(H);
x0:=x;
y0:=y;
Delay(dt);




Стало:
GoToXY(x,y);
write(H);
Delay(dt);


Ещё в конце программы(после цикла тоже произошли изменения):

было:
begin
c:=ReadKey;
case c of
'i': begin vx:=0; vy:=-1 end;
'm': begin vx:=0; vy:=1 end;
'j': begin vx:=-1; vy:=0 end;
'k': begin vx:=1; vy:=0 end;
end;
end;
Inc(x,vx); Inc(y,vy);
end;
end.


стало:
begin
c:=ReadKey;
case c of
'i':begin vx:=0; vy:=-1 end;
'm':begin vx:=0; vy:=1 end;
'j':begin vx:=-1; vy:=0 end;
'k':begin vx:=1; vy:=0 end;
end;
end;
GoToXY(x,y);
write(' '); Inc(x,vx);
Inc(y,vy);
end;
end.
GoodWind
Гелла, у нас же не игра "найди 10 отличий" wink.gif
найди почему некоторые строки первого варианта отличаются от второго и получишь +1 за усердие wink.gif
Гелла
Цитата
Гелла, у нас же не игра "найди 10 отличий"


mega_chok.gif unsure.gif

Цитата
найди почему некоторые строки первого варианта отличаются от второго и получишь +1 за усердие

unsure.gif unsure.gif unsure.gif unsure.gif wacko.gif
Lapp
Цитата(Гелла @ 27.04.2006 19:44) *

mega_chok.gif unsure.gif
unsure.gif unsure.gif unsure.gif unsure.gif wacko.gif

Гелла, я тебя понял.
Погоди, стреляться не надо!!
Да, ты права: строить глазки - это способ.
Особенно еще четыре раза подряд.
А на орбиту спутника зрачки пусть лучше вылазят у меня smile.gif

Я понял свою ошибку, госпожа учительница.. Ты хочешь поиграть поскорее. Я прав? smile.gif
O'kay, поиграем.
Только, боюсь, не прямо сейчас. Извини. Заходи еще, ладно?
Гелла
Цитата
Я понял свою ошибку, госпожа учительница.. Ты хочешь поиграть поскорее. Я прав?
O'kay, поиграем.
Только, боюсь, не прямо сейчас. Извини. Заходи еще, ладно?


Не поняла...?!? blink.gif wink.gif
Lapp
Цитата(Гелла @ 28.04.2006 15:27) *

Не поняла...?!? blink.gif wink.gif

Была поздняя ночь (на самом деле почти утро, пятый час), башка уже плохо варила - наверное, неясно выразился, извини.

Но что ж еще делать с игрой, как не играть в нее?..
Короче, в ближайшее время перейдем к более продвинутой версии. Чтобы было можно играть. Тебе станет интереснее, надеюсь. smile.gif
А не сейчас - это потому что немного занят, извини.. Как только освобожу часок - все будет.
Заходи. Ладно? smile.gif
Lapp
После некоторого перерыва (очень извиняюсь), возвращаемся к нашей змеючке smile.gif. Оговорюсь (а то Гелла слишком уж подозрительна, чуть что - в боевую стойку smile.gif ), что я ни на кого не намекаю smile.gif. Кстати, Гелла, недавно я в качестве иллюстрации к решению задачи для Надин (там был метод змейки) выложил в теме Фотография одно фото - рекомендую посмотреть, придаст живости нашему процессу обучения smile.gif.

Итак, что же изменилось в Змейке-2 по сравнению со Змейкой-1? А вот, что: я убрал одну пару переменных, x0 и y0 - они оказались лишними. Перестановки операторов связны с этим. (То есть в целом ты была права, но нужно конкретнее, выделить главное, отсечь второстепенное - добавлено позже)

Теперь о блок-схеме. Вот она:
Нажмите для просмотра прикрепленного файла
Пожалуйста, просмотри ее и найди соответствие между блоками и операторами в программе.

А теперь время сделать что-то новое - шаг вперед! smile.gif
В качестве такого шага я предлагаю убрать одну строку из программы.
В самом конце есть такая строчка, она состоит из двух операторов:
GoToXY(x,y);Write(' ');
Стирать ее не обязательно, можно просто закомментировать, то есть заключить в фигурные скобочки {}. После этого компилятор не будет обращать на нее внимания.
То, что получится, будет в каком-то смысле больше похоже на змейку, чем бедная одинокая голова (восьмерка).

Но вот беда - все тело нашей змеи пока состоит из одних голов! sad.gif
Как это исправить?..
Подумай, а потом прочти ответ на строчке ниже (выдели блоком) и сделай так.

Вернуть строчку назад, но пробел в операторе Write заменить на ноль (0).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.