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

Змейка (главное меню)

30.05.2021, 22:18. Показов 5161. Ответов 1

Author24 — интернет-сервис помощи студентам
Всем привет, пытаюсь разобраться в коде данной игры, но никак не могу понять как правильно сделать главное меню в начале. Началась учебная практика и преподаватель сказал что не хватает меню игры + чтобы в этом меню была функция изменения скорости, но еще одна проблема это скорость, если поменять значение в строке со скоростью змейки, змейка начинает не съедать яблоки, а проходить сквозь них, не понимаю в чем проблема. Помогите добрые люди ;(
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import pygame
import random
 
# инициализировать pygame
pygame.init() 
# создать отображение и запуск обновления
width = 640
height = 480
display = pygame.display.set_mode((width, height))
 
pygame.display.update()
pygame.display.set_caption("Змейка с приколом")
 
# цвет
colors = {
    "snake_head": (0, 255, 0),
    "snake_tail": (0, 200, 0),
    "apple": (255, 0, 0)
}
 
# положение змейки со смещением
snake_pos = {
    "x": width/2-10,
    "y": height/2-10,
    "x_change": 0,
    "y_change": 0
}
 
# размер змейки
snake_size = (10, 10)
 
# скорость звейки
snake_speed = 10
 
# хвост змеи
snake_tails = []
 
snake_pos["x_change"] = -snake_speed
for i in range(75):
    snake_tails.append([snake_pos["x"] + 10*i, snake_pos["y"]])
 
# еда
food_pos = {
    "x": round(random.randrange(0, width - snake_size[0]) / 10) * 10,
    "y": round(random.randrange(0, height - snake_size[1]) / 10) * 10,
}
 
food_size = (10, 10)
food_eaten = 0
 
# началать цикл
game_end = False
clock = pygame.time.Clock()
 
while not game_end:
    # game loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_end = True
 
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and snake_pos["x_change"] == 0:
                # move left
                snake_pos["x_change"] = -snake_speed
                snake_pos["y_change"] = 0
 
            elif event.key == pygame.K_RIGHT and snake_pos["x_change"] == 0:
                # move right
                snake_pos["x_change"] = snake_speed
                snake_pos["y_change"] = 0
 
            elif event.key == pygame.K_UP and snake_pos["y_change"] == 0:
                # move up
                snake_pos["x_change"] = 0
                snake_pos["y_change"] = -snake_speed
 
            elif event.key == pygame.K_DOWN and snake_pos["y_change"] == 0:
                # move down
                snake_pos["x_change"] = 0
                snake_pos["y_change"] = snake_speed
 
    # очистка экрана
    display.fill((0,0,0))
 
    # движение хвоста змейки
    ltx = snake_pos["x"]
    lty = snake_pos["y"]
 
    for i,v in enumerate(snake_tails):
        _ltx = snake_tails[i][0]
        _lty = snake_tails[i][1]
 
        snake_tails[i][0] = ltx
        snake_tails[i][1] = lty
 
        ltx = _ltx
        lty = _lty
 
    # рисовка хвоста змеи
    for t in snake_tails:
        pygame.draw.rect(display, colors["snake_tail"], [
            t[0],
            t[1],
            snake_size[0],
            snake_size[1]])
 
    # рисовка змеи
    snake_pos["x"] += snake_pos["x_change"]
    snake_pos["y"] += snake_pos["y_change"]
 
    # телепортировать змею если она выходит за рамки
    if(snake_pos["x"] < -snake_size[0]):
        snake_pos["x"] = width
 
    elif(snake_pos["x"] > width):
        snake_pos["x"] = 0
 
    elif(snake_pos["y"] < -snake_size[1]):
        snake_pos["y"] = height
 
    elif(snake_pos["y"] > height):
        snake_pos["y"] = 0
 
    pygame.draw.rect(display, colors["snake_head"], [
        snake_pos["x"],
        snake_pos["y"],
        snake_size[0],
        snake_size[1]])
 
    # рисовка еды
    pygame.draw.rect(display, colors["apple"], [
        food_pos["x"],
        food_pos["y"],
        food_size[0],
        food_size[1]])
 
    # столкновение с едой
    if(snake_pos["x"] == food_pos["x"]
        and snake_pos["y"] == food_pos["y"]):
        food_eaten += 1
        snake_tails.append([food_pos["x"], food_pos["y"]])
 
        food_pos = {
            "x": round(random.randrange(0, width - snake_size[0]) / 10) * 10,
            "y": round(random.randrange(0, height - snake_size[1]) / 10) * 10,
        }
 
    # сталкновение с хвостом
    for i,v in enumerate(snake_tails):
        if(snake_pos["x"]+snake_pos["x_change"] == snake_tails[i][0]
            and snake_pos["y"]+snake_pos["y_change"] == snake_tails[i][1]):
            snake_tails = snake_tails[:i]
            break
 
    pygame.display.update()
    
    # настройка фпс
    clock.tick(30)
    
 
# закрыть приложение
pygame.quit()
quit()
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2021, 22:18
Ответы с готовыми решениями:

Заменить главное меню на другое главное меню
Здравствуйте. Помогите, пожалуйста, с задачей: &quot;Создать приложение, в котором при нажатии на кнопку...

Как сделать возврат в главное меню из подпункта меню, здесь код в (.h) и (.cpp)
(.h)Header.h #pragma once using namespace std; class Adress { public: Adress(string...

Возврат назад в главное меню из подпункта меню
Добрый вечер, подскажите пожалуйста, как организовать многоуровневое меню? А конкретно, надо из...

Сделать: Главное меню (первые вторые третьи) после главного меню выбор блюда, в конце список обеда
Создать 3 массива = 1 – супы(борщ, солянка, грибной) 2 - каши(гречка, перловка, манка) 3 –...

1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
09.06.2021, 22:44 2
Цитата Сообщение от rus_el_di Посмотреть сообщение
не могу понять как правильно сделать главное меню в начале
В играх есть понятие сцены. Упрощённо, сцена это всё что игрок видит и с чем может взаимодействовать в данный момент. Меню игры видно не всегда, а только в определённые моменты. Так как оно ни с чем не пересекается, его можно вынести в одтельную сцену. Змейку с едой можно вынести в игровую сцену. На старте запускать сцену меню. При нажатии на "играть" ложить сцену игры на вершину стека сцен. А в вечном цикле брать сцену на вершине стека, отрисовывать её и передавать ей весь ввод.

Например:

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
import abc
 
 
class AbstractScene(abc.ABC):
    @abc.abstractmethod
    def draw(self, *args, **kw):
        pass
 
    @abc.abstractmethod
    def update(self, *args, **kw):
        pass
 
 
class MenuScene(AbstractScene):
    # тут реализация методов помеченных декоратором @abc.abstractmethod
    pass  
 
 
class ActionScene(AbstractScene):
    # тут реализация методов помеченных декоратором @abc.abstractmethod
    pass  
 
 
 
if __name__ == '__main__':
    init()  # иницилизируем окно и задаём нужные параметры
    scene_stack = [MenuScene()]
    game_end = false
    while not game_end:
        scene_stack[-1].update()
        scene_stack[-1].draw()
Это так, набросок. Можно сделать объект State в который запихнуть (scene_stack, game_end) и передавать его в метод update() чтобы можно было завершить игру и изменить сцену. Но лучше эти манипуляции за методами спрятать, так легче будет проверки всякие проводить.

Добавлено через 4 минуты
Цитата Сообщение от rus_el_di Посмотреть сообщение
if(snake_pos["x"] < -snake_size[0]):
все эти скобки вымораживают, это питон а не си, это не по PEP8. Настоятельно рекомендую к ознакомлению.

Добавлено через 2 минуты
rus_el_di, у тебя проверка столкновения реализована сравнением целых и положение еды всегда кратно 10, как думаешь
Цитата Сообщение от rus_el_di Посмотреть сообщение
в чем проблема
?
0
09.06.2021, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2021, 22:44
Помогаю со студенческими работами здесь

Главное меню
Здравствуйте!!! WP-3.5.1 Моя казалось-бы простая задача : Первые 2 пункта Главного меню должны...

главное меню
как сделать чтобы в главном меню, когда я нажимаю &quot;начать программу&quot; на форме появлялись все то,...

Главное меню
6.25. Дана последовательность ненулевых целых чисел, оканчивающая ну¬лем. Определить: А) сколько...

Главное меню
Вот с меню ни как не могу разобраться..жумловское меню встает не по центру контейнера меню...как...

главное меню
Перехожу на Visual c++ c c++ Builder Создаю приложение win32, но в нем есть главное меню и &quot;о...

Главное меню
Хочу сделать главное меню.. например, установить на форму контрол mainmenu, расположить его в самом...

Главное меню
Всем привет! имеется некоторое горизонтальное меню (скрин прилагается), хотелось бы с ним сделать...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru