0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10

Игра TRON

01.03.2016, 17:22. Показов 1100. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как реализовать вот такую игру в Delphi.
Миниатюры
Игра TRON  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2016, 17:22
Ответы с готовыми решениями:

TRON: LEGACY
НАРОД!!! КТО ИДЕТ НА TRON:LEGACY ??? На днях посмотрел первого трона и очень им проникся.

Бюджет 4500 гр. Конфигурация работа в Office, AutoCAD, игра Assassin, онлайн игра World of Tanks
Собираю компьютер для сестры. Основные требования: работа в Microsoft Office, AutoCAD, игра Assassin, онлайн игра World of Tanks ...

Игра в загадки. Загадать загадку. Если ответ верен – поздравить пользователя. Затем сообщить, что игра окончена.
Всем привет! Меня зовут VitoScaletta, совсем недавно начал обучаться JS, но очень тяжело в голову заходит информация, но я не сдаюсь! В...

13
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
01.03.2016, 21:31
если просто код дать, вы его не поймете
если писать как и что - получится нормальная такая книга
в чем смысл такой неслабой работы для писателя книги?
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
02.03.2016, 16:58  [ТС]
я не прошу написать код и все подробно расписать , я лишь прошу рассказать как реализовтаь прорисовку хвоста, как проверять врезался или нет.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
02.03.2016, 17:53
запоминаем все отрезки, из которых состоит ломаная, и проверяем не пересекутся ли они
Пересечение отрезков по координатам их вершин
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
02.03.2016, 22:05  [ТС]
Написал вот такой вот бред, теперь думаю можно лил как сделать проверку.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
case key of
VK_down: begin dx:=0; dy:=10;  end;
vk_right: begin dx:=10; dy:=0;
 end;
 vk_up: begin dx:=0; dy:=-10;
 end;
 vk_left: begin dx:=-10; dy:=0;
 end;
end;   end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
 
begin
x:=x+dx;
y:= y+dy;
form1.Canvas.lineto(x,y);
end;
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
02.03.2016, 22:28
общий ход мыслей верный
но сразу- форма - плохое место для рисования
для этого есть PaintBox
dвсе рисование должно идти в PaintBox.OnPaint

В Timer должно быть
begin
ProcessNewStep;
Paintbox.Invalidate;
end;

т.е. пересчитать след. шаг и попросить PaintBox перерисоваться
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
02.03.2016, 23:28  [ТС]
можете пояснить что должно происходить в OnPaint И что делает Paintbox.Invalidate;
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
03.03.2016, 14:43  [ТС]
Сделал как вы посоветовали, рисование идет в onpaint но нет цельной линии, как это можно исправить?
Delphi
1
2
3
4
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
paintbox1.Canvas.lineto(x,y);
end;
Миниатюры
Игра TRON  
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
03.03.2016, 17:22
нужно просто прочитать 2 странички про доступные методы TCanvas
для рисования отрезка нужны две команды
MoveTo(X1,Y1);
LineTo(X2,Y2);

лучше бы конечно строить всю линию разом через PolyLine
но в любом случае читать справочник
0
5976 / 4551 / 1095
Регистрация: 29.08.2013
Сообщений: 28,172
Записей в блоге: 3
03.03.2016, 17:54
взять грид, уменьшить ячейки и рисовать в нем
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
03.03.2016, 20:44  [ТС]
Написал вот такую проверку если врежется, работает только если врезаться в себя, а в противника нет.
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Timer1Timer(Sender: TObject);
var i,i2:integer;
begin
 
ProcessNewStep;
 ProcessNewStep2;
for i := 1 to j2+100 do
if (mass[i]=x) and (mass2[i]=y) or (mass[i]=x2) and (mass2[i]=y2)   then  begin timer1.enabled:=false;
showmessage('ВЫ ПРОИГРАЛИ');     end;
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
04.03.2016, 06:27
во-первых, для точек есть тип даже готовый TPoint с полями x,y

во вторых, вы прямо все точки в массив заносите?
если точка 1 (10,10) то точка 2 разве не может быть (10,15) ?
а между ними например есть еще (10,11) (10,12) (10,13) (10,14) и попадания в эти точки у вас никак не отслеживаются
я же дал ссылку на пересечение двух отрезков

у вас должно быть примерно такое описание модели
и лучше это вынести в отдельный юнит
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
TTronUser=class
public
  color:TColor;// цвет, которым будем рисовать этого юзера
  v:Tpoint; // вектор скорости
  Pts:array of TPoint; // массив точек ломаной
  ptCount:integer; // количество точек сейчас
  function CurP:TPoint; // точка где юзер сейчас. (последняя занесенная в массив точка)
  function NextP:TPoint; // следующая точка = CurP + V
  procedure AddPoint(P:TPoint);
  constructor Create;
  destructor Destroy; override;
end;
 
constructor TTronUser.Create;
begin
  inherited Create;
  setLength(pts,1000);
end;
 
destructor TTronUser.Destroy;
begin
  setLength(pts,0);
  inherited;
end;
 
procedure TTronUser.AddPoint(p:TPoint);
begin
  if ptCount=length(pts) then
    setLength(pts,length(pts)+100);
  pts[ptCount] := p;
  inc(ptCount);
end;
 
function TTronUser.CurP:TPoint;
begin
  if (ptCount>0) then
    result := pts[ptCount-1]
  else
    result:=point(0,0);
end;
 
function TTronUser.NextP:TPoint;
var p:TPoint;
begin
  p:=CurP;
  result.x:=P.x+V.x;
  result.y:=P.y+V.y;
end;


тогда игровая механика примерно такая

Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
TForm1=class(TForm)
...
  pb1:TPointBox;
...
  user:array[0..1] of TTronUser;
  boom:TPoint; // точка пересечения
  GameOver:boolean;
end;
 
procedure TForm1.FormCreate(Sender:TObject);
begin
  user[0]:=TTronUserCreate;
  user[0].AddP(point(50,50));
  user[0].color := clRed;
  user[1]:=TTronUserCreate;
  user[1].AddP(point(70,50));
  user[1].color := clBlue;
end;
procedure TForm1.FormDestroy(Sender:TObject);
begin
  user[0].free;
  user[1].free;
end;
 
procedure TForm1.DrawUser(u:TTronUser);
var p:TPoint;
begin
  pb1.canvas.pen.color:=u.color;
  pb1.canvas.brush.color:=u.color;
  pb1.canvas.polyline(u.pts); // след
  p:=user.CurP;
  pb1.canvas.ellipse(p.x-2, p.y-2, p.x+2, p.y+2); // тек. положение
end;
 
procedure TForm1.pb1Paint(Sender:TObject);
var i:integer;
begin
  for i:=0 to 1 do
    drawUser(i);
 if (boom.x<>0)and(boom.y<>0) then
 begin
   //нарисовать бум в точке Boom
 end;
end;
 
function TForm1.LineIntersect(u1,u2:TTronUser; var p:TPoint):boolean;
begin
  // тут проверяется пересечение последнего отрезка юзера 1 со всеми отрезками юзера2
  // если есть, найденная точка передается в P
  // result =true/false - найдено или нет
end;
 
procedure TForm1. processNewStep;
begin
 
  if LineIntersect(user[0],user[1], boom) then
  begin
    // проиграл User[0]
     GameOver := true;
  end;
  if LineIntersect(user[1],user[0], boom) then
  begin
    // проиграл User[1]
     GameOver := true;
  end;
 
end;
 
procedure TForm1.checkKeyboard();
begin
  // чисто например...
  if GetAsyncKeyState(...) then
     user[0].v.y:=5;
  // прочитать про использование GetAsyncKeyState
end;
 
procedure TForm1.TimerTimer(Sender:TObject);
begin
  if not GameOver then
  begin
    checkKeyboard(); // здесь может измениться вектор скорости в зависимости от нажатых клавиш
    processNewStep(); // расчет след. шага
  end;
  pb1.invalidate;
end;


Добавлено через 2 минуты
забыл добавить в processNewStep user[0].AddP(user[0].NextP)
занесение новой точки в массив, если не было бум
0
0 / 0 / 0
Регистрация: 21.01.2016
Сообщений: 10
04.03.2016, 18:24  [ТС]
Спасибо, конечно, но мне нужно это для курсовой, а у вас код слишком по феншую, остановлюсь на своем варианте.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
04.03.2016, 18:38
нуну
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2016, 18:38
Помогаю со студенческими работами здесь

Игра в «Одиннадцать предметов», игра Баше.
прошу помощи в создании программы! Разработать программную модель следующей игры двух игроков(пользователь-компьютер),реализовав...

Как сделать так, чтобы при нажатии на кнопку "Новая игра" игра начиналась заново?
Как сделать так, чтобы при нажатии на кнопку &quot;Новая игра&quot; игра начиналась заново? unit1.cpp void __fastcall TForm1::N1Click(TObject...

Игра Кости, игра с компьютером
Всем привет! Делаю консольную игру Кости. Условия такие: 1) Перед игрой все игроки бросают кость, первым начинает тот, у кого выпало...

Существует ли игра такая игра?
Всем привет. Существует ли такая игра, где, допустим, мы находимся на космическом корабле, в подлодке, еще в каком-либо транспорте и...

Игра слов, игра Scrabble
Задание: Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru