Pygame如何实现反弹球小游戏
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要为大家展示了"Pygame如何实现反弹球小游戏",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Pygame如何实现反弹球小游戏"这篇文章吧。一、
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
国外开放的存取数据库
网络安全绘画作品高年级
学网络安全哪个专业好
服务器刚度
软件开发入门笔记本
江苏惠普服务器维修维保多少钱
数据库应用技术电子版
耀邦科技软件开发
华硕服务器管理端口映射
unity与数据库
底层软件开发 翻译
软件开发合同的售后服务内容
揭阳无线软件开发价目表
建网站服务器的步骤
制作pve内网源服务器
中南林业科技大学互联网专业
实用网络技术期末试卷
如何提升国家网络安全
泰坦档案管理系统服务器名称
存储过程抽取数据库
张军有关网络安全的批示
国家网络安全手抄报要简单的
5g软件开发公司好吗
网络技术基础 郑大远程
2018华为网络技术
逃离塔科夫服务器管理员
网络安全网贷
省市区邮编数据库
耀尔互联网科技
加工中心数据库如何修改