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

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

29.03.2015, 15:42. Показов 62990. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru