我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python+Pygame编写一个Pong游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python+Pygame编写一个Pong游戏

前言

这次,我们要用Pygame写一个Pong游戏

先看看效果:

需要的模块:Pygame

在python文件同目录下新建resources文件夹,在文件夹中新建Pong文件夹,文件夹中放入两个音频文件

代码教学

导入需要的模块

import pygame
from pygame.locals import *
import random
import sys

定义常量

COUNTDOWN=USEREVENT+1
path="resources/Pong/"

定义Class类,初始化函数内的代码:

pygame.init()
self.screen=pygame.display.set_mode((750,800))
pygame.display.set_caption("Pong")
 
self.mode="welcome"
self.ball=None
self.xspeed=0
self.yspeed=0
self.r=0
self.p1=None
self.p2=None
self.p1y=0
self.p2y=0
self.boardWidth=0
self.boardHeight=0
self.countdown=0
self.p1score=0
self.p2score=0
self.ballr=None
self.min=2
self.max=7
self.win=11
self.matchpoint=0
self.boardSpeed=self.max
self.ding=pygame.mixer.Sound(path+"ding.mp3")
self.bo=pygame.mixer.Sound(path+"bo.mp3")

定义listen函数

    def listen(self):
        for event in pygame.event.get():
            if event.type==QUIT:
                sys.exit()
            elif event.type==KEYDOWN:
                if event.key==K_k and self.mode=="welcome":
                    self.mode="playing"
                    self.ball=[750/2,800/2]
                    self.r=10
                    self.p1y=100
                    self.p2y=100
                    self.boardWidth=10
                    self.boardHeight=100
                    self.countdown=5
                    self.p1score=0
                    self.p2score=0
                    self.ballr=Rect(100,100,1,1)
                    pygame.time.set_timer(COUNTDOWN,1000)
            elif event.type==COUNTDOWN:
                self.countdown-=1
                if self.countdown==0:
                    self.countdown=0
                    pygame.time.set_timer(COUNTDOWN,0)
                    self.xspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
                    self.yspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
                else:
                    self.ding.play()

 定义draw函数,用于屏幕显示,进入游戏时的ui:

        if self.mode=="welcome":
            self.screen.fill((0,0,0))
            ts=[
                "Welcome to Pong",
                "This game needs 2 players",
                "Press K to start"
            ]
            y=100
            for t in ts:
                to=self.print_text("simhei",35,t,(255,255,255))
                self.screen.blit(to,(100,y))
                y+=40

开始游戏后:

        elif self.mode=="playing":
            self.screen.fill((0,0,0))
            self.p1=pygame.draw.rect(self.screen,(255,255,255),(0,self.p1y,self.boardWidth,self.boardHeight))
            self.p2=pygame.draw.rect(self.screen,(255,255,255),(750-self.boardWidth,self.p2y,self.boardWidth,self.boardHeight))
            to=self.print_text("simhei",20,"Press WS to move",(255,255,255))
            to2=self.print_text("simhei",20,"Press ↑↓ to move",(255,255,255))
            tor=to.get_rect()
            tor2=to2.get_rect()
            d=10
            tor.bottomleft=d,800-d
            tor2.bottomright=750-d,800-d
            self.screen.blit(to,tor)
            self.screen.blit(to2,tor2)
            to=self.print_text("simhei",20,"Match Point!",(255,255,255))
            if self.matchpoint==1:
                self.screen.blit(to,(10,10))
            elif self.matchpoint==2:
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            elif self.matchpoint==11:
                pygame.time.set_timer(COUNTDOWN,0)
                to=self.print_text("simhei",20,"Win!",(255,255,255))
                self.screen.blit(to,(10,10))
                to=self.print_text("simhei",20,"Lose!",(255,255,255))
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            elif self.matchpoint==22:
                pygame.time.set_timer(COUNTDOWN,0)
                to=self.print_text("simhei",20,"Lose!",(255,255,255))
                self.screen.blit(to,(10,10))
                to=self.print_text("simhei",20,"Win!",(255,255,255))
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            if not (self.matchpoint==11 or self.matchpoint==22):
                self.move()
                if not self.countdown:
                    pygame.draw.line(self.screen,(255,255,255),(750/2,0),(750/2,800),5)
                else:
                    to=self.print_text("simhei",72,str(self.countdown),(255,255,255))
                    tor=to.get_rect()
                    tor.midtop=750/2,50
                    self.screen.blit(to,tor)
            to=self.print_text("simhei",150,str(self.p1score),(255,255,255))
            to2=self.print_text("simhei",150,str(self.p2score),(255,255,255))
            tor=to.get_rect()
            tor2=to2.get_rect()
            tor.midtop=750/2/2,50
            tor2.midtop=750/2+750/2/2,50
            self.screen.blit(to,tor)
            self.screen.blit(to2,tor2)
            self.ballr=pygame.draw.circle(self.screen,(255,255,255),tuple(self.ball),self.r)

这里,为了可以显示文字,我们自己写一个print_text函数,用于显示文字

    @staticmethod
    def print_text(name,size,text,color):
        font=pygame.font.SysFont(name,size)
        image=font.render(text,True,color)
        return image

定义一个move函数,用于移动小球和两个玩家的“板”

    def move(self):
        if (not self.countdown) and (not (self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2))):
            self.ball[0]+=self.xspeed
            self.ball[1]+=self.yspeed
            if self.ball[0]-self.r<=0:
                self.p2score+=1
                self.countdown=3
                self.ballr=Rect(100,100,1,1)
                self.ball=[750/2,800/2]
                pygame.time.set_timer(COUNTDOWN,1000)
            if self.ball[0]+self.r>=750:
                self.p1score+=1
                self.countdown=3
                self.ballr=Rect(100,100,1,1)
                self.ball=[750/2,800/2]
                pygame.time.set_timer(COUNTDOWN,1000)
            if self.ball[1]-self.r<=0 or self.ball[1]+self.r>=800:
                self.yspeed=-self.yspeed
                if self.yspeed<0:
                    self.yspeed=random.randint(-self.max,-self.min)
                else:
                    self.yspeed=random.randint(self.min,self.max)
                self.bo.play()
        elif self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2):
            self.xspeed=-self.xspeed
            if self.xspeed<0:
                self.xspeed=random.randint(-self.max,-self.min)
            else:
                self.xspeed=random.randint(self.min,self.max)
            self.bo.play()
            self.ball[0]+=self.xspeed*2
        key=pygame.key.get_pressed()
        if key[K_w]:
            self.p1y-=self.boardSpeed
        if key[K_s]:
            self.p1y+=self.boardSpeed
        if key[K_UP]:
            self.p2y-=self.boardSpeed
        if key[K_DOWN]:
            self.p2y+=self.boardSpeed
        if self.p1y<=0:
            self.p1y=0
        if self.p2y<=0:
            self.p2y=0
        if self.p1y+self.boardHeight>=800:
            self.p1y=800-self.boardHeight
        if self.p2y+self.boardHeight>=800:
            self.p2y=800-self.boardHeight

再定义一个函数,用于检查是否有玩家已经到达赛点

    def checkMatchPoint(self):
        self.matchpoint=0
        if self.p1score==self.win:
            self.matchpoint=11
        if self.p2score==self.win:
            self.matchpoint=22
        if self.p1score+1==self.win:
            self.matchpoint=1
        if self.p2score+1==self.win:
            self.matchpoint=2
        if self.p1score+1==self.win and self.p2score+1==self.win:
            self.win+=1

定义用于进入游戏主循环的函数run

    def run(self):
        clock=pygame.time.Clock()
        while True:
            clock.tick(60)
            self.listen()
            if not (self.matchpoint==11 or self.matchpoint==22):
                self.checkMatchPoint()
            self.draw()
            pygame.display.update()

在类的外面,创建game对象,并进入游戏主循环

game=Game()
game.run()

最终代码

import pygame
from pygame.locals import *
import random
import sys
 
COUNTDOWN=USEREVENT+1
path="resources/Pong/"
 
class Game:
    def __init__(self):
        pygame.init()
        self.screen=pygame.display.set_mode((750,800))
        pygame.display.set_caption("Pong")
 
        self.mode="welcome"
        self.ball=None
        self.xspeed=0
        self.yspeed=0
        self.r=0
        self.p1=None
        self.p2=None
        self.p1y=0
        self.p2y=0
        self.boardWidth=0
        self.boardHeight=0
        self.countdown=0
        self.p1score=0
        self.p2score=0
        self.ballr=None
        self.min=2
        self.max=7
        self.win=11
        self.matchpoint=0
        self.boardSpeed=self.max
        self.ding=pygame.mixer.Sound(path+"ding.mp3")
        self.bo=pygame.mixer.Sound(path+"bo.mp3")
 
    def listen(self):
        for event in pygame.event.get():
            if event.type==QUIT:
                sys.exit()
            elif event.type==KEYDOWN:
                if event.key==K_k and self.mode=="welcome":
                    self.mode="playing"
                    self.ball=[750/2,800/2]
                    self.r=10
                    self.p1y=100
                    self.p2y=100
                    self.boardWidth=10
                    self.boardHeight=100
                    self.countdown=5
                    self.p1score=0
                    self.p2score=0
                    self.ballr=Rect(100,100,1,1)
                    pygame.time.set_timer(COUNTDOWN,1000)
            elif event.type==COUNTDOWN:
                self.countdown-=1
                if self.countdown==0:
                    self.countdown=0
                    pygame.time.set_timer(COUNTDOWN,0)
                    self.xspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
                    self.yspeed=random.randint(self.min,self.max) if random.randint(0,1)==0 else random.randint(-self.max,-self.min)
                else:
                    self.ding.play()
 
    def draw(self):
        if self.mode=="welcome":
            self.screen.fill((0,0,0))
            ts=[
                "Welcome to Pong",
                "This game needs 2 players",
                "Press K to start"
            ]
            y=100
            for t in ts:
                to=self.print_text("simhei",35,t,(255,255,255))
                self.screen.blit(to,(100,y))
                y+=40
        elif self.mode=="playing":
            self.screen.fill((0,0,0))
            self.p1=pygame.draw.rect(self.screen,(255,255,255),(0,self.p1y,self.boardWidth,self.boardHeight))
            self.p2=pygame.draw.rect(self.screen,(255,255,255),(750-self.boardWidth,self.p2y,self.boardWidth,self.boardHeight))
            to=self.print_text("simhei",20,"Press WS to move",(255,255,255))
            to2=self.print_text("simhei",20,"Press ↑↓ to move",(255,255,255))
            tor=to.get_rect()
            tor2=to2.get_rect()
            d=10
            tor.bottomleft=d,800-d
            tor2.bottomright=750-d,800-d
            self.screen.blit(to,tor)
            self.screen.blit(to2,tor2)
            to=self.print_text("simhei",20,"Match Point!",(255,255,255))
            if self.matchpoint==1:
                self.screen.blit(to,(10,10))
            elif self.matchpoint==2:
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            elif self.matchpoint==11:
                pygame.time.set_timer(COUNTDOWN,0)
                to=self.print_text("simhei",20,"Win!",(255,255,255))
                self.screen.blit(to,(10,10))
                to=self.print_text("simhei",20,"Lose!",(255,255,255))
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            elif self.matchpoint==22:
                pygame.time.set_timer(COUNTDOWN,0)
                to=self.print_text("simhei",20,"Lose!",(255,255,255))
                self.screen.blit(to,(10,10))
                to=self.print_text("simhei",20,"Win!",(255,255,255))
                tor=to.get_rect()
                tor.topright=750-10,10
                self.screen.blit(to,tor)
            if not (self.matchpoint==11 or self.matchpoint==22):
                self.move()
                if not self.countdown:
                    pygame.draw.line(self.screen,(255,255,255),(750/2,0),(750/2,800),5)
                else:
                    to=self.print_text("simhei",72,str(self.countdown),(255,255,255))
                    tor=to.get_rect()
                    tor.midtop=750/2,50
                    self.screen.blit(to,tor)
            to=self.print_text("simhei",150,str(self.p1score),(255,255,255))
            to2=self.print_text("simhei",150,str(self.p2score),(255,255,255))
            tor=to.get_rect()
            tor2=to2.get_rect()
            tor.midtop=750/2/2,50
            tor2.midtop=750/2+750/2/2,50
            self.screen.blit(to,tor)
            self.screen.blit(to2,tor2)
            self.ballr=pygame.draw.circle(self.screen,(255,255,255),tuple(self.ball),self.r)
 
    @staticmethod
    def print_text(name,size,text,color):
        font=pygame.font.SysFont(name,size)
        image=font.render(text,True,color)
        return image
 
    def move(self):
        if (not self.countdown) and (not (self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2))):
            self.ball[0]+=self.xspeed
            self.ball[1]+=self.yspeed
            if self.ball[0]-self.r<=0:
                self.p2score+=1
                self.countdown=3
                self.ballr=Rect(100,100,1,1)
                self.ball=[750/2,800/2]
                pygame.time.set_timer(COUNTDOWN,1000)
            if self.ball[0]+self.r>=750:
                self.p1score+=1
                self.countdown=3
                self.ballr=Rect(100,100,1,1)
                self.ball=[750/2,800/2]
                pygame.time.set_timer(COUNTDOWN,1000)
            if self.ball[1]-self.r<=0 or self.ball[1]+self.r>=800:
                self.yspeed=-self.yspeed
                if self.yspeed<0:
                    self.yspeed=random.randint(-self.max,-self.min)
                else:
                    self.yspeed=random.randint(self.min,self.max)
                self.bo.play()
        elif self.ballr.colliderect(self.p1) or self.ballr.colliderect(self.p2):
            self.xspeed=-self.xspeed
            if self.xspeed<0:
                self.xspeed=random.randint(-self.max,-self.min)
            else:
                self.xspeed=random.randint(self.min,self.max)
            self.bo.play()
            self.ball[0]+=self.xspeed*2
        key=pygame.key.get_pressed()
        if key[K_w]:
            self.p1y-=self.boardSpeed
        if key[K_s]:
            self.p1y+=self.boardSpeed
        if key[K_UP]:
            self.p2y-=self.boardSpeed
        if key[K_DOWN]:
            self.p2y+=self.boardSpeed
        if self.p1y<=0:
            self.p1y=0
        if self.p2y<=0:
            self.p2y=0
        if self.p1y+self.boardHeight>=800:
            self.p1y=800-self.boardHeight
        if self.p2y+self.boardHeight>=800:
            self.p2y=800-self.boardHeight
 
    def checkMatchPoint(self):
        self.matchpoint=0
        if self.p1score==self.win:
            self.matchpoint=11
        if self.p2score==self.win:
            self.matchpoint=22
        if self.p1score+1==self.win:
            self.matchpoint=1
        if self.p2score+1==self.win:
            self.matchpoint=2
        if self.p1score+1==self.win and self.p2score+1==self.win:
            self.win+=1
 
    def run(self):
        clock=pygame.time.Clock()
        while True:
            clock.tick(60)
            self.listen()
            if not (self.matchpoint==11 or self.matchpoint==22):
                self.checkMatchPoint()
            self.draw()
            pygame.display.update()
 
game=Game()
game.run()

到此这篇关于Python+Pygame编写一个Pong游戏的文章就介绍到这了,更多相关Python Pygame Pong游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python+Pygame编写一个Pong游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python+Pygame编写一个Pong游戏

Pong游戏模拟了两个打乒乓球的人,就是在两条线中间有一个点在动,操纵器就是一个摇杆上有一个按钮的那种。本文就来用Python中的Pygame库编写一个Pong小游戏
2023-01-05

Python利用3D引擎写一个Pong游戏

之前,我们尝试过用pygame做了一个2D的Pong游戏。本文将利用强大的3D引擎Ursina制作一个3D版的Pong游戏。文中的示例代码讲解详细,感兴趣的可以了解一下
2023-01-05

基于JavaSwing制作一个Pong小游戏

《Pong》是美国雅达利公司(ATARI)开发的视频游戏,该作模拟了两个打乒乓球的人,就是在两条线中间有一个点在动,操纵器就是一个摇杆上有一个按钮的那种。本文就来用JavaSwing制作一个Pong小游戏吧
2023-01-05

怎么用Python编写一个简单的游戏

本篇内容介绍了“怎么用Python编写一个简单的游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在这个系列中,我们要用不同的编程语言编写相
2023-06-15

Python实战:运用Pygame编写Flappy bird小游戏,我能玩一天

首先下载Python中Pygame的模块可以在Windows下的CMD中使用pip下载pip install pygame有的小伙伴安装的时候报错,那么你可以从官网下载Pygame然后解压进入网址https://www.lfd.uci.ed
2023-06-02

基于JavaScript编写一个翻卡游戏

这篇文章主要为大家详细介绍了如何溧阳JavaScript编写一个简单的翻卡游戏,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2023-02-15

使用Java编写一个2048小游戏

本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页
2023-06-06

使用JavaScript编写一个2048小游戏

今天就跟大家聊聊有关使用JavaScript编写一个2048小游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点
2023-06-07

如何利用Python编写一个记忆翻牌游戏

这篇文章主要为大家展示了“如何利用Python编写一个记忆翻牌游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何利用Python编写一个记忆翻牌游戏”这篇文章吧。开发工具Python版本:3
2023-06-29

使用java编写一个猜字母游戏

使用java编写一个猜字母游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和
2023-06-06

怎么用C++编写一个井字游戏

这篇文章主要介绍“怎么用C++编写一个井字游戏”,在日常操作中,相信很多人在怎么用C++编写一个井字游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C++编写一个井字游戏”的疑惑有所帮助!接下来,请跟
2023-06-17

利用java编写一个弹球小游戏

本篇文章给大家分享的是有关利用java编写一个弹球小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。弹球游戏实现原理:  隔一定时间(小于1秒)重新绘制图像,因为Graphi
2023-05-31

怎么用Python编写一个宝石消消乐小游戏

本篇内容介绍了“怎么用Python编写一个宝石消消乐小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发工具python版本:3.6.4
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录