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的Bottle框架的一些使用技巧介绍
Apr 08 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
django使用html模板减少代码代码解析
Dec 12 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
python实现简单flappy bird
Dec 24 Python
Python面向对象之类的定义与继承用法示例
Jan 14 Python
详解如何设置Python环境变量?
May 13 Python
python打开使用的方法
Sep 30 Python
django中瀑布流写法实例代码
Oct 14 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
python Matplotlib模块的使用
Sep 16 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
我的群发邮件程序
2006/10/09 PHP
php zip文件解压类代码
2009/12/02 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python对文件操作知识汇总
2016/05/15 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
解决python报错MemoryError的问题
2018/06/26 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
怎么快速自学python
2020/06/22 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
自动化专业本科毕业生求职信
2013/10/20 职场文书
酒店人事专员岗位职责
2013/12/19 职场文书
项目建议书范文
2014/05/12 职场文书
调研座谈会发言材料
2014/08/23 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
golang 实现并发求和
2021/05/08 Golang