bouncing balls(跳ねるたまたま)を増殖(たまたま^8)させてみた



# 基本方針

テキスト 「いちばんやさしいPython入門教室」大澤文孝著,(ソーテック社出版,2017)で，せっかく[速くした](https://qiita.com/daddygongon/items/53c1206ca4f68a77f1bf)んで，「もっと増やせね？」というのが動機です．どうせなら「カラーグリグリ」は後付け．

---

![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/a392251e-af52-f843-4276-5980d5782ee6.gif "bouncing\_ball.gif")

---


# 動画の作り方

-   動画は，Narupenが気づかせてくれた
-   [ScreenToGif](https://www.screentogif.com)を利用
    -   参照: [寝ログ記事](https://nelog.jp/screen-to-gif)

-   quicktime -> giftedを利用
    -   cmd-ctrl-esc で録画停止
    
    -   参照:[【Mac】自分の画面を録画して、即gif動画化する方法](https://qiita.com/YosukeItabashi/items/5722395218e6e592fd39)
    
    -   \*\* なんかqiitaに上がらね．
        
        :CUSTOM\_ID: なんかqiitaに上がらね

![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/459dde88-a9e4-6532-adb9-9e26b2b3bb5f.gif "bouncing\_ball\_128\_\_large.gif")

---

![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151211/f07cfa9d-8033-f546-f52a-77b8b03dc12b.gif)

---


# 位置，速度，カラーの初期値をランダムに

    random.randint(0,9) を改良すればいいよね．

```python
  random.randint(0, 800), random.randint(0, 600) #x,y位置
  random.randint(0, 10)-5 # dx
```

```python
  color1 = "#e8f" # rgb color
```

これをどうやろう？

---


## colorのrandom化

```python
color1 = "#"+ hex(random.randint(1, 15)).lstrip("0x") + hex(random.randint(1, 15)).lstrip("0x") + hex(random.randint(1, 15)).lstrip("0x")
```

みたいにね．やってることは，

1.  "#"というstringを用意して
2.  1..15(1..f)の整数を出して，
3.  hexで"0xe"とかの16進数(hexadecimal)に変換して
4.  lstripで左(l)の"0x"をstrip(剥がす)[^1]

[^1]: [hex+lstripの参照サイト](https://www.geeksforgeeks.org/python-hex-function/)

---


# たくさんのボール

あとはたくさんのボールをballsにappend(追加)．

```python
  balls = []
  for j in range(100):
      balls.append(Ball(x, y, dx, dy, color)
```

---


# うまく生成しない

実は，3回に2回は失敗しています．

```python
    File "C:\Users\shige\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 2567, in __init__
      self.tk.call(
  _tkinter.TclError: invalid color name "#12"
```

カラー文字生成で失敗(修正済み，たぶん)．

---


# ソースコード

全てを晒しておきます．

```python
  # Copyright (c) 2020 daddygongon
  # Released under the MIT license
  # https://opensource.org/licenses/mit-license.php
  import tkinter as tk
  import random
  speed = 1
  size = 10
  class Ball:
      global speed
      def __init__(self, x, y, dx, dy, color):
          self.x, self.y = x, y
          self.dx, self.dy = dx*speed, dy*speed
          self.color = color
          self.shape = None

      def move(self, canvas):
          self.erase(canvas)
          self.x += self.dx
          self.y += self.dy
          self.draw(canvas)
          if (self.x >= canvas.winfo_width() or self.x <= 0):
              self.dx = -self.dx
          if (self.y >= canvas.winfo_height() or self.y <= 0):
              self.dy = -self.dy
      def erase(self, canvas):
          canvas.delete(self.shape)
      def draw(self, canvas):
          self.shape = canvas.create_oval(self.x - size, self.y - size,
                                          self.x + size, self.y + size,
                                          fill=self.color, width=0)

  def loop():
      for b in balls:
          b.move(canvas)
      root.after(10, loop)

  def color_maker(init, fin):
      color1 = "#"+hex(random.randint(init, fin)
      ).lstrip("0x")+hex(random.randint(init, fin)
      ).lstrip("0x") + hex(random.randint(init, fin)
      ).lstrip("0x")
      return color1

  root = tk.Tk()
  root.geometry("800x600")

  canvas = tk.Canvas(root, width=800, height=600, bg=color_maker(1, 2))
  canvas.place(x=0, y=0)

  balls = []
  for j in range(2**8):
  #    balls.append(Ball(random.randint(390, 410), random.randint(290, 310),
      balls.append(Ball(random.randint(0, 800), random.randint(0, 600),
                        random.randint(0, 10)*2-10, random.randint(0,10)*2-10, 
                        color_maker(8, 15)))

  root.after(10, loop)
  root.mainloop()
```

idleでは最後のmainloopもいらないそうです．



------
 - **source** ~/Desktop/lecture_23s/compA23/d7_11_python/c7_bouncing_256_balls.org