python3小游戏(1):吃苹果小游戏

 

python小白群交流:861480019

注意,申请入群时必须备注“不发广告”,不然不通过(禁止在群里发广告,不然诅咒你),另外这个群都是一群和我一样的小白,大家谁也不说谁,共同进步(ps:写这个文章时,只有我一人)

一. 概述:

1.本文是基于pygame库开发的小游戏,主要功能有:

(1).可以通过键盘的上下左右四个键来控制主人公小刘的位置(同是移动方向不同,小刘的姿势也不同)

(2).游戏开始界面会随机飘着大约40个苹果,如果小刘碰到苹果,会把它吃掉,同是增加界面下方显示的血量

(3).吃完苹果,game over

 

 

2.从游戏开发及完成的全过程看,分为个步骤:

 

(1).开发工具:pycharm;python版本python3.6;window版本win7 64位

 

(2).需要安装pygame库,

(3).如果要打包成exe可执行程序,则需要安装pyinstaller库,

二.干活(安装库的过程就不写了,网上一大堆,需要提醒的是python版本和这些库版本一定要匹配):

1.造个小小小库(哈~可见有多小):

        (1).之所以造库是因为我们这个小游戏中有两个活物:主人公小刘和苹果;这个库有两功能:

                    a.主人公小刘,我们有一个矩阵图片如下,拿出“找泥妹”的眼里看一下有啥区别。(一天后。。。)。                        昨天我们让你看下面图片找出区别,我公布答案吧,每一行代表一个方向,同一行内,每一列代表小刘走一步需                          要怎么迈步。我们需要一个方法在小刘拐弯时知道他拐哪边,在下图聚焦到一个姿势显示到界面。(下面图片想用的话,直接右键下载即可)

                   

                     b.苹果:我们因为需要在游戏开始在界面漂浮40个苹果,并在小刘吃了一个后把他去掉,这样不可能一个一个创建,这 里也需要一个方法

          (2).代码实现(我把这文件命名为myLibrary.py)

 

# -*- coding: utf-8 -*-
# @Time    : 2018/5/17 0017 上午 8:32
# @Author  : silents
# @FileName: myLibrary.py
# @Software: PyCharm
# @Blog    :http://blog.csdn.net/chq1005613740
import pygame
from pygame.locals import *
class Point():def __init__(self, x,y):self.X =xself.Y =yclass MySprite(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.master_image = Noneself.frame = 0self.old_frame = -1self.frame_width = 1self.frame_height = 1self.first_frame = 0self.last_frame = 0self.columns = 1self.last_time = 0self.direction = 0self.X = 0self.Y = 0#新增了velocity属性,他是一个pointself.velocity = Point(0.0,0.0)def load(self, filename, position, bg_size):self.image = pygame.image.load(filename).convert_alpha()self.rect = self.image.get_rect()#苹果的位置self.rect.left, self.rect.top = position#self.speed = speedself.width, self.height = bg_size[0], bg_size[1]def load_column(self, filename, position, bg_size, columns):self.master_image = pygame.image.load(filename).convert_alpha()self.frame_width = bg_size[0]self.frame_height = bg_size[1]self.position = positionself.rect  = self.master_image.get_rect()self.ori_frame_width = self.rect.widthself.ori_frame_height = self.rect.heightself.rect.left, self.rect.top = positionself.rect.width,self.rect.height = bg_size[0],bg_size[1]self.columns = columnsself.last_frame = (self.ori_frame_width // bg_size[0]) * (self.ori_frame_height // bg_size[1]) - 1def update(self, current_time, rate=60):if current_time > self.last_time + rate:self.frame += 1if self.frame > self.last_frame:self.frame = self.first_frameself.last_time = current_timeif self.frame != self.old_frame:frame_x = (self.frame % self.columns) * self.frame_widthframe_y = (self.frame // self.columns) * self.frame_height# rect = ( self.X, self.Y, self.frame_width, self.frame_height )rect = ( frame_x, frame_y, self.frame_width, self.frame_height )self.rect.left, self.rect.top = self.X, self.Yself.image = self.master_image.subsurface(rect)self.old_frame = self.frame

可以看出代码很少,主要分三部分(请自行忽略初始化部分):

a.  方法load:主要是为创建苹果而准备,

        加载图片 -->  获取图片大小  -->  获取图片位置  

b.  方法load_column:主要为小刘而准备,

        加载图片 --> 获取图片位置 --> 获取图片大小  --> 把图片切割成64块(每块一个姿势)

c.  方法update:也为小刘而准备,

       对load_colunm中切割完的64块piece进行切换,同时移动位置

2.写一个小小调用(可见比上面少了一个“小”,有点麻烦,心脏不好,高血压勿进):

  (1). 开始之前需要先了解几个概念:

           a. 精灵:你可以简单的理解为一个需要显示的图片

           b. 精灵组:你可以简单的理解为一组需要显示的图片

           c.碰撞检测:在程序中,我们理解为两个精灵是否碰撞,精灵和精灵组是否碰撞,精灵组和精灵组是否碰撞

   (2). 大致流程:

          a.创建玩家精灵组:里面是上面切割完的64块小刘

          b. 创建苹果精灵组:里面是在界面位置随机的40个苹果

          c. 设置定时器:定时更新界面

          d.检测键盘按键:作为小刘移动的依据

          e.移动小刘:让他去吃苹果

          f.检测碰撞:此游戏中属于精灵和精灵组的碰撞(两次检测,逐一分析代码),把碰撞的苹果吃掉

          g. 更新血量:小刘吃一个苹果就增加一点血

   (3). 代码搬运(此文件我把它叫walk.py)

# -*- coding: utf-8 -*-
# @Time       : 2018/5/17 0017 上午 10:30
# @Author     : silents
# @FileName   : fifth_walk.py
# @Software   : PyCharm
# @Blog       :http://blog.csdn.net/chq1005613740
# @Description: Buttons to control the movement of people,
#               people eat apples,
#               people eat apples will increase blood,
#               eat blood overimport itertools, sys, time, random, math, pygame
from pygame.locals import *
from game_go.myLibrary import *def calc_velocity(direction, vel=1.0):velocity = Point(0, 0)if direction == 0:  # 上velocity.Y = -velelif direction == 2:  # 右velocity.X = velelif direction == 4:  # 下velocity.Y = velelif direction == 6:  # 左velocity.X = -velreturn velocitypygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("吃苹果")
font = pygame.font.SysFont('arial',36)
timer = pygame.time.Clock()# 创建精灵组
player_group = pygame.sprite.Group()
food_group = pygame.sprite.Group()# 初始化玩家精灵组
#def load_column(self, filename, position, bg_size, columns):
position = 800/2-10,600/2+10
bg_size = 62.5, 62.5
player = MySprite()
player.load_column("res//walk.png",position, bg_size, 8)
# player.position = 80, 80
player.direction = 4
player_group.add(player)# 初始化food精灵组for n in range(1, 40):food = MySprite();position = random.randint(0, 750), random.randint(0, 550)bg_size = 50, 48food.load("res//apple.png", position, bg_size)food_group.add(food)game_over = False
player_moving = False
player_health = 0while True:timer.tick(30)ticks = pygame.time.get_ticks()for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()keys = pygame.key.get_pressed()if keys[K_ESCAPE]:sys.exit()elif keys[K_UP] or keys[K_w]:player.direction = 0player_moving = Trueelif keys[K_RIGHT] or keys[K_d]:player.direction = 2player_moving = Trueelif keys[K_DOWN] or keys[K_s]:player.direction = 4player_moving = Trueelif keys[K_LEFT] or keys[K_a]:player.direction = 6player_moving = Trueelse:player_moving = Falseif not game_over:# 根据角色的不同方向,使用不同的动画帧player.first_frame = player.direction * player.columnsplayer.last_frame = player.first_frame + player.columns - 1if player.frame != player.first_frame:player.frame = player.first_frameif not player_moving:# 当停止按键(即人物停止移动的时候),停止更新动画帧player.frame = player.first_frame = player.last_frameelse:player.velocity = calc_velocity(player.direction, 2)player.velocity.X *= 2player.velocity.Y *= 2# 更新玩家精灵组player_group.update(ticks, 50)# 移动玩家if player_moving:player.X += player.velocity.Xplayer.Y += player.velocity.Yif player.X  < 0:player.X = 0elif player.X > 700:player.X = 700if player.Y  <0:player.Y = 0elif player.Y > 500:player.Y = 500myfont = pygame.font.SysFont('arial',36)white = 255, 255, 255textImage = myfont.render("Hello Pygame:%i-%i" %(player.X,player.Y), True, white)# 检测玩家是否与食物冲突,是否吃到果实attacker = Noneattacker = pygame.sprite.spritecollide(player, food_group, False, pygame.sprite.collide_circle)if len(attacker) !=0:for atta in attacker:# if pygame.sprite.collide_circle(player, atta):if pygame.sprite.collide_circle_ratio(0.65)(player, atta):player_health += 2;food_group.remove(atta);if player_health > 100: player_health = 100# 更新食物精灵组# food_group.update(ticks, 50)if len(food_group) == 0:game_over = True# 清屏screen.fill((50, 50, 100))# 绘制精灵food_group.draw(screen)player_group.draw(screen)# 绘制玩家血量条pygame.draw.rect(screen, (50, 150, 50, 180), Rect(300, 570, player_health * 2, 25))pygame.draw.rect(screen, (100, 200, 100, 180), Rect(300, 570, 200, 25), 2)if game_over:textImage = font.render("G A M E   O V E R", True, (0,0,0))screen.blit(textImage, (100,100))# print_text(font, 300, 100, "G A M E   O V E R")screen.blit(textImage, (300,500))pygame.display.update()

 

(因为本人菜鸟,大家过程中有问题就留言,我会的肯定马上回复,不像某些大神那么忙)

 

 

三. 打包,发货

      现在我们可以把py打包成exe了,嘤嘤嘤。。。

1.安装pyinstaller库

    cmd到python3路径下,执行如下命令:

            pip3 install pyinstaller

2. 打包(如果有资源文件,如图片等,则需要按同样目录复制到exe同目录下)

    pyinstaller -F -w walk.py

     注意:

(1).如出现"failed to execute main"错误,则执行下面命令(显示详细报错信息):

pyinstaller -D  main.py

(2).如出现以下错误,则执行命令:

pyinstaller --clean --win-private-assemblies -F XXXX.py

备注:

--clean清除pyinstaller的缓存并移除之前建立的临时文件,

 --win-私人组件把跟这个程序捆绑的共享的组件都改为私有的

调试阶段不用-w,因为如果有错误就打印在终端了而不是闪退

3. 嘚瑟

     请自行脑补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621263.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

接苹果游戏 小学生邀请赛T3

思路&#xff1a; 虽然M代表了小船的占列宽&#xff0c;但是小船每次只能移动一格&#xff0c;所以我们首先排除在小船初始位置范围内的苹果&#xff0c;然后再让小船一步一步移动&#xff0c;直到最大范围能够接到苹果&#xff0c;因为小船初始位置在最左侧&#xff0c;所以不…

【MongoDB系列】-MongoDB详解(一文让你明白什么是MongoDB)

MongoDB简介 MongoDB 是一个开源的、跨平台的、面向文档的、基于分布式文件存储的数据库系统&#xff0c;MongoDB 是由 C 语言开发&#xff0c;旨在为 Web 应用提供可扩展的高性能数据存储解决方案。在高负载的情况下&#xff0c;通过添加更多的节点&#xff0c;可以保证服务器…

【蓝桥杯选拔赛真题13】Scratch接苹果游戏 少儿编程scratch蓝桥杯选拔赛真题讲解

目录 scratch接苹果游戏 一、题目要求 编程实现 二、题目分析

【JAVA】String 类

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; String 1. 字符串构造2. String对象的比…

2005-2022年全国各地级市经济增长目标约束

2005-2022年全国各地级市经济增长目标约束 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a;省份、城市、年份、经济增长目标硬约束、经济增长目标软约束 4、范围&#xff1a;地级市&#xff0c;每年具体城市数量参看下面图片 5、指标…

第七周 停车场模拟

烟台大学计算机与控制工程学院 作者&#xff1a; 郝环宇 日期&#xff1a;10.13 问题描述:设停车场是一个可停放n辆汽车的狭长死胡同&#xff0c;南边封口&#xff0c;汽车只能从北边进出&#xff08;这样的停车场世间少有&#xff09;。 汽车在停车场内按车辆到达时间的先后…

实战项目密室逃脱

密室逃脱 对摄像机的智能控制&#xff08;很有用&#xff09;&#xff0c;当遇到墙壁时可以自动抬高。 把环境设为静态的&#xff0c;调小slope&#xff0c;调小半径&#xff0c;bake。 创建AI机器人&#xff0c;给上如图组件&#xff0c;大的球碰撞器用来检测是否遇到玩家…

【Java】789. 逃脱阻碍者---简化主题大意,主要求x+y和到达目标点的最短距离,快速解决问题!!!

你在进行一个简化版的吃豆人游戏。你从 [0, 0] 点开始出发&#xff0c;你的目的地是 target [xtarget, ytarget] 。地图上有一些阻碍者&#xff0c;以数组 ghosts 给出&#xff0c;第 i 个阻碍者从 ghosts[i] [xi, yi] 出发。所有输入均为 整数坐标 。 每一回合&#xff0c;…

【蓝桥模板】——迷宫逃脱夺命3问,你能坚持到哪1问?(BFS模板)

大家好&#xff0c;我是爱分享的小蓝&#xff0c;欢迎交流指正~ 全文目录&#x1f9ed; &#x1f381;说在前面 &#x1f3c6;模板-BFS迷宫⭐ &#x1f680;传送锚点​ &#x1f4a1;思路点拨 &#x1f35e;代码详解 &#x1f3c6;走迷宫Ⅰ⭐ &#x1f680;传送锚点 &…

MVSNet 和 PatchMatchNet 的DTU数据集 几个不同之处 一定要注意

文章目录 1 测试集 数据加载不同2 训练集 数量 分辨率不同 1 测试集 数据加载不同 1.MVSNet 的DTU测试数据集和PatchmatchNet测试数据集不一样&#xff1b; 区别在于数据加载&#xff0c;前者 cams文件最后是最小深度和间隔&#xff0c;后者是最小深度和最大深度。 2 训练集 …

最强嘴提o.o文字转语音

下载 链接&#xff1a;https://pan.baidu.com/s/1cb24WW2dihtRpMz4giMxyw 提取码&#xff1a;k3xu 解压密码&#xff1a;领航员未鸟 项目源码&#xff1a;https://github.com/Plachtaa/VITS-fast-fine-tuning/tree/main 使用 解压后来到&#xff0c;该目录下&#xff0c;把…

覆盖诊所全流程管理,适合中大型诊所门诊的门诊管理系统

诊所全流程管理查询 从线上与线下的角度入手&#xff0c;一套合格好用的诊所管理系统包括互联网医疗的线上咨询问诊、预约挂号&#xff0c;并且还有线下的患者登记、病历处方录入、药品进销存、财务报表等管理&#xff0c;将各位患者的信息数据在平台共享&#xff0c;方便医生…

医生病人管理系统MySQL设计_医院门诊管理系统的设计与实现(JSP,MySQL)(含录像)

医院门诊管理系统的设计与实现(JSP,MySQL)(含录像)(毕业论文6800字,程序代码,MySQL数据库) 随着信息化的飞速发展和普遍使用&#xff0c;计算机在各行各业得到越来越广泛的应用&#xff0c;医疗卫生领域作为实现信息化的重点&#xff0c;医院面临信息时代的挑战&#xff0c;医院…

门诊分诊管理系统分诊台程序

其详细功能如下&#xff1a;1. 设置挂号数量警报线系统可以为每个科室的每个医生&#xff08;特别是专家号&#xff09;&#xff0c;设定挂号数量警报线。当就诊病人数量超过限定的数量时&#xff0c;计算机系统会自动报警来通知管理人员、护士、医生&#xff0c;以便及时提示护…

网络工程毕业设计 SSM疫情期间医院门诊管理系统(源码+论文)

文章目录 1 项目简介2 实现效果2.1 界面展示 3 设计方案3.1 概述3.2 系统开发流程3.3 系统结构设计 4 项目获取 1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的…

ssm java mysql_医院门诊管理系统_

息化不断建设发展的今天&#xff0c;医院看病预约&#xff0c;医生的挂号等&#xff0c;已经十分方便&#xff0c;通过在线挂号&#xff0c;医生的查看&#xff0c;就能够了解到医院的门诊基本信息&#xff0c;并且可以在线进行门诊的医生查看&#xff0c;医院最新的资讯等&…

java校园医院门诊管理系统ssm

系统分为用户&#xff0c;医生和管理员三个角色 1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户…

计算机毕业设计 SSM+MySQL毕业设计 疫情期间医院门诊管理系统

摘 要 21世纪的到来&#xff0c;国家的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;智能科技时代崛起的优势&#xff0c;医院门诊管理系统当然也不能排除在外。疫情期间医院门诊管理系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;…

基于javaweb+jsp的医院门诊病例管理系统

基于javawebjsp的医院门诊病例管理系统 JavaWeb JavaBean JSP MVC MySQL Tomcat JavaScript Bootstrap 基础JSPServlet或JSPSSM(Spring、SpringMVC、MyBatis)框架或JSPSSMMaven(pom.xml)框架或SpringBoot…均可修改 开发工具&#xff1a;eclipse/idea/myeclipse/sts等均可配…

涛然自得周刊(第06期):韩版苏东坡的突围

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后&#xff0c;丁被大自然环境疗愈&#…