可以问一下,怎样让我这个代码里的外星人实现随机左右移动哇,改了一下午了还是改不出来
谢谢!
模块alien
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
#表示单个外星人
def __init__(self,ai_settings,screen):
#初始化外星人并设置其起始位置
super(Alien,self).__init__()
self.screen=screen
self.ai_settings=ai_settings
#加载外星人的图片,并设置其rect属性
self.image=pygame.image.load("images/alien.bmp")
self.rect=self.image.get_rect()
#每个外星人最初都在屏幕左上角附近
self.rect.x=self.rect.width
self.rect.y=self.rect.height
#储存外星人的准确位置
self.x=float(self.rect.x)
def blitme(self):
#在指定位置绘制外星人
self.screen.blit(self.image,self.rect)
def check_edges(self):
# 葖果有外星人位于屏幕边缘,就返回True
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True
def update(self):
#向左、向右移动外星人
self.x += (self.ai_settings.alien_speed_factor*self.ai_settings.fleet_direction)
self.rect.x=self.x
模块game_functions
#储存大量让游戏运行的函数
import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleep
#响应按键
def check_keydown_events(event,ai_settings,screen,ship,bullets):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
elif event.key==pygame.K_UP:
ship.moving_up=True
elif event.key==pygame.K_DOWN:
ship.moving_down=True
elif event.key==pygame.K_SPACE:
fire_bullet(ai_settings,screen,ship,bullets)
elif event.key==pygame.K_q:
sys.exit()
#响应松开
def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
elif event.key==pygame.K_UP:
ship.moving_up=False
elif event.key==pygame.K_DOWN:
ship.moving_down=False
#定义一个管理事件代码的函数
def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):
#响应键盘和鼠标事件
for event in pygame.event.get():
#是否停止
if event.type==pygame.QUIT:
sys.exit()
#左右移动
elif event.type==pygame.KEYDOWN:
check_keydown_events(event,ai_settings,screen,ship,bullets)
elif event.type==pygame.KEYUP:
check_keyup_events(event,ship)
elif event.type==pygame.MOUSEBUTTONDOWN:
mouse_x,mouse_y=pygame.mouse.get_pos()
check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y)
def check_play_button(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets,mouse_x,mouse_y):
#在玩家单击play按钮时开始新游戏
button_clicked=play_button.rect.collidepoint(mouse_x,mouse_y)
if button_clicked and not stats.game_active:
#重置游戏
ai_settings.initialize_dynamic_settings()
#隐藏光标
pygame.mouse.set_visible(False)
#重置游戏统计信息
stats.reset_stats()
stats.game_active=True
#重置记分牌图像
sb.prep_score()
sb.prep_high_score()
sb.prep_level()
#清空外星人和子弹
aliens.empty()
bullets.empty()
#创建一群新的外星人,并让飞船居中
creat_fleet(ai_settings,screen,ship,aliens)
ship.center_ship()
# 创建一颗子弹并将其加入到编组中
def fire_bullet(ai_settings,screen,ship,bullets):
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
#更新子弹的位置,并删除已经消失的子弹
bullets.update()
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)
def get_number_aliens_x(ai_settings,alien_width):
#计算每行容纳多少个外星人
available_space_x=ai_settings.screen_width-2*alien_width
number_aliens_x=int(available_space_x/(2*alien_width))
return number_aliens_x
def get_number_rows(ai_settings,ship_height,alien_height):
avaliable_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)
number_rows=int(avaliable_space_y/(2*alien_height))
return number_rows
def creat_alien(ai_settings,screen,aliens,alien_number,row_number):
#创建一个外星人并将其放在当前行
alien = Alien(ai_settings, screen)
alien_width=alien.rect.width
alien.x = alien_width + 2 * alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y=alien.rect.height+2*alien.rect.height*row_number
aliens.add(alien)
def creat_fleet(ai_settings,screen,ship,aliens):
#创建外星人群
#创建一个外星人,并计算一行可以容纳多少个外星人
alien = Alien(ai_settings, screen)
number_aliens_x=get_number_aliens_x(ai_settings,alien.rect.width)
number_rows=get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
#创建外星人群
for row_number in range(number_rows):
for alien_number in range(number_aliens_x):
creat_alien(ai_settings,screen,aliens,alien_number,row_number)
def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):
#更新外新人的位置
check_fleet_edges(ai_settings,aliens)
aliens.update()
#检测外星人和飞船碰撞
if pygame.sprite.spritecollideany(ship,aliens):
ship_hit(ai_settings,stats,screen,ship,aliens,bullets)
#检查是否有外星人到达了屏幕底部
check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets)
def check_fleet_edges(ai_settings,aliens):
#有外星人到达屏幕边缘时采取相应的措施
for alien in aliens.sprites():
if alien.check_edges():
change_fleet_direction(ai_settings,aliens)
break
def change_fleet_direction(ai_settings,aliens):
#将整体外星人下移,并改变他们的方向
for alien in aliens.sprites():
alien.rect.y+=ai_settings.fleet_drop_speed
ai_settings.fleet_direction*=-1
def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):
#检查是否有子弹击中了外星人
#如果是这样,就删除相应的子弹和外星人
collisions=pygame.sprite.groupcollide(bullets,aliens,True,True)
if collisions:
for aliens in collisions.values():
stats.score+=ai_settings.alien_points*len(aliens)
sb.prep_score()
check_high_score(stats,sb)
if len(aliens)==0:
#删除现有的子弹,加快游戏进行的速度,并创建一群新的外星人
#如果整群外星人都被消灭,就提高一个等级
bullets.empty()
ai_settings.increase_speed()
#提高一个等级
stats.level+=1
sb.prep_level()
creat_fleet(ai_settings,screen,ship,aliens)
def ship_hit(ai_settings,stats,screen,ship,aliens,bullets):
#相应被外星人撞到的飞船
if stats.ships_left>0:
stats.ships_left-=1
#清空外星人和子弹
aliens.empty()
bullets.empty()
#创建一群新的外星人和飞船
creat_fleet(ai_settings,screen,ship,aliens)
ship.center_ship()
#暂停
sleep(0.5)
else:
stats.game_active=False
pygame.mouse.set_visible(True)
def check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets):
#检查是否有外星人到达了屏幕底端
screen_rect=screen.get_rect()
for alien in aliens.sprites():
if alien.rect.bottom>=screen_rect.bottom:
ship_hit(ai_settings,stats,screen,ship,aliens,bullets)
break
def check_high_score(stats,sb):
#检查是否诞生了新的最高分
if stats.score>stats.high_score:
stats.high_score=stats.score
sb.prep_high_score()
#更新屏幕上的图像,并切换到新屏幕
def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):
# 每次循环时都重新绘制屏幕
screen.fill(ai_settings.bg_color)
#在飞船和外星人后面重新绘制所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
ship.blitme()
aliens.draw(screen)
#显示得分
sb.show_score()
#如果游戏处于非活跃状态,就绘制play按钮
if not stats.game_active:
play_button.draw_button()
# 让最近一次屏幕可见
pygame.display.flip()