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 相关文章推荐
Python实现批量修改文件名实例
Jul 08 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python查看微信撤回消息代码
Jun 07 Python
Django contenttypes 框架详解(小结)
Aug 13 Python
Python这样操作能存储100多万行的xlsx文件
Apr 16 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
python获取地震信息 微信实时推送
Jun 18 Python
python实现机器人卡牌
Oct 06 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 Python
Python 使用office365邮箱的示例
Oct 29 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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扩展
2013/06/13 PHP
PHP strripos函数用法总结
2019/02/11 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
JQuery在光标位置插入内容的实现代码
2010/06/18 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
在Python中使用正则表达式的方法
2015/08/13 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
详解python 注释、变量、类型
2018/08/10 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python怎么判断模块安装完成
2020/06/19 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
python 模拟登陆github的示例
2020/12/04 Python
Django中ORM的基本使用教程
2020/12/22 Python
生物制药毕业生自荐信
2013/10/16 职场文书
银行出纳岗位职责
2013/11/25 职场文书
社团活动策划书范文
2014/01/09 职场文书
高中生评语大全
2014/04/25 职场文书
难忘的一课教学反思
2014/04/30 职场文书
农业项目投资意向书
2015/05/09 职场文书
健康证明
2015/06/19 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
《传颂之物 虚伪的假面》BD发售宣传CM公开
2022/04/04 日漫