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实现socket客户端和服务端简单示例
Feb 24 Python
python多进程共享变量
Apr 06 Python
Python检测网络延迟的代码
May 15 Python
Python判断telnet通不通的实例
Jan 26 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
Python jieba库用法及实例解析
Nov 04 Python
Python中itertools的用法详解
Feb 07 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
手把手教你用Django执行原生SQL的方法
Feb 18 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php GUID生成函数和类
2014/03/10 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
div模拟滚动条效果示例代码
2013/10/16 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
Three.js快速入门教程
2016/09/09 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
javascript history对象详解
2017/02/09 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python制作Windows系统服务
2017/03/25 Python
python 格式化输出百分号的方法
2019/01/20 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
简单了解python变量的作用域
2019/07/30 Python
使用python实现对元素的长截图功能
2019/11/14 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
党性分析自查总结
2014/10/14 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python