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实现电子词典
Apr 23 Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python程序中的观察者模式结构编写示例
May 27 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
解决pytorch-gpu 安装失败的记录
May 24 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
Wordpress php 分页代码
2009/10/21 PHP
php zip文件解压类代码
2009/12/02 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
Python如何生成树形图案
2018/01/03 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
高考考python编程是真的吗
2020/07/20 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
优秀党员主要事迹
2014/01/19 职场文书
求职信模板标准格式范文
2014/02/23 职场文书
个人函授自我鉴定
2014/03/25 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
开除通知书范本
2015/04/25 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android