设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 35969|回复: 11
打印 上一主题 下一主题

【Pygame 第7课】 多变的宿敌

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-8-29 23:45:09 |显示全部楼层 |倒序浏览
在游戏中,一般都有个宿敌什么的。在我们这个打飞机小游戏中,宿敌就是不断从天而降的敌机。它与本机、子弹构成了这个游戏的三个要素:

  • 本机会发射子弹,子弹向上运动
  • 敌机会不停产生,向下运动
  • 子弹碰到敌机,敌机和子弹都销毁,加分
  • 本机碰到敌机,本机和敌机都销毁,游戏结束


这节课就来创造这个宿敌。

同样,为敌机创建一个类:Enemy,类的内容大致与Bullet相似。
  1. class Enemy:
  2.     def __init__(self):
  3.         self.x = 200
  4.         self.y = -50
  5.         self.image = pygame.image.load('enemy.png').convert_alpha()

  6.     def move(self):
  7.         if self.y < 800:
  8.             self.y += 0.3
  9.         else:
  10.             self.y = -50
复制代码
让敌机在屏幕上方外部靠中间的位置产生,并且在每一次循环中都向下移动,当飞出屏幕下方后,就回到屏幕上方重新开始。

和bullet一样,我们创建一个Bullet对象,然后在循环中调用它的move方法,并且绘制在屏幕上。
  1. enemy = Enemy()

  2. while True:
  3.     ###
  4.     enemy.move()
  5.     screen.blit(enemy.image, (enemy.x, enemy.y))
复制代码
运行程序。敌机开始在屏幕中部周而复始地自上向下运动。

这宿敌也太呆了吧!
这样的游戏谁要玩!

所以我们要加点随机性。

让敌机的出现位置有变化,让它的速度有变化。

给Enemy增加一个restart方法:
  1. def restart(self):
  2.     self.x = random.randint(50, 400)
  3.     self.y = random.randint(-200, -50)
  4.     self.speed = random.random() + 0.1
复制代码
它的作用是,给敌机在屏幕上方的一定范围内随机一个初始位置,然后再给它增加一个叫做speed的随机量,作为它的速度,在move函数中被使用。这样,它的行为开始有了变化。这里用到了random模块,记得在程序开头import它。

restart在__init__函数以及飞出屏幕下方时调用。后面,在敌机被击中的时候,也会要调用它。

再次运行程序,看上去有那么点意思了。如果敌机再多一点,子弹再多一点,就更好了。这个,留在下节课中说。

7game.png
7-1.png

7-2.png

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程

enemy.png (5.88 KB, 下载次数: 1606)

enemy.png

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2013-9-1 22:46:41 |显示全部楼层
jpjlqone 发表于 2013-9-1 15:12
游戏已经可以玩了,但计分有问题每次得分都会在原来 的数字上面复写,而不是更新数字(就是1会直接写在0上 ...

因为你是在bg上blit,就是把数字绘制在了背景上,每次都会不停往上绘制而不重新刷新。
你应该绘制在screen上。screen.blit
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2013-9-2 11:46:56 |显示全部楼层
jpjlqone 发表于 2013-9-1 23:15
对啊,这个怎么疏忽了,确实没经验。已经打包exe给女朋友玩啦哈哈

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2014-8-14 14:19:58 |显示全部楼层
牵着蚂蚁遛达 发表于 2014-8-13 17:09
麻烦问一下,self.y为啥初始化为-50呢?我把y设置成任何值效果都一样。。。。 ...

-50就是让敌机最开始的时候默认是在屏幕上方之外
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2015-10-13 13:43:11 |显示全部楼层
daiqifan 发表于 2015-10-12 16:18
# -*- coding: utf-8 -*-
import pygame
from pygame import *

pygame.mouse.get_pos()
可能因为一开始这个值没有吧?你把move里面的数据打印出来看看是多少
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2016-6-14 11:14:51 |显示全部楼层
windgod 发表于 2016-6-13 23:33
大神好!我觉得这节课的内容,需要解释下,在程序最开始要加个“import random”,否则会错误 ...

嗯,提到了一句但没有特别强调。因为random在基础课程前面讲过,所以就一笔带过了。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2016-6-17 09:52:37 |显示全部楼层
江南小才子 发表于 2016-6-16 22:57
想问一下CROOSIN先生,为什么这一课的程序,实现后,必须移动鼠标才能发子弹,如果飞机不动,那么子弹和敌 ...

查看缩进,你是不是把 bullet.move 和 enemy.move 的代码写到事件的 for 循环里了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2016-7-8 18:04:42 |显示全部楼层
Yumiao_HyunMin 发表于 2016-7-8 13:27
请教一下先生,定义敌机速度时:self.speed = random.random() + 0.1
加0.1的意思是每一次重置速度时速度都 ...

对,避免随机出一个特别慢的值
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2016-8-1 11:35:17 |显示全部楼层
captainooo 发表于 2016-8-1 11:02
请教下,为啥我的结果显示全局变量random未定义,然后就跑不起来,,

没有引用random,或者单词拼错了,还有可能你有文件命名成了random.py
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2018-1-30 15:57:43 |显示全部楼层
python_dino 发表于 2018-1-30 10:53
# -*- coding: utf-8 -*-
import pygame
from sys import exit

把 (enemy.x,enemy.y) 输出来调试
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-5 09:35 , Processed in 0.033634 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部