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 不关闭控制台的实现方法
Oct 23 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
Python生成随机密码的方法
Jun 16 Python
python递归函数绘制分形树的方法
Jun 22 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
图文详解python安装Scrapy框架步骤
May 20 Python
解决python 上传图片限制格式问题
Oct 30 Python
tensorflow mnist 数据加载实现并画图效果
Feb 05 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
python 制作一个gui界面的翻译工具
May 14 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
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
php实现websocket实时消息推送
2018/03/30 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
django 环境变量配置过程详解
2019/08/06 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
如何用Django处理gzip数据流
2021/01/29 Python
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
省三好学生申请材料
2014/01/22 职场文书
征婚广告词
2014/03/17 职场文书
关于旅游的活动方案
2014/08/15 职场文书
警告通知
2015/04/25 职场文书
诚信高考倡议书
2019/06/24 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
Golang实现可重入锁的示例代码
2022/05/25 Golang