2015-08-10 2 views
2

Я делаю футбольный матч с шестью игроками защиты. У меня этот код установлен случайным образом, чтобы все они двигались к защитнику.Python: Randrange

Все, что мне интересно, это лучший способ сделать это. Я знаю, что должен быть способ просто зациклировать это без так много операторов 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 

Это в основном все, что двигает мои компьютерные плееры, в то время как у меня есть защитник, установленный на клавиши со стрелками для движения игрока.

ответ

0

Вы можете использовать dictionary хранить позиции ваших игроков в обеих командах, пример -

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

Same для 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 ,

Несмотря на то, что вышеуказанный код выполняет то же самое, но в два этапа, вы можете захотеть сохранить некоторое число, так что перемещение не произойдет, если игрок находится в определенном диапазоне (малый диапазон) защитника.

1

Используйте список кортежей вместо переменной для каждой координаты. Это значительно сократит длину вашего кода.

EDIT 1
Чтобы сделать это еще короче, я ternary expressions.

EDIT 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) 
Смежные вопросы