关于游戏开发:PONG-100行代码写一个弹球游戏

29次阅读

共计 2511 个字符,预计需要花费 7 分钟才能阅读完成。

大家好,欢送来到 Crossin 的编程教室!

明天跟大家讲一讲:如何做游戏

https://www.bilibili.com/vide…

游戏的主题是弹球游戏《PONG》,它是史上第一款街机游戏。因而选它作为我这个游戏开发系列的第一期主题。

游戏引擎用的是 Python 的一个游戏库:pgzero。它是对 pygame 的一个封装,让你不须要写多余的套路代码,只有配置游戏的内容逻辑即可。

咱们这个游戏用它来写,一共只须要 100 行代码。

首先须要装置 python 环境。这一步没搞定的同学,能够参考咱们 python 入门教程:http://python666.cn,下面有具体图文介绍。

而后须要装置 pgzero 库,能够命令行下通过 pip 命令装置:

pip install pgzero

装置完,运行一句

pgzrun.go()

咱们的游戏世界之门就曾经关上了。

当初下面还是混沌初开,一片乌黑。

设定一个矩形的左上角坐标和长宽,在游戏的绘制函数 draw 中用指定色彩填充,咱们就失去了一个矩形。

pad_1 = Rect((20, 20), (10, 100))

def draw():
    screen.clear()
    screen.draw.filled_rect(pad_1, 'white')

适当调整一下,就失去了一块游戏中用来挡球的板。

在游戏的更新函数中减少判断,当键盘上的“上”、“下”按键被按下时,批改挡板的 y 坐标,就能够在游戏中管制挡板的挪动了。

PAD_SPEED = 10

def update(dt):
    if keyboard.up:
        pad_1.y -= PAD_SPEED
    elif keyboard.down:
        pad_1.y += PAD_SPEED

这样就曾经实现 PONG 游戏中的玩家操控角色:一块可高低挪动的挡板。而当初咱们用到的代码仅仅 10 行。

有的小伙伴可能留神到了,这里有两个函数,一个叫 draw,它是负责游戏中的画面绘制,另一个叫 update,它负责游戏中的逻辑更新。

咱们常常听到说游戏运行时速度是每秒 30 帧、60 帧之类,或者叫做 FPS(Frames Per Second)。draw 和 update 就是在游戏的“一帧”画面中所要做的事件。你的计算机或者游戏主机的性能越高,每一帧所破费的计算工夫就越少,游戏帧数就能够更高,游戏体验也就更晦涩。

创立一个叫做 Ball 的类型,属性值包含地位和速度。而后,在绘图函数中以小球的地位为圆心画一个圆,在更新函数中依照匀速直线静止位移公式,也就是 位移 = 速度 x 工夫,计算出小球下一帧的地位。如此就实现了一个会静止的小球。

class Ball():
    def __init__(self):
        self.pos = [300, 200]
        self.speed = [1, 1]        
    def update(self, dt):
        for i in range(2):
            self.pos[i] += self.speed[i] * dt

ball = Ball()

def draw():
    screen.clear()
    screen.draw.filled_rect(pad_1, 'white')
    screen.draw.filled_circle(ball.pos, BALL_RADIUS, 'white')

再设置一下边界条件,让小球达到屏幕边缘时能够扭转对应的速度方向,碰到高低边缘就将 y 速度重量乘以 -1,超出左右边缘则地位从新设置回屏幕核心。

class Ball():
    ...      

    def update(self, dt):
        for i in range(2):
            self.pos[i] += self.speed[i]

        if self.pos[1] < 0 or self.pos[1] > HEIGHT:
            self.speed[1] *= -1
        if self.pos[0] < 0 or self.pos[0] > WIDTH:
            self.reset()

有了板,有了球,接下来就是让他们之间产生关联。

在更新函数中做一个碰撞检测:如果板子的矩形与球的圆心产生了交加,就让球反弹回去。

def update(dt):
    ...
    
    ball.update(dt)

    if pad_1.collidepoint(ball.pos) and ball.speed[0] < 0:
        ball.speed[0] *= -1

到这一步,游戏的外围物理规定就曾经定义结束。

依照同样的办法,在屏幕的右侧创立第二块板,通过另外的按键进行管制。而后,当小球超出左右边界时,别离给对面一方得分。

class Ball():
    ...      

    def dead(self, side):
        scores[side] += 1
        self.reset()

这样,一个最最简略的,双人版弹球游戏就实现了。

当然,如果你找不到另一个人陪你一起玩,也能够让本人的左手跟右手玩。

或者,给一侧板减少一点主动追踪的代码:让板的地位随着球的地位挪动。这也算是一个游戏 AI 了。

def auto_move_pad(dt):
    if ball.pos[0] > WIDTH / 2 and ball.speed[0] > 0:
        if pad_2.y + pad_2.height * 0.25 > ball.pos[1]:
            pad_2.y -= PAD_SPEED * dt
            if pad_2.top < 0:
                pad_2.top = 0
        elif pad_2.y + pad_2.height * 0.75 < ball.pos[1]:
            pad_2.y += PAD_SPEED * dt
            if pad_2.bottom > HEIGHT:
                pad_2.bottom = HEIGHT

至此,一个具备残缺外围玩法的弹球游戏 PONG 曾经实现了。加上空格也不到 100 行代码。特地适宜编程老手刚刚接触游戏开发的小伙伴进行练习。

不过,我还给游戏减少了一点点细节,感兴趣的小伙伴可点击文章结尾的视频进行观看。喜爱的话欢送点赞和转发!

之后我还会来尝试更多的游戏类型,更多的玩法。争取实现最后立下的 FLAG:实现 100 个游戏。如果你想看某类游戏或者某个游戏的实现,或者对某个实现细节有疑难,也能够留言中通知我,我会优先思考。

代码曾经开源,可通过“Crossin 的编程教室”获取

https://github.com/crossin/ga…


获取更多教程和案例,

欢送搜寻及关注:Crossin 的编程教室

每天 5 分钟,轻松学编程。

正文完
 0