かめよこある記

~カメもタワシも~
To you who want to borrow the legs of a turtle

はね返されたら打ち返す。今度は1000倍返しだ!

2020-09-22 21:31:57 | もしもゲームがつくれたなら

 世間に遅れないよう「半沢」をみているが、プログラムを打ちながら、横目でチラチラながら見していると全員(半沢も含めて)が悪人にしかみえない・・・。
 正義にしろ悪にしろ、何かにかこつけて、お互いや誰かを罵倒したり土下座させたりしたいと思うほど、皆がストレスを抱え込んでいるということだろうか。
 さて。プログラミング熱を絶やさぬよう、またまた出来そうなシリーズで、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()


ゲーム制作ランキング


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« NHKラジオ第2を聞いて学... | トップ | ゲルマント夫人に恋して »
最新の画像もっと見る

コメントを投稿

もしもゲームがつくれたなら」カテゴリの最新記事