IPB
ЛогинПароль:

> Все таже змейка, добить раз и навсегда, сделать хвост
a100
сообщение 15.12.2010 12:45
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской
Реальное имя: a100

Репутация: -  0  +


Здравствуйте! Благодаря информации с вашего форума, получилось написать, так сказать. костяк программы) не просто списать, а понять что для чего, это получилось. Опыт программирования еще совсем маленький.
Вот мой код:

Program Snake;
  uses crt;
const 
	xn=1;  		{предел экрана слева}
	xx=80;      {предел экрана справа}
	yn=1;       {верхний предел экрана} 
	yx=25;      {нижний предел экрана}
	H='0';      {голова змеи}
	dt=400;     {задержка}

var 
	x:integer=xx div 2; {начальное расположение змеи}
	y:integer=yx div 2;
	vx:integer=-1;  {начальное направление змеи}
	vy:integer=0;
    xe:integer=15; {начальные координаты яблока}
    ye:integer=15;
var 
	c:char;
	

begin
randomize;
clrscr;
gotoxy(xe,ye);     {рисуем первое яблоко}
write ('$');

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               {если это был управляющий символ, изменяем движение}
			'w':begin vx:=0; vy:=-1 end;  {изменяем движение на движение вверх}
			's':begin vx:=0; vy:=1 end;   {изменяем движение на движение вниз}
			'a':begin vx:=-1; vy:=0 end;  {изменяем движение на движение влево} 
			'd':begin vx:=1; vy:=0 end;   {изменяем движение на движение вправо}
			end;
		end;
    gotoxy(x,y); 
    write(' ');
    inc(x,vx);    {вычисляем новое положение змейки}
    inc(y,vy);
    if (x=xe) and (y=ye) then {если координаты змеи совпадают с координатами яблока}
		begin
			xe:=random(75);  {рисуем новое яблоко, случайным образом}
			ye:=random(20);
			gotoXY(xe,ye);
			write('$');
		end;
  end;
end.



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

надеюсь на вашу помощь
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Lapp
сообщение 15.12.2010 13:37
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(a100 @ 15.12.2010 12:45) *
надеюсь на вашу помощь
Самый лучший вариант - завести двумерный массив из байтов по числу клеток игрового поля
  b: array [xn..xx,yn..yx] of byte;

В нем рисуй тело от хвоста до головы. Вот такие обозначения:
0 - пустая клетка
1 - тело идет вверх
2 - тело идет вправо
3 - тело идет вниз
4 - тело идет влево
5 - голова (тело закончилось
6 - кролик
7 - мангуста
8 - препятствие
....

Вот тебе пример такого поля и змеи на нем:
0000000000
0002222300
0001000300
0021000500
0010000000
0014440000
0000000000

При этом храни в двух парах переменных текущие координаты головы и хвоста. Так ты сможешь "двигать змею". Если змея в этот момент движется вправо, то следующий кадр будет такой:
0000000000
0002222300
0001000300
0021000250
0010000000
0014400000
0000000000

Подумай над этим как следует. Если будут вопросы - задавай. Меня не будет до ночи, но кто-то еще может подсказать..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 15.12.2010 14:30
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(Lapp @ 15.12.2010 13:37) *

  b: array [xn..xx,yn..yx] of byte;

В нем рисуй тело от хвоста до головы. Вот такие обозначения:
0 - пустая клетка
1 - тело идет вверх
2 - тело идет вправо
3 - тело идет вниз
4 - тело идет влево
5 - голова (тело закончилось
6 - кролик
7 - мангуста
8 - препятствие


Фу, это же магические числа.
Я предпочитаю делать так:


  type 
    TField = (fEmpty, fUp, fRight, fDown, fLeft, fHead, fFood, fEnemy, fBorder);

  var  
    b: array [xn..xx,yn..yx] of TField;




--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 15.12.2010 14:34
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 15.12.2010 14:30) *
Фу, это же магические числа.
Я предпочитаю делать так:


  type 
    TField = (fEmpty, fUp, fRight, fDown, fLeft, fHead, fFood, fEnemy, fBorder);

  var  
    b: array [xn..xx,yn..yx] of TField;


yes2.gif Одобрямс! good.gif
Только тогда с отладкой и промежуточными печатями могут быть проблемы.. Не совсем проблемы, просто дополнительная писанина + значения могут случайно съехать..
Но это все мелочи. Правильно, нужно именно так делать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
a100   Все таже змейка   15.12.2010 12:45
Lapp   надеюсь на вашу помощьСамый лучший вариант - завес...   15.12.2010 13:37
TarasBer   [code=pas] b: array [xn..xx,yn..yx] of byte; В н...   15.12.2010 14:30
Lapp   Фу, это же магические числа. Я предпочитаю делать ...   15.12.2010 14:34
a100   Самый лучший вариант - завести двумерный массив и...   15.12.2010 19:54
Lapp   получается, сначала надо заполнить массив нулями, ...   16.12.2010 12:03
a100   спаааааасибо! буду разбираться   16.12.2010 22:45
TarasBer   Как раз с отладкой проблем меньше, потому что когд...   15.12.2010 14:37
Lapp   Что касается печати, то тут да, язык в данной реал...   15.12.2010 14:59
a100   в принципе более менее разобрался) но есть куча во...   21.12.2010 11:50
Lapp   Спасибо, Тарас, +1 (P.S. - сделаю завтра, на сегод...   21.12.2010 15:11
TarasBer   > Вот это место, Write(CellPrint[b[j,i]+1]), чт...   21.12.2010 12:15
a100   Друзья, огромное Вам спасибо за помощь! попро...   22.12.2010 6:46
a100   не получается сделать, чтоб змейка постоянно была ...   22.12.2010 14:31


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 28.07.2025 4:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"