Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/302: Рейтинг темы: голосов - 302, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 12.02.2015
Сообщений: 5

Змейка на python с pygame (100 строчек начинающего)

29.03.2015, 15:42. Показов 62839. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане.
Я бы очень хотел побольше критики (начиная от ошибок в этом тексте и заканчивая неправильно выбранной логикой при написании программы).
Кликните здесь для просмотра всего текста
Прошёл туториал на codecademy, почитал несколько статей на хабре, долго выбирал между Java и Python и выбрал Python для изучения.
Самого меня занесло в медицину, т.ч. учусь как гуманитарий, но в школе был одним из лучших по алгебре и информатике.
При выборе ЯП руководствовался тем, чтобы и игрушку написать можно было, и программку для финансистов, чтоб не париться со сложным синтаксисом при изучении, чтоб быстро и одному можно было создать что-нибудь "работающее" и интересное.
Вообще выбор был между С++, Java, Python.
Давно "изучал" (это сильно сказано, скорее присматривался) QBasic (школа), HTML (знаю, что язык разметки), PHP, азы Python.
Недавно присмотрелся к Java и C++. Но остановился именно на Python, потому что хобби. Но хотелось бы получить кайфа, денег и небо в алмазах от кодинга...
Если вы приблизительно представили, меня, то пожалуйста посоветуйте ЯП для изучения, который лучше подойдёт для моих целей.

Написал игру змейка.
Только основное игровое окно без примочек.
Проблема - иногда, когда змейка уже движется, после нажатия клавиши змейка не поворачивает в следующем цикле, а поворачивает в "послеследующем". Если успеть нажать в первые ~200 мсек после прорисовки змейки, то она нормально сходит в следующем цикле, иначе происходит как написано выше.
Как решить данную проблему?
Кликните здесь для просмотра всего текста
Не все переменные написаны на нормальном английском, ибо знаниями оного язык сильно не блещу. Комментарии по-возможности старался везде написать. Прошу прощения, если где-то код вам покажется некрасивым. Но, пожалуйста...

КРИТИКУЙТЕ как можно больше!
Python
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# -*- coding: utf-8 -*- 
import pygame
import random
 
window = pygame.display.set_mode((402, 402))
pygame.display.set_caption("Zmey 3000")
screen = pygame.Surface((402, 402))     
done = True # для главного цикла
#рисуем сетку
def draw_setka():
    x = 0
    x_x = 400
    y = 0
    y_y = 400
    for i in range(11):
        pygame.draw.line(screen, (255, 255, 255), (x, y), (x, y_y), 2)
        x += 40
    x = 0
    for i2 in range(11):
        pygame.draw.line(screen, (255, 255, 255), (x, y), (x_x, y), 2)
        y += 40 
#класс героя, элемента хвоста, яблока
class Zmey():
    def __init__(self, xpos, ypos, filename):
        self.xpos = xpos
        self.ypos = ypos
        self.bitmap = pygame.image.load(filename)
    def render(self):
        screen.blit(self.bitmap, (self.xpos * 40 + 2,self.ypos * 40 + 2))
#движение хвоста
def going_hv():
    x = 2
    y = len(list)
    for i in reversed(list[1:]):
            i.xpos, i.ypos = list[y - x].xpos, list[y - x].ypos #каждый кубик (элемент хвоста) получает координаты стоящего перед ним (ближе к голове змейки)
            x += 1
counter = 0 #для будущего счёта
hvost = Zmey(4, 5, 'element.jpg')
hero = Zmey(4, 4, 'element.jpg')
going = '' # для клавиш
list = [hero, hvost] #тут хранится змейка
#движение хвоста змейки
def do_going(going):
    if going == 'left':     
        going_hv()      
        list[0].xpos -= 1
        if list[0].xpos < 0:
            list[0].xpos = 9        
    if going == 'right':        
        going_hv()      
        list[0].xpos += 1
        if list[0].xpos > 9:
            list[0].xpos = 0        
    if going == 'up':       
        going_hv()      
        list[0].ypos -= 1
        if list[0].ypos < 0:
            list[0].ypos = 9
    if going == 'down':     
        going_hv()      
        list[0].ypos += 1
        if list[0].ypos > 9:
            list[0].ypos = 0
apple = Zmey(10, 10, 'apple.png')
#генерация яблока
def apple_gen(list):
    x = random.randint(0, 9)
    y = random.randint(0, 9)
    for i in list:
        if (i.xpos, i.ypos) == (x, y):
            x, y = apple_gen(list)
        else:
            continue
    return x, y     
apple.xpos, apple.ypos = apple_gen(list) #начальное положение яблока
while done:
    some_x = list[len(list) - 1].xpos #если бедет захвачено яблоко, добавленной части хвоста передаётся это значение по Х
    some_y = list[len(list) - 1].ypos # --//-- по У  
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = False
        if event.type == pygame.KEYDOWN:
            # Выясняем какая именно кнопка была нажата
            if event.key == pygame.K_LEFT:
                going = 'left'              
            if event.key == pygame.K_RIGHT:
                going = 'right'
            if event.key == pygame.K_UP:
                going = 'up'        
            if event.key == pygame.K_DOWN:
                going = 'down'
    do_going(going) #передаем новые координаты змейки
    #если съедено яблоко
    if list[0].xpos == apple.xpos and list[0].ypos == apple.ypos:
        counter += 1
        list.append(Zmey( some_x, some_y, 'element.jpg'))
        apple.xpos, apple.ypos = apple_gen(list)    
    screen.fill((0, 0, 0))
    draw_setka()
    #отрисовка змейки через цикл
    for i in list:
        i.render()
    apple.render()
    window.blit(screen, (0, 0))
    pygame.display.flip()
    pygame.time.delay(300)
PS: извините за табуляцию

PPS: картинки
Название: element.jpg
Просмотров: 706

Размер: 562 байт
Название: apple.png
Просмотров: 687

Размер: 177 байт
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.03.2015, 15:42
Ответы с готовыми решениями:

опять змейка (Python+Pygame) Противный баг
Друг познакомил с чудесной библиотекой Pygame И я решил на скорую руку реализовать змейку Из разных статей и гайдов,я выяснил-что...

Змейка на pygame
Здравствуйте, пишу змейку на pygame в учебных целях. В классической змейке, змея анимируется тиками(рывками), ровно на одну клетку. Я уже 2...

Змейка pygame
Здравствуйте, написал змейку на pygame. Писал не по шаблону, а сам все реализовывал. Хочется знать мнение более опытных людей, какие...

5
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
30.03.2015, 07:45
1. Код написан не по PEP 8
2.
Цитата Сообщение от ratsionalist Посмотреть сообщение
Если успеть нажать в первые ~200 мсек после прорисовки змейки, то она нормально сходит в следующем цикле, иначе происходит как написано выше.
Как решить данную проблему?
Слишком большая задержка:
Цитата Сообщение от ratsionalist Посмотреть сообщение
pygame.time.delay(300)
Т.е. обработка событий происходит каждые 300 мс. Поэтому интерфейс такой неотзывчивый. Задержку уменьшить. Чтобы темп игры не становился слишком высоким, понятно, что мсещение змейки будет происходит не на каждой итерации.
3. Используются глобальные переменные.
4. Есть переменная с именем list, что является именем стандартного типа (и подсветка синтаксиса на это как бы намекает).
5. draw_setka - draw_grid
1
 Аватар для Wolkodav
842 / 480 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
30.03.2015, 13:22
ratsionalist, ну уж можно было-бы тогда создать какой-нибудь объект игра, объект поле. А в него уже пихать что нужно. Вообщем какую-нибудь маленькую платформочку. Просто если захотите по сети устроить или еще чего прикрутить, то придётся переписывать. Как-то разбить на объекта. общаться через события между объектами.
1
0 / 0 / 0
Регистрация: 27.07.2015
Сообщений: 1
27.07.2015, 08:44
У меня вопрос, ответьте пожалуйста...

Добавлено через 11 минут
1)Какого размера должна быть картинка,если ее самому делать( вроде 40х40 пикселей, да?),
2)какого она должна быть формата(png,jpeg,bmp ?)
3) в какой папке должна быть чтобы потом ее добавить игру (hvost = Zmey(4, 5, 'element.jpg') вы ведь ее в какую то папку добавили)
Заранее спасибо

Добавлено через 7 минут
в какой папке должно быть изображение*
0
 Аватар для akzo
71 / 67 / 6
Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8
27.07.2015, 10:54
Цитата Сообщение от робин Посмотреть сообщение
)Какого размера должна быть картинка,если ее самому делать( вроде 40х40 пикселей, да?),
Программирование это в первую очередь эксперементирование, надо пробывать! Лично, когда я писал игру, просто качал готовые спрайты и только убирал ненужный фон.
Цитата Сообщение от робин Посмотреть сообщение
2)какого она должна быть формата(png,jpeg,bmp ?)
Любого
Цитата Сообщение от робин Посмотреть сообщение
в какой папке должна быть чтобы потом ее добавить игру (hvost = Zmey(4, 5, 'element.jpg') вы ведь ее в какую то папку добавили)
В той же где ваш скрипт)
Моя прелесть:
0
 Аватар для akzo
71 / 67 / 6
Регистрация: 08.08.2013
Сообщений: 286
Записей в блоге: 8
27.07.2015, 11:29
Для анимирования персонажей использовал библиотеку pyganim.

Добавлено через 33 минуты
Кстати вот и сама игра, может кому-то понадобиться, проверял на винде.
http://www.fayloobmennik.net/5344386
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2015, 11:29
Помогаю со студенческими работами здесь

Змейка на pygame
Пытаюсь осилить змейку. Возникла проблема с управлением змеей, когда нажимаешь клавишу поворота, происходит задержка, не могу понять...

Pygame (Змейка) проблема с проигрышем музыки
Здравствуйте, я решил добавить в свою игру фоновую музыку, но при помещении музыки в основной цикл она начинает бесконечное кол-во раз...

Создание файла каждые 100 строчек
Привет всем, у меня возникла проблема. в textbox лежит 300 строчек текста каждые 100 строчек создается текстовый файл с этими 100...

Python + Pygame
Сдравствуйте, помогите разобраться понять не могу, как мне сделать перенос строки Пример: text = u&quot;Нужная информация....

Python Pygame
Почему-то капли оставляют за собой след, а мне надо, чтобы они просто вниз уходили. Подскажите, в чем ошибка? import pygame ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru