用python撰寫乒乓球小游戲–Turtle功能的應用
python有很多功能強大的代碼庫,Turtle是一款用于游戲開發的代碼庫,通過撰寫乒乓球小游戲可以了解這個庫的基本的代碼的使用
先創建游戲的背景,頁面的話感覺跟matlab的互動頁面的編輯還有easygui差不多,import os 與游戲本身無關,是為了后面可能添加音效而參考的
#創建游戲背景
import os
import turtle as t
game = t.Screen()
game.title("雙人乒乓球對戰")
game.bgcolor("black")
#os.system("pause") 或 input() 可以使程式暫停,不過此處使用可能導致程式直接終止,所以使用game.mianloop()
game.mainloop()
game.setup(800,600)
先創建一個球拍
這里必須提一下Turtle創建可視的物件的實質是創建一支畫筆,有筆本身和筆所畫出的軌跡,
#創建球拍
pai = t.Turtle() #物件其實是畫筆
pai.ht() #隱藏球拍
pai.up() #隱藏軌跡
pai.speed(0) #運動速度為瞬移
pai.color("blue")
pai.shape('square')
pai.shapesize(5,1) #對上面的正方形進行拉伸
#根據800*400建立直角坐標系,進行移動
pai.goto(-350,0) #現在會有一條運動軌跡,所以第二條將其隱藏
pai.st() #到位后再顯示出來
第二個球拍同理,只需要換個顏色和坐標,坐標(0,0)為顯示框的正中央,再背景創建時,我規定坐標范圍是(800,600),相當于800*600的矩形框,大家也可以自己調整,但是后面的代碼都會發生變化
pai2 = t.Turtle()
pai2.ht()
pai2.up()
pai2.speed(0)
pai2.color("white")
pai2.shape('square')
pai2.shapesize(4,1)
pai2.goto(350,0)
pai2.st()
然后添加乒乓球(在這里我想到了植物大戰僵尸的魔改版,其實也可以不抬起畫筆(doge))
#添加乒乓球
ball = t.Turtle()
ball.up() #不需要隱藏但是不能畫一條線
ball.speed(0)
ball.color("yellow")
ball.shape('circle') #d=20
ball.goto(0,0)
ball.st()
ball.vx = 2 #直接定義X軸和Y軸的速度
ball.vy = 2
player1score = 0
player2score = 0
現在考慮列印分數,最后一行的代碼有許多函式的內置引數,感興趣的朋友可以參考我另一則博客Turtle內置部分函式的用法
pen = t.Turtle() #創建一個畫筆來列印分數
pen.ht() #隱藏最初的箭頭,不影響書寫(后面列印的字)
pen.up() #只要選定位置與初始化位置(0,0)不相符就會有軌跡
pen.color('white')
pen.goto(-10,260)
X = 'play1: {} play2: {}'.format(player1score,player2score)
pen.write(X,align='center',font=('Arial',20,'bold'))
最后讓球拍和乒乓球動起來吧
這里的鍵位設定不知道是不是我電腦的原因(惠普的按鍵總是奇奇怪怪),只能開英文大寫才行
#移動球拍
#自定義方向鍵
#先定義方法
def pai_up():
y = pai.ycor()
y = y + 12
pai.sety(y)
def pai_down():
y = pai.ycor()
y = y - 12
pai.sety(y)
def pai2_up():
y = pai2.ycor()
y = y + 12
pai2.sety(y)
def pai2_down():
y = pai2.ycor()
y = y - 12
pai2.sety(y)
game.listen() #聽從玩家指令
game.onkey(pai_up,'W') #開始自定義鍵位,為了避免輸入法的問題直接開大寫
game.onkey(pai_down,'S')
game.onkey(pai2_up,'I')
game.onkey(pai2_down,'K')
#用回圈使乒乓球動起來
while True:
ball.setx(ball.xcor()+ball.vx)
ball.sety(ball.ycor()+ball.vy)
if (ball.ycor() > 290) or (ball.ycor() < -290): #防止出界(只針對上下)--反彈--動量守恒
ball.vy *= -1
if (ball.xcor() > 390) or (ball.xcor() < -390):
ball.vx *= -1
if (ball.ycor() < pai2.ycor() + 50) and (ball.ycor() > pai2.ycor() - 50) and (ball.xcor() > 330):
ball.vx *= -1
if (ball.ycor() < pai.ycor() + 50) and (ball.ycor() > pai.ycor() -50) and (ball.xcor() < -330 ):
ball.vx *= -1
#判斷出界
if ball.xcor() > 380 :
ball.goto(0,0)
player1score += 1
pen.clear()
X = 'play1: {} play2: {}'.format(player1score, player2score)
pen.write(X, align='center', font=('Arial', 20, 'bold'))
if ball.xcor() < -380:
player2score += 1
pen.clear() #作為幕布不會重繪,則需要認為地重繪(清除上一次的顯示)
X = 'play1: {} play2: {}'.format(player1score, player2score)
pen.write(X, align='center', font=('Arial', 20, 'bold')) #這個方法被多次呼叫,為了簡化也可以定義一個方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256385.html
標籤:python
上一篇:Markdown部分基本語法
下一篇:Python爬取網路小說
