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在指定目录下查找gif文件的方法
May 04 Python
Python MySQLdb Linux下安装笔记
May 09 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
Nov 19 Python
Python求平面内点到直线距离的实现
Jan 19 Python
python实现横向拼接图片
Mar 23 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
python实现腾讯滑块验证码识别
Apr 27 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 生成文字png图片的代码
2011/04/17 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
Python的多维空数组赋值方法
2018/04/13 Python
django 单表操作实例详解
2019/07/30 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
中学团支部工作总结
2015/08/13 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python