Python实现打乒乓小游戏


Posted in Python onSeptember 25, 2021

本文实例为大家分享了Python实现打乒乓小游戏的具体代码,供大家参考,具体内容如下

Python实现打乒乓小游戏

源码奉上:

import sys
import cfg
import pygame
from modules import *
 
 
'''定义按钮'''
def Button(screen, position, text, button_size=(200, 50)):
    left, top = position
    bwidth, bheight = button_size
    pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
    pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
    pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
    pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
    pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
    font = pygame.font.Font(cfg.FONTPATH, 30)
    text_render = font.render(text, 1, (255, 235, 205))
    return screen.blit(text_render, (left+50, top+10))
 
 
'''
Function:
    开始界面
Input:
    --screen: 游戏界面
Return:
    --game_mode: 1(单人模式)/2(双人模式)
'''
def startInterface(screen):
    clock = pygame.time.Clock()
    while True:
        screen.fill((41, 36, 33))
        button_1 = Button(screen, (150, 175), '1 Player')
        button_2 = Button(screen, (150, 275), '2 Player')
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if button_1.collidepoint(pygame.mouse.get_pos()):
                    return 1
                elif button_2.collidepoint(pygame.mouse.get_pos()):
                    return 2
        clock.tick(10)
        pygame.display.update()
 
 
'''结束界面'''
def endInterface(screen, score_left, score_right):
    clock = pygame.time.Clock()
    font1 = pygame.font.Font(cfg.FONTPATH, 30)
    font2 = pygame.font.Font(cfg.FONTPATH, 20)
    msg = 'Player on left won!' if score_left > score_right else 'Player on right won!'
    texts = [font1.render(msg, True, cfg.WHITE),
            font2.render('Press ESCAPE to quit.', True, cfg.WHITE),
            font2.render('Press ENTER to continue or play again.', True, cfg.WHITE)]
    positions = [[120, 200], [155, 270], [80, 300]]
    while True:
        screen.fill((41, 36, 33))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    return
                elif event.key == pygame.K_ESCAPE:
                    sys.exit()
                    pygame.quit()
        for text, pos in zip(texts, positions):
            screen.blit(text, pos)
        clock.tick(10)
        pygame.display.update()
 
 
'''运行游戏Demo'''
def runDemo(screen):
    # 加载游戏素材
    hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
    goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
    pygame.mixer.music.load(cfg.BGMPATH)
    pygame.mixer.music.play(-1, 0.0)
    font = pygame.font.Font(cfg.FONTPATH, 50)
    # 开始界面
    game_mode = startInterface(screen)
    # 游戏主循环
    # --左边球拍(ws控制, 仅双人模式时可控制)
    score_left = 0
    racket_left = Racket(cfg.RACKETPICPATH, 'LEFT', cfg)
    # --右边球拍(↑↓控制)
    score_right = 0
    racket_right = Racket(cfg.RACKETPICPATH, 'RIGHT', cfg)
    # --球
    ball = Ball(cfg.BALLPICPATH, cfg)
    clock = pygame.time.Clock()
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit(-1)
        screen.fill((41, 36, 33))
        # 玩家操作
        pressed_keys = pygame.key.get_pressed()
        if pressed_keys[pygame.K_UP]:
            racket_right.move('UP')
        elif pressed_keys[pygame.K_DOWN]:
            racket_right.move('DOWN')
        if game_mode == 2:
            if pressed_keys[pygame.K_w]:
                racket_left.move('UP')
            elif pressed_keys[pygame.K_s]:
                racket_left.move('DOWN')
        else:
            racket_left.automove(ball)
        # 球运动
        scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
        score_left += scores[0]
        score_right += scores[1]
        # 显示
        # --分隔线
        pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
        # --球
        ball.draw(screen)
        # --拍
        racket_left.draw(screen)
        racket_right.draw(screen)
        # --得分
        screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
        screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
        if score_left == 11 or score_right == 11:
            return score_left, score_right
        clock.tick(100)
        pygame.display.update()
 
 
'''主函数'''
def main():
    # 初始化
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
    pygame.display.set_caption('pingpong —— 九歌')
    # 开始游戏
    while True:
        score_left, score_right = runDemo(screen)
        endInterface(screen, score_left, score_right)
 
 
'''run'''
if __name__ == '__main__':
    main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
本地文件上传到七牛云服务器示例(七牛云存储)
Jan 11 Python
Python程序设计入门(2)变量类型简介
Jun 16 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
python处理xml文件的方法小结
May 02 Python
利用python提取wav文件的mfcc方法
Jan 09 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
python实现银联支付和支付宝支付接入
May 07 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
pytorch标签转onehot形式实例
Jan 02 Python
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
Python极值整数的边界探讨分析
Sep 15 #Python
Python办公自动化PPT批量转换操作
Sep 15 #Python
Python办公自动化解决world文件批量转换
Sep 15 #Python
You might like
php不用正则采集速度探究总结
2008/03/24 PHP
php intval的测试代码发现问题
2008/07/27 PHP
php xml-rpc远程调用
2008/12/19 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
利用javascript查看html源文件
2006/11/08 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Python 操作文件的基本方法总结
2017/08/10 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python绘制热力图heatmap
2020/03/23 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
执行Python程序时模块报错问题
2020/03/26 Python
python实现飞船大战
2020/04/24 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
工程安全员岗位职责
2014/03/09 职场文书
银行职员自我鉴定
2014/04/20 职场文书
公务员考察材料
2014/12/23 职场文书