【Python】Python-skier游戏[摘自.与孩子一起学编程]
这是一个滑雪者的游戏。
skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向。
准备素材
一 准备python环境:我下载的python2.6 IDLE
二 pygame安装下载:http://www.pygame.org/download.shtml,双击安装即可
注意1 安装时需要选择对应的python路径
注意2 安装的位数要与python一致,64对32位无法成功使用
校验是否成功:在python里import pygame无异常,即可正确使用
三 图片资料,需要一个skier_down.png
,一个skier_crash.png
,skier_left1.png
和skier_left2.png
,skier_right1.png
和skier_right2.png
,还有一颗树skier_tree.png
和一个旗子skier_flag.png
。
四 好啦,开始写代码再运行就OK啦:注释再加吧。
#-*- coding:utf-8 -*-
import pygame,sys,random
#定义图片元素列表
skier_images=["skier_down.png","skier_right1.png","skier_right2.png","skier_left2.png","skier_left1.png"]
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.image.load("skier_down.png")
self.rect=self.image.get_rect()
self.rect.center=[320,100]
self.angle=0
def turn(self,direction):
self.angle=self.angle+direction
if self.angle<-2:
self.angle=-2
if self.angle>2:
self.angle=2
center=self.rect.center
self.image=pygame.image.load(skier_images[self.angle])
self.rect=self.image.get_rect()
self.rect.center=center
speed=[self.angle,6-abs(self.angle)*2]
return speed
#滑雪者左右移动
def move(self,speed):
self.rect.centerx=self.rect.centerx+speed[0]
if self.rect.centerx<20:
self.rect.centerx=20
if self.rect.centerx>620:
self.rect.centerx=620
#创建树和小旗
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self,image_file,location,type):
pygame.sprite.Sprite.__init__(self)
self.image_file=image_file
self.image=pygame.image.load(image_file)
self.location=location
self.rect=self.image.get_rect()
self.rect.center=location
self.type=type
self.passed=False
#让场景向上滚动
def scroll(self,t_ptr):
self.rect.centery=self.location[1]-t_ptr
#创建一个窗口,包含随机的树和小旗
def create_map(start,end):
obstacles=pygame.sprite.Group()
gates=pygame.sprite.Group()
locations=[]
for i in range(10):
row=random.randint(start,end)
col=random.randint(0,9)
location=[col*64+20,row*64+20]
if not (location in locations):
locations.append(location)
type=random.choice(["tree","flag"])
if type=="tree":
img="skier_tree.png"
elif type=="flag":
img="skier_flag.png"
obstacle=ObstacleClass(img,location,type)
obstacles.add(obstacle)
return obstacles
#有移动时重辉屏幕
def animate():
screen.fill([255,255,255])
pygame.display.update(obstacles.draw(screen))
screen.blit(skier.image,skier.rect)
screen.blit(score_text,[10,10])
pygame.display.flip()
#切换到场景的下一屏
def updateObstacleGroup(map0,map1):
obstacles=pygame.sprite.Group()
for ob in map0:
obstacles.add(ob)
for ob in map1:
obstacles.add(ob)
return obstacles
#做好准备
pygame.init()
screen=pygame.display.set_mode([640,640])
clock=pygame.time.Clock()
skier=SkierClass()
speed=[0,6]
map_position=0
points=0
map0=create_map(20,29)
map1=create_map(10,19)
activeMap=0
obstacles=updateObstacleGroup(map0,map1)
font=pygame.font.Font(None,50)
#开始主循环,每秒更新30次图形
while True:
clock.tick(30)
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_LEFT:
speed=skier.turn(-1)
elif event.key==pygame.K_RIGHT:
speed=skier.turn(1)
skier.move(speed)
map_position+=speed[1] if map_position>=640 and activeMap==0:
activeMap=1
map0=create_map(20,29)
obstacles=updateObstacleGroup(map0,map1)
if map_position>=1280 and activeMap==1:
activeMap=0
for ob in map0:
ob.location[1]=ob.location[1]-1280
map_position=map_position-1280
map1=create_map(10,19)
obstacles=updateObstacleGroup(map0,map1)
for obstacle in obstacles:
obstacle.scroll(map_position)
hit=pygame.sprite.spritecollide(skier,obstacles,False)
if hit:
if hit[0].type=="tree" and not hit[0].passed:
points=points-100
skier.image=pygame.image.load("skier_crash.png")
animate()
pygame.time.delay(1000)
skier.image=pygame.image.load("skier_down.png")
skier.angle=0
speed=[0,6]
hit[0].passed=True
elif hit[0].type=="flag" and not hit[0].passed:
points+=10
obstacles.remove(hit[0])
score_text=font.render("Score:"+str(points),1,(0,0,0))
animate()
5 我遇到的问题
问题1 self.image=pygame.image.load("skier_down.png") error: Couldn't open skier_down.png
解决:需要将png文件与py代码放到同一个路径下
问题2 python代码中的注释 关键字 字符串等不能高亮显示
解决:是因为python代码未保存成*.py后缀文件
问题3 TypeError: 'NoneType' object is not iterable
解决:对应调用的class为写return。
问题4 关闭游戏框可以退出游戏但是并不能关闭游戏框
解决: 在sys.exit()前加一个pygame.quit()
【Python】Python-skier游戏[摘自.与孩子一起学编程]的更多相关文章
- 转【Python】Python-skier游戏[摘自.与孩子一起学编程]
http://www.cnblogs.com/zhaoxd07/p/4914818.html 我遇到的问题 问题1 self.image=pygame.image.load("skier_d ...
- 【和孩子一起学编程】 python笔记--第二天
第六章 GUI:用户图形界面(graphical user interface) 安装easygui:打开cmd命令窗口,输入:pip install easygui 利用msgbox()函数创建一个 ...
- 【和孩子一起学编程】 python笔记--第一天
[该随笔记录本人在阅读过程写的笔记和一些问题,格式比较随意,不定时更新] 由于该书使用的python版本为2.5,本人使用的为3.6. 第一章: 遇到的第一个问题: 1.3节 输出指令: print ...
- 【和孩子一起学编程】 python笔记--第四天
第十一章: 可变循环 newStars = int(input("how many stars do you want?")) for i in range(newStars): ...
- 【和孩子一起学编程】 python笔记--第三天
第十章 游戏时间:Skier 首先安装pygame,直接在cmd命令控制框里键入pip install pygame就可以了 代码: import pygame, sys, random skier_ ...
- 【和孩子一起学编程】 python笔记--第五天
关于python2在python3中的改动: https://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5MDEyMDk4Mw==&appmsgid=1 ...
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
- 教孩子学编程 Python
教孩子学编程 Python 目录 第1 章 Python 基础:认识环境 111 认识Python 312 用Python 编写程序 513 运行Python 程序 514 本章小结 615 编程 ...
- 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门
百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
随机推荐
- 研读代码必须掌握的Eclipse快捷键
1. Ctrl+左键 和F3 这个是大多数人经常用到的,用来查看变量.方法.类的定义跳到光标所在标识符的定义代码.当按执行流程阅读时,F3实现了大部分导航动作. 2 Ctrl+Shift+G在工作空间 ...
- python logging 日志轮转文件不删除问题
前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...
- 区间型动规--石子归并(Pascal)
题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使 ...
- cocos2dx之Lua调用C++
现在cocos2dx3.8自己封装了以前的toLua++,比以前更好用了. 先来看一下整体步骤: 1.编写一个.ini文件. 2,修改genbindings.py脚本. 3,执行genbindings ...
- 【BZOJ [1878】[SDOI2009]HH的项链
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- PHP截取字符串,获取长度,获取字符位置的函数
strstr(string,string) = strchr(,) //从前面第一次出现某个字符串的地方截取到最后strrchr(string,string) //从某个字符串从最后出现的位置截取到结 ...
- 酷摄影:关于梦 - Miki takahashi
这组摄影来自于日本东京摄影师 Miki takahashi 是一组双重曝光摄影,分开看也许很平常,但是结合在一起却非常有韵味. [gallery]
- DBNull.Value 字段的用法
DBNull 是一个单独的类,这意味着该类只能存在此实例.它指数据库中数据为空(<NULL>)时,在.net中的值 如果数据库字段的数据缺失,则您可以使用 DBNull.Value 属性将 ...
- Java API ——Scanner类
1.Scanner类概述 JDK5以后用于获取用户的键盘输入,一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器.Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空 ...
- Use powerful plugins in your vim.
# setup by root wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz tar -xzvf ctags-5.8.t ...