【问题标题】:Is there a way to have my blit repeat itself after making it's first iteration?有没有办法让我的 blit 在第一次迭代后重复自己?
【发布时间】:2023-03-31 07:05:01
【问题描述】:

如果任何对 pygames 有基本了解的人可以帮助我解决我目前面临的问题,那就太好了。对于你们那里的绝对神来说,这应该不会太难。

我的代码目前存在问题。

我正在尝试制作一个简单的游戏,其中程序显示一个随机字母,用户必须在该字母到达页面底部之前输入该字母。

我有在随机列中显示随机字母的代码,但是,一旦字母到达底部,我只有程序打印“结束”然后退出程序。

我无法理解如何进一步开发代码。这是现在的代码:

import os                                                           # 
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (1335,330)           # sets the coordinates so that the window pops up in the lower right side of the screen (1600x900 screen)

import pygame                                                       # pygame is the platform im using
import random                                                       # random needs to be imported for the random letters and columns
pygame.init()                                                       # initializes pygame

win = pygame.display.set_mode((260, 527))                           # size of the window ,screenwidth = 260, screenheight = 527

pygame.display.set_caption("Daveypoo is King")                      # title of the window

clock = pygame.time.Clock()                                         # used for frame rate

bg = pygame.image.load('phone3cropped.jpg')                         # background picture upload

qp = pygame.image.load('q.png')                                     # uploads pictures of the letters (use paint, 50x50 pixels, black, 1 pixel outline, font = 36)
wp = pygame.image.load('w.png')                                     # ^
ep = pygame.image.load('e.png')                                     # ^
ap = pygame.image.load('a.png')                                     # ^
sp = pygame.image.load('s.png')                                     # ^
dp = pygame.image.load('d.png')                                     # ^
jp = pygame.image.load('j.png')                                     # ^
kp = pygame.image.load('k.png')                                     # ^
lp = pygame.image.load('l.png')                                     # ^

letterlist = [qp,wp,ep,ap,sp,dp,jp,kp,lp]                           # creates a list of letter images
randletter = random.choice(letterlist)                              # randomizes the list of images^

class player():                                                     # creates letter instance
    def __init__(self, x,y,width,height,end):                       # initializes the list
        self.x = x
        self.y = y
        self.width = width
        self.height = height 
        self.path = [self.y, 415]                                   # creates the path that the letters will travel
        self.vel = 1                                                # this is where the velocity of the letters is set                                
        self.hitbox = (self.x, self.y, 50, 50)                      # creates the hitbox for the letter pictures (no need to change for now -- 50x50 is good)

    def move(self, win):                                            # creates the movement for the letters
        if self.vel > 0:                                            
            if self.y + self.vel < self.path[1] :                   # if the bottom of the letter is less than the end, then:
                self.y += self.vel                                  # keep going
            else:                                                   # if not:
                self.vel = 0                                        # stop moving
        else:                                                       # if the bottom of the letter is at the end, then
            print('end')
            quit()
            #redrawGameWindow()
                                                                    # this is where the action to make a new letter has to go


class greenzone(object):                                            # creates the zone (greenzone) where the player should get the letter in
    def __init__(self,x,y,width,height):                            # initializes it
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.hitbox = (16, 342, 228, 66)                            # first two letters are top left (x,y) coordinate of the zone, next is width, next is height

    # def hit(self):
        # print('hit')

def redrawGameWindow():
    win.blit(bg, (0,0))                                             # diplays the background image, coordinates of top left 
    win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height))) # displays the letters going down the page (letters.x, letters.y, letters.width, letters.height)
    # win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height)))
    letters.move(win)                                              # calls upon the movement of the letters -- makes them move
    # for letter in letters:
        # letter.draw(win)

    #pygame.draw.rect(win, (255,0,0), (16, 342, 228, 66), 2)        # this shows the hitbox of the greenzone if needed
    pygame.display.update()                                         # idk what this does -- but it is needed

### mainloop
abc_list = [27,106,185]                                             # this is the list of the starting positions of the letters (top left)
rand = random.choice(abc_list)                                      # takes a random starting position of the letters 
letters = player(rand,56,50,50,415)                                 # instances the letters to start 
#letters = []                                                        # apparently creates a list of the the letters -- used to initialize and create new letters 
target = greenzone(18,343,228,67)                                   # sets the hitbox of the greenzone 

run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            exit()

    # for letter in letters:
        # if letter.x < 500 and letter.x > 0:
            # letter.x += letter.vel
        # else:
            # letters.pop(letters.index(letter))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_q] and randletter == qp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_w] and randletter == wp:            
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_e] and randletter == ep:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_a] and randletter == ap:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_s] and randletter == sp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_d] and randletter == dp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_j] and randletter == jp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_k] and randletter == kp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    if keys[pygame.K_l] and randletter == lp:
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if letters.y + letters.height > target.hitbox[1]:
                print('hit')
            else:
                print('fail')
        else:
            print('fail')

    redrawGameWindow()


pygame.quit()

我知道这是很多代码,我尝试在其中添加尽可能多的注释,以帮助阅读本文的任何人理解我的心态。

对此的任何和所有帮助都会很棒。我知道我做错了很多——我几天前才开始这样做。感谢您的任何意见,非常感谢!

【问题讨论】:

    标签: python python-3.x pygame iteration new-operator


    【解决方案1】:

    根据您提供的其他信息:

    我面临的主要/总体问题是,一旦这封信 触底,我希望它重新做一个新的“迭代” 新列中的随机字母,并继续重复。最终,我 希望程序只允许 5 个“生命”,如果他们搞砸了 超过 5 次,他们可以选择重新启动或退出 程序。

    除此之外,我未来对这段代码的期望是允许用户选择出现在 屏幕。但我个人相信我可以编写代码 一旦我重复了整个代码(就像我刚刚描述的那样 以上)

    我不得不将碰撞检测算法移出按键部分。我还清理了代码以将每个部分分成自己的函数。我对类还不太熟悉,所以我不知道如何处理 target = greenzone(..) - 这也可能是我使用 global 的原因

    update()、init()、main() 很简单。 dropLetter() 是您正在寻找的功能。在 updateInput() 中,randLetterIndex 用于更有效地检查按下的键是否是您需要的,我仍然感到震惊 Python 没有 switch() 语句,所以这就是我想出的解决方法. checkCollision() - 我尽量保持原样,因为我不确定你未来对这款游戏的计划。我确实在 else 语句中添加了很多内容,包括将 quit() 语句移到此处

    import os                                                           # 
    os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (1335,330)           # sets the coordinates so that the window pops up in the lower right side of the screen (1600x900 screen)
    
    import pygame                                                       # pygame is the platform im using
    import random                                                       # random needs to be imported for the random letters and columns
    pygame.init()                                                       # initializes pygame
    
    win = pygame.display.set_mode((260, 527))                           # size of the window ,screenwidth = 260, screenheight = 527
    
    pygame.display.set_caption("Daveypoo is King")                      # title of the window
    
    clock = pygame.time.Clock()                                         # used for frame rate
    
    bg = pygame.image.load('phone3cropped.jpg')                         # background picture upload
    
    qp = pygame.image.load('q.png')                                     # uploads pictures of the letters (use paint, 50x50 pixels, black, 1 pixel outline, font = 36)
    wp = pygame.image.load('w.png')                                     # ^
    ep = pygame.image.load('e.png')                                     # ^
    ap = pygame.image.load('a.png')                                     # ^
    sp = pygame.image.load('s.png')                                     # ^
    dp = pygame.image.load('d.png')                                     # ^
    jp = pygame.image.load('j.png')                                     # ^
    kp = pygame.image.load('k.png')                                     # ^
    lp = pygame.image.load('l.png')                                     # ^
    
    letterlist = [qp,wp,ep,ap,sp,dp,jp,kp,lp]                           # creates a list of letter images
    pygameKeyList = [pygame.K_q, pygame.K_w, pygame.K_e, pygame.K_a, pygame.K_s, pygame.K_d, pygame.K_j, pygame.K_k, pygame.K_l]
    random.seed()                                                  # seed the RNG
    abc_list = [27,106,185]                                             # this is the list of the starting positions of the letters (top left)
    lives = 5                                                      # 5 lives to start
    userPressingKey = False                                        # if user is currenlty pressing the key of the currently chosen letter
    run = False
    
    class player():                                                     # creates letter instance
        def __init__(self, x,y,width,height,end):                       # initializes the list
            self.x = x
            self.y = y
            self.width = width
            self.height = height 
            self.path = [self.y, 415]                                   # creates the path that the letters will travel
            self.vel = 1                                                # this is where the velocity of the letters is set                                
            self.hitbox = (self.x, self.y, 50, 50)                      # creates the hitbox for the letter pictures (no need to change for now -- 50x50 is good)
    
        def move(self, win):                                            # creates the movement for the letters
            if self.vel > 0:                                            
                if self.y + self.vel < self.path[1] :                   # if the bottom of the letter is less than the end, then:
                    self.y += self.vel                                  # keep going
                else:                                                   # if not:
                    self.vel = 0                                        # stop moving
    #        else:                                                       # if the bottom of the letter is at the end, then
    #            print('end')
    #            quit()
                #redrawGameWindow()
                                                                        # this is where the action to make a new letter has to go
    
    
    class greenzone(object):                                            # creates the zone (greenzone) where the player should get the letter in
        def __init__(self,x,y,width,height):                            # initializes it
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.hitbox = (16, 342, 228, 66)                            # first two letters are top left (x,y) coordinate of the zone, next is width, next is height
    
        # def hit(self):
            # print('hit')
    
    def redrawGameWindow():
        win.blit(bg, (0,0))                                             # diplays the background image, coordinates of top left 
        win.blit(letterlist[randLetterIndex], pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height))) # displays the letters going down the page (letters.x, letters.y, letters.width, letters.height)
        # win.blit(randletter, pygame.draw.rect(win, (255, 255, 255), (letters.x, letters.y, letters.width, letters.height)))
        letters.move(win)                                              # calls upon the movement of the letters -- makes them move
        # for letter in letters:
            # letter.draw(win)
    
        #pygame.draw.rect(win, (255,0,0), (16, 342, 228, 66), 2)        # this shows the hitbox of the greenzone if needed
        pygame.display.update()                                         # idk what this does -- but it is needed
    
    def dropLetter():
        #global randletter
        global letters, rand, randLetterIndex
        randLetterIndex = random.randrange(0,len(letterlist))
    #    randletter = letterlist[randLetterIndex]                              # randomizes the list of images^
        rand = random.choice(abc_list)                                      # takes a random starting position of the letters 
        letters = player(rand,56,50,50,415)                                 # instances the letters to start 
        #letters = []                                                        # apparently creates a list of the the letters -- used to initialize and create new letters 
    
    def checkCollision():
        global run, lives
        if letters.y < target.hitbox[1] + target.hitbox[3]:    
            if userPressingKey:
                if letters.y + letters.height > target.hitbox[1]:            
                    print('hit')
                else:
                    print('fail')
        else:
            print('fail hard')
            lives -= 1
            print("lives:",lives)
            if(lives <= 0):
                print('end')
                run = False
                quit()
            dropLetter()
    
    def updateInput():
        global userPressingKey
    
        keys = pygame.key.get_pressed()
    
        if(keys[pygameKeyList[randLetterIndex]]):
            userPressingKey = True
        else:
            userPressingKey = False
    
    
        # if keys[pygame.K_q] and randletter == qp:
        #     checkCollision()
    
        # if keys[pygame.K_w] and randletter == wp:            
        #     checkCollision()
    
        # if keys[pygame.K_e] and randletter == ep:
        #     checkCollision()
    
        # if keys[pygame.K_a] and randletter == ap:
        #     checkCollision()
    
        # if keys[pygame.K_s] and randletter == sp:
        #     checkCollision()
    
        # if keys[pygame.K_d] and randletter == dp:
        #     checkCollision()
    
        # if keys[pygame.K_j] and randletter == jp:
        #     checkCollision()
    
        # if keys[pygame.K_k] and randletter == kp:
        #     checkCollision()
    
        # if keys[pygame.K_l] and randletter == lp:
        #     checkCollision()
    
        # for letter in letters:
            # if letter.x < 500 and letter.x > 0:
                # letter.x += letter.vel
            # else:
                # letters.pop(letters.index(letter))
    
    
    def update():
        updateInput()
        checkCollision()
    
    def init():
        dropLetter()
    
    def main():
        global run
        init()
    
        ### mainloop
        run = True
        while run:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    exit()
            update()
            redrawGameWindow()
            clock.tick(144)
    
    
    target = greenzone(18,343,228,67)                                   # sets the hitbox of the greenzone 
    main()
    pygame.quit()
    

    【讨论】:

    • 我的男人,我只想说非常感谢您抽出时间来帮助我。到目前为止,我玩得很开心,我将继续这样做。我花了很长时间才站起来,你只是帮了我大忙。你这样做对我来说意义重大。你真是一头野兽。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2021-11-15
    • 2016-03-07
    相关资源
    最近更新 更多