世間に遅れないよう「半沢」をみているが、プログラムを打ちながら、横目でチラチラながら見していると全員(半沢も含めて)が悪人にしかみえない・・・。
正義にしろ悪にしろ、何かにかこつけて、お互いや誰かを罵倒したり土下座させたりしたいと思うほど、皆がストレスを抱え込んでいるということだろうか。
さて。プログラミング熱を絶やさぬよう、またまた出来そうなシリーズで、3D風壁打ちテニス(?)ゲームににチャレンジ。
ボールの動きなど、本当はこうなのでは?とイロイロ考えてしまうけど、いまさら物理を勉強する時間(むしろやる気)もないやら、それをプログラムに生かす技量もないわで、それっぽいところでひとまず着地。
いつまでもやっていると、図書館で借りた本を読む時間がどんどん無くなっちゃうからね。
【遊び方】
飛んでくるボールをラケットで打ち返してください。
マウスの位置にラケットが移動、ただし、一番手前の壁の線がラケットの位置なので、その枠内でないと反応しません。
ミスして、しばらく待つとゲーム再開。
ミスするまでの時間が表示されます。
【リスト】
# 壁PON!2020 for Python by kameyoko
import tkinter
import random
import winsound
import math
import time
rx = 255 # 変数の設定
ry = 191
rz = 192
rw = 48
rh = int(rw/2)
bw = 24
tmr = 0
def ms_move(e): # マウス処理
global rx, ry, rw, rh
x = e.x
y = e.y
if x >63+rw and x < 447-rw: rx = x
if y >47+rh and y < 335-rh: ry = y
def init_ball(): # ゲームの初期化
global bx, by, bz, bvx, bvy, bvz, st
bx = random.randint( 63, 447)
by = random.randint( 63, 191)
bz = 36
bvy = (-1 + random.randint(0, 1)*2)*random.randint(8,12)
bvx = bvy*2
bvz = int(bvy/2)
st = time.time()
def dsp_wall(): # 壁の表示
x1, y1 = calc( 0, 0, 32)
x2, y2 = calc(511,383, 32)
cvs.delete("GR1")
G = "gray"
cvs.create_rectangle( x1, y1, x2, y2, fill=G, outline=G, width=2, tag="GR1")
cvs.create_line( 0, 0, x1, y1, fill=G, width=2, tag="GR1")
cvs.create_line( 511, 0, x2, y1, fill=G, width=2, tag="GR1")
cvs.create_line( 0, 383, x1, y2, fill=G, width=2, tag="GR1")
cvs.create_line( 511, 383, x2, y2, fill=G, width=2, tag="GR1")
for z in range(64, 193, 64):
x1, y1 = calc( 0, 0, z)
x2, y2 = calc(511,383, z)
w = 1 + int(z/64)
cvs.create_rectangle( x1, y1, x2, y2, outline=G, width=w, tag="GR1")
cvs.update()
def display(): # ボールとラケットの表示
global bx, by, bz, bw, rx, ry, rz, rw, rh, st
cvs.delete("GR2","TX1")
x, y = calc(bx,383, bz)
z1 = int(bw*bz/256)
z2 = int(z1/2)
z3 = bz-rz
cvs.create_oval(x-z1, y-z2, x+z1, y+z2, fill="gray", outline="gray", tag="GR2")
cvs.create_oval(rx-rw, 330, rx+rw, 340, fill="gray", outline="gray", tag="GR2")
x, y = calc(bx, by, bz)
w = 1 + int(bz/128)
if z3 < 0:
cvs.create_oval(x-z1, y-z1, x+z1, y+z1, fill="yellow", outline="black", width=w, tag="GR2")
dsp_racket()
else:
dsp_racket()
cvs.create_oval(x-z1, y-z1, x+z1, y+z1, fill="yellow", outline="black", width=w, tag="GR2")
nw = time.time()
tm = int(nw - st)
mn = int(tm / 60)
sc = tm % 60
cvs.create_text(128, 20, text="TIME {:02}:{:02}".format(mn,sc), fill="black", font=("Times New Roman", 16), tag="TX1")
cvs.update()
def dsp_racket(): # ラケットの表示サブ
global rx, ry, rw, rh
for i in range(40, 141, 20):
a = math.radians(i)
c = math.cos(a)
s = math.sin(a)
cvs.create_line( rx+c*rw, ry-s*rh, rx+c*rw, ry+s*rh, fill="silver", tag="GR2")
cvs.create_line( rx-s*rw, ry+c*rh, rx+s*rw, ry+c*rh, fill="silver", tag="GR2")
cvs.create_oval(rx-rw, ry-rh, rx+rw, ry+rh, outline="red", width= 5, tag="GR2")
def calc(x, y, z): # 表示位置の計算
x = int(255+(x-255)*z/256)
y = int(191+(y-191)*z/256)
return x,y
def game_main(): # メイン処理
global bx, by, bz, bvx, bvy, bvz, rx, ry, rz, bw, rw, rh, tmr
if tmr == 0:
display()
x, y = calc( bx, by, rz)
z = int(bw*bz/256)
if abs(x-rx)<rw+z and abs(y-ry)<rh+z and (bz-rz)>-z and (bz-rz)<1 and bvz>0:
bvz = -bvz
bz = rz - z
winsound.Beep(440, 100)
if bx < bw or (511-bw)< bx:
bvx = -bvx
bx = (511-bw)-(511-bw*2)*(bx<bw)
winsound.Beep(880, 25)
if by < bw or (383-bw)< by:
bvy = -bvy
by = (383-bw)-(383-bw*2)*(by<bw)
winsound.Beep(880, 25)
if bz < 32+z:
bvz = -bvz
bz = 32+z
winsound.Beep(880, 25)
if 256 < bz:
winsound.Beep(220,500)
tmr = 50
bx += bvx
by += bvy
bz += bvz
bvy += 1
else:
tmr = tmr -1
if tmr == 0: init_ball()
root.after(50, game_main)
# 初期設定
root = tkinter.Tk()
root.title("壁PON!")
root.resizable(False, False)
root.bind("Motion", ms_move)
cvs = tkinter.Canvas(root, width=512, height=384, bg="white")
cvs.pack()
dsp_wall()
init_ball()
game_main()
※コメント投稿者のブログIDはブログ作成者のみに通知されます