- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个运行游戏,你可以在其中移动和收集硬币。对于每种硬币,我都有一个 if 语句:
if cn1+25 < x and cn1 + 50 > x:
cn1 = -1000
if cn1 < -3:
coincount += 1
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
这个 if 语句不断地发生,将数百个硬币添加到变量 coincount
中。后来在我的代码中,我将 coincount 中的硬币数量传输到屏幕上。
有没有办法确保只运行一次?
(这是我的其余代码,可能会有所帮助)
import pygame,sys,random
pygame.init()
width = 900
height = 300
screenDim = (width,height)
green=(0,255,0)
yellow=(255,255,0)
red=(255,0,0)
WHITE = (0,0,0)
BLACK = (255,255,255)
screen = pygame.display.set_mode(screenDim)
placePlatformX = 0
placePlatformY = 275
coin = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Desktop\\coin.png').convert_alpha()
coin = pygame.transform.scale(coin, (25,25))
background = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Desktop\\background.jpg').convert_alpha()
background = pygame.transform.scale(background, (width,height))
guy = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Desktop\\guy.png').convert_alpha()
guy = pygame.transform.rotate(guy,90)
cloud1 = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Downloads\\cloud.png').convert_alpha()
cloud1 = pygame.transform.scale(cloud1,(156,88))
cloud2 = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Downloads\\cloud.png').convert_alpha()
cloud2 = pygame.transform.scale(cloud1,(131,53))
cloud3 = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Downloads\\cloud.png').convert_alpha()
cloud3 = pygame.transform.scale(cloud1,(200,100))
cloud4 = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Downloads\\cloud.png').convert_alpha()
cloud4 = pygame.transform.scale(cloud1,(39,20))
bplatform = pygame.image.load('C:\\Users\\eliya_s1suf2x\\Desktop\\platform.jpg').convert_alpha()
coincount = 0
x = 450
y = -20
block = 1000
cn1 = 100
cn2 = 100
cn3 = 100
cn4 = 100
cn5 = 100
cloudmove = 20
INVFONT = pygame.font.Font('C:\\Users\\eliya_s1suf2x\\Desktop\\MINECRAFT\\Raleway-ExtraBold.ttf', 18)
textObj = INVFONT.render(str(coincount), True, WHITE, BLACK)
def update():
screen.blit(background,(0,0))
screen.blit(textObj,(860,0))
screen.blit(cloud1,(cloudmove,0))
screen.blit(cloud2,(cloudmove+120,30))
screen.blit(cloud3, (cloudmove+500,10))
screen.blit(cloud4, (cloudmove + 340,20))
screen.blit(bplatform,(placePlatformX,placePlatformY))
screen.blit(bplatform,(placePlatformX+190,placePlatformY))
screen.blit(bplatform,(placePlatformX+380,placePlatformY))
screen.blit(bplatform,(placePlatformX+570,placePlatformY))
screen.blit(bplatform,(placePlatformX+760,placePlatformY))
screen.blit(bplatform,(placePlatformX+1760,placePlatformY+100))
#block list update
screen.blit(bplatform,(block-500,190))
screen.blit(bplatform,(block,100))
screen.blit(bplatform,(block+250,200))
screen.blit(bplatform,(block+500,210))
screen.blit(bplatform,(block+830,190))
screen.blit(bplatform,(block+1000,140))
screen.blit(coin,(cn1 + 40,245))
screen.blit(coin,(cn2 + 80,245))
screen.blit(coin,(cn3 + 120,245))
screen.blit(coin,(cn4+ 160,245))
screen.blit(coin,(cn5 + 200,245))
screen.blit(coin,(830,0))
screen.blit(guy,(x,y))
#pygame.sprite.spritecollide()
standOnBrick = 255
speed = 2
gravity = 3
pygame.display.set_caption("Run")
finished = False
while finished == False:
#processing all the events
for event in pygame.event.get(): # event1, event2,..
if event.type == pygame.QUIT:
finished = True
pygame.quit()
sys.exit()
if y < standOnBrick:
y += gravity
update()
#where the block #where the block
#starts #ends
elif cn1+25 < x and cn1 + 50 > x:
cn1 = -1000
if cn1 < -3:
coincount += 1
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
#WORK ON THIS
elif cn2 + 50 < x and cn2 + 100 > x:
cn2 = -1025
if cn2 < -3:
coincount += 1
print('coincount',coincount)
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
elif cn3 + 75 < x and cn3 + 150 > x:
cn3 = -1050
if cn3 < -3:
coincount += 1
print('coincount',coincount)
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
elif cn4 + 100 < x and cn2 + 200 > x:
cn4 = -1000
if cn4 < -3:
coincount += 1
print('coincount',coincount)
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
elif cn5 + 125 < x and cn5 + 230 > x:
cn5 = -1000
if cn5 < -3:
coincount += 1
print('coincount',coincount)
print('hello')
textObj = INVFONT.render(str(coincount+1), True, WHITE, BLACK)
elif block-525 < x and block-330 > x:
#how high guy is
standOnBrick = 167
elif block-16 < x and block+180 > x:
standOnBrick = 79
elif block + 230 < x and block + 426 > x:
standOnBrick = 179
elif block + 480 < x and block + 480+196>x:
standOnBrick = 189
elif block + 810 < x and block + 1026 > x:
standOnBrick = 169
elif block + 980 < x and block +1176 > x:
standOnBrick = 119
else:
standOnBrick = 255
pressedKeys = pygame.key.get_pressed()
if pressedKeys[pygame.K_LEFT] == 1:
x -= speed
print(x)
update()
elif pressedKeys[pygame.K_RIGHT] == 1:
block -= 0.5
cn1 -= 0.5
cn2 -= 0.5
cn3 -= 0.5
cn4 -= 0.5
cn5 -= 0.5
cloudmove -= 0.2
update()
if x < 450:
cloudmove += 0.25
x+=speed
cn1 += 0.5
cn2 += 0.5
cn3 += 0.5
cn4 += 0.5
cn5 += 0.5
update()
print(x)
block += 0.5
elif pressedKeys[pygame.K_UP] == 1:
y -= 5
print(y)
update()
#bounderies
if x < 2:
x += 2.1
pygame.display.flip()#Update method/load next frame
#pygame.quit()
最佳答案
您的代码缺少的是抽象。
而不是一堆screen.blit
还有很多if
语句,使用列表。
使用包含所需所有信息的数据结构(在您的情况下为对象),而不是硬编码值(如 cn1+25 < x and cn1 + 50 > x
)。
这是一个简单的示例。
假设我们有一个美好的世界,在阳光明媚的日子里,云朵在移动:
import pygame
screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()
cloud = pygame.Surface((50, 20))
cloud.set_colorkey((11, 12, 13))
cloud.fill((11, 12, 13))
pygame.draw.ellipse(cloud, pygame.Color('white'), cloud.get_rect())
cloudmove = 20
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit()
screen.fill(pygame.Color('lightblue'))
screen.blit(cloud, (cloudmove+120,30))
cloudmove += 1
pygame.display.flip()
clock.tick(30)
但是我们当然想要更多不仅仅是一朵云。我们不想要的是重复代码并增加复杂性。我们可以做这样的事情:
import pygame
screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()
cloud = pygame.Surface((50, 20))
cloud.set_colorkey((11, 12, 13))
cloud.fill((11, 12, 13))
pygame.draw.ellipse(cloud, pygame.Color('white'), cloud.get_rect())
cloud2 = pygame.Surface((50, 20))
cloud2.set_colorkey((11, 12, 13))
cloud2.fill((11, 12, 13))
pygame.draw.ellipse(cloud2, pygame.Color('white'), cloud2.get_rect())
cloud3 = pygame.Surface((50, 20))
cloud3.set_colorkey((11, 12, 13))
cloud3.fill((11, 12, 13))
pygame.draw.ellipse(cloud3, pygame.Color('white'), cloud3.get_rect())
cloudmove = 20
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit()
screen.fill(pygame.Color('lightblue'))
screen.blit(cloud, (cloudmove-120,30))
screen.blit(cloud2, (cloudmove-220,40))
screen.blit(cloud3, (cloudmove-170,50))
cloudmove += 1
pygame.display.flip()
clock.tick(30)
如果我们再添加十几个对象,您已经可以看到它将在哪里结束。
所以让我们尝试在这里使用代表云的对象:
import pygame
screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()
class Cloud:
def __init__(self, x, y):
self.image = pygame.Surface((50, 20))
self.image.set_colorkey((11, 12, 13))
self.image.fill((11, 12, 13))
pygame.draw.ellipse(self.image, pygame.Color('white'), self.image.get_rect())
self.x = x
self.y = y
def update(self):
self.x += 1
if self.x > 300:
self.x = 0
clouds = [Cloud(0, 30), Cloud(100, 40), Cloud(50, 50)]
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit()
screen.fill(pygame.Color('lightblue'))
for cloud in clouds:
screen.blit(cloud.image, (cloud.x, cloud.y))
cloud.update()
pygame.display.flip()
clock.tick(30)
(这里没有新图像,因为它看起来基本相同)
好多了!现在,要添加更多云,我们只需添加新的 Cloud
实例到clouds
列表。看看我们如何不仅在类中存储云的图像,而且还存储位置。我们已将云行为(沿着天空移动并在离开屏幕后从左侧开始)放入类中。
但我们仍然可以做得更好! Pygame 提供了一些我们可以使用的方便的类和函数。看一下下面的代码:
import pygame
screen = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()
class Coin(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((44, 40))
self.image.set_colorkey((11, 12, 13))
self.image.fill((11, 12, 13))
cx, cy = self.image.get_rect().center
pygame.draw.circle(self.image, pygame.Color('grey'), (cx + 2, cy), 20)
pygame.draw.circle(self.image, pygame.Color('orange'), (cx - 2, cy), 20)
self.rect = self.image.get_rect(topleft=(x, y))
def update(self):
mouse_pos = pygame.mouse.get_pos()
if self.rect.collidepoint(mouse_pos) and pygame.mouse.get_pressed()[0]:
self.kill()
class Cloud(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((50, 20))
self.image.set_colorkey((11, 12, 13))
self.image.fill((11, 12, 13))
pygame.draw.ellipse(self.image, pygame.Color('white'), self.image.get_rect())
self.rect = self.image.get_rect(topleft=(x, y))
def update(self):
self.rect.move_ip(1, 0)
if not pygame.display.get_surface().get_rect().colliderect(self.rect):
self.rect.right = 0
stuff = pygame.sprite.Group(Cloud(0, 30), Cloud(100, 40), Cloud(50, 50),
Coin(100, 100), Coin(150, 180), Coin(80, 200))
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
quit()
screen.fill(pygame.Color('lightblue'))
stuff.draw(screen)
stuff.update()
pygame.display.flip()
clock.tick(30)
我们通过使用 pygame 的 Group
来抽象绘制和更新我们的对象。和 Sprite
类。
看看向我们的小游戏添加新内容是多么容易。我添加了金币,你可以点击我收集,金币的所有行为都位于 Coin
类(class)。一旦您点击一枚硬币,kill
Sprite
的方法调用类,这只是从其所有组中删除该对象,因此它不再位于 stuff
中。组,并且不再在屏幕上绘制,并有效地从游戏中删除(并回答您的问题“仅运行一次 if 语句”)。
关于python - 在 pygame 中仅运行一次 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53988851/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!