python pygame 简单小游戏

article/2025/10/6 10:36:34

python pygame 简单小游戏

最近学习了pygame,感觉十分有意思,花了一点时间制作了一个简单的小游戏

效果图

在这里插入图片描述
这是一个很简单的防守类小游戏
玩家可以使用wasd控制人物移动,并且鼠标控制人物旋转,发射元气弹消除敌人。敌人顺利到达城墙则玩家扣血,血量清零后游戏结束,反之坚持200秒则游戏胜利。

模块区

开头导入几个需要使用的模块和一个 Player类

import jieba
import os
import sys
import math
import random
import pygame
import datetime
from pygame.locals import *class Player(object):  #玩家 类def __init__(self, img, rect, speed):self.ful_img = imgself.img = self.ful_imgself.rect = rectself.speed = speedself.num = 0def update(self, screen, press_keys):  #键盘控制if press_keys[K_a]:self.rect.left -= self.speedif self.rect.left <= 0:self.rect.left = 0if press_keys[K_d]:self.rect.left += self.speedif self.rect.right >= 250:self.rect.right = 250if press_keys[K_w]:self.rect.top -= self.speedif self.rect.top <= 0:self.rect.top = 0if press_keys[K_s]:self.rect.top += self.speedif self.rect.bottom >= 800:self.rect.bottom = 800self.num += 1if self.num % 3 == 0:self.num = 0return [(self.rect.left + self.rect.right)/2, (self.rect.top + self.rect.bottom)/2], self.img

设置区

设置区包含了窗口设置区和基础设置区
基础设计区包含了游戏时间,玩家,城墙,元气弹,敌人等设计

if __name__ == '__main__':# 1 - 设置区# 1.1 - 窗口设置区white = (255, 255, 255)screen_width, screen_height = 1368, 800os.environ['SDL_VIDEO_CENTERED'] = '1'screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Python_Game")# 1.2 - 基础设置区pygame.init()pygame.font.init()font = pygame.font.SysFont('SimHei',32)start = 0win = 0running = 0distance = 200health_value = 194  health_value_max = 194  #最大血量fin_time = 200   #游戏时间start_time = datetime.datetime.now()rect_player = Rect(50, 50, 133, 142)   #玩家设置player_speed = 2player_pos = []monsters = []  #怪物设置monster_speed = 1wave_set = []  #元气弹设置wave_speed = 1.5wave_max = 2fig_path = r'C:\Users\Sakura\Desktop\pythongame\gamefile/'   paper = pygame.image.load(fig_path + 'paper.jpg').convert_alpha()   #背景paper = pygame.transform.scale(paper, (1368, 800))wall = pygame.image.load(fig_path + 'walls.png').convert_alpha()  #城墙wall_width = wall.get_width()wall_height = wall.get_height()player = pygame.image.load(fig_path + 'beggers.png').convert_alpha()  #玩家player_width = player.get_width()player_height = player.get_height()waves = pygame.image.load(fig_path + 'waves.png').convert_alpha()  #元气弹sub_wave = waves.subsurface(Rect((0, 0), (waves.get_width() / 5, waves.get_height())))sub_wave_width = sub_wave.get_width()sub_wave_height = sub_wave.get_height()monster_img1 = pygame.image.load(fig_path + 'monster1.png').convert_alpha()  #怪物图片monster_width = monster_img1.get_width()monster_height = monster_img1.get_height()monster_img = monster_img1health_bar_img = pygame.image.load(fig_path + "health.png")  #血条图片health_bar_height = health_bar_img.get_height()health_img = pygame.image.load(fig_path + "health.png")health_height = health_img.get_height()victory = pygame.image.load(fig_path + 'victory.jpg')   #胜利图片victory = pygame.transform.scale(victory, (1368, 800))game_over = pygame.image.load(fig_path + 'game_over.jpg')  #失败图片game_over = pygame.transform.scale(game_over, (1368, 800))start_img = pygame.image.load(fig_path + 'start.jpg').convert_alpha()  #游戏开始图片

游戏区

游戏区包含了 游戏开始,进行,结束三个区块
布局了玩家,城墙,元气弹,以及怪物的生成。此外还有元气弹于怪物抵消,血量扣除,胜负判断等数个操作。

    # 2 - 游戏区# 2.1 - 游戏开始区while not start:   #游戏开始前screen.fill(white)screen.blit(start_img, (0, 0))text = font.render("按空格开始游戏!",True, (250, 50, 200))text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerxtext_Rect.centery = screen.get_rect().centery + 200screen.blit(text, text_Rect)pygame.display.flip()for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == K_SPACE:start = 1running = 1pygame.mixer.music.load(fig_path + "bgm.mp3")pygame.mixer.music.play(1, 0.0)pygame.mixer.music.set_volume(0.15)start_time = datetime.datetime.now()PL = Player(player, rect_player, player_speed)  #生成玩家# 2.2 - 游戏进行区while running:# 2.2.1 - 游戏显示区screen.fill(white)screen.blit(paper, (0, 0))for height in range(0, screen_height, wall_height):  #城墙布局screen.blit(wall, (distance, height))press_keys = pygame.key.get_pressed()player_pos, player_img = PL.update(screen, press_keys)position = pygame.mouse.get_pos()  #鼠标控制玩家旋转angle = math.atan2(position[1] - (player_pos[1] + player_height),position[0] - (player_pos[0] + player_width))player_rot = pygame.transform.rotate(player_img, 360 - angle * 57.29)player_pos1 = (player_pos[0] - player_rot.get_rect().width / 2,player_pos[1] - player_rot.get_rect().height / 2)screen.blit(player_rot, player_pos1)for wave in wave_set:  #元气弹index = 0vel_x = math.cos(wave[0]) * wave_speedvel_y = math.sin(wave[0]) * wave_speedwave[1] += vel_xwave[2] += vel_yif wave[1] < - sub_wave_width or wave[1] > screen_width \or wave[2] < - sub_wave_height or wave[2] > screen_height:wave_set.pop(index)index += 1for projectile in wave_set:wave1 = pygame.transform.rotate(sub_wave, 360 - projectile[0] * 57.29)screen.blit(wave1, (projectile[1], projectile[2]))monster_timer = random.choice(range(200))if monster_timer < 1:monsters.append([screen_width,random.randint(monster_height, screen_height - monster_height)])index = 0for monster in monsters:   #怪物生成if monster[0] < - monster_width:monsters.pop(index)monster[0] -= monster_speedmonster_rect = pygame.Rect(monster_img.get_rect())monster_rect.top = monster[1]monster_rect.left = monster[0]if monster_rect.left < wall_width + distance:health_value -= random.randint(20, 50)monsters.pop(index)index1 = 0for wave in wave_set:wave_rect = pygame.Rect(sub_wave.get_rect())wave_rect.left = wave[1]wave_rect.top = wave[2]# 检查两个矩形块即怪物和元气弹是否交叉if monster_rect.colliderect(wave_rect):wave_set.pop(index1)try:monsters.pop(index)except IndexError as error:print("IndexError: " + str(error))index1 += 1index += 1for monster in monsters:screen.blit(monster_img, monster)font = pygame.font.Font(None, 42)   #游戏时间cur_time = datetime.datetime.now()play_time = (cur_time - start_time).secondsif play_time % 60 < 10:time_str = ":0"else:time_str = ":"survived_text = font.render(str(play_time // 60) +time_str +str(play_time % 60),True, (0, 0, 0))text_Rect = survived_text.get_rect()text_Rect.topright = [screen_width - 5, 5]screen.blit(survived_text, text_Rect)health_bar_img = pygame.transform.scale(health_bar_img,   #血量(health_value_max, health_bar_height))screen.blit(health_bar_img, [0, 5])if health_value < 0:health_value = 0health_img = pygame.transform.smoothscale(health_img,(health_value, health_height))screen.blit(health_img, [0, 5])pygame.display.flip()# 2.2.2 - 游戏操作区for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN and len(wave_set) < wave_max:position = pygame.mouse.get_pos()wave_set.append([math.atan2(position[1] - (player_pos1[1] + player_height),position[0] - (player_pos1[0] + player_width)),player_pos1[0], player_pos1[1]])if pygame.time.get_ticks() >= fin_time * 1000:running = 0win = 1if health_value == 0:running = 0win = 0#  2.3 游戏结束区while not running and start:pygame.mixer.music.stop()if win:screen.blit(victory, (0, 0))pygame.font.init()font = pygame.font.SysFont('SimHei',32)text = font.render("胜利 !",True, (250, 50, 200))text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerx + 20text_Rect.centery = screen.get_rect().centery - 250screen.blit(text, text_Rect)if not win:screen.blit(game_over, (0, 0))pygame.font.init()font = pygame.font.SysFont('SimHei',32)text = font.render("失败 !",True, (250, 50, 200))text_Rect = text.get_rect()text_Rect.centerx = screen.get_rect().centerx + 20text_Rect.centery = screen.get_rect().centery - 250screen.blit(text, text_Rect)pygame.display.flip()for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()

源代码链接

源代码 github


http://chatgpt.dhexx.cn/article/wcFWEBGX.shtml

相关文章

PyGame游戏编程

Python非常受欢迎的一个原因是它的应用领域非常广泛&#xff0c;其中就包括游戏开发。而是用Python进行游戏开发的首选模块就是PyGame。 1. 初识Pygame PyGame是跨平台Python模块&#xff0c;专为电子游戏设计&#xff0c;包含图像、声音等&#xff0c;创建在SDL&#xff08;…

用pygame做一个简单的python小游戏---生命游戏

用pygame做一个简单的python小游戏—生命游戏 生命游戏&#xff08;Game of Life&#xff09; 生命游戏(Game of Life)是剑桥大学约翰何顿康威(John Horton Conway)教授设计的一个计算机程序。这个计算机程序是因为它模拟和显示的图像看起来颇似生命的出生和繁衍过程而得名为…

python游戏库pygame经典教程

目录 一.Pygame程序基本搭建过程 1.初始化化程序 2.创建Surface对象 3.事件监听 4.游戏循环 二.Pygame Display显示模块详解 1.将Surface对象粘贴至主窗口上 2.设置窗口主窗口 3.填充主窗口背景&#xff0c;参数值RGB 4.设置窗口标题 5.更新屏幕内容 6.pygame.display其他方…

Python游戏编程(Pygame)

安装Pygame pip install pygameC:\Users> pip install pygame Collecting pygame Downloading https://files.pythonhosted.org/packages/3e/f5/feabd88a2856ec86166a897b62bfad828bfe7a94a27cbd7ebf07fd 70399/pygame-1.9.4-cp37-cp37m…

Python、PyGame游戏项目

英文打字游戏项目 项目简介 英文打字小游戏&#xff0c;友好的多界面交互&#xff0c;界面整洁、美观&#xff0c;可动态调节游戏等级难度&#xff0c;可配置游戏信息。 有游戏分数&#xff0c;游戏时间&#xff0c;拼写特效&#xff0c;背景音乐&#xff0c;不同游戏等级的历…

手把手教你用python写游戏

引言 最近python语言大火&#xff0c;除了在科学计算领域python有用武之地之外&#xff0c;在游戏、后台等方面&#xff0c;python也大放异彩&#xff0c;本篇博文将按照正规的项目开发流程&#xff0c;手把手教大家写个python小游戏,项目来自《Python编程从入门到实践》&…

分享30个有趣的 Python小游戏,我能玩一天

大家好&#xff0c;今天给大家带来30个 Python 小游戏&#xff0c;喜欢记得点赞、一定要收藏&#xff0c;完整版代码&#xff0c;文末获取 文章目录 有手就行1、吃金币2、打乒乓3、滑雪4、并夕夕版飞机大战5、打地鼠 简简单单6、小恐龙7、消消乐8、俄罗斯方块9、贪吃蛇 普普通通…

Python游戏汇总:三十个pygame游戏代码【附源码免费分享】

导语 哈喽哈喽&#xff01;我是木木子&#xff01; ​ 每日更新游戏不知不觉已经很多啦~ Python兴趣始于游戏&#xff0c;所以更新的文章中基本上都是游戏代码居多。 然后我疯狂的找各种小游戏、小脚本、小项目的教程源码什么的&#xff0c;然后自己进行学习、制作、修改等…

Python游戏汇总:三十个pygame游戏代码

提示&#xff1a;爱学习哦&#xff0c;不要沉迷游戏&#xff0c;平时打发一下无聊时间最好啦 正文 欢迎阅读&#xff1a; 1.python21点小游戏。2.Python笨鸟先飞小游戏。3.python绘制满天星小游戏。4.吃豆豆小游戏项目。 5.python忍者奔跑小游戏。6.python迷宫小游戏。7.pyt…

8个Python小游戏,可以上班摸鱼玩一天

1、吃金币 源码分享&#xff1a; import os import cfg import sys import pygame import random from modules import *游戏初始化 def initGame():# 初始化pygame, 设置展示窗口pygame.init()screen pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption(ca…

30个Python小游戏,小白练手,我都能玩一天【内附源码】

今天给大家带来30个py小游戏&#xff0c;一定要收藏&#xff01; 全部源码都整理好了&#xff0c;在文章最底部~ 有手就行 1、吃金币 【有手就行系列不介绍玩法了附源码】 源码分享&#xff1a; import os import cfg import sys import pygame import random from module…

迷你项目python

迷你项目python 骰子模拟器石头剪刀布随机密码生成器 骰子模拟器 目的&#xff1a;创建一个程序来模拟掷骰子。 提示&#xff1a;当用户询问时&#xff0c;使用random模块生成一个1到6之间的数字。 import random while int(input(press 1 to roll the dice or 0 to exit:\n…

23款小游戏-Python一行代码就能玩

给IT入门加星标&#xff0c;提升编程技能 free-python-games&#xff0c;一行代码就能进入使用Python开发的小游戏快乐玩耍&#xff01; 安装 pip?install?freegamesPython包括随您的安装一起分发的大量标准库。标准库有一个称为Turtle的模块&#xff0c;这是一种向普通人…

Python游戏开发实战:飞机大战(含代码)

【课程简介】 玩游戏老是输&#xff0c;不如试试自己做个游戏当欧皇。本次课程教大家如何通过pygame模块实现游戏, 以飞机大战为例&#xff0c;讲解游戏的基本机制, 让大家掌握游戏实现原理 &#xff0c;触类旁通更多Python游戏开发。 【课程推荐】Python游戏开发实战&#x…

【Python游戏】Python各大游戏合集:超级玛丽、天天酷跑、我的世界、魔塔、雷霆战机 | 附带源码

相关文件 关注小编&#xff0c;私信小编领取哟&#xff01; 当然别忘了一件三连哟~~ 公众号&#xff1a;Python日志 可以关注小编公众号&#xff0c;会不定时的发布一下Python小技巧&#xff0c;还有很多资源可以免费领取哟&#xff01;&#xff01; 源码领取&#xff1a;加P…

13个Python小游戏(含源码),开始敲起来,玩吧!

来源丨网络 经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个P…

30个Python小游戏,上班摸鱼我能玩一天【内附源码】

大家好&#xff0c;我是辣条。 今天给大家带来30个py小游戏&#xff0c;一定要收藏&#xff01; 目录 有手就行 1、吃金币 2、打乒乓 3、滑雪 4、并夕夕版飞机大战 5、打地鼠 简简单单 6、小恐龙 7、消消乐 8、俄罗斯方块 9、贪吃蛇 普普通通 10、24点小游戏 1…

iosetup mysql_InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts

在一台服务器中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用。 之前运行一直没有问题(最多的时候有23个MySQL实例同时运行)&#xff0c;后来新配置了一台服务器&#xff0c;启动其对应的实例时失败。 部分错误日志如下&#xff1a; …… 140505 16:05:59 …

linux系统中socket错误码:EINTR和EAGAIN的处理

目录 人为重启被中断的系统调用 安装信号时设置 SA_RESTART属性 忽略信号 永远阻塞的系统调用&#xff0c;被信号中断&#xff0c;导致其不继续等待&#xff0c;转而去执行signal_handler 1、什么是慢系统调用&#xff1f; 该术语适用于那些可能永远阻塞的系统调用。永远阻…

iosetup mysql_InnoDB: Error: io_setup() failed with EAGAIN

最近安装好了MySQL之后&#xff0c;在启动MySQL服务时无法正常启动MySQL。提示没有更新/var/lib/mfailedZDB.pid并退出。该MySQL与Oracle位于同一主机。有些内核参数进行过调整应该也是使用与MySQL。下面是该问题的具体描述。 1、故障现象SZDB:/usr/src/mysql_src # /etc/init.…