Привет всем) В общем такая проблема, я программирую алгоритмы (всякие операции с массивами, циклами, функциями) - нормально, но никак не могу что-нибудь сделать относящейся к играм( Почему то просто не получается и всё... Змейку уже 3-тий раз начал писать, но все время какие то проблемы... Помогите, а? Учусь быстро, язык программирования не важен... (Но лучше если Си-подобный)
Snuux, возьми учить какой нибудь api посещай форумы задавай конкретные вопросы Это ведь очевидно а вообще опыт приходит через преодоление препятствий Только так и никак иначе!
Ну в общем сейчас свой "недо-алгоритм" покажу, и напишу вопросы...: В общем вот картинка:
В принципе вопрос один, как узнавать где был последний элемент хвоста, чтоб потом его убирать... То есть предположим у нас есть двумерный массив поля и ... В общем тут надо придумать как змейку показать.. То ли это тоже двумерным массивом сделать, то ли одномерным, и надо где то хранить конец хвоста (с этим у меня проблема...)
Добавлено (07.11.2012, 13:18) --------------------------------------------- Если делать на движке, то можно и без массива поля, но мне хочется именно с ним...
Snuux, ну это-же очевидно! Для змейки берёшь двумерный массив, скажем (50,2) где 50 - это наибольшее количество возможных элементов тела змейки (можешь и 100 взять и 1000 - как хочешь, алгоритм одинаков), ставишь переменную длинна=1 и поехал! Массив заполняешь циклом: номер 0 1 ...... Х 8 0 ...... У 2 0 ...... При движении змейки значения просто перегоняешь вглубь массива до номера = длинна тоже циклом. Просчитываешь новое положение головы, перегоняешь все ячейки вглубь, в первые элементы массива записываешь новое положение головы, последняя ячейка после длинны не перемещается, а просто затирается. Короче - рисуешь только голову и затираешь последнюю ячейку хвоста. Если наезжаешь на еду - последнюю ячейку не стираешь, длину увеличиваешь на единицу. Делов-то, в чём трудность?
Сообщение отредактировал Serg1971 - Среда, 07 Ноября 2012, 13:42
При движении змейки значения просто перегоняешь вглубь массива до номера = длинна тоже циклом. Просчитываешь новое положение головы, перегоняешь все ячейки вглубь, в первые элементы массива записываешь новое положение головы
Список то лучше. Тем более если есть в стандартной библиотеке. Хотя я не знаю на чём пишет автор. mecinvader
То есть предположим у нас есть двумерный массив поля и ... В общем тут надо придумать как змейку показать.. То ли это тоже двумерным массивом сделать, то ли одномерным, и надо где то хранить конец хвоста (с этим у меня проблема...)
05142, автор просил решение с массивом Всё зависит на чём он пишет конечно, реализаций и идей - миллион!
m[15,20]:byte - Массив поле v:byte; - Вектор направления, четыре направления - четыре значения 1,2,3,4 s:byte=3; - Количество сегментов удава
Инициализируем удава: 2-голова 3-тело 4- хвост
Рабочий цикл: 1-новое положение головы в зависимости от вектора направления, с проверкой коллизий. (если голова на кролике, увеличиваем s на 1) Далее сканируем поле, и если >0 и <254, ячейки массива увеличиваем на 1 (как бы сдвигаем сегменты в сторону головы). Вычисляем хвост if (m[a,b]==s+2){m[a,b]=0} (если голова на кролике, ничего не обнулится, s то выросла)
Code
const maxx=20; maxy=35;
var m:array[0..maxx,0..maxy]of byte; v:byte; s:byte;
/////////////////////////////////////////////////////////////////////// procedure Krolik; //Рандомный кролиа var a,x,y:integer; begin for a:=1 to 1000 do begin x:=random(maxx); y:=random(maxy); if m[x,y]=0 then begin m[x,y]:=254; break; end; end; end; //----------------------- procedure Ini; //Новая игра var a,b:integer; begin for b:=0 to maxy do begin for a:=0 to maxx do begin m[a,b]:=0; m[a,0]:=255; m[a,maxy]:=255; m[0,b]:=255; m[maxx,b]:=255; end; end;
m[maxx div 2,maxy div 2]:=1; m[maxx div 2,maxy div 2+1]:=2; m[maxx div 2,maxy div 2+2]:=3; v:=1; s:=3; Krolik; end; /////////////////////////////////////////////////////////////////////// procedure Tf.FormCreate(Sender: TObject); begin Randomize; Ini; end;
procedure Tf.FormClose(Sender: TObject; var Action: TCloseAction); begin // end;
procedure Tf.Timer1Timer(Sender: TObject); var a,b:integer; begin
// Рабочий цикл for b:=0 to maxy do begin for a:=0 to maxx do begin if m[a,b]=2 then begin if v=1 then begin if m[a,b-1]>0 then begin if m[a,b-1]=254 then begin m[a,b-1]:=1; // новое положение головы inc(s); Krolik; end else begin Ini; end; end else begin m[a,b-1]:=1; // новое положение головы end; end;
if v=2 then begin if m[a,b+1]>0 then begin if m[a,b+1]=254 then begin m[a,b+1]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a,b+1]:=1; end; end;
if v=3 then begin if m[a-1,b]>0 then begin if m[a-1,b]=254 then begin m[a-1,b]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a-1,b]:=1; end; end;
if v=4 then begin if m[a+1,b]>0 then begin if m[a+1,b]=254 then begin m[a+1,b]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a+1,b]:=1; end; end; end; end; end;
// сдвиг сегментов удава и обнуление хвоста for b:=0 to maxy do begin for a:=0 to maxx do begin if (m[a,b]>0)and(m[a,b]<254) then m[a,b]:=m[a,b]+1; if m[a,b]=s+2 then m[a,b]:=0; end; end;
// отрисовка for b:=0 to maxy do begin for a:=0 to maxx do begin if m[a,b]=0 then f.Image1.Canvas.Brush.Color:=clsilver; if m[a,b]=255 then f.Image1.Canvas.Brush.Color:=clred; if m[a,b]=254 then f.Image1.Canvas.Brush.Color:=clYellow; if (m[a,b]>0)and(m[a,b]<254) then f.Image1.Canvas.Brush.Color:=clGreen; if m[a,b]=2 then f.Image1.Canvas.Brush.Color:=clTeal; f.Image1.Canvas.Rectangle(a*16,b*16,a*16+16,b*16+16); f.Image1.Canvas.TextOut(a*16,b*16,inttostr(m[a,b])); end; end; end; // управление движением procedure Tf.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key=87 then v:=1; if key=83 then v:=2; if key=65 then v:=3; if key=68 then v:=4; end;