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

2024-10-08 19:30:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在制作一个新的加农炮游戏。我怎样才能做到屏幕左下角只有一门大炮?你知道吗

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);

Tags: andfieldpointcannonspacingsetfillballsizegetx
1条回答
网友
1楼 · 发布于 2024-10-08 19:30:11

你得到4门大炮的原因是:

for c in range (0,numBalls):

…其中numBalls是4,每次通过循环都创建一个新的加农炮。你知道吗

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

然而,简化程序可能更有意义。将4门大炮的列表替换为一门大炮,去掉循环,对4个球执行相同的操作,等等。然后还可以简化布局规则,如果只有1门大炮,则无需使用spacing变量来配置它们之间的距离。等等。这可能使您更容易理解程序的工作原理,并且弄清楚如何简化它本身也可能是有益的。你知道吗


如果你想改变它的位置,在这一行:

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

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

相关问题 更多 >

    热门问题