pygame学习笔记(6):完成一个简单的游戏


Posted in Python onApril 15, 2015

学了这么长时间的Pygame,一直想写个游戏实战一下。看起来很简单的游戏,写其来怎么这么难。最初想写个俄罗斯方块,想了很长时间如何实现,想来想去,也没写出来,于是干脆下载别人的代码来读。后来,要想写一个帮助记忆的挖宝箱的游戏,结果也没完成。唯一完成了就是下面这个小人接金币的游戏,超级简单,通过左右键控制小人移动去接空中下来的金币,接住金币得5分,接不住游戏结束,金币速度会随着level的关数而越来越快。完成这段代码后,我依然觉得这段代码写得很差,确实也是自己对pygame只是掌握了皮毛,对surface、sprite这些理解的还不透彻。这里把代码写出来,有时间的大牛们可以帮助指点一下,让我也有所提高。

 

# -*- coding: cp936 -*-
'''
一个超级简单的游戏
左右键控制小人移动去接空中下来的金币,接住金币得5分,接不住游戏结束,金币速度会随着level的关数
而越来越快
'''
import pygame,sys,os,random
pygame.init()

class rect():#画出小人
  def __init__(self,filename,initial_position):
    self.image=pygame.image.load(filename)
    self.rect=self.image.get_rect()
    self.rect.topleft=initial_position
    
class goldrect(pygame.sprite.Sprite):#绘出金币
  def __init__(self,gold_position,speed):
    pygame.sprite.Sprite.__init__(self)
    self.image=pygame.image.load('image\\gold.png')
    self.rect=self.image.get_rect()
    self.rect.topleft=gold_position
    self.speed=speed
  def move(self):
    self.rect=self.rect.move(self.speed)

    
    


def drawback(): #绘出背景图片
  my_back=pygame.image.load('image\\qi3.jpg') 
  bakscreen.blit(my_back,[0,0])

    
def loadtext(levelnum,score,highscore):#绘出成绩、level、最高分等
  my_font=pygame.font.SysFont(None,24)
  levelstr='Level:'+str(levelnum)
  text_screen=my_font.render(levelstr, True, (255, 0, 0))
  bakscreen.blit(text_screen, (650,50))
  highscorestr='Higescore:'+str(highscore)
  text_screen=my_font.render(highscorestr, True, (255, 0, 0))
  bakscreen.blit(text_screen, (650,80))
  scorestr='Score:'+str(score)
  text_screen=my_font.render(scorestr, True, (255, 0, 0))
  bakscreen.blit(text_screen, (650,110))  

def loadgameover(scorenum,highscore):#绘出GAME OVER
  my_font=pygame.font.SysFont(None,50)
  levelstr='GAME OVER'
  over_screen=my_font.render(levelstr, True, (255, 0, 0))
  bakscreen.blit(over_screen, (300,240))
  highscorestr='YOUR SCORE IS '+str(scorenum)
  over_screen=my_font.render(highscorestr, True, (255, 0, 0))
  bakscreen.blit(over_screen, (280,290))
  if scorenum>int(highscore):#写入最高分
    highscorestr='YOUR HAVE GOT THE HIGHEST SCORE!'
    text_screen=my_font.render(highscorestr, True, (255, 0, 0))
    bakscreen.blit(text_screen, (100,340))
    highfile=open('highscore','w')
    highfile.writelines(str(scorenum)) 
    highfile.close() 
  
def gethighscore(): #读取最高分
  if os.path.isfile('highscore'):
    highfile=open('highscore','r')
    highscore=highfile.readline() 
    highfile.close() 
  else:
    highscore=0
  return highscore
         
bakscreen=pygame.display.set_mode([800,600])
bakscreen.fill([0,160,233])
pygame.display.set_caption('Dig!Dig!')
drawback()



levelnum=1 #level
scorenum=0 #得分
highscore=gethighscore()#最高分
ileft=1 #记录向左移动步数,用来控制图片
iright=10 #记录向右移动步数,用来控制图片
x=100
y=450
filename='image\\1.png'
backimg_ren=rect(filename,[x,y])
bakscreen.blit(backimg_ren.image,backimg_ren.rect)
loadtext(levelnum,scorenum,highscore)
goldx=random.randint(50,580)
speed=[0,levelnum]
mygold=goldrect([goldx,100],speed) 
pygame.display.update()

while True:
  if scorenum>0 and scorenum/50.0==int(scorenum/50.0):#当得分是50的倍数时修改level
    levelnum=scorenum/50+1
    speed=[0,levelnum]
  
  for event in pygame.event.get():
    if event.type==pygame.QUIT:
      sys.exit()
  #make gold  

  pressed_keys = pygame.key.get_pressed()
  if pressed_keys[pygame.K_LEFT]:#按下左键

    drawback() 
    loadtext(levelnum,scorenum,highscore)

    if iright > 14 :iright=10
    iright=iright+1
    filename='image\\'+str(iright)+'.png'
    if x<50 :
      x=50
    else:
      x=x-10

    backimg_surface=rect(filename,[x,y])
    bakscreen.blit(backimg_surface.image,backimg_surface.rect)

    
  if pressed_keys[pygame.K_RIGHT]:#按下右键

    drawback()
    loadtext(levelnum,scorenum,highscore)

    if ileft > 4 :ileft=0
    ileft=ileft+1
    filename='image\\'+str(ileft)+'.png'
    if x>560:
      x=560
    else:
      x=x+10

    backimg_surface=rect(filename,[x,y])
    bakscreen.blit(backimg_surface.image,backimg_surface.rect)

  drawback()
  loadtext(levelnum,scorenum,highscore)
  mygold.move()
  bakscreen.blit(mygold.image,mygold.rect) 
  
  backimg_surface=rect(filename,[x,y])
  bakscreen.blit(backimg_surface.image,backimg_surface.rect)
  if mygold.rect.top>600:#判断金币是否着地,一但着地,游戏结束
    loadgameover(scorenum,highscore)
  if mygold.rect.colliderect(backimg_surface.rect):#判断金币是否与小人碰撞,如果碰撞表示小人接到金币
    scorenum+=5
    loadtext(levelnum,scorenum,highscore)
    goldx=random.randint(50,580)
    mygold=goldrect([goldx,100],speed) 
  pygame.display.update()

程序中用到的资源可从这里下载:文件名:gold.7z, 访问地址:http://www.kuaipan.cn/file/id_16699292408348719.htm

Python 相关文章推荐
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
python使用mysql的两种使用方式
Mar 07 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
python中Lambda表达式详解
Nov 20 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
Python实战之OpenCV实现猫脸检测
Jun 26 Python
python如何读取和存储dict()与.json格式文件
Jun 25 Python
pygame学习笔记(5):游戏精灵
Apr 15 #Python
pygame学习笔记(4):声音控制
Apr 15 #Python
Python的Django框架使用入门指引
Apr 15 #Python
python中xrange用法分析
Apr 15 #Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 #Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 #Python
python实现telnet客户端的方法
Apr 15 #Python
You might like
xml+php动态载入与分页
2006/10/09 PHP
php,不用COM,生成excel文件
2006/10/09 PHP
php中一个有意思的日期逻辑处理
2012/03/25 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
PHP asXML()函数讲解
2019/02/03 PHP
Javascript 中介者模式实例
2009/12/16 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
营销人才自我鉴定范文
2013/12/25 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript