python pygame在射击外星人时更新分数
我正在做拍摄外星人的功能,然后更新屏幕上的分数 我的想法是python pygame在射击外星人时更新分数,python,pygame,Python,Pygame,我正在做拍摄外星人的功能,然后更新屏幕上的分数 我的想法是 在class Game\u状态下为初始设置self.score=0 在添加分数的类设置中设置self.alien_分数=50 设置self.score=pygame.font.font(无,80)。渲染(str(state.score),True,self.color)在类记分板中将分数显示在屏幕上 检查class函数中的collisions=pygame.sprite.groupcollisde(子弹、外星人、假、真) 如果发生碰撞:
class Game\u状态下为初始设置self.score=0
类设置中设置self.alien_分数=50
self.score=pygame.font.font(无,80)。渲染(str(state.score),True,self.color)
在类记分板中
将分数显示在屏幕上class函数中的collisions=pygame.sprite.groupcollisde(子弹、外星人、假、真)
如果发生碰撞:
state.score+=setting.alien_score
sb=记分牌(设置、状态)`
当子弹射中外星人后,在屏幕上添加分数并更新分数
班级记分板
如下所示:
class记分板():
定义初始化(自身、设置、状态):
self.color=(0,0,0)
self.score=pygame.font.font(无,80).render(str(state.score),True,self.color)
self.rect=self.score.get_rect()
self.rect.top=setting.screen\u rect.top
self.rect.right=setting.screen_rect.right-30
def blit_分数(自身、设置):
setting.screen.blit(self.score、self.rect)
现在我这样做了,但是当子弹射中外星人时,屏幕上没有分数更新,值总是0,我不知道是什么原因造成的?
使用sb=Scoreboard(设置,状态)
安装课堂的方法是否错误
如果我在\uuuu init\uuuu
当我将课堂记分板修改为:
class Scoreboard():
def __init__(self,setting,state):
self.color = (0,0,0)
self.prep_score(setting,state)
def prep_score(self,setting,state):
self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
self.rect = self.score.get_rect()
self.rect.top = setting.screen_rect.top
self.rect.right = setting.screen_rect.right-30
def blit_score(self,setting):
setting.screen.blit(self.score,self.rect)
然后在类函数中更改checkcollisions=pygame.sprite.groupcollisde(子弹、外星人、假、真)
if collisions :
state.score += setting.alien_score
sb.prep_score(setting,state)
分数显示正确,当\uuuuu init\uuuuu
中的整个参数如我显示的第一个错误示例所示时,我可以通过哪种方式更新分数
以下是代码:
#!/usr/bin/python
import sys,os
import pygame
from time import sleep
class Setting():
def __init__(self,width,height):
self.w=width
self.h=height
self.flag=pygame.RESIZABLE
self.color=(255,255,255)
self.speed=1.5
self.ship=3
self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
self.screen_rect=self.screen.get_rect()
pygame.display.set_caption("Muhaha")
self.dynamic_setting()
def dynamic_setting(self):
self.alien_score = 50
class Game_state():
def __init__(self,setting):
self.reset(setting)
def reset(self,setting):
self.ship_left = setting.ship
self.score = 0
class Scoreboard():
def __init__(self,setting,state):
self.color = (0,0,0)
self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
self.rect = self.score.get_rect()
self.rect.top = setting.screen_rect.top
self.rect.right = setting.screen_rect.right-30
def blit_score(self,setting):
setting.screen.blit(self.score,self.rect)
class Ship():
def __init__(self,screen,setting):
temp=pygame.image.load("/home/finals/python/alien/image/title.jpg").convert_alpha()
self.ship=pygame.transform.smoothscale(temp,(200,200))
self.rect=self.ship.get_rect()
'''setting the ship position'''
self.rect.center=setting.screen_rect.center
self.rect.bottom=setting.screen_rect.bottom
'''setting the temp x,y to store value'''
self.x=float(self.rect.centerx)
self.y=float(self.rect.centery)
class Bullet(pygame.sprite.Sprite):
def __init__(self,setting,ship):
super().__init__()
self.rect=pygame.Rect(0,0,3,10)
self.rect.centerx=ship.rect.centerx
self.rect.top=ship.rect.top
self.color=(0,0,0)
self.speed=2
'''setting the temp y to store speed'''
self.y=float(self.rect.centery)
def move_bullet(self):
self.y -= self.speed
self.rect.y= self.y
def draw_bullet(self,setting):
pygame.draw.rect(setting.screen,self.color,self.rect)
class Alien(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
pic=pygame.image.load("/home/finals/python/alien/image/ship.jpg").convert_alpha()
self.image=pygame.transform.smoothscale(pic,(100,100))
self.rect=self.image.get_rect()
self.x = float(self.rect.x)
self.rect.x=(self.rect.width)
self.speed=1
self.direction = 1
def create(self,setting,aliens):
'''calculate how many aliens can be placed on screen'''
spacex=setting.w-(self.rect.x)*2
spacey=(setting.h)/2-self.rect.y
alien_number=int(spacex/(2*(self.rect.width)))
alien_row=int(spacey/(2*(self.rect.height)))
for row in range(alien_row):
for number in range(alien_number):
alien=Alien()
'''setting position for every alien'''
alien.x=alien.rect.x+2*alien.rect.width*number
alien.rect.x=alien.x
alien.rect.y=alien.rect.y+2*alien.rect.height*row
aliens.add(alien)
def update(self):
'''update alien position '''
self.x += (self.speed*self.direction)
self.rect.x =self.x
class Function():
def __init__(self):
'''setting lable for ship move'''
self.moving_up = False
self.moving_down = False
self.moving_left = False
self.moving_right = False
def event(self,bullets,setting,ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key ==pygame.K_z:
if len(bullets) < 10:
bullets.add(Bullet(setting,ship))
elif event.key == pygame.K_UP:
self.moving_up=True
elif event.key == pygame.K_DOWN:
self.moving_down=True
elif event.key == pygame.K_LEFT:
self.moving_left=True
elif event.key == pygame.K_RIGHT:
self.moving_right=True
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
self.moving_up=False
elif event.key == pygame.K_DOWN:
self.moving_down=False
elif event.key == pygame.K_LEFT:
self.moving_left=False
elif event.key == pygame.K_RIGHT:
self.moving_right=False
def move(self,setting,ship):
'''set the ship not move out of the screen'''
if self.moving_up == True and ship.rect.top >= 0:
ship.y -= setting.speed
if self.moving_down == True and ship.rect.bottom <= setting.h:
ship.y += setting.speed
if self.moving_left == True and ship.rect.left >= 0:
ship.x -= setting.speed
if self.moving_right == True and ship.rect.right <= setting.w:
ship.x += setting.speed
'''update ship position'''
ship.rect.centerx=ship.x
ship.rect.centery=ship.y
def check_bullet_collide(setting,alien,state,sb,bullets,aliens):
'''check bullets and aliens collide'''
collisions=pygame.sprite.groupcollide(bullets,aliens,False,True)
'''add the score and update it'''
if collisions :
state.score += setting.alien_score
sb=Scoreboard(setting,state)
'''reset the bullets and aliens '''
if len(aliens) ==0:
bullets.empty()
alien.create(setting,aliens)
def blit_bullet(setting,alien,state,sb,bullets,aliens):
'''create bullet'''
for bullet in bullets.sprites():
pygame.draw.rect(setting.screen,bullet.color,bullet.rect)
bullet.y -= bullet.speed
bullet.rect.y=bullet.y
'''check the bullets whether in screen'''
for bullet in bullets:
if bullet.rect.y <= 0:
bullets.remove(bullet)
Function.check_bullet_collide(setting,alien,state,sb,bullets,aliens)
def check_alien_edge(setting,aliens):
'''check the alien touch the edge of screen'''
for alien in aliens.sprites():
if alien.x > setting.w or alien.x < 0:
Function.change_alien_direction(aliens)
break
def change_alien_direction(aliens):
'''if touch the screen move down and change the direction'''
for alien in aliens.sprites():
alien.rect.y +=50
alien.direction *= -1
def update_alien(setting,alien,aliens):
Function.check_alien_edge(setting,aliens)
aliens.update()
def blit_alien(setting,alien,aliens):
aliens.draw(setting.screen)
def ckeck_ship_collide(setting,ship,alien,state,aliens):
if pygame.sprite.spritecollideany(ship,aliens):
state.ship_left -= 1
if state.ship_left >= 0:
aliens.empty()
alien.create(setting,aliens)
state.ship_left -= 1
ship.rect.center = ship.screen_rect.center
ship.rect.bottom = ship.screen_rect.bottom
ship.x = float(ship.rect.centerx)
ship.y = float(ship.rect.centery)
sleep(0.5)
else:
print("Gamer over")
def blit_screen(self,setting,ship,alien,sb,bullets,aliens):
setting.screen.fill((255,255,255))
setting.screen.blit(ship.ship,ship.rect)
setting.screen.blit(sb.score,sb.rect)
self.event(bullets,setting,ship)
Function.blit_alien(setting,alien,aliens)
def game():
pygame.init()
setting=Setting(1200,800)
screen=setting.screen
state=Game_state(setting)
sb=Scoreboard(setting,state)
ship=Ship(screen,setting)
function=Function()
bullet=Bullet(setting,ship)
bullets=pygame.sprite.Group()
alien=Alien()
aliens=pygame.sprite.Group()
alien.create(setting,aliens)
while True:
function.blit_screen(setting,ship,alien,sb,bullets,aliens)
function.move(setting,ship)
Function.update_alien(setting,alien,aliens)
Function.blit_bullet(setting,alien,state,sb,bullets,aliens)
Function.ckeck_ship_collide(setting,ship,alien,state,aliens)
pygame.display.flip()
game()
#/usr/bin/python
导入系统,操作系统
导入pygame
从时间上导入睡眠
类设置():
定义初始值(自身、宽度、高度):
self.w=宽度
self.h=高度
self.flag=pygame.RESIZABLE
self.color=(255255)
自身速度=1.5
self.ship=3
self.screen=pygame.display.set_模式((self.w,self.h),self.flag)
self.screen\u rect=self.screen.get\u rect()
pygame.display.set_标题(“Muhaha”)
self.dynamic_设置()
def动态_设置(自身):
self.u分数=50
类Game_state():
定义初始化(自我,设置):
自复位(设置)
def重置(自我,设置):
self.ship_left=设置.ship
self.score=0
班级记分板():
定义初始化(自身、设置、状态):
self.color=(0,0,0)
self.score=pygame.font.font(无,80).render(str(state.score),True,self.color)
self.rect=self.score.get_rect()
self.rect.top=setting.screen\u rect.top
self.rect.right=setting.screen_rect.right-30
def blit_分数(自身、设置):
setting.screen.blit(self.score、self.rect)
船舶等级():
定义初始化(自身、屏幕、设置):
temp=pygame.image.load(“/home/finals/python/alien/image/title.jpg”).convert_alpha()
self.ship=pygame.transform.smoothscale(temp,(200200))
self.rect=self.ship.get_rect()
“设置船舶位置”
self.rect.center=setting.screen\u rect.center
self.rect.bottom=setting.screen\u rect.bottom
''将温度x,y设置为存储值''
self.x=浮动(self.rect.centerx)
self.y=浮动(self.rect.centery)
类子弹(pygame.sprite.sprite):
定义初始(自我、设置、装运):
super()。\uuuu init\uuuuu()
self.rect=pygame.rect(0,0,3,10)
self.rect.centerx=ship.rect.centerx
self.rect.top=ship.rect.top
self.color=(0,0,0)
自身速度=2
''将温度y设置为存储速度''
self.y=浮动(self.rect.centery)
def move_项目符号(自身):
self.y-=自速度
self.rect.y=self.y
def draw_项目符号(自身,设置):
pygame.draw.rect(设置.屏幕,self.color,self.rect)
类外星人(pygame.sprite.sprite):
定义初始化(自):
super()。\uuuu init\uuuuu()
pic=pygame.image.load(“/home/finals/python/alien/image/ship.jpg”).convert_alpha()
self.image=pygame.transform.smoothscale(图,(100100))
self.rect=self.image.get_rect()
self.x=float(self.rect.x)
self.rect.x=(self.rect.width)
自身速度=1
自我定向=1
def创建(自身、设置、外部):
''计算屏幕上可以放置多少外星人''
spacex=设置.w-(自校正x)*2
spacey=(setting.h)/2-self.rect.y
异形数=int(空格x/(2*(自矩形宽度)))
异形行=int(空格Y/(2*(自校正高度)))
对于范围内的行(外星行):
对于范围内的编号(外来编号):
外星人
''为每个外国人设置位置''
alien.x=alien.rect.x+2*alien.rect.width*数字
alien.rect.x=alien.x
alien.rect.y=alien.rect.y+2*alien.rect.height*行
外星人。添加(外星人)
def更新(自我):
''更新外星位置''
self.x+=(自速度*自方向)
self.rect.x=self.x
类函数():
定义初始化(自):
''为船舶移动设置标签''
self.moving_up=False
self.moving_down=False
self.moving_left=False
self.moving_right=False
def事件(自身、项目符号、设置、装运):
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_z:
如果透镜(子弹)<10:
项目符号。添加(项目符号(设置,装运))
elif event.key==pygame.K_UP:
self.moving_up=True
import sys,os
import pygame
from time import sleep
class Setting():
def __init__(self,width,height):
self.w=width
self.h=height
self.flag=pygame.RESIZABLE
self.color=(255,255,255)
self.speed=1.5
self.ship=3
self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
self.screen_rect=self.screen.get_rect()
pygame.display.set_caption("Muhaha")
self.dynamic_setting()
def dynamic_setting(self):
self.alien_score = 50
class Game_state():
def __init__(self,setting):
self.reset(setting)
def reset(self,setting):
self.ship_left = setting.ship
self.score = 0
class Scoreboard():
def __init__(self,setting,state):
self.color = (0,0,0)
self.score = pygame.font.Font(None,80).render(str(state.score),True,self.color)
self.rect = self.score.get_rect()
self.rect.top = setting.screen_rect.top
self.rect.right = setting.screen_rect.right-30
def blit_score(self,setting):
setting.screen.blit(self.score,self.rect)
class Ship():
def __init__(self,screen,setting):
temp=pygame.image.load("/home/finals/python/alien/image/title.jpg").convert_alpha()
self.ship=pygame.transform.smoothscale(temp,(200,200))
self.rect=self.ship.get_rect()
'''setting the ship position'''
self.rect.center=setting.screen_rect.center
self.rect.bottom=setting.screen_rect.bottom
'''setting the temp x,y to store value'''
self.x=float(self.rect.centerx)
self.y=float(self.rect.centery)
class Bullet(pygame.sprite.Sprite):
def __init__(self,setting,ship):
super().__init__()
self.rect=pygame.Rect(0,0,3,10)
self.rect.centerx=ship.rect.centerx
self.rect.top=ship.rect.top
self.color=(0,0,0)
self.speed=2
'''setting the temp y to store speed'''
self.y=float(self.rect.centery)
def move_bullet(self):
self.y -= self.speed
self.rect.y= self.y
def draw_bullet(self,setting):
pygame.draw.rect(setting.screen,self.color,self.rect)
class Alien(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
pic=pygame.image.load("/home/finals/python/alien/image/ship.jpg").convert_alpha()
self.image=pygame.transform.smoothscale(pic,(100,100))
self.rect=self.image.get_rect()
self.x = float(self.rect.x)
self.rect.x=(self.rect.width)
self.speed=1
self.direction = 1
def create(self,setting,aliens):
'''calculate how many aliens can be placed on screen'''
spacex=setting.w-(self.rect.x)*2
spacey=(setting.h)/2-self.rect.y
alien_number=int(spacex/(2*(self.rect.width)))
alien_row=int(spacey/(2*(self.rect.height)))
for row in range(alien_row):
for number in range(alien_number):
alien=Alien()
'''setting position for every alien'''
alien.x=alien.rect.x+2*alien.rect.width*number
alien.rect.x=alien.x
alien.rect.y=alien.rect.y+2*alien.rect.height*row
aliens.add(alien)
def update(self):
'''update alien position '''
self.x += (self.speed*self.direction)
self.rect.x =self.x
class Function():
def __init__(self,setting):
'''setting lable for ship move'''
self.moving_up = False
self.moving_down = False
self.moving_left = False
self.moving_right = False
self.setting = setting
def event(self,bullets,ship):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key ==pygame.K_z:
if len(bullets) < 10:
bullets.add(Bullet(setting,ship))
elif event.key == pygame.K_UP:
self.moving_up=True
elif event.key == pygame.K_DOWN:
self.moving_down=True
elif event.key == pygame.K_LEFT:
self.moving_left=True
elif event.key == pygame.K_RIGHT:
self.moving_right=True
elif event.key == pygame.K_ESCAPE:
sys.exit()
elif event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
self.moving_up=False
elif event.key == pygame.K_DOWN:
self.moving_down=False
elif event.key == pygame.K_LEFT:
self.moving_left=False
elif event.key == pygame.K_RIGHT:
self.moving_right=False
def move(self,ship):
'''set the ship not move out of the screen'''
if self.moving_up == True and ship.rect.top >= 0:
ship.y -= self.setting.speed
if self.moving_down == True and ship.rect.bottom <= self.setting.h:
ship.y += self.setting.speed
if self.moving_left == True and ship.rect.left >= 0:
ship.x -= self.setting.speed
if self.moving_right == True and ship.rect.right <= self.setting.w:
ship.x += self.setting.speed
'''update ship position'''
ship.rect.centerx=ship.x
ship.rect.centery=ship.y
def check_bullet_collide(self,alien,state,sb,bullets,aliens):
'''check bullets and aliens collide'''
collisions=pygame.sprite.groupcollide(bullets,aliens,False,True)
'''add the score and update it'''
if collisions :
state.score += self.setting.alien_score
sb=Scoreboard(self.setting,state)
'''reset the bullets and aliens '''
if len(aliens) ==0:
bullets.empty()
alien.create(self.setting,aliens)
def blit_bullet(self,alien,state,sb,bullets,aliens):
'''create bullet'''
for bullet in bullets.sprites():
pygame.draw.rect(self.setting.screen,bullet.color,bullet.rect)
bullet.y -= bullet.speed
bullet.rect.y=bullet.y
'''check the bullets whether in screen'''
for bullet in bullets:
if bullet.rect.y <= 0:
bullets.remove(bullet)
self.check_bullet_collide(alien,state,sb,bullets,aliens)
def check_alien_edge(self,aliens):
'''check the alien touch the edge of screen'''
for alien in aliens.sprites():
if alien.x > self.setting.w or alien.x < 0:
self.change_alien_direction(aliens)
break
def change_alien_direction(self,aliens):
'''if touch the screen move down and change the direction'''
for alien in aliens.sprites():
alien.rect.y +=50
alien.direction *= -1
def update_alien(self,alien,aliens):
self.check_alien_edge(aliens)
aliens.update()
def blit_alien(self,alien,aliens):
aliens.draw(self.setting.screen)
def ckeck_ship_collide(self,ship,alien,state,aliens):
if pygame.sprite.spritecollideany(ship,aliens):
state.ship_left -= 1
if state.ship_left >= 0:
aliens.empty()
alien.create(self.setting,aliens)
state.ship_left -= 1
ship.rect.center = ship.screen_rect.center
ship.rect.bottom = ship.screen_rect.bottom
ship.x = float(ship.rect.centerx)
ship.y = float(ship.rect.centery)
sleep(0.5)
else:
print("Gamer over")
def blit_screen(self,ship,alien,sb,bullets,aliens):
self.setting.screen.fill((255,255,255))
self.setting.screen.blit(ship.ship,ship.rect)
self.setting.screen.blit(sb.score,sb.rect)
self.event(bullets,ship)
self.blit_alien(alien,aliens)
def game():
pygame.init()
setting=Setting(1200,800)
screen=setting.screen
state=Game_state(setting)
sb=Scoreboard(setting,state)
ship=Ship(screen,setting)
function=Function(setting)
bullet=Bullet(setting,ship)
bullets=pygame.sprite.Group()
alien=Alien()
aliens=pygame.sprite.Group()
alien.create(setting,aliens)
while True:
function.blit_screen(ship,alien,sb,bullets,aliens)
function.move(ship)
function.update_alien(alien,aliens)
function.blit_bullet(alien,state,sb,bullets,aliens)
function.ckeck_ship_collide(ship,alien,state,aliens)
pygame.display.flip()
game()