外星人入侵:第12章 - 第14章

1. Markdown

这是第一次用markdown进行写作,一边要写课后感想一边要考虑MD的语法问题,可能会比较慢。周五就已经完成了Program 1 的任务,想找一个平台进行学习感悟的发表,发现CSDN广告太多,没有广告,并且有markdown这个我以前经常听别人说的东西,就打算学习一下。

2. Chapter 12

2.1 Setting类

和我们平常玩的游戏一样,setting通常会单独做成一个文件。回忆一下尼尔机械纪元,config文件一般都会在游戏的根目录下,可以不用进游戏就修改图像设置以及中英文设置。同理,在pygame中,我们也会将Setting单独成类。所有代码我们通常会根据其作用,放在一个py文件里,后续我们也会提到重构 这个概念。

2.2 Alien_invasion

2.2.1 开始

首先我们需要用pygame进行游戏幕布的创建,也就是screen。这个screen的参数我们写在了Setting里面。

2.2.2 Rect

其次我们会导入飞船图像并且创建是ship类,因为飞船之后会有子弹发射,外星人撞击飞船等行为,所以需要一个类。在这里我们用到外接矩形rect。导入的图片会先被识别成一个矩形,因为矩形是个简单的图形方便计算处理,并且玩家不太容易注意到。(比如说飞船撞击到外星人其实是飞船的外接矩形撞到外星人的外接矩形*)使用get_rect().

3. 感想

我突然觉得这样写流水账没意思,而且我以后也不一定会看,太繁琐了。我只想写一些我觉得以后需要注意的点。

3.1 拼写

自从购买了红轴之后误触率上升了很多,但是打字速度也快了很多。打代码时非常容易发生拼写错误,比如alien打成alineright打成rignt,还有类和函数名有没有复数‘s’,这点以后要有意识的培养自己代码习惯以及对复数的敏感性,争取早日形成自己的命名风格。

3.2 函数的参数传递

传递实参有两种方法,位置实参和关键字实参

3.2.1 位置实参

位置实参顾名思义就是按照函数中形参的次序来提供值,比如

def check_events(ai_settings, aliens, bullets, play_button, sb, 
    screen, ship, stats):

如果形参位置如此排列,你就要按照该排列提供值。如果提供值的次序出错,运行就会报错。针对该方法,我就想到了将形参按照首字母顺序排列,这样永远都不会弄错。但是问题是比如矩形的widthweight,就是先长再高;还有一些内置函数或者import进来的函数次序一定,并不按照首字母来。那么对此,就比较推荐用关键字实参了

3.2.3 关键词实参

关键词实参,很简单,就是在使用时

check_events(ai_settings=ai_settings, stats=stats,...)

使用该方法不需要关注次序,但是要把形参名写在上面,后面加=,并且注意,‘=’两边不能用空格。当然,这个比较繁琐,打字多了,我更喜欢第一种目前。如何在这点上规范,我可能以后还要想想。

3.3 Json

这个东西我本科就学过了,我喜欢叫它Jason,但它原名其实是JavaScript Object Notation. What ever, 这个东西一般存储数据比较多,肯定是比txt和庞大的csv要好点的。(粗浅的认为

这次在保存最高分的时候我使用了json格式并且成功非常开心。'w'即使是在json中也是覆盖写入的意思 (json本来就是open里面的一个参数啊,不会影响到‘w', 'r', 'a' 其他参数)

    def save_high_score(self):
        filename = 'high_score.json'
        with open(filename,'w') as fo:
            json.dump(self.high_score, fo)

    def load_high_score(self):
        filename = 'high_score.json'
        with open(filename,'r') as fo:
            self.high_score = json.load(fo)
        return self.high_score

代码写下吧,征服新东西很自豪

3.4 类中的self

3.4.1 初始化init两旁有两个下划线(_ _)

  1. 初始化init两旁有两个下划线
  2. 继承时()不需要写参数(python3)
class Ship(Sprite):
    def __init__(self, ai_settings, screen):
        """"初始化飞船和位置"""
        super().__init__() # 括号里就留白(无空格)

3.4.2 类中的函数def

基本上,类中的函数都会有self,因为一个类中需要数据传递,而self就是载体,把数据存到self,然后可以在类中的不同函数之间进行传导值。

3.4.3

def check_events(ai_settings, aliens, bullets, play_button, sb, 
    screen, ship, stats):
    """响应按键和鼠标事件"""
    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                stats.save_high_score()
                sys.exit()

game_function.py中的函数需要引用game_stats.py中的类中的函数:

3.4.3.1 具体步骤

  1. 首先,需要statas = GameStats(ai_settings), 也就是创造实例。这里注意,GameStats类需要提供ai_settings作为实参,这个在创造类时的初始化init()中发现。

  2. 然后,我们要在函数的形参中,加入stats的位置,用来引入stats的值
    这里形参和实参名字一样的,因为这样方便减少记忆量。实参基本上都是类的实例,所以我先创建好实例名,然后把函数的形参名也改成实例名,这样就可以不用改名字了。

3.先打stats,再打函数名,因为这个函数没有形参,所以空格内不用打东西,所以就是

stats.save_high_score()

这个点在做大项目中经常用到,引用其他py文件的函数之类,所以在这里理清楚,打字打出来加深记忆。

4. 总结

脖子很累,打了快两小时。外星人入侵这个项目我其实没太深入去做,因为自己不打算做游戏这方面,下一个program用Python做数据分析才是我想深入的点,所以总结一下几点:

4.1 类,函数的概念

这个游戏项目主要加深了我第8、 9 章的理解,函数需要形参,调用需要给予实参。而类就是将多个用共同作用或服务于同一对象的函数放在一起,这样调用时只需要:

实例名.函数名(实参)

4.2 屏幕和键盘的抓取

pygame.event.get()可以获取各种按键和鼠标事件,
event.type有KEYDOWN, KEYUP, MOUSEBUTTONDOWN,
event.key 是K_RIGHT, K_LEFT, K_SPACE, K_q(为什么字母键是小写?

故意弄个总结也没太大意思,本来这篇就是总结了
以后更加努力,享受迟来的编程吧~

你可能感兴趣的:(外星人入侵:第12章 - 第14章)