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 28 Python
Python利用ansible分发处理任务
Aug 04 Python
python轻松查到删除自己的微信好友
Jan 10 Python
python3通过selenium爬虫获取到dj商品的实例代码
Apr 25 Python
详解Django模版中加载静态文件配置方法
Jul 21 Python
python plotly绘制直方图实例详解
Jul 22 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
python+mysql实现个人论文管理系统
Oct 25 Python
PageFactory设计模式基于python实现
Apr 14 Python
python安装和pycharm环境搭建设置方法
May 27 Python
Python编写万花尺图案实例
Jan 03 Python
Python实现微信表情包炸群功能
Jan 28 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
global.php
2006/12/09 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
php自定义分页类完整实例
2015/12/25 PHP
PHP+JQuery+Ajax实现分页方法详解
2016/08/06 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
JavaScript Split()方法
2015/12/18 Javascript
JS实现复制功能
2017/03/01 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
深入理解vue中的$set
2017/06/01 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
Python常用库推荐
2016/12/04 Python
不可错过的十本Python好书
2017/07/06 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python如何获取apk的packagename和activity
2020/01/10 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
程序员经常用到的UNIX命令
2015/04/13 面试题
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
助理政工师申报材料
2014/06/03 职场文书
齐云山导游词
2015/02/06 职场文书
借条如何写
2015/05/26 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
PHP正则表达式之RCEService回溯
2022/04/11 PHP
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers