用python写一个魂斗罗
已于 2022-11-16 16:10:10 修改
分类专栏: Python 文章标签: pygame 游戏 python
版权
Python
专栏收录该内容
订阅专栏
嗨!多一嘴: 童年玩过的经典游戏中,魂斗罗当属经典啊,最近用python写出来,赶一波回忆杀哈哈哈哈哈哈哈~
tips: 600多行代码,耐心耐心耐心!( 偷看*-|||
1、代码实现
(1)子弹类(bullet.py)
import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,game_settings,screen,player):
super().__init__()
self.game_settings = game_settings
self.player = player
self.screen = screen
self.image = pygame.image.load('图片/bullet1.png')
self.rect = self.image.get_rect()
self.rect.left = player.rect.right-20#开始子弹默认往右射击
if self.player.player_direction == -1:
self.rect.right = player.rect.left+20
self.rect.centery = player.rect.centery-15
if self.player.player_down:
self.rect.centery = player.rect.centery#调整子弹位置
if self.player.player_up:
self.rect.bottom = player.rect.top+20
self.x = float(self.rect.x)
self.y = float(self.rect.y)
self.mx = self.x#mx为保存初始x的坐标
self.my = self.y
self.speed_factor = game_settings.bullet_speed_factor
def update(self):
if self.y<self.my or self.y == self.my and self.x == self.mx and self.player.player_up:
self.y -= self.speed_factor
self.rect.y = self.y
elif self.x < self.mx or self.x == self.mx and self.player.player_direction == -1:
self.x -= self.speed_factor
self.rect.x = self.x
elif self.x>self.mx or self.x == self.mx:#默认为右方向
self.x += self.speed_factor
self.rect.x = self.x
def blit_bullet(self):
self.screen.blit(self.image,self.rect)
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
(2)敌人类(enemy.py)
import pygame
from pygame.sprite import Sprite
class Enemy(Sprite):
def __init__(self,game_settings,screen):
super().__init__()
self.pos_j = 0.0
self.pos_i = 0.0
self.game_settings = game_settings
self.screen = screen
self.image = pygame.image.load('图片/enemy/EL/bag1.png')
#self.image = pygame.image.load('图片/enemy/EL/bz1.png')
self.rect = self.image.get_rect()
self.rect.x = self.game_settings.screen_width+self.rect.width*2
self.rect.bottom = 367
self.x = float(self.rect.x)#敌人的位置
self.speed_factor = self.game_settings.enemy_speed_factor
def blitme(self):
self.screen.blit(self.image,self.rect)
def update(self):
if self.game_settings.enemy_is_alive:
if self.game_settings.screen_rolling:
self.x -= self.speed_factor+1 #屏幕滚动速度减去敌人移动速度
self.rect.x = self.x
self.x -= self.speed_factor
self.rect.x = self.x
self.update_run_direction('EL')
else:
if self.game_settings.screen_rolling:
self.x -= self.speed_factor+1 #屏幕滚动速度减去敌人移动速度
self.rect.x = self.x
self.boom()
def boom(self):
self.names1 = locals()
self.players1 = []
for self.j in range(1,3):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/enemy/boom%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.1
if self.pos_i > 2.0:
self.game_settings.boom_end = True
def update_run_direction(self,direction):#循环图片
self.names1 = locals()
self.players1 = []
for self.j in range(1,5):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/enemy/'+direction+'/bag%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_j)]
self.pos_j += 0.1#图片变化速率
if self.pos_j > 4.0:#敌人bag有4个动作
self.pos_j = 0.0
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
(3)按钮类(button.py)
import pygame.font
class Button():
def __init__(self,game_settings,screen,msg):
self.screen = screen
self.screen_rect = self.screen.get_rect()
self.width,self.height = 300,150
self.button_color=(0,255,0)
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(None,48)
self.rect = pygame.Rect(0,0,self.width,self.height)
self.rect.center = self.screen_rect.center
self.prep_msg(msg)
def prep_msg(self,msg):
self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
self.screen.fill(self.button_color,self.rect)
self.screen.blit(self.msg_image,self.msg_image_rect)
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
(4)游戏大boss类(game_boss.py)
import pygame
import random
from pygame.sprite import Sprite
import datetime
class Game_Boss(Sprite):
def __init__(self,game_settings,screen,player):
super().__init__()
self.pos_i = 0.0
self.pos_j = 0.0
self.pos_k = 0.0
self.game_settings = game_settings
self.screen = screen
self.image = pygame.image.load('图片/boss/left/move/bz1.png')
self.rect = self.image.get_rect()
self.rect.x = self.game_settings.screen_width-self.rect.width
self.rect.bottom = 370
self.x = float(self.rect.x)#敌人的位置
self.speed_factor = self.game_settings.enemy_speed_factor
self.boss_start_Y = 370#开始boss人物的高度
self.boss_Y = self.boss_start_Y
self.attack1_order = 0
self.player = player
self.mx = self.x
def blitme(self):
self.screen.blit(self.image,self.rect)
def update(self):
if self.game_settings.boss_alive:
self.direction()
self.rand_att()
if self.game_settings.attack_1:
if self.game_settings.boss_direction == 1:
self.attack_1('left')
else:
self.attack_1('right')
elif self.game_settings.attack_2:
if self.game_settings.boss_direction == 1:
self.attack_2('left')
else:
self.attack_2('right')
elif self.game_settings.boss_jump:
self.jump()
elif self.game_settings.boss_run:
if self.game_settings.boss_direction == 1:
self.run('left')
else:
self.run('right')
elif self.player.rect.centerx > self.rect.x:
self.x += self.speed_factor
self.rect.x = self.x
self.move('right')
elif self.player.rect.centerx < self.rect.x:
self.x -= self.speed_factor
self.rect.x = self.x
self.move('left')
else:
self.boom()
self.game_settings.game_win = True
def rand_att(self):
random.seed(datetime.datetime.now())
if self.game_settings.attack_1 == False and self.game_settings.attack_2 == False and self.game_settings.boss_jump == False and self.game_settings.boss_run == False:
self.rand_num = random.randint(1,70)
if self.rand_num == 1:
self.game_settings.attack_1 = True
elif self.rand_num == 2:
self.game_settings.attack_2 = True
elif self.rand_num == 3:
self.game_settings.boss_jump =True
elif self.rand_num == 4:
self.game_settings.boss_run = True
def attack_1(self,direction):
self.rect.bottom = 410#做此动作时人物的位置
self.names1 = locals()
self.players1 = []
for self.j in range(0,34):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/attack_1/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 34.0 :#循环完成后:
self.pos_i = 0.0
self.game_settings.attack_1 = False
def attack_2(self,direction):
self.rect.bottom = 355
self.names1 = locals()
self.players1 = []
for self.j in range(0,30):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/attack_2/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.5
if self.pos_i >= 30:
self.pos_i = 0.0
self.game_settings.attack_2 = False
def move(self,direction):#循环图片
self.rect.bottom = 370
self.names1 = locals()
self.players1 = []
for self.j in range(1,7):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/move/bz%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.1#图片变化速率
if self.pos_i > 6.0:#敌人bag有4个动作
self.pos_i = 0.0
def run(self,direction):
self.rect.bottom = 400
self.names1 = locals()
self.players1 = []
for self.j in range(0,6):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/'+direction+'/run/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_i)]
self.pos_i += 0.3
if self.pos_i >= 6:
self.pos_i = 0.0
self.game_settings.boss_run = False
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += 6
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= 6
self.rect.x = self.x
def jump(self):
self.rect.bottom = self.boss_Y
if self.game_settings.boss_jump_vel < 0:
self.game_settings.boss_jump_vel += 0.6#跳跃上升的增加的速率
elif self.game_settings.boss_jump_vel > 0:
self.game_settings.boss_jump_vel += 0.8#跳跃下降增加的速率
self.boss_Y += self.game_settings.boss_jump_vel
if self.boss_Y > self.boss_start_Y:
self.game_settings.boss_jump = False#结束跳跃
self.boss_Y = self.boss_start_Y
self.game_settings.boss_jump_vel = -12.0#恢复跳跃开始的速度
if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:
self.x += self.speed_factor
self.rect.x = self.x
elif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:
self.x -= self.speed_factor
self.rect.x = self.x
self.names1 = locals()
self.players1 = []
for self.j in range(3,10):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/left/jump/%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_j)]
self.pos_j += 0.4#跳跃旋转速率
if self.pos_j >= 7:#跳跃有7个动作
self.pos_j = 0.0
def direction(self):
if self.player.rect.centerx > self.rect.x:
self.game_settings.boss_direction = -1
else:
self.game_settings.boss_direction = 1
def boom(self):
self.names1 = locals()
self.players1 = []
for self.j in range(1,4):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/boss/boom%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_k)]
self.pos_k += 0.05
if self.pos_k >= 3.0:
#self.game_settings.boom_end = True
self.game_settings.boss_boom_end = True
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
(5)方法封装类(game_function.py)
import sys
import pygame
from bullet import Bullet
from enemy import Enemy
from game_boss import Game_Boss
def check_keydown_events(event,game_settings,screen,player,bullets):
if event.key == pygame.K_k:#跳跃
player.player_jump = True
if event.key == pygame.K_d:#向右
game_settings.bullet_direction = 'right'
if player.player_down or player.player_up:
player.moving_right = False
else:
player.moving_right = True
player.player_direction = 1
if event.key == pygame.K_a:#向左
game_settings.bullet_direction = 'left'
if player.player_down or player.player_up:
player.moving_left = False
else:
player.moving_left = True
player.player_direction = -1
elif event.key == pygame.K_s:#向下
player.player_down = True
player.player_moving = False
player.moving_left = False
player.moving_right = False
elif event.key == pygame.K_w:#向上
player.player_up = True
player.player_moving = False
player.moving_left = False
player.moving_right = False
elif event.key == pygame.K_j:#射击
new_bullet = Bullet(game_settings,screen,player)
bullets.add(new_bullet)
player.player_shooting = True
elif event.key == pygame.K_p:
sys.exit()
def check_keyup_events(event,player):
if event.key == pygame.K_d:#右
player.image = pygame.image.load('图片/PR/player.png')
player.moving_right = False
player.player_moving = False
elif event.key == pygame.K_a:#左
player.image = pygame.image.load('图片/PL/player.png')
player.player_moving = False
player.moving_left = False
elif event.key == pygame.K_s:#下
player.player_down = False
if player.player_direction == 1:
player.image = pygame.image.load('图片/PR/player.png')
if player.player_direction == -1:
player.image = pygame.image.load('图片/PL/player.png')
elif event.key == pygame.K_w:#上
player.player_up = False
if player.player_direction == 1:
player.image = pygame.image.load('图片/PR/player.png')
if player.player_direction == -1:
player.image = pygame.image.load('图片/PL/player.png')
def check_events(game_settings,screen,player,bullets):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
player.player_moving = True
check_keydown_events(event,game_settings,screen,player,bullets)
elif event.type == pygame.KEYUP:
check_keyup_events(event,player)
def update_screen(game_settings,bg,pos_x,screen,player,bullets,enemys,boss,win_button):
screen.blit(bg,(pos_x,0))
for bullet in bullets.sprites():
bullet.blit_bullet()
"""if game_settings.boom_end:#击中敌人爆炸
enemys.empty()
game_settings.boom_end = False"""
player.blitme()
if game_settings.boss_appear:
boss.draw(screen)
enemys.draw(screen)
if game_settings.game_win:
win_button.draw_button()
pygame.display.flip()
def update_bullet(game_settings,bullets,screen,enemys,boss):
bullets.update()
for bullet in bullets.copy():
if bullet.rect.centerx<0 or bullet.rect.centery<0 or bullet.rect.centerx > game_settings.screen_width:
bullets.remove(bullet)
check_bullet_enemy_collisions(game_settings,bullets,screen,enemys)
check_bullet_boss_collisions(game_settings,bullets,boss)
def check_bullet_enemy_collisions(game_settings,bullets,screen,enemys):
if game_settings.enemy_is_alive:
collisions = pygame.sprite.groupcollide(bullets,enemys,True,False)
else:
collisions = pygame.sprite.groupcollide(bullets,enemys,True,True)
if collisions != {}:
game_settings.enemy_is_alive = False
if len(enemys) == 0:
create_legion(game_settings,screen,enemys)
def check_bullet_boss_collisions(game_settings,bullets,boss):
if game_settings.boss_alive:
collisions = pygame.sprite.groupcollide(boss,bullets,False,True)
else:
collisions = pygame.sprite.groupcollide(boss,bullets,True,True)
if collisions != {}:
game_settings.boss_lift -= 1
if game_settings.boss_lift == 0:
game_settings.boss_alive = False
def create_legion(game_settings,screen,enemys):
for enemy_number in range(1):
game_settings.enemy_is_alive = True
enemy = Enemy(game_settings,screen)
enemys.add(enemy)
def update_enemys(game_settings,enemys):
if game_settings.boss_appear == False:#判断boss是否出现,出现则不出现小兵
enemys.update()
for enemy in enemys.copy():
if enemy.rect.centerx<0:
enemys.remove(enemy)
if game_settings.boom_end:#击中敌人爆炸
enemys.remove(enemy)
game_settings.boom_end = False
game_settings.boss_appear = True
def update_player(game_settings,stats,player,enemys):
player.update()
if pygame.sprite.spritecollideany(player,enemys):
player_hit(game_settings,stats,player)
if game_settings.player_die_end == True:
player.revive_player()
game_settings.player_die_end = False
def player_hit(game_settings,stats,player):
stats.players_left -= 1
game_settings.player_is_alive = False
def update_boss(game_settings,boss):
if game_settings.boss_appear:
boss.update()
if game_settings.boss_boom_end:
boss.empty()
def create_boss(game_settings,screen,player,boss):
bo = Game_Boss(game_settings,screen,player)
boss.add(bo)
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
(6)游戏玩家类(game_player.py)
import pygame
class Game_Player():
def __init__(self,game_settings,screen):
self.screen = screen
self.game_settings = game_settings
self.image = pygame.image.load('图片/PR/player.png')
self.rect = self.image.get_rect()
self.screen_rect = self.screen.get_rect()
self.screen_center_pos = self.screen_rect.centerx
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = 380
self.center = float(self.rect.centerx)
self.moving_right = False
self.moving_left = False
self.player_moving = False
self.pos_i = 0.0#跑步画面改变速度
self.pos_j = 0.0#跳跃的改变初始速度
self.pos_n = 0.0#射击
self.pos_d = 0.0
self.player_direction = 1#1为右,-1为左
self.player_down = False
self.player_up = False
self.player_jump = False
self.player_start_Y = 380#开始人物的高度
self.player_Y = self.player_start_Y
self.player_shooting = False
def update(self):
if self.game_settings.player_is_alive:
if self.moving_right and self.rect.right < self.screen_rect.right:
if self.game_settings.boss_appear:
self.center += self.game_settings.player_speed
elif self.center > self.screen_center_pos:
self.center += 0
else:
self.center += self.game_settings.player_speed
if self.moving_left and self.rect.left > 0:
self.center -= self.game_settings.player_speed
self.rect.centerx = self.center
self.update_image_moving()
else:
self.update_die()
def update_die(self):
self.names = locals()
self.players = []
for self.i in range(1,3):
self.names['player_image%s' %self.i] = pygame.image.load('图片/PR/death%s.png' %self.i)
self.players.append(self.names['player_image%s' %self.i])
self.image = self.players[int(self.pos_d)]
self.pos_d += 0.1
if self.pos_d > 2.0:
self.pos_d = 0.0
self.game_settings.player_die_end = True
def update_image_moving_direction(self,direction):#循环图片
if self.player_shooting == True:
self.names = locals()
self.players = []
for self.i in range(1,4):
self.names['player_image%s' %self.i] = pygame.image.load('图片/'+direction+'/shooting%s.png' %self.i)
self.players.append(self.names['player_image%s' %self.i])
self.image = self.players[int(self.pos_n)]
self.pos_n += 0.1#射击时跑步速率
if self.pos_n > 3.0:#射击时跑步有3个动作
self.pos_n = 0.0
else:
self.names = locals()
self.players = []
for self.i in range(1,6):
self.names['player_image%s' %self.i] = pygame.image.load('图片/'+direction+'/player%s.png' %self.i)
self.players.append(self.names['player_image%s' %self.i])
self.image = self.players[int(self.pos_i)]
self.pos_i += 0.1#跑步速率
if self.pos_i > 5.0:#跑步有5个动作
self.pos_i = 0.0
def update_image_jump(self,direction):#循环图片
if self.game_settings.player_is_alive:
if self.player_jump == True:
self.names1 = locals()
self.players1 = []
for self.j in range(1,5):
self.names1['player_image%s' %self.j] = pygame.image.load('图片/'+direction+'/jump%s.png' %self.j)
self.players1.append(self.names1['player_image%s' %self.j])
self.image = self.players1[int(self.pos_j)]
self.pos_j += 0.3#跳跃旋转速率
if self.pos_j > 4.0:#跳跃有4个动作
self.pos_j = 0.0
else:
self.update_die()
def update_image_moving(self):
if self.player_moving:
if self.moving_right:
self.update_image_moving_direction('PR')#PR是向右的图片
elif self.moving_left:
self.update_image_moving_direction('PL')
def get_player_state(self,player_state):#检测player的状态是否为趴下,向上,跳跃等
if self.player_direction == 1:
self.image = pygame.image.load('图片/PR/'+player_state+'.png')
if self.player_direction == -1:
self.image = pygame.image.load('图片/PL/'+player_state+'.png')
self.rect = self.image.get_rect()
self.rect.centerx = self.center
def get_player_down(self):
self.get_player_state('down')
self.rect.bottom = self.player_start_Y
self.screen.blit(self.image,self.rect)
def get_player_up(self):
self.get_player_state('up')
self.rect.bottom = self.player_start_Y
self.screen.blit(self.image,self.rect)
def get_player_jump(self):
self.get_player_state('jump1')
self.rect.bottom = self.player_Y
if self.game_settings.jump_vel < 0:
self.game_settings.jump_vel += 0.6#跳跃上升的增加的速率
elif self.game_settings.jump_vel > 0:
self.game_settings.jump_vel += 0.8#跳跃下降增加的速率
self.player_Y += self.game_settings.jump_vel
if self.player_Y > self.player_start_Y:
self.player_jump = False
self.player_Y = self.player_start_Y
self.game_settings.jump_vel = -14.0#恢复跳跃开始的速度
if self.player_direction == 1:
self.image = pygame.image.load('图片/PR/player.png')
self.reset_player()
if self.player_direction == -1:
self.image = pygame.image.load('图片/PL/player.png')
self.reset_player()
if self.player_jump == True:#判断是否处于跳跃状态来决定是否旋转跳跃的图像
if self.player_direction == 1:
self.update_image_jump('PR')
if self.player_direction == -1:
self.update_image_jump('PL')
self.screen.blit(self.image,self.rect)
def reset_player(self):
self.rect = self.image.get_rect()
self.rect.centerx = self.center
self.rect.bottom = self.player_start_Y
self.screen.blit(self.image,self.rect)
def blitme(self):
if self.player_jump:
self.get_player_jump()
elif self.player_down:
self.get_player_down()
elif self.player_up:
self.get_player_up()
else:
self.reset_player()
def revive_player(self):
self.center = self.screen_rect.centerx
self.game_settings.player_is_alive = True
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
(7)游戏统计类(game_stats.py)
class GameStats():
def __init__(self,game_settings):
self.game_settings = game_settings
self.reset_stats()
def reset_stats(self):
self.players_left = self.game_settings.players_limit
1
2
3
4
5
6
7
8
(8)设置类(settings.py)
class Settings():
def __init__(self):
self.screen_width = 1200
self.screen_height = 750
self.player_speed = 5
self.jump_vel = -14.0#跳跃开始的速度,这里改动,game_player那里也要改动
self.bullet_speed_factor = 17
self.enemy_speed_factor = 1#屏幕滚动速度减去敌人移动速度为1(屏幕为5,敌人为4)移动时候才平滑。这里改动,enemy的update那里也要改
self.screen_rolling = False
self.enemy_is_alive = True
self.boom_end = False
self.players_limit = 3
self.player_is_alive = True
self.player_die_end = False
self.boss_jump_vel = -12.0
self.attack_1 = False
self.attack_2 = False
self.boss_jump = False
self.boss_run = False
self.boss_appear = False
self.boss_direction = 1#1位向左,-1为向右
self.boss_lift = 15
self.boss_alive = True
self.game_win = False
self.boss_boom_end = False
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
(9)主程序类(Contra.py)
import pygame
import sys
from pygame.locals import *
from settings import Settings
from game_player import Game_Player
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStats
from game_boss import Game_Boss
from button import Button
def run_game():
bg = pygame.image.load("图片/map01.jpeg")
game_settings = Settings()
pos_x = 0#地图移动
pygame.init()
screen = pygame.display.set_mode(
(game_settings.screen_width,game_settings.screen_height))
pygame.display.set_caption("魂斗罗")
stats = GameStats(game_settings)
player = Game_Player(game_settings,screen)
bullets = Group()
boss = Group()
enemys = Group()
win_button = Button(game_settings,screen,"YOU WIN")
gf.create_legion(game_settings,screen,enemys)
gf.create_boss(game_settings,screen,player,boss)
while True:
pygame.mouse.set_visible(False)
gf.check_events(game_settings,screen,player,bullets)
gf.update_player(game_settings,stats,player,enemys)
gf.update_bullet(game_settings,bullets,screen,enemys,boss)
gf.update_enemys(game_settings,enemys)
gf.update_boss(game_settings,boss)
gf.update_screen(game_settings,bg,pos_x,screen,player,bullets,enemys,boss,win_button)
if player.moving_right and player.center > player.screen_rect.centerx and game_settings.boss_appear == False:
game_settings.screen_rolling = True
pos_x -= 5#屏幕滚动速度
else:
game_settings.screen_rolling = False
run_game()
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
2、运行结果
3、游戏素材
链接:https://pan.baidu.com/s/1M6-eZhHM9rOaFmrSMYOdog
提取码:wi6h
偷完面具就瞎跑
关注
6
22
15
专栏目录
基于Python的魂斗罗源码(完整源码可运行).rar
————————————————
版权声明:本文为【拉保小炮】博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_44619675/article/details/113933439