python游戏设计_Python游戏设计入门

原标题:Python游戏设计入门

精品小课,服务大众

turtle库是Python自带的基本绘图库,是初学Python同学最好的一个入门的工具。为了完成弹球游戏,我们第一步导入turtle库。

新建一个屏幕对象实例,设定窗口的标题内容为“ 大学计算机基础”,设置窗口的大小水平为 800 像素,垂直为 600像素,背景填充颜色为经典的黑色(字符串类型)。

# 导入绘图库

import turtle

wn = turtle.Screen

wn.title("大学计算机基础")

wn.setup( 800 , 600 )

wn.bgcolor("black")

wn.tracer( 0 )

20b1da0f8d7a4fcc8b6f428b812114c2.png

测试结果窗口

从turtle模块中新建一个Turtle类,取名为paddleA对象实例,设置速度最快(无动画效果),形状为正方形,颜色为白色,位置在平面的左侧,画笔抬起(移动过程中不会绘制线段),正方形进行拉伸,变成一个矩形条。

进入游戏主循环,不断更新窗口内容(进行重绘)。

注意:turtle默认的 形状尺寸为 20X20 像素。

c315849ba86e495aa5440e0644ee79ca.png

# 档板A

paddleA = turtle.Turtle

paddleA.speed( 0 )

paddleA.shape("square")

paddleA.color("white")

paddleA.goto( -350, 0 )

paddleA.penup

paddleA.shapesize( stretch_wid = 5, stretch_len = 1)

# 游戏主循环

while True:

wn.update #更新窗口

e230b062da9b4d88be36d2a4446e0530.png

新增档板B和 小球ball

小球有2个属性即移动中X坐标与Y坐标的增量。

# 档板A

paddleA = turtle.Turtle

paddleA.speed( 0 )

paddleA.shape("square")

paddleA.color("white")

paddleA.goto( -350, 0 )

paddleA.penup

paddleA.shapesize( stretch_wid = 5, stretch_len = 1)

# 档板B

paddleB = turtle.Turtle

paddleB.speed( 0 )

paddleB.shape("square")

paddleB.color("white")

paddleB.goto( 350, 0 )

paddleB.penup

paddleB.shapesize( stretch_wid = 5, stretch_len = 1)

# 小球 ball

ball=turtle.Turtle #turtle 模块名,Turtle 类名 实例初始化

ball.speed(0) #0最快速度,1-9级不同速度

ball.shape("circle") #shape 形状:square circle,trianle...

ball.color("white") #物品原色,默认颜色是黑色

ball.penup #状态 抬笔

ball.dx= 0.1 #水平方向移动距离

ball.dy= -0.1 #垂直方向移动距离

#游戏主循环

while True:

wn.update #更新窗口

19b5e288e16349e392cc534f37887c13.png

最终有3个对象的窗口

下面随小编一起新增4个函数,控制A、B档板上下移动(20个像素单位),并且对wn对象添加一个 事件侦听方法,通过wn的方法onkeypress 绑定具体按键与函数的对应关系(建议大家看懂它的逻辑)。

#定义一个函数,移动挡板向上

def paddleA_up:

y=paddleA.ycor#返回当前的Y坐标

y=y+20

paddleA.sety(y)#设置当前的Y坐标

#定义一个函数,移动挡板向下

def paddleA_down:

y=paddleA.ycor#返回当前的Y坐标

y=y-20

paddleA.sety(y)#设置当前的Y坐标

#定义一个函数,移动挡板向上

def paddleB_up:

y=paddleB.ycor#返回当前的Y坐标

y=y+20

paddleB.sety(y)#设置当前的Y坐标

#定义一个函数,移动挡板向下

def paddleB_down:

y=paddleB.ycor#返回当前的Y坐标

y=y-20

paddleB.sety(y)#设置当前的Y坐标

#玩家需要按w向上,s向下

wn.listen#事件侦听

wn.onkeypress(paddleA_up,"w") #按下去的键的侦测

wn.onkeypress(paddleA_down,"s") #按下去的键的侦测

wn.onkeypress(paddleB_up,"Up") #按下去的键的侦测

wn.onkeypress(paddleB_down,"Down") #按下去的键的侦测

29465db0166448df9f6bd2e22b555282.png

可以通过键盘上的 w,s , ↑,↓按键,

分别控制档板A和档板B的向上向下移动

在主游戏循环模块中,新增小球移动代码,它的移动有4种不同情况(因为反弹的关系),分别如下图所示:

098d0008f1364c358530c089ac7289b4.png

#主游戏主循环

while True:

wn.update #窗口刷新

#让小球不断移动

ball.setx( ball.xcor + ball.dx )

ball.sety( ball.ycor + ball.dy )

#上边界检测

if ball.ycor>290:

ball.sety(290)

ball.dy=ball.dy*(-1)

#下边界检测,反向

if ball.ycor<-290:

ball.sety(-290)

ball.dy=ball.dy*(-1)

#右边界检测

if ball.xcor>390:

ball.setx(390)

ball.dx=ball.dx*(-1)

#左边界检测,反向

if ball.xcor<-390:

ball.setx(-390)

ball.dx=ball.dx*(-1)

浅红色为新增代码块

60ec02ed44d2471bb3a923a09f8d62fb.png

碰到下边界(进入右下,出来右上)

50c03a2924ce4cf292769029298ff416.png

碰到下边界(进入左下,出来左上)

980a10ad0cdb45e28cad91d5b1a4198e.png

碰到上边界(进入左上,出来左下)

db5a9520166f40cbbe5f2ddc810de301.png

碰到上边界(进入右上,出来右下)

179035edbb2d4753b75e19ca1ac9d81c.png

碰到右边界(进入右上,出来左上)

2267d67538e5453fa324387c60ad596c.png

碰到右边界(进入右下,出来左下)

7a860a0e8de946e7b031f8d84f940789.png

碰到左边界(进入左下,出来右下)

fd7ad9a6e4164041a67223f34cadbd3f.png

碰到左边界(进入左上,出来右上)

本项目中最难部分,就是小球碰到档板B 的反弹的条件逻辑设定如下

(1)小球的X坐标大于 340 并且,小于350 (从水平方向来看)

(2) 小球的X坐标大于 档板Y坐标 - 40 并且小于 档板Y坐标 + 40

6f2babc4859c49769f97ac97da470b4a.png

f96e7798cf88421e826db40db5137c57.png

小球碰到档板B 的反弹的条件逻辑设定如下

(1)小球的X坐标小于 -340 并且,大于 -350 (从水平方向来看)

(2)小球的X坐标大于 档板Y坐标 - 40 并且 小于档板Y坐标 + 40

#主游戏主循环

while True:

#小球碰到挡板B反弹

if (ball.xcor< 350 and ball.xcor>340) and (ball.ycor< paddleB.ycor+40 and ball.ycor>paddleB.ycor-40):

ball.setx(340)

ball.dx=ball.dx*(-1)

#小球碰到挡板A反弹

if (ball.xcor>-350 and ball.xcor<-340) and (ball.ycor< paddleA.ycor+40 and ball.ycor>paddleA.ycor-40):

ball.setx(-340)

ball.dx=ball.dx*(-1)

浅红色为新增代码块

8b961cebcaa34402a957b7fd9cbbf810.png

小球碰到档板B反弹

a81ad5c8909b414c804f5c39259250a7.png

小球碰到档板A反弹

添加2个变量Score_A 和 Score_B ,记录玩家A和玩家B的游戏得分。pen对象实例是在窗口的正上方绘制文本(本身隐藏的),计分规则很简单,小球碰到左边边缘,玩家B加一分(A不扣分), 小球碰到右边边缘,玩家A加一分(B不扣分),具体的代码如下,如果逻辑上不明白可以给小编留言。

#计分变量

Score_A=0#玩家A的得分

Score_B=0#玩家A的得分

#游戏的计分系统

pen=turtle.Turtle

pen.speed(0)

pen.color("white")

pen.penup

pen.hideturtle#隐藏画笔

pen.goto(0,260)#中间正上方

showText= f"玩家A得分{Score_A},玩家B得分{Score_B}"

pen.write(showText,align="center",font=("Courier",24,"bold"))

while True:

#右边界检测

if ball.xcor>390:

ball.setx(390)

ball.dx=ball.dx*(-1)

Score_A+=1

pen.clear

showText= f"玩家A得分{Score_A},玩家B得分{Score_B}"

pen.write(showText,align="center",font=("Courier",24,"bold"))

#左边界检测,反向

if ball.xcor<-390:

ball.setx(-390)

ball.dx=ball.dx*(-1)

Score_B+=1

pen.clear

showText= f"玩家A得分{Score_A},玩家B得分{Score_B}"

pen.write(showText,align="center",font=("Courier",24,"bold"))

最后给游戏添加一些音效,让游戏有更好的体验感。

注意:Bounce.wav 和 Win.wav文件需要与Python源文件在同一目录下。

import turtle #导入乌龟库。Pygame

import winsound #播放声音的库

#主游戏主循环

while True:

wn.update #窗口刷新

#上边界检测

if ball.ycor>290:

ball.sety(290)

ball.dy=ball.dy*(-1)

winsound.PlaySound("Bounce.wav",winsound.SND_ASYNC)#播放声音

#下边界检测,反向

if ball.ycor<-290:

ball.sety(-290)

ball.dy=ball.dy*(-1)

winsound.PlaySound("Bounce.wav",winsound.SND_ASYNC)#播放声音

#右边界检测

if ball.xcor>390:

ball.setx(390)

ball.dx=ball.dx*(-1)

Score_A+=1

pen.clear

showText= f"玩家A得分{Score_A},玩家B得分{Score_B}"

pen.write(showText,align="center",font=("Courier",24,"bold"))

winsound.PlaySound("Win.wav",winsound.SND_ASYNC)#同步播放声音

#左边界检测,反向

if ball.xcor<-390:

ball.setx(-390)

ball.dx=ball.dx*(-1)

Score_B+=1

pen.clear

showText= f"玩家A得分{Score_A},玩家B得分{Score_B}"

pen.write(showText,align="center",font=("Courier",24,"bold"))

winsound.PlaySound("Win.wav",winsound.SND_ASYNC)#播放声音

#碰到挡板B反弹

if (ball.xcor< 350 and ball.xcor>340) and (ball.ycor< paddleB.ycor+40 and ball.ycor>paddleB.ycor-40):

ball.setx(340)

ball.dx=ball.dx*(-1)

winsound.PlaySound("Bounce.wav",winsound.SND_ASYNC)#播放声音

#碰到挡板A反弹

if (ball.xcor>-350 and ball.xcor<-340) and (ball.ycor< paddleA.ycor+40 and ball.ycor>paddleA.ycor-40):

ball.setx(-340)

ball.dx=ball.dx*(-1)

winsound.PlaySound("Bounce.wav",winsound.SND_ASYNC)#播放声音

625951b23936478d9e951e4f4346a4dd.png

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值