小白学Python---做个小游戏

用pygame模块做个小游戏

    Pygame是一个Python中专门用于多媒体应用(如电子游戏)的开发模块,其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在SDL的基础上,SDL是一套跨平台的多媒体开发库,用C语言实现,被广泛的应用于游戏、模拟器、播放器等的开发。下面将用Pygame做一个“大球吃小球”的游戏,主要是加深对面向对象编程的理解。

制作游戏窗口

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False


if __name__ == '__main__':
    main()

在窗口中绘图

    绘制好图形化窗口后,使用draw模块的函数在窗口上绘制我们需要的图形:线条,矩形,圆形等等,值的注意的是屏幕的坐标系原点在左上角,x轴正向朝右,y抽正向朝下。在表示位置和大小时,默认的单位都是像素,而像素就是屏幕上的一个点。pygame中颜色用的是色光的三原色:红绿蓝,通过一个元组或列表来指定颜色的RGB值,每个值都在0-255之间。

import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
    screen.fill((242, 242, 242))
    # 绘制一个圆(参数分别是: 屏幕, 颜色, 圆心位置, 半径, 0表示填充圆)
    pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
    # 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
    pygame.display.flip()
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False


if __name__ == '__main__':
    main()

实现动画效果

    动画效果的实现其实就是让不连续的图片连续的播放,只要每秒中达到了一定的帧数,就能做出流畅的动画效果,而让小球动起来可以在循环中改变小球的位置,并刷新实现。
import pygame


def main():
    # 初始化导入的pygame中的模块
    pygame.init()
    # 初始化用于显示的窗口并设置窗口尺寸
    screen = pygame.display.set_mode((800, 600))
    # 设置当前窗口的标题
    pygame.display.set_caption('大球吃小球')
    # 定义变量来表示小球在屏幕上的位置
    x, y = 50, 50
    running = True
    # 开启一个事件循环处理发生的事件
    while running:
        # 从消息队列中获取事件并对事件进行处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        screen.fill((255, 255, 255))
        pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
        pygame.display.flip()
        # 每隔50毫秒就改变小球的位置再刷新窗口
        pygame.time.delay(50)
        x, y = x + 5, y + 5


if __name__ == '__main__':
    main()

碰撞检测

    要求小球碰到墙壁会反弹,而2个球相撞,大球会吃掉小球。这里的碰撞检测直接检查2个小球的圆心距与半径和的关系就好,为了制造更多的小球,我们可以通过鼠标事件处理,在鼠标点击位置创建颜色、大小和移动速度不同的小球,这里就要使用面向对象的知识。
class Ball(object):
    '''定义球'''

    def __init__(self, center, color, radius, sx, sy):
        '''初始化'''
        self._center = center
        self._color = color
        self._radius = radius
        self._sx = sx
        self._sy = sy

    @property
    def center(self):
        return self._center

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        self._radius = radius

    def move(self):
        '''移动'''
        x, y = self._center[0], self._center[1]
        x += self._sx
        y += self._sy
        self._center = (x, y)
        if x + self._radius >= 800 or x - self._radius <= 0:
            self._sx = -self._sx
        if y + self._radius >= 600 or y - self._radius <= 0:
            self._sy = -self._sy

    def draw(self, screen):
        '''画球'''
        pygame.draw.circle(screen, self._color, self._center,self._radius, 0)#0表示实心,

    def eat(self, other):
        '''吃球'''
        x, y = self._center[0], self._center[1]
        x1, y1 = other.center[0], other.center[1]
        line = ((x - x1) ** 2 + (y - y1) ** 2) ** 0.5
        if line < (self._radius + other.radius):
            if self._radius < other.radius:
                other.radius += round(((3.14*self._radius**2*0.5)**0.5 / 3.14)**0.5)
                self._radius = 0
            elif self._radius > other.radius:
                self._radius += round(((3.14*other.radius**2*0.5)**0.5 / 3.14)**0.5)
                other.radius = 0


def refresh(screen, balls):
    bg_color = (250, 250, 250)
    screen.fill(bg_color)
    for ball in balls:
        ball.draw(screen)
    pygame.display.flip()


def random_color():
    red = randint(0, 255)
    green = randint(0, 255)
    blue = randint(0, 255)
    return red, green, blue

事件处理

    游戏中通过点击鼠标获得不同小球,因此通过事件对象的type属性来判定事件类型,利用pos属性来获取鼠标点击位置。
def main():
    balls = []
    pygame.init()
    screen = pygame.display.set_mode([800, 600])
    red_color = (255, 0, 0)
    ball = Ball((100, 100), red_color, 30, 3, 3)
    x, y = 200, 200
    pygame.display.set_caption('大球吃小球')
    clock = pygame.time.Clock()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            #处理鼠标事件,1表示左键
            elif event.type == pygame.MOUSEBUTTONDOWN and \
                event.button == 1:
                center = event.pos
                color = random_color()
                radius = randrange(10, 50)
                sx, sy = randint(-10, 10), randint(-10, 10)
                ball = Ball(center, color, radius, sx, sy)
                balls.append(ball)
        refresh(screen, balls)
        clock.tick(50)
        for index, ball in enumerate(balls):
            ball.move()
            for i in range(index,len(balls)):
               ball.eat(balls[i])

    pygame.quit()#退出

if __name__ == '__main__':
    main()
    合并以上2段代码就能做出一个很简单的小游戏,pygame做2D游戏尚可,如果要做3D游戏,可以使用Panda3D。

1341301-20180323195924488-155896731.png

转载于:https://www.cnblogs.com/bbszc520/p/8632933.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一个初者,Python最好的方法是先从Python基础语法开始,然后熟悉Python的核心编程技巧,例如数据结构和算法,以及面向对象编程,最后熟悉常用的Python框架和库,比如Django和NumPy。 ### 回答2: 作为一个小白Python是一个很好的选择。Python是一种简单易的编程语言,适合初者入门。Python有以下几个优势。 首先,Python的语法简洁明了,易于理解和记忆。相比其他编程语言,Python的代码更加简洁,使用的关键字和符号相对较少。这使得初者能够更容易地理解和掌握编程概念。 其次,Python拥有强大的编程生态系统。Python有许多开源的库和框架,这些库和框架提供了各种各样的功能和工具,帮助开发者更快速地构建应用程序。例如,NumPy和Pandas库用于数据处理和分析,Django和Flask框架用于Web开发,Matplotlib和Seaborn库用于数据可视化等。通过使用这些库和框架,初者可以更轻松地实现复杂的任务。 此外,Python有广泛的应用领域。无论是数据分析、人工智能、Web开发还是科计算,Python都有很好的应用。Python可以打开许多就业和创业的机会。Python是一种功能强大且受欢迎的编程语言,对于初者来说,Python是一个具有前景的选择。 最后,Python拥有活跃的社区支持。在习过程中,你可以轻松地在互联网上找到各种教程、指南和解答。Python社区非常友好和开放,你可以随时向社区中的其他开发者寻求帮助和建议。 总之,作为一个小白Python是一个明智的选择。Python的简洁语法、强大生态系统、广泛的应用领域以及活跃的社区支持使得Python变得更加容易和愉快。开始Python吧,探索编程的魅力! ### 回答3: 作为一个小白Python是一个不错的选择。Python是一种简洁且易于习的编程语言,对初者非常友好。以下是Python的一些建议: 首先,可以选择一本入门级的Python编程书籍或者在线教程。这些教材通常从基本概念开始讲解,适合初者从零基础开始习。 其次,需要安装Python编程环境。Python有多个版本,建议选择最新的稳定版本。可以在Python官方网站上下载并安装。 接下来,需要练习编简单的Python程序。可以从一些小项目开始,例如编一个计算器、制作一个简单的文字游戏等。这样可以巩固所的知识,并更好地理解Python的语法和特性。 与此同时,积极参与Python编程社区和论坛,例如Python官方论坛或者Stack Overflow等。这样可以与其他Python爱好者交流经验、解决问题,并通过阅读其他人的代码提高自己的编程能力。 另外,Python拥有广泛的应用领域,例如数据分析、人工智能、网络编程等。考虑到自己的兴趣和职业方向,可以选择深入Python在相关领域的应用,并尝试开发相关项目。 最后,记住习编程是一个循序渐进的过程。要持之以恒、不断实践,不断充实自己的编程知识和技能。 总之,Python对于一个小白来说是一个很好的选择。通过选择适合的习材料、实践编程序、参与社区交流以及追求专业发展,可以逐步掌握Python编程,并在日后的习和工作中获得更多机会和挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值