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 xlsxwriter创建excel图表的方法
Jun 11 Python
python版大富翁源代码分享
Nov 19 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python笔记之观察者模式
Nov 20 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
python打开音乐文件的实例方法
Jul 21 Python
Python如何重新加载模块
Jul 29 Python
Python实现机器学习算法的分类
Jun 03 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中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
Js中sort()方法的用法
2006/11/04 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
NumPy统计函数的实现方法
2020/01/21 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
python能开发游戏吗
2020/06/11 Python
python爬虫工具例举说明
2020/11/30 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
python中entry用法讲解
2020/12/04 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
求职简历中自我评价
2014/01/28 职场文书
上班玩手机检讨书
2014/02/17 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
nginx容器方式反向代理实战
2022/04/18 Servers