效果展示:
程序简介
1.使用pygame模组
2.在material目录下有一些素材
3.吃豆人的游戏主体
4.吃豆人怪物的AI(未使用深度学习)
主要代码
main.py
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
import pygame, sys from pygame. locals import * from unit import user, enemy import random #constant initialize FPS = 60 BLOCK_SIZE = 24 WIDTH = 29 HEIGHT = 15 WINDOW_WIDTH = WIDTH * BLOCK_SIZE WINDOW_HEIGHT = HEIGHT * BLOCK_SIZE MAP_NAME = "./material/map.maze" BGM_NAME = "./material/bgm.ogg" BLOCK_IMAGE = "./material/block.png" FOOD_IMAGE = "./material/food.png" GAMEOVER_IMAGE = "./material/gameover.png" SERVER_PORT = 30000 ENEMY_COUNT = 4 OX = 1 OY = 1 DELAY = 8 #pygame initialize pygame.init() display = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) clock = pygame.time.Clock() block_image = pygame.image.load(BLOCK_IMAGE) food_image = pygame.image.load(FOOD_IMAGE) gameover_image = pygame.image.load(GAMEOVER_IMAGE) bgm = pygame.mixer.music.load(BGM_NAME) scene = "game" unit_list = [] game_map = [] #map initialize def load_map(filename): global game_map game_map.clear() file = open (filename, 'r' ) for line in file .readlines(): game_map.append( list (line.strip())) pass pass #set passport def through(position): x = position[ 0 ] y = position[ 1 ] in_range = (x > = 0 and x < WIDTH) and (y > = 0 and y < HEIGHT) in_space = ( not game_map[y][x] = = '1' ) return (in_range and in_space) pass #gameover? def check_gameover(user_pos, enemy_pos): global scene gameover = (enemy_pos[ 0 ] = = user_pos[ 0 ] and enemy_pos[ 1 ] = = user_pos[ 1 ]) if gameover: scene = "gameover" pass return gameover pass #gameover def gameover(): pygame.mixer.music.stop() keys = pygame.key.get_pressed() if keys[K_RETURN]: initialize() pass display.fill(( 0 , 0 , 0 )) x = (WINDOW_WIDTH - gameover_image.get_width()) / 2 y = (WINDOW_HEIGHT - gameover_image.get_height()) / 2 display.blit(gameover_image, (x, y)) pygame.display.update() pass #unit initialize def initialize_unit(): unit_list.clear() ox = random.randint( 1 , WIDTH - 2 ) oy = random.randint( 1 , HEIGHT - 2 ) while not through((ox, oy)): ox = random.randint( 1 , WIDTH - 2 ) oy = random.randint( 1 , HEIGHT - 2 ) unit_list.append(user(OX, OY)) for i in range ( 0 , ENEMY_COUNT): enemy_color = i % 4 ox = random.randint( 1 , WIDTH - 2 ) oy = random.randint( 1 , HEIGHT - 2 ) while not through((ox, oy)): ox = random.randint( 1 , WIDTH - 2 ) oy = random.randint( 1 , HEIGHT - 2 ) unit_list.append(enemy(enemy_color, ox, oy)) pass pass #initialize def initialize(): global scene load_map(MAP_NAME) initialize_unit() scene = "game" pygame.mixer.music.play( - 1 ) #system update def system_update(): clock.tick(FPS) for event in pygame.event.get(): if event. type = = pygame.QUIT: sys.exit() pass #update control control_clock = [ 0 , DELAY] def control_update(): #user control if control_clock[ 0 ] > control_clock[ 1 ]: user = unit_list[ 0 ] keys = pygame.key.get_pressed() passport = False pos = user.position if keys[K_UP]: pos = user.move(through(user. next ( 0 ))) elif keys[K_RIGHT]: pos = user.move(through(user. next ( 1 ))) elif keys[K_DOWN]: pos = user.move(through(user. next ( 2 ))) elif keys[K_LEFT]: pos = user.move(through(user. next ( 3 ))) pass game_map[pos[ 1 ]][pos[ 0 ]] = '0' #enemy control u_pos = unit_list[ 0 ].position for index in range ( 1 , len (unit_list)): enemy = unit_list[index] if check_gameover(u_pos, enemy.position): break enemy.track(u_pos) passport = through(enemy. next ()) enemy.move(passport) while not passport: enemy.clockwise() passport = through(enemy. next ()) enemy.move(passport) pass control_clock[ 0 ] = 0 pass else : control_clock[ 0 ] + = 1 pass pass #update screen def screen_update(): display.fill(( 0 , 0 , 0 )) for i in range ( 0 , HEIGHT): for j in range ( 0 , WIDTH): x = j * BLOCK_SIZE y = i * BLOCK_SIZE if game_map[i][j] = = '1' : display.blit(block_image, (x, y)) elif game_map[i][j] = = '4' : display.blit(food_image, (x, y)) pass pass pass for unit in unit_list: unit.update() x = unit.position[ 0 ] * BLOCK_SIZE y = unit.position[ 1 ] * BLOCK_SIZE display.blit(unit.image, (x, y), unit.image_rect()) pygame.display.update() pass #first initialize() #main loop while True : system_update() if scene = = "game" : control_update() screen_update() else : gameover() pass pass |
unit.py
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
|
import pygame import math import random USER_IMAGE = "./material/user.png" ENEMY_IMAGE = [( "./material/enemy%d.png" % i) for i in range ( 1 , 5 )] class unit(): def __init__( self , filename): super (unit, self ).__init__() self .image = pygame.image.load(filename) self .clock = [ 0 , 5 ] self .direction = 0 self .position = [ 1 , 1 , 1 , 1 ] self .index = 0 self .source_rect = 0 pass def update( self ): self .animation_update() pass def animation_update( self ): self .clock[ 0 ] + = 1 if self .clock[ 0 ] > self .clock[ 1 ]: if self .index < 4 : self .index + = 4 else : self .index - = 4 self .source_rect = self .image_rect() self .clock[ 0 ] = 0 pass pass def move( self , passport): if passport: pos = self .position[:] self .position[ 0 ] = self .position[ 2 ] self .position[ 1 ] = self .position[ 3 ] else : self .position[ 2 ] = self .position[ 0 ] self .position[ 3 ] = self .position[ 1 ] pos = self .position pass return pos pass def next ( self ): self .ahead() return ( self .position[ 2 ], self .position[ 3 ]) pass def turn( self , direction): self .direction = direction % 4 self .index = self .direction pass def ahead( self ): if self .direction = = 0 : self .position[ 3 ] - = 1 elif self .direction = = 1 : self .position[ 2 ] + = 1 elif self .direction = = 2 : self .position[ 3 ] + = 1 elif self .direction = = 3 : self .position[ 2 ] - = 1 pass def image_rect( self ): w = self .image.get_width() h = self .image.get_height() ox = math.floor(w / 4 * ( self .index % 4 )) oy = math.floor(h / 2 * math.floor( self .index / 4 )) return pygame.Rect((ox, oy), ( 24 , 24 )) class user(unit): def __init__( self , x, y): super (user, self ).__init__(USER_IMAGE) self .position = [x, y, x, y] pass def next ( self , direction): self .turn(direction) self .ahead() return ( self .position[ 2 ], self .position[ 3 ]) pass class enemy(unit): def __init__( self , id , x, y): filename = ENEMY_IMAGE[ id ] super (enemy, self ).__init__(filename) self .position = [x, y, x, y] pass def track( self , user_pos): rand_dir = [ 1 , 2 , 3 , 4 ] self .turn(random.choice(rand_dir)) pass def clockwise( self ): self .turn( self .direction + 1 ) pass class enemy_user(unit): def __init__( self , x, y): filename = ENEMY_IMAGE[ 0 ] super (enemy_user, self ).__init__(filename) self .position = [x, y, x, y] pass def move( self , x, y): self .position[ 0 ] = x self .position[ 1 ] = y pass |
总结:
程序还有许多地方可以完善,如怪物的AI,时间的判定等等,有兴趣的大佬可以加以修改完善。
完整项目下载:https://github.com/tinytsunami/Python-Game
以上就是python 实现简单的吃豆人游戏的详细内容,更多关于python 实现吃豆人游戏的资料请关注服务器之家其它相关文章!
原文链接:https://github.com/tinytsunami/Python-Game