【问题标题】:Python: Randrange蟒蛇:兰德兰奇
【发布时间】:2015-08-10 02:27:32
【问题描述】:

我正在制作一个有 6 名防守球员的足球游戏。我设置了这个代码来随机让他们都向四分卫移动。

我想知道是否有更好的方法来做到这一点。我知道必须有一种方法可以在没有太多 if 语句的情况下循环它,但我对 python 很陌生。

我只包含与玩家移动相关的部分,只是为了使代码更易于阅读。

import pygame
import random

x = 215 
y = 223
step = 50
frame_count = 0
side = True
hike = True

p1d1x = 265
p1d1y = 174
p1d2x = 265
p1d2y = 224
p1d3x = 265
p1d3y = 274
p1d4x = 465
p1d4y = 174
p1d5x = 365
p1d5y = 224
p1d6x = 565
p1d6y = 274

p2d1x = 415
p2d1y = 174
p2d2x = 415
p2d2y = 224
p2d3x = 415
p2d3y = 274
p2d4x = 215
p2d4y = 174
p2d5x = 315
p2d5y = 224
p2d6x = 115
p2d6y = 274

(I draw all my players using the x and y variables above)

(I use my frame_count which is built into my counter or game timer to move players at an appropriate speed. The rest is all in my main loop)

frame_count += 1

defense = random.randrange(0,6,1)
    if side == True and frame_count == 45:
        if defense == 0:
            if p1d1x > x:
                p1d1x -= step
            if p1d1y > y:
                p1d1y -= step
            if p1d1x < x:
                p1d1x += step
            if p1d1y < y:
                p1d1y += step            
        elif defense == 1:
            if p1d2x > x:
                p1d2x -= step
            if p1d2y > y:
                p1d2y -= step
            if p1d2x < x:
                p1d2x += step
            if p1d2y < y:
                p1d2y += step
        elif defense == 2:
            if p1d3x > x:
                p1d3x -= step
            if p1d3y > y:
                p1d3y -= step
            if p1d3x < x:
                p1d3x += step
            if p1d3y < y:
                p1d3y += step
        elif defense == 3:
            if p1d4x > x:
                p1d4x -= step
            if p1d4y > y:
                p1d4y -= step
            if p1d4x < x:
                p1d4x += step
            if p1d4y < y:
                p1d4y += step    
        elif defense == 4:
            if p1d5x > x:
                p1d5x -= step
            if p1d5y > y:
                p1d5y -= step
            if p1d5x < x:
                p1d5x += step
            if p1d5y < y:
                p1d5y += step 
        elif defense == 5:
            if p1d6x > x:
                p1d6x -= step
            if p1d6y > y:
                p1d6y -= step
            if p1d6x < x:
                p1d6x += step
            if p1d6y < y:
                p1d6y += step  
    elif side == False and frame_count == 45:
        if defense == 0:
            if p2d1x > x:
                p2d1x -= step
            if p2d1y > y:
                p2d1y -= step
            if p2d1x < x:
                p2d1x += step
            if p2d1y < y:
                p2d1y += step 
        elif defense == 1:
            if p2d2x > x:
                p2d2x -= step
            if p2d2y > y:
                p2d2y -= step
            if p2d2x < x:
                p2d2x += step
            if p2d2y < y:
                p2d2y += step    
        elif defense == 2:
            if p2d3x > x:
                p2d3x -= step
            if p2d3y > y:
                p2d3y -= step
            if p2d3x < x:
                p2d3x += step
            if p2d3y < y:
                p2d3y += step  
        elif defense == 3:
            if p2d4x > x:
                p2d4x -= step
            if p2d4y > y:
                p2d4y -= step
            if p2d4x < x:
                p2d4x += step
            if p2d4y < y:
                p2d4y += step   
        elif defense == 4:
            if p2d5x > x:
                p2d5x -= step
            if p2d5y > y:
                p2d5y -= step
            if p2d5x < x:
                p2d5x += step
            if p2d5y < y:
                p2d5y += step    
        elif defense == 5:
            if p2d6x > x:
                p2d6x -= step
            if p2d6y > y:
                p2d6y -= step
            if p2d6x < x:
                p2d6x += step
            if p2d6y < y:
                p2d6y += step

当我将四分卫设置为箭头键以进行球员移动时,这基本上就是移动我的电脑球员的一切。

【问题讨论】:

    标签: python loops if-statement pygame


    【解决方案1】:

    对每个坐标使用元组列表而不是变量。这将大大缩短您的代码长度。

    编辑 1
    为了让它更短,我使用了ternary expressions

    编辑 2
    只是通过使用一个函数把它收紧了一点。我不认为它可以变得更短,但我会看看我能做什么;)

    import pygame
    from random import randrange
    
    x = 215 
    y = 223
    step = 50
    frame_count = 0
    side = True
    hike = True
    
    p1 = [(265, 274), (265, 224), (265, 274), (465, 174), (365, 224), (565, 274)]
    p2 = [(415, 174), (415, 224), (415, 274), (215, 174), (315, 224), (115, 274)]
    
    frame_count += 1
    
    def move(p):
        defense = randrange(len(p))
        if frame_count == 45:
            if p[defense][0] != x:
                p[defense][0] += step if p[defense][0] < x else -step
            if p[defense][1] != y:
                p[defense][1] += step if p[defense][1] < y else -step
    
    move(p1 if side else p2)
    

    【讨论】:

      【解决方案2】:

      您可以使用dictionary 来存储您的球员在两支球队中的位置,例如 -

      team1 = {'p1d1':(265,174),'p1d2':(265,224),...}
      

      team2 也一样 -

      team2 = {'p2d1':(415,174),'p2d2':(415,224),...}
      

      然后您可以遍历字典键和项以创建变量,示例 -

      for player, position in team1:
          #Do your logic to draw them
      for player, position in team2:
          #Do your logic to draw them
      

      然后您可以使用random.choice() 从您的字典中选择一个随机键,这将是要移动的玩家,然后移动它,示例 -

      if side == True and frame_count == 45:
          key_to_move = random.choice(list(team1.keys()))
          (x1, y1) = team1[key_to_move]
          if x1 > x:
              x1 -= step
          elif x1 < x:
              x1 += step
          if y1 > y:
              y1 -= step
          elif y1 < y:
              y1 += step
          team1[key_to_move] = (x1,y1)
          .
          .
          .
      #Same for team2
      

      我稍微改变了逻辑以使用 if..elif ,因为有时如果球员离四分卫太近,你最终可以在同一步骤中移动 +=-=,因为你会移动球员(p1d1x 在开始时大于 x)使得 p1d1x 变得小于 x ,然后再次将他移到 x 上方。

      虽然上面的代码也做了同样的事情,但是在两个步骤中,您可能需要考虑保留一些数字,这样如果球员在四分卫的某个范围(小范围)内就不会发生移动。

      【讨论】:

        猜你喜欢
        • 2011-06-13
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        相关资源
        最近更新 更多