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 列表(List)操作方法详解
Mar 11 Python
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
Python反射和内置方法重写操作详解
Aug 27 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
在Python中定义一个常量的方法
Nov 10 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
python pandas时序处理相关功能详解
Jul 03 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
python小白切忌乱用表达式
May 29 Python
详解Python中的进程和线程
Jun 23 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
php中的一个中文字符串截取函数
2007/02/14 PHP
php 中英文语言转换类代码
2011/08/11 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
PHP缓冲区用法总结
2016/02/14 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
Javascript alert消息换行的方法
2013/08/07 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
第六章之辅组类与响应式工具
2016/04/25 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
基于Bootstrap下拉框插件bootstrap-select使用方法详解
2018/08/07 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[03:09]显微镜下的DOTA2第一期——带你走进华丽的DOTA2世界
2014/06/20 DOTA
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
python基础教程项目二之画幅好画
2018/04/02 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
中专自我鉴定
2014/02/05 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
入党介绍人意见2015
2015/06/01 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis