Pygame如何实现反弹球小游戏
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了"Pygame如何实现反弹球小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Pygame如何实现反弹球小游戏"这篇文章吧。一、
千家信息网最后更新 2026年11月02日Pygame如何实现反弹球小游戏
这篇文章主要为大家展示了"Pygame如何实现反弹球小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Pygame如何实现反弹球小游戏"这篇文章吧。
一、准备中
1)游戏规则
比平常的乒乓球????更简单,玩家只要接住球打回去即可,谁先获得10球就胜利(可修改)。
单人操作:方向键上下即可;双人模式:一个是方向键上下没错,还有一个就是WS上下。
2)素材准备
3)环境安装
本文用到的环境:Python3、Pycharm、Pygame模块部分自带。
pip install -i https://pypi.douban.com/simple/ +模块名
二、敲代码
1)配置文件
配置文件:背景颜色、界面大小、界面的一些背景音乐等等下面代码很简单都看的懂哈。
import os '''屏幕长宽'''WIDTH = 500HEIGHT = 500'''游戏素材路径'''CURRPATH = os.getcwd()RESOURCESDIRPATH = os.path.join(CURRPATH, 'resources')AUDIOSDIRPATH = os.path.join(RESOURCESDIRPATH, 'audios')FONTDIRPATH = os.path.join(RESOURCESDIRPATH, 'font')IMAGESDIRPATH = os.path.join(RESOURCESDIRPATH, 'images')BALLPICPATH = os.path.join(IMAGESDIRPATH, 'ball.png')RACKETPICPATH = os.path.join(IMAGESDIRPATH, 'racket.png')FONTPATH = os.path.join(FONTDIRPATH, 'font.TTF')GOALSOUNDPATH = os.path.join(AUDIOSDIRPATH, 'goal.wav')HITSOUNDPATH = os.path.join(AUDIOSDIRPATH, 'hit.wav')BGMPATH = os.path.join(AUDIOSDIRPATH, 'bgm.mp3')'''颜色'''WHITE = (255, 255, 255)
2)设置球的反弹、移动规则
class Ball(pygame.sprite.Sprite): def __init__(self, imgpath, cfg, **kwargs): pygame.sprite.Sprite.__init__(self) self.cfg = cfg self.image = loadImage(imgpath) self.rect = self.image.get_rect() self.reset() '''移动''' def move(self, ball, racket_left, racket_right, hit_sound, goal_sound): self.rect.left = self.rect.left + self.speed * self.direction_x self.rect.top = min(max(self.rect.top + self.speed * self.direction_y, 0), self.cfg.HEIGHT - self.rect.height) # 撞到球拍 if pygame.sprite.collide_rect(ball, racket_left) or pygame.sprite.collide_rect(ball, racket_right): self.direction_x, self.direction_y = -self.direction_x, random.choice([1, -1]) self.speed += 1 scores = [0, 0] hit_sound.play() # 撞到上侧的墙 elif self.rect.top == 0: self.direction_y = 1 self.speed += 1 scores = [0, 0] # 撞到下侧的墙 elif self.rect.top == self.cfg.HEIGHT - self.rect.height: self.direction_y = -1 self.speed += 1 scores = [0, 0] # 撞到左边的墙 elif self.rect.left < 0: self.reset() racket_left.reset() racket_right.reset() scores = [0, 1] goal_sound.play() # 撞到右边的墙 elif self.rect.right > self.cfg.WIDTH: self.reset() racket_left.reset() racket_right.reset() scores = [1, 0] goal_sound.play() # 普通情况 else: scores = [0, 0] return scores '''初始化''' def reset(self): self.rect.centerx = self.cfg.WIDTH // 2 self.rect.centery = random.randrange(self.rect.height // 2, self.cfg.HEIGHT - self.rect.height // 2) self.direction_x = random.choice([1, -1]) self.direction_y = random.choice([1, -1]) self.speed = 1 '''绑定到屏幕上''' def draw(self, screen): screen.blit(self.image, self.rect)
3)设置球拍电脑的移动等
class Racket(pygame.sprite.Sprite): def __init__(self, imgpath, type_, cfg, **kwargs): pygame.sprite.Sprite.__init__(self) self.cfg = cfg self.type_ = type_ self.image = loadImage(imgpath, False) self.rect = self.image.get_rect() self.reset() '''移动''' def move(self, direction): if direction == 'UP': self.rect.top = max(0, self.rect.top - self.speed) elif direction == 'DOWN': self.rect.bottom = min(self.cfg.HEIGHT, self.rect.bottom + self.speed) else: raise ValueError('[direction] in Racket.move is %s, expect %s or %s...' % (direction, 'UP', 'DOWN')) '''电脑自动移动''' def automove(self, ball): if ball.rect.centery - 25 > self.rect.centery: self.move('DOWN') if ball.rect.centery + 25 < self.rect.centery: self.move('UP') '''初始化''' def reset(self): # 左/右边的拍 self.rect.centerx = self.cfg.WIDTH - self.rect.width // 2 if self.type_ == 'RIGHT' else self.rect.width // 2 self.rect.centery = self.cfg.HEIGHT // 2 # 速度 self.speed = 5 '''绑定到屏幕上''' def draw(self, screen): screen.blit(self.image, self.rect)4)设置游戏开始界面
开始界面分单、双人游戏。
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()
5)定义游戏结束页面
谁先胜利达到10个球,结束界面设置。
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()6)运行游戏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()7)主函数、标题名称等
'''主函数'''def main(): # 初始化 pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT)) pygame.display.set_caption('反弹球小游戏') # 开始游戏 while True: score_left, score_right = runDemo(screen) endInterface(screen, score_left, score_right)三、效果展示
嗯哼想着感觉视频不需要,这个很简单界面,就直接截图展示吧~懒.jpg
游戏开始界面——

开始游戏——

以上是"Pygame如何实现反弹球小游戏"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
界面
移动
小游戏
球拍
上下
内容
屏幕
篇文章
素材
控制
代码
函数
右边
文件
方向
模块
模式
玩家
环境
电脑
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网女皇 腾讯科技
伴你行互联网科技有限公司
狮子座互联网科技培训
互联网前沿科技
科技大学互联网专业好不好
互联网公司会议桌创意科技软装饰
移动互联网科技股
浙江互联网科技研学营
花神(南京)互联网科技有限公司
互联网科技与大数据专业
互联网科技的全部知识
阿里互联网科技企业
工业互联网等科技实现智能化赋能
城市宝互联网科技有限公司
富国互联网科技002692
江苏互联网科技小贷
北京互联网科技类企业分布
优雇互联网科技有限公司
恒生科技互联网指数十大成分股
每日互联网科技新闻
奇酷互联网科技
万易互联网科技有限公司
互联网科技论文
亿人帮互联网科技
大白互联网科技
互联网科技博客
互联网科技公司实习生
互联网媒体平台算高科技产业
互联网科技职业技能培训学校
杭州融税互联网科技有限公司