Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/68: Рейтинг темы: голосов - 68, средняя оценка - 4.71
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

Змейка

17.10.2010, 06:00. Показов 12990. Ответов 95
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
wxWidgets - вот и пошло первое написание игры. Ну относительно игры конечно. Проблема вот в чем. Нам препод показал как сделать, чтобы "змейка" двигалась. Поднастроил, чтобы она двигалась правильно. Влево - влево, вниз - вертикально вниз и т.п. Но есть проблемка. При таком коде, что соответственно:

C++
1
2
3
    m_coord +=
        wxGetKeyState(WXK_UP)? wxPoint(0, -10) : wxGetKeyState(WXK_DOWN) ? wxPoint(0, 10) : 
        wxGetKeyState(WXK_LEFT)? wxPoint(-10, 0) : wxGetKeyState(WXK_RIGHT)? wxPoint(10, 0) : wxPoint(10, 0);
Координата точки изменяется, только если держать кнопку. По дефолту идет вправо. Не коммильфо. Как запомнить последнюю нажатую кнопку и перемещать именно в ту сторону, какая кнопка была нажата?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.10.2010, 06:00
Ответы с готовыми решениями:

Змейка не работает
Неправильно работает хвост (add_hvost) . Что не так ? #include <iostream> #include <conio.h> #include <cstdlib> #include...

Змейка. Нужен совет как доработать программу
Недавно я зашел в тупик, работая над программой "Змейка". Но несмотря на то, что в общем и целом программа работает (змея двигается по...

Змейка на QT C++
Доброго времени суток! Начал изучение с++ QT и параллельно пробую писать игру змейка. Сама реализация игры почти готова - змейка...

95
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 02:16  [ТС]
Студворк — интернет-сервис помощи студентам
rangerx,
Другими словами, ты принципиально будешь делать "не так"? Теперь понятна истинная причина почему ты решил использовать вектор и swap вместо того что я предложил.
Нет. Не совсем так. Не принципиально. Я очень ценю твои советы и ту помощь, что ты оказываешь. Дек я решил не использовать действительно по совету препода.

Зачем? Если в дальнейшем ты собираешься ставить ещё и панель, то без сейзеров ты этого не сделаешь. Так что советую разобраться с этим. И кстати говоря ты Layout(); не вызвал для фрейма поэтому сейзеры у тебя скорее всего не работали должным образом. Вызови Layout(); после SetSizer(Sizer); А сам сейзер оформи так Sizer->Add(Ob, 0, wxALIGN_CENTER, 0); может быть такой вариант это не то, что тебе нужно, но по крайней мере увидишь, что они работают
Препода вообще несколько удивило создание сайзера во фрейме, он сказал, что это нераспространенная практика и делать так не стоит.
В смысле? Что значит убрать события клавы?
Всмысле не работать через event. Через wxGetKeyState или что-то вроде. Причем в самом таймере или в отдельной функции. Иначе процесс тормозит.
У тебя холст мерцает при перерисовке ты имеешь в виду?
И холст и змейка насколько я понял.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
31.10.2010, 02:08
Цитата Сообщение от Lavroff Посмотреть сообщение
Дек я решил не использовать действительно по совету препода.
Дек я советовал в сравнении с вектором, а не вообще. То, что твоего препода устраивает решение с вектором меня честно говоря удивляет.
Цитата Сообщение от Lavroff Посмотреть сообщение
Препода вообще несколько удивило создание сайзера во фрейме, он сказал, что это нераспространенная практика и делать так не стоит.
Очень интересно... Вот статья(довольна большая, с картинками) по сейзерам, советую почитать. Правда там примеры на Питоне, но сути это не меняет.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 03:35  [ТС]
rangerx, Именно ее я и читал)
Его устраивает. Змейка - это так, вступительный этап. Не более. Из группы единственный кто ее худо бедно написал - это я.

По сайзерам конкретно во фрейме ему совсем не понравилось. Он впринципе графикой занимается довольно долго (по его словам) и даже не знаю. Вообщем его это удивило

Добавлено через 1 час 2 минуты
Что-то все не совсем хорошо... От чего можно пронаследовать канву? Пробовал от wxPanel... Размер приходится ставить вручную + на нажатие кнопок, кроме пробела реакции ноль. А еще если пару-тройку раз нажать пробел энтер начинает дико мигать... Как решить такую красоту?
Для Фрейма еще для скроллдвиндоу вызвал Layout. Вполне красиво стало. Но все же.

Добавлено через 20 минут
Собственно эта проблема решилась довольно таки без проблем. Но елки палки... Как сделать так, чтобы шел нормальный ресайз клиентского окна? оО Ибо при запуске мое клиентское окно размером 1 на 1 пиксель. Параметры все стоят по умолчанию у класса
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
31.10.2010, 12:15
Его устраивает. Змейка - это так, вступительный этап. Не более. Из группы единственный кто ее худо бедно написал - это я.
Так ты её сдал получается, просто хочешь доделать для себя?
По сайзерам конкретно во фрейме ему совсем не понравилось. Он впринципе графикой занимается довольно долго (по его словам) и даже не знаю. Вообщем его это удивило
Ясно. Вот ещё статейка, особенно обрати внимание на листинг 4.
Собственно эта проблема решилась довольно таки без проблем. Но елки палки... Как сделать так, чтобы шел нормальный ресайз клиентского окна? оО Ибо при запуске мое клиентское окно размером 1 на 1 пиксель. Параметры все стоят по умолчанию у класса.
Ты сейзер используешь или нет? Цепляй скрины, чтобы было понятно, что у тебя там происходит.
P.S. Ниже скрин с сейзером, как написал выше, т.е. твой холст, только отцентрованный и с фоном. Что тебя в этом не устраивает и что ты хочешь получить я не понимаю.
Миниатюры
Змейка  
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 16:28  [ТС]
rangerx,
Так ты её сдал получается, просто хочешь доделать для себя?
И это тоже.
Ясно. Вот ещё статейка, особенно обрати внимание на листинг 4.
Почитаю.
Ты сейзер используешь или нет? Цепляй скрины, чтобы было понятно, что у тебя там происходит.
P.S. Ниже скрин с сейзером, как написал выше, т.е. твой холст, только отцентрованный и с фоном. Что тебя в этом не устраивает и что ты хочешь получить я не понимаю.
Красиво... Суть в том, что wxScrolledWindow для этого использовать насколько я понял со слов препода - не лучшая идея. Но даже если использовать, приходится подгонять размер канвы под размер фрейма, если я что-то еще понимаю.
По сути, если не использовать сайзер и использовать wxPanel как базовый класс ведь окно должно растягиваться на размер фрейма, если использовать wxDefaultSize(т.е. wxSize(-1,-1)) или нет?
В скринах к сожалению это сейчас выразить не могу ибо с компа, а не с ноута.

Добавлено через 1 час 20 минут
По поводу статьи, да для кнопок это нормально. Но корректно-ли для самого клиентского окна?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
31.10.2010, 18:05
По сути, если не использовать сайзер и использовать wxPanel как базовый класс ведь окно должно растягиваться на размер фрейма, если использовать wxDefaultSize(т.е. wxSize(-1,-1)) или нет?
Вообще должно... Но надо бы проверить.
По поводу статьи, да для кнопок это нормально. Но корректно-ли для самого клиентского окна?
Что значит "для самого клиентского окна"? Кнопки это по-твоему не окна? )))
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
31.10.2010, 21:59  [ТС]
rangerx,
Вообще должно... Но надо бы проверить.
Да вот пытался. Не вышло.

Что значит "для самого клиентского окна"? Кнопки это по-твоему не окна? )))
М... Да... Понял, что глупость сказал...
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
01.11.2010, 01:18
Да вот пытался. Не вышло.
Попробуй передать канве размер клиентской области фрейма. Т.е. измени соответствующим образом конструктор канвы и создай объект таким образом
C++
1
MyCanvas* Ob = new MyCanvas(this, GetClientSize());
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2010, 00:18  [ТС]
Елки. Решил таки вернуться. Лучше бы я этого не делал...

Я не понимаю в чем проблема и разобраться не могу. Это угнетает. ТТ.

Конструктор канвы. Содержание не имеет сути.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class MyCanvas : public wxPanel
{
public:
    //Конструктор. Параметры указатель на MyFrame
    MyCanvas(MyFrame* POb, wxSize sz):
      /*Конструктор класса wxScrolledWindow
      Указатель на MyFrame, константа wxID_ANY, константа wxDefaultPosition
      размер клиентского окна. На MINUS_SIZE меньше размера фрейма для каждого параметра
      инициализация указателя на змейку, инициализация указателя на еду
      установка переменной очки в значение 0, инициализация значения таймера константой T_V*/
      wxPanel(POb, wxID_ANY, wxDefaultPosition, sz), 
          Sn(new MySnake(this)), Food(new MyFood(this)), points(0), timer_value(T_V)
C++
1
    MyCanvas* Ob=new MyCanvas(this, GetClientSize());
Вызов конструктора канвы.
Результат: но ведь не должно быть области отмеченной красным. Откуда она?

C++
1
2
3
4
void MyCanvas::OnSize(wxSizeEvent& event)
{
    Refresh();
}
Нормально не тащит почему-то. В чем я совершенно не прав?
Миниатюры
Змейка  
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
11.11.2010, 21:28
Цитата Сообщение от ForEveR Посмотреть сообщение
Результат: но ведь не должно быть области отмеченной красным. Откуда она?
Хм... Попробуй вызвать Layout () для канвы(либо для фрейма) после создания объекта.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.11.2011, 18:09  [ТС]
Вчера нашел сею тему... Сегодня собрал wxWidgets и запустил сей проект. Буду вероятно доделывать. Вопросов подозреваю опять же будет много.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.11.2011, 19:01  [ТС]
Собираю на лине.
Code
1
forever@lavroffff:~/Programs/cpp_projects/Snake wxWidgets$ g++ -o snake Constant.h Food.h minimal.cpp Snake.cpp Snake.h `wx-config --cppflags --libs` -std=c++0x
Запускается. Но при старте начинается какой-то треш. Вот скрин. В чем мб дело?
Миниатюры
Змейка  
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
05.11.2011, 13:59
Выкладывай исходники, так сложно что-то сказать.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.11.2011, 14:10  [ТС]
Как-то так.
Вложения
Тип файла: 7z snake.7z (37.7 Кб, 22 просмотров)
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
05.11.2011, 15:20
Попробуй рисовать в таймере вот так
C++
1
2
3
4
wxClientDC dc(this); // если будут мерцания используй wxBufferedDC 
dc.Clear();
Sn->Draw(dc);
DrawFood(dc);
Но это скорее временное решение, чем правильное.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.11.2011, 15:51  [ТС]
rangerx, Помогло. Спасибо!
В чем причина может быть? В какую сторону рыть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2011, 15:51
Помогаю со студенческими работами здесь

Ошибка undefined reference to в игре "Змейка"
В главном файле такие ошибки: #include <QApplication> #include "Game.h" Game* game; int main(int argc, char *argv) { ...

Прокомментировать код игры "змейка" в QT
Помогите прокомментировать код игры (подписать как, что и для чего).

Ошибки в игре "Змейка"
Не получается исправить ошибки в коде :(

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не ползла в направлении обратному...

Змейка
Написал только движение квадрата влево,вправо,вверх,вниз ,но не могу им управлять он движется до конца поля ,а только потом можно...


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

Или воспользуйтесь поиском по форуму:
96
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru