如何制作一门大炮而不是多门?

时间:2014-12-02 20:00:02

标签: python graphics

我目前正在制作新的大炮游戏。如何在屏幕的左下角设置一个大炮?

from graphics import *
from math import sqrt
from math import trunc

def PinR(p,r):
    if p.getX()>=r.getP1().getX() and p.getX()<=r.getP2().getX()and p.getY()>=r.getP1().getY() and p.getY()<=r.getP2().getY():
       return True;
    else:
        return False;
def distance(p1,p2):
    dx=p1.getX()-p2.getX();
    dy=p1.getY()-p2.getY();
    dist=sqrt(dx*dx+dy*dy);
    return dist;

#parameter
FieldWidth=700;
FieldHeight=700;
GroundDepth=75;
BallSize=10;
OriginalSpeed=4;
FieldBackground="brown";
FieldBorder="brown";
tickLength=800000;
buttonSize=8;

#   number of cannons and balls
numBalls=4;
#   initial cannon power
explosionStrength=30;
#   intial gravitational constant
g=1;
#   clock tick delay
delay=0.05;


#Create field
Field=GraphWin("B",FieldWidth,FieldHeight);
Field.setBackground(FieldBackground);

#set of balls
spacing=FieldWidth/(numBalls);
ball=[];
for b in range (0,numBalls):
    newball=Circle(Point(spacing*b+spacing//2,FieldHeight-GroundDepth),BallSize);
    newball.setFill("black");
    newball.draw(Field);
    ball.append(newball);

#cannon
cannon=[]
for c in range (0,numBalls):
    newCannon=Rectangle(Point(spacing*c+spacing//2-BallSize,FieldHeight-GroundDepth-BallSize*5),
                        Point(spacing*c+spacing//2+BallSize,FieldHeight-GroundDepth+BallSize));
    newCannon.setFill("black");
    newCannon.draw(Field);
    cannon.append(newCannon);

#set of button groups (fire, powerup, powerdown)
fire=[];
for f in range (0,numBalls):
    newbutton=Rectangle(Point(spacing*f+spacing//2-buttonSize//2,FieldHeight-GroundDepth-BallSize),
                        Point(spacing*f+spacing//2+buttonSize//2,FieldHeight-GroundDepth-BallSize+buttonSize));
    newbutton.setFill("red");
    newbutton.draw(Field);
    fire.append(newbutton);

#wall

#target(red,white,red,white)
balldistance=20;
ball1=Circle(Point(FieldWidth//2-20,FieldHeight//2+20),BallSize);
ball1.setFill("red");
ball1.draw(Field);

1 个答案:

答案 0 :(得分:2)

你获得4门大炮的原因是你要这样做:

for c in range (0,numBalls):

...其中numBalls为4,每次循环都会创建一个新的大炮。

大概只有一门大炮你也只需要一个炮弹和一枪,所以只需设置numBalls = 1而不是numBalls = 4

但是,在您完成计划时简化程序可能更有意义。用一门大炮替换4门大炮的清单,摆脱循环,为4球做同样的事情等等。然后你也可以简化布局规则 - 不需要spacing变量来配置多远除了大炮之外,如果只有其中的一个。等等。这可能使您更容易理解程序的工作原理 - 并且弄清楚如何简化它可能同样有益于它自己。


如果你想改变它的位置,那就是在这一行中设置:

newCannon=Rectangle(Point(spacing*c+spacing//2-BallSize,FieldHeight-GroundDepth-BallSize*5),
                    Point(spacing*c+spacing//2+BallSize,FieldHeight-GroundDepth+BallSize));

因此,您可以调整各种常量(这些常量似乎都具有相当合理的名称)以获得您想要的结果 - 当然,只需硬编码您想要的位置而不是计算它。