![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
Hello world!
Делаю игру "змейка" и нуждаюсь в помощи. Сама змейка сделана (делаю я её через Shape, никаких объектов на форме нет кроме таймера!) : snake[i] := TShape.Create(Form1); //// указываем ей, что это объект snake[i].Parent := Form1; /// пишем, кто родитель snake[i].Shape := stCircle; ///// задаём форму snake[i].Height := block_height; //// длину snake[i].Width := block_width; //// ширину snake[i].Top := 250 + i*20 ; //// где находится на форме snake[i].Left := 250 ; //// где находится на форме Проблема в том, что я пока не знаю, как сделать стену (или как ещё называют "препятствия"). Мои соображения: Разделить всю карту 25х25 на условные квадраты по 20 (т.к. один Shape = 20) и пока что просто расставить туда единицы и нули (пока не важно как), и там где есть единица рисовать Shape , там где 0 - ничего не рисовать. P.S. могу переформулировать вопрос иначе: как вообще сделать эту "стену"? Выслушаю любые разумные предложения! Уфф.... ну вроде бы вот. Прошу, помогите! Желательно срочно! Заранее спасибо! Последний раз редактировалось Grenade; 03.03.2010 в 20:18. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]()
Можете сделать двумерный массив Shap'ов и просто менять цвета нужных вам просто обращаясь к индексам, нужным вам.
Код:
Изобретатель велосипедов
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
Когда я писал "змейку" в Borland Pascal, я использовал двумерный массив и всё получилось (правда сама игра была не очень). Здесь у меня тоже есть двумерный массив:
map: array[0..24,0..24]of integer; Программу я написал также, как и в Pascal'е. Но в Delphi (у меня стоит 2010) он выводит ошибку в этой строчке. С похожей родом проблемами я встречался и приходилось даже переписывать что-то. Я не спорю, возможно я что-то не так делаю.... Если Вам не сложно, не могли бы Вы скинуть мне код, как бы Вы написали это! |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]()
Ну, таких проблем быть не должно, покажите код, можт поможем-с. Просто так гораздо легче реализовать всё это.
Изобретатель велосипедов
|
![]() |
![]() |
![]() |
#5 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
1. Иди в раздел про создание игр, там есть прикрепленная тема с уроками по созданию игр.
2. Про разделение поля на клетки это ты угадал. Это и есть основа таких игр. Сегмент тела змеи или ее добыча занимают одну клетку, так же и стены. Цитата:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 03.03.2010 в 20:34. |
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
Кажется начинаю догонять. Правда в процедуре DrawMap у меня пусто, и пока что писать - я не сильно догадываюсь. Если можете - помогите!
const block_height = 20; block_width = 20; var Form1: TForm1; snake: array of TShape; map: array[0..24,0..24]of integer; length: integer; direction: array of byte; // 1- left, 2- up, 3-right, 4- down OldDir : byte; NewDir : byte; food: TShape; implementation procedure DrawMap(); var i : integer; j : integer; temp : TShape; begin end; procedure Move(); var i : integer; Key : word; begin for i:=length-1 downto 1 do direction[i] := direction[i-1]; for i:=0 to length-1 do begin case direction[i] of 1: snake[i].Left:=snake[i].Left - 20; 2: snake[i].Top:=snake[i].Top - 20; 3: snake[i].Left:=snake[i].Left + 20; 4: snake[i].Top:=snake[i].Top + 20; end; end; if OldDir<>NewDir then begin case NewDir of 1: key := vk_Left; 2: key := vk_up; 3: key := vk_right; 4: key := vk_down; end; UpdateDirection(Key); end; OldDir := direction[0]; end; procedure AddSegment(); var i : integer; begin length := length + 1; SetLength(snake,length); SetLength(direction,length); snake[length-1] := TShape.Create(Form1); snake[length-1].Parent := Form1; snake[length-1].Shape := stCircle; snake[length-1].Height := block_height; snake[length-1].Width := block_width; direction[length-1] := direction[length-2]; case direction[length-2] of 1: begin snake[length-1].Top := snake[length-2].Top; snake[length-1].Left := snake[length-2].Left +20; end; 2: begin snake[length-1].Top := snake[length-2].Top + 20; snake[length-1].Left := snake[length-2].Left; end; 3: begin snake[length-1].Top := snake[length-2].Top; snake[length-1].Left := snake[length-2].Left -20; end; 4: begin snake[length-1].Top := snake[length-2].Top - 20; snake[length-1].Left := snake[length-2].Left; end; end; end; procedure UpdateDirection(Key : word); begin if ( direction[0] = 0 ) then begin if (Key = vk_up) then begin direction[0] := 2; direction[1] := 2; direction[2] := 2; direction[3] := 2; end; end else if ( Key = vk_Left ) and ( direction[0] = 2 ) then begin snake[0].Left := snake[0].Left - 20; snake[0].Top := snake[0].Top + 20; direction[0] := 1; end else if ( Key = vk_Left ) and ( direction[0] = 4 ) then begin snake[0].Left := snake[0].Left - 20; snake[0].Top := snake[0].Top - 20; direction[0] := 1; end else if ( Key = vk_Right ) and ( direction[0] = 2 ) then begin snake[0].Left := snake[0].Left + 20; snake[0].Top := snake[0].Top + 20; direction[0] := 3; end else if ( Key = vk_Right ) and ( direction[0] = 4 ) then begin snake[0].Left := snake[0].Left + 20; snake[0].Top := snake[0].Top - 20; direction[0] := 3; end else if ( Key = vk_Down ) and ( direction[0] = 1) then begin snake[0].Left := snake[0].Left + 20; snake[0].Top := snake[0].Top + 20; direction[0] := 4; end else if ( Key = vk_Down ) and ( direction[0] = 3) then begin snake[0].Left := snake[0].Left - 20; snake[0].Top := snake[0].Top + 20; direction[0] := 4; end else if ( Key = vk_Up ) and ( direction[0] = 1) then begin snake[0].Left := snake[0].Left + 20; snake[0].Top := snake[0].Top - 20; direction[0] := 2; end else if ( Key = vk_Up ) and ( direction[0] = 3) then begin snake[0].Left := snake[0].Left - 20; snake[0].Top := snake[0].Top - 20; direction[0] := 2; end; end; |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
Оставшаяся часть программы:
procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin length := 2; SetLength(direction,length); SetLength(snake,length); for i := 0 to length-1 do begin snake[i] := TShape.Create(Form1); snake[i].Parent := Form1; snake[i].Shape := stCircle; snake[i].Height := block_height; snake[i].Width := block_width; snake[i].Top := 250 + i*20 ; snake[i].Left := 250 ; direction[i] := 0; end; OldDir:=1; NewDir:=1; map := [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0]; //// Здесь вместо единичек должны быть Shap'ы в процедуре DrawMap(); end; procedure TForm1.FormDestroy(Sender: TObject); var i:integer; begin for i := 0 to length-1 do snake[i].Free; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var i : integer; begin case Key of vk_left: newdir:=1; vk_right: newdir:=3; vk_up: newdir:=2; vk_down: newdir:=4; end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin AddSegment(); end; procedure TForm1.Timer1Timer(Sender: TObject); begin Move(); end; end. |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
P.S. извините, что без Enter'ов и пробелов, Не хватило места....
|
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
![]()
Для кодов на форуме есть тег CODE.
|
![]() |
![]() |
![]() |
#10 |
Пользователь
Регистрация: 03.03.2010
Сообщений: 38
|
![]()
Да, поспешил
![]() |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Информация по игре "Змейка" | Arions | Помощь студентам | 9 | 14.12.2009 17:28 |
Делаю игру "Tanks" 3D | anyx | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 19 | 20.09.2009 20:55 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Помогите с игрой "Змейка". | spamer | Общие вопросы Delphi | 2 | 26.12.2008 21:17 |
Ещё одна игра "Змейка" | Simply-Art | Софт | 17 | 05.07.2007 04:10 |