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中copy和deepcopy中的区别
Oct 23 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
pycharm导入源码的具体步骤
Aug 04 Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 Python
浅析python字符串前加r、f、u、l 的区别
Jan 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
PHP中的日期处理方法集锦
2007/01/02 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
Dom 是什么的详细说明
2010/10/25 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
JavaScript学习笔记之JS函数
2015/01/22 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
Python字符串处理函数简明总结
2015/04/13 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python如何实现远程方法调用
2020/08/07 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
大学生励志演讲稿
2014/04/25 职场文书
市场开发计划书
2014/05/07 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL