@ema0248

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonで壁に当たると跳ね返る4つのボールのプログラムを作成しているのですがわからない点がいくつかあります。

pythonで壁に当たると跳ね返る4つのボールのプログラムを作成しているのですがわからない点がいくつかあります。
1つ目にBallクラスにて,ボールの変数(ボールID, x座標,y座標,直径,x座標移動距離,y座標移動距離,色)をプロパティとして参照できるようにgetterとsetterを記載したいです。
2つ目はは Ballクラスのmoveメソッドにボールの移動の処理を記載したいです。
3つ目はBallオブジェクトが壁に当たった際に跳ね返るようにboundメソッドに条件文と処理を記載したいです。
現在4つの円を出力するところまではできてます。

該当するソースコード

import time #sleep時間を設定するために使用
from tkinter import * #図形描画用のライブラリ

DURATION = 0.03 #何秒間隔でボールを移動させるかの設定

#ボールのクラス
class Ball:
    def __init__(self, ball_id, x, y, diameter, vx, vy, color):
        self.ball_id = ball_id #ボールのID 
        self.x = x #ボールのx座標
        self.y = y #ボールのy座標
        self.diameter = diameter #ボールの直径
        self.vx = vx #0.03秒間にボールが移動するx座標の距離
        self.vy = vy #0.03秒間にボールが移動するy座標の距離
        self.color = color #ボールの色

    #ボールの移動メソッド.
    # x座標はvxずつ,y座標はvyずつ移動する.
    def move(self):
        # 2. ボールの移動の処理について記載せよ. 2点
        pass #この行は削除すること

    #壁にあたった際に跳ね返るメソッド.
    #ボールがもしくは左の壁に達したら,vxが逆方向になるようにする.
    #ボールが上もしくは下の壁に達したら,vyが逆方向になるようにする.
    def bound(self, border):
        # 3. ボールが跳ね返るように処理を記載せよ. 4点
        pass #この行は削除すること

    def redraw(self):
        canvas.coords(self.ball_id, self.x - self.diameter, self.y - self.diameter, self.x + self.diameter, self.y + self.diameter)

   # 1. ボールの変数をプロパティとして参照できるようにせよ. 9点
   # ボールID,x座標,y座標,直径,x座標移動距離,y座標移動距離,色のすべての変数に対して,getterとsetterを定義すること.


#壁を設定する.ボールがあたると跳ね返る.
class Border:
    #left: 左の壁のx座標.right: 右の壁のx座標. top: 上の壁のy座標. bottom: 下の壁のy座標
    def __init__(self, left, right, top, bottom):
        self.left = left
        self.right = right
        self.top = top
        self.bottom = bottom

    #壁の描画
    def draw(self):
        canvas.create_rectangle(self.left, self.top, self.right, self.bottom)

#ボール作成の関数
def make_ball(x, y, diameter, vx, vy, color):
    ball_id = canvas.create_arc(x, y, x + diameter, y + diameter, fill=color, outline=color, start=0, extent=359)
    ball = Ball(ball_id, x, y, diameter, vx, vy, color) #ボールのインスタンスを作成
    return ball

#ボールを表示するための画面を作成.Tkinterを使用.
tk = Tk()
canvas = Canvas(tk, width=800, height=500, bd=0)
canvas.pack()

#壁のインスタンスを作成
border = Border(100, 700, 100, 400)
border.draw()

#ボールの初期値を設定し4つのボールを作成.
balls = [
    make_ball(150, 150, 20, 2, 3, "darkblue"),
    make_ball(200, 250, 25, -4, -3, "orange"),
    make_ball(300, 350, 10, -2, 6, "green"),
    make_ball(400, 350, 5, 10, -6, "red"),
]


#停止させるまで,実行し続ける.
while True:
    for ball in balls:
        ball.move() # ボールを移動させる処理
        ball.bound(border) # ボールが壁にあたった際に跳ね返る処理
        ball.redraw() # ボールの再描画
        tk.update() # 画面のアップデート

    time.sleep(DURATION) #0.03秒間スリープ

0 likes

1Answer

Comments

  1. @ema0248

    Questioner

    ありがとうございます。とても参考になりました!

Your answer might help someone💌