【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的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
随机推荐
- 制作滚动视图(ScrollView)
怎样判断是否应当使用滚动视图 所谓的滚动视图,是指一个可以滑动的视窗,视窗大小和位置固定不变,视窗内的内容用户可以通过手指滑动或者拖动滚动天来进行滚动浏览. 滚动视图的目的是为了解决同类内容过多,一个 ...
- Unity寻路的功能总结
源地址:http://blog.csdn.net/sgnyyy/article/details/21878163 1. 利用Unity本身自带的NavMesh 这篇文章已经比较详细,可能对于很多需要a ...
- ActivePython2.7 +Firefly1.2.2+WIN7服务器搭建过程(已通过)
原地址:http://www.9miao.com/question-15-54027.html 1.ActivePython2.7 版本(内部已经包含easy_install,pywin32)2.所需 ...
- android 多个listView的向下滚动设置 listView动态设置高度代码
墨迹天气图: 这里都是用的android里面的shape实现的,实现起来比较简单,只是在滚动的时候有点小麻烦... 当我们多个ListView超出了它的父控件LinearLayout的时候,它们每个L ...
- FF浏览器来帮助我们录制脚本
有时我们录制一个页面的脚本,我们需要知道这个页面哪些请求是耗时最大的?这个时候FF浏览器的网络分析功能就可以派上用场了,打开火狐浏览器按F12: 点击重新载入,可以看到下面的信息: 看到最耗时的操作了 ...
- 李洪强iOS开发之使用CycleScrollView实现轮播图
01 导入头文件,并且定义CycleScrollView属性 02 初始化,设置frame并且添加到collectionView上 03 调用方法并且设置轮播的图片
- 126. Word Ladder II
题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...
- GCC警告选项例解
程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵.遇到任意一条编译器警告都坚决不放过.有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splin ...
- init进程解析rc文件的相关函数分析
init进程的源码文件位于system/core/init,其中解析rc文件语法的代码放在五个函数中, init_parse_config_file (init_parser.c), read_fil ...
- WinAPI——钩子函数大全3
函数原形:LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam); 参数: code:指示一个代码,被 ...