-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
169 lines (142 loc) · 6.01 KB
/
main.py
File metadata and controls
169 lines (142 loc) · 6.01 KB
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
164
165
166
167
168
169
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Snake Game - Anime Edition
动漫风格贪吃蛇游戏主程序入口
作者: AI Assistant
版本: 1.0.0
描述: 具有动漫视觉风格的本地贪吃蛇游戏,支持暂停、皮肤选择与最高分记录
"""
import pygame
import sys
from ui_menu import MainMenu
from game_logic import SnakeGame
from skin_manager import SkinManager
from score_manager import ScoreManager
# 游戏常量
WIDTH = 800
HEIGHT = 600
FPS = 60
TITLE = "贪吃蛇 - Anime Edition"
class GameApp:
"""游戏主应用类"""
def __init__(self):
"""初始化游戏应用"""
pygame.init()
# 设置窗口
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption(TITLE)
# 设置窗口图标
import os
icon_path = os.path.join("assets", "icon.ico")
try:
if os.path.exists(icon_path) and icon_path.endswith('.ico'):
# 对于.ico文件,我们跳过加载,因为pygame对.ico支持有限
pass
else:
# 如果有其他格式的图标文件,可以在这里加载
pass
except Exception as e:
print(f"无法加载图标: {e}")
self.clock = pygame.time.Clock()
self.running = True
self.fullscreen = False
# 初始化管理器
self.skin_manager = SkinManager()
self.score_manager = ScoreManager()
# 初始化菜单和游戏
self.main_menu = MainMenu(self.screen, self.skin_manager, self.score_manager)
self.snake_game = None
# 导入皮肤选择菜单
from ui_menu import SkinSelectionMenu
self.skin_selection_menu = SkinSelectionMenu(self.screen, self.skin_manager)
# 游戏状态
self.state = "menu" # menu, game, skin_selection
def toggle_fullscreen(self):
"""切换全屏模式"""
self.fullscreen = not self.fullscreen
if self.fullscreen:
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
else:
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
def handle_events(self):
"""处理事件"""
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
elif event.type in [pygame.KEYDOWN, pygame.KEYUP]:
if event.type == pygame.KEYDOWN and event.key == pygame.K_F11:
self.toggle_fullscreen()
# 根据当前状态处理按键
if self.state == "menu":
if event.type == pygame.KEYDOWN: # 菜单只处理按下事件
result = self.main_menu.handle_event(event)
if result == "start_game":
self.start_game()
elif result == "skin_selection":
self.state = "skin_selection"
elif result == "quit":
self.running = False
elif self.state == "skin_selection":
if event.type == pygame.KEYDOWN: # 皮肤选择只处理按下事件
result = self.skin_selection_menu.handle_event(event)
if result == "back_to_menu" or result == "skin_selected":
self.state = "menu"
elif self.state == "game" and self.snake_game:
# 游戏状态需要处理按下和释放事件
result = self.snake_game.handle_event(event)
if result == "menu":
self.state = "menu"
self.snake_game = None
elif result == "toggle_fullscreen":
self.toggle_fullscreen()
elif event.type == pygame.MOUSEBUTTONDOWN:
if self.state == "menu":
result = self.main_menu.handle_event(event)
if result == "start_game":
self.start_game()
elif result == "skin_selection":
self.state = "skin_selection"
elif result == "quit":
self.running = False
elif self.state == "skin_selection":
result = self.skin_selection_menu.handle_event(event)
if result == "back_to_menu" or result == "skin_selected":
self.state = "menu"
def start_game(self):
"""开始游戏"""
self.snake_game = SnakeGame(self.screen, self.skin_manager, self.score_manager)
self.state = "game"
def update(self):
"""更新游戏状态"""
if self.state == "game" and self.snake_game:
result = self.snake_game.update()
if result == "game_over" or result == "victory":
self.state = "menu"
self.snake_game = None
def draw(self):
"""绘制游戏画面"""
self.screen.fill((26, 26, 46)) # 深蓝色背景
if self.state == "menu":
self.main_menu.draw()
elif self.state == "game" and self.snake_game:
self.snake_game.draw()
elif self.state == "skin_selection":
# 绘制皮肤选择界面
self.skin_selection_menu.draw()
pygame.display.flip()
def run(self):
"""运行游戏主循环"""
while self.running:
self.handle_events()
self.update()
self.draw()
self.clock.tick(FPS)
pygame.quit()
sys.exit()
def main():
"""主函数"""
app = GameApp()
app.run()
if __name__ == "__main__":
main()