Python-CCF:20180302 碰撞的小球

题目描述

在这里插入图片描述

用时

50min,稍长
但是当年用C语言整整写了一个下午还没搞出来
让我用面向过程的语言写这种题还不如弄死我

思路

一切皆对象

小球是一个类
有位置和速度的属性
有运动和碰撞的方法

每秒让所有的小球都调用一次运动的方法,更新位置
然后停住
判断此刻是否碰了墙或者其他小球
如果碰了则速度反向
到时间后输出每个小球对象的位置属性

就这么简单

满分代码

class Ball():
    # 当前坐标
    position = 0
    # 当前速度,右正左负
    speed = 1

    def __init__(self, position):
        # 初始化坐标
        self.position = position

    def move(self):
        # 每调用一次则坐标+1或-1
        self.position += self.speed

    def hit(self):
        # 碰撞后速度反向
        self.speed *= -1


# 传入一个小球对象、所有球对象的list、线段的长度
def hit_judger(the_ball, all_balls, line_length):
    # 如果碰到了线段首尾
    if the_ball.position == 0 or the_ball.position == line_length:
        the_ball.hit()
    else:
        for one_ball in all_balls:
            # 判断与其他球是否碰撞时不能把本球计算在内
            if one_ball is not the_ball:
                # 若碰撞到其他的球(最多只能碰一个)
                if the_ball.position == one_ball.position:
                    # 则改变自己的速度
                    the_ball.hit()
                    break
    return


if __name__ == '__main__':
    ball_nums, line_length, time_cost = map(int, input().split())
    orig_positions = list(map(int, input().split()))

    all_balls = []
    for op in orig_positions:
        # 初始化所有小球对象并添加至list中
        all_balls.append(Ball(op))

    for tc in range(time_cost):
        for one_ball in all_balls:
            # 所有的球运动1s
            one_ball.move()

        for the_ball in all_balls:
            # 依次判断是否碰撞
            hit_judger(the_ball, all_balls, line_length)

    for one_ball in all_balls:
        print(one_ball.position, end=' ')

总结

判断是否碰撞的 hit_judger方法开始出了个小bug,在这debug了十分钟
开始时是这样写的

if the_ball.position == one_ball.position:
# 则两球同时改变速度
	the_ball.hit()
	one_ball.hit()

然后发现比如第二个球碰了第三个球
那检测第二个球时把两个球的速度都改变了
检测第三个球时因为位置没变,所以认为又发生了一次碰撞
又把两个球的速度变回去了
这里踩坑了
把所有球每秒的速度和位置都输了出来才找到bug

然后就是天杀的CCF又在split上做手脚了
题目里明说的用空格分割,我用了split(' ')给我报运行错误了
坑爹呢
在这里插入图片描述

发布了61 篇原创文章 · 获赞 11 · 访问量 4841

猜你喜欢

转载自blog.csdn.net/weixin_43249758/article/details/104453209