手把手教你用Python改造一款外星人入侵小游戏

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

为学应须毕生力,攀高贵在少年时。

大家好,我是白小纯。这是我在【Python爬虫与数据挖掘】公众号的第二篇文章,第一篇文章写的是冰冰女神,反响非常不错,没来得及围观的小伙伴,可以戳文章:手把手教你用Python网络爬虫+自动化来创建一位属于你自己的虚拟女票(附源码),觉得不错,记得三连支持噢!

前言

    很多朋友都是从python编程:从入门到实践开始的python学习,这本书还是比较适合初学者的。

之前公众号也送过这本书,没有收到的小伙伴也别灰心,送书活动基本上每周的周六或者周日都会进行,大家记得来参加就是了。

言归正传,而在这本书中有一个pygame小游戏项目,外星人入侵。

对于初学者来说,从小游戏入手去学python是个很不错的选择,然而我觉得此书中的外星人入侵小游戏太过单调和粗糙,所以灵光一闪决定将其升级为超级魔改版。

本文先按照此书给出该游戏的原始1.0版本和原始1.0版本完整代码,然后然后逐步分析并将其魔改为全新版本。

比起单调无趣的原始版本,魔改版除了基本玩法还是个射击游戏,几乎看不出来和原始版本有什么关系。

这篇文章主要分为三个部分进行展开:

一、原始版本再现
  1.原始1.0版本的源码免费获取地址:
二、魔改思路
  1.醒目亮眼的UI界面
  2.实现地图,怪物,血量多样化
  3.实现游戏商城和丰富金融体系
 三、未完待续

一、原始版本再现

原始1.0版本:

原始1.0版本有如下特点:

1.玩家可以控制屏幕底下的炮口(书中说是飞船)左右移动并射击僵尸
2.僵尸群固定3排,固定数量,固定间距生成,不会随着关卡升级而变化
3.玩家有3条生命,左上角代表剩余生命,被僵尸群碰到或尸群到达屏幕底部则生命-1
4.玩家每次射击都要按一下射击键(这里是空格),不能连续射击
5.尸群作为一个整体左右移动碰到屏幕边缘便前进一步,如果不能及时消灭尸群最边缘的僵尸,那么尸群将会移动得很快
6.只有一种怪物,而且怪物没有设置血量,关卡升级只是怪物左右横移变快
7.玩法单调,没有特效,没有技能,没有道具,没有地图
8.不能实现分数存储,每次运行程序时的最高分记录不会保存

只能说原始1.0版本实现了一个小游戏的基本框架,如下图:

此时左上角有3个大炮的图标,意为我还有3条生命。

屏幕上方中央是最高分,屏幕最右上角是当前分数,由于这是运行程序后的第一次游戏,当前分即最高分。

屏幕最右上角当前分数的下面的数字是当前关卡,消灭全部僵尸进入下一关,随着关卡的升级尸群的移动速度会越来越快。

被僵尸群碰到或尸群到达屏幕底部则生命会减一哦,上图就只剩下2条命了。

原始1.0版本要用到的文件如下:

其中分门别类,各文件都有其明确分工,alien是专门写外星人的,alien_invasion是主程序,bullet是控制子弹及相关参数的,button是控制开始游戏按钮,game_stats是游戏的一些初始化设置,scoreboard是控制分数面板,settings用于游戏参数设置,ship专门控制飞船。

原始1.0版本要用到的图片也非常简单,存在images里面,只有一个外星人和一个飞船,这里我用的是一个僵尸和一个大炮。你也可以选用自己喜欢的形象替换。

原始1.0版本的源码免费获取地址:

https://download.csdn.net/download/x978404178/20299596?spm=1001.2014.3001.5501 

二、魔改思路

本文将初步推出魔改后的版本,不妨记为魔改2.0版。

1. 醒目亮眼的UI界面

通过精心设计的登录封面,游戏取名星际前线,并达到如下效果:

 此登录界面支持鼠标点击开始游戏按钮即开始游戏,鼠标点击或按下键盘s键可进入/退出积分商城,鼠标点击联系我们可以看到作者信息。

部分代码:

        self.color=(230,230,230)
        self.fm = pygame.image.load('images/fm.png').convert_alpha()
        self.title = pygame.image.load('images/title.png').convert_alpha()
        self.titlerect = pygame.Rect(-190, -60, 1920, 1000)  # 矩形(x,y,width,height)
        self.play = pygame.image.load('images/play.png').convert_alpha()
        self.playrect = pygame.Rect(645,300, 280, 280)#矩形(x,y,width,height)
        self.shop = pygame.image.load('images/shop.png').convert_alpha()
        self.shoprect = pygame.Rect(0, 700, 330, 158)  # 矩形(x,y,width,height)
        self.lianxi1 = pygame.image.load('images/lianxi1.png').convert_alpha()
        self.lianxi1rect = pygame.Rect(1330, 780, 187, 80)  # 矩形(x,y,width,height)
 
        self.shop2 = pygame.image.load('images/shop2.png').convert_alpha()
        self.shop2rect = pygame.Rect(1395, 735, 140, 126)  # 矩形(x,y,width,height)

2.实现地图,怪物,血量多样化

所有怪物生成数量与关卡有关,生成数量在一定限度内随机,但关卡越高,生成数量趋向于越多。

怪物生成范围也为一定限度内随机生成。

怪物移动速度与关卡有关,关卡越高,前进速度越快,但设置了一个速度上限。

怪物以一定概率在一个身位内瞬移移动,可以闪避飞船的子弹。

第一关是可爱的小机器人,1点血量,在第三关出现了手拿盾牌的机器人,3点血量。

在第5关出现了BOSS,上方是它的红色血条,很长。

BOSS嘛,不抗揍怎么当老大?

我在游戏中设置了丰富的地图,每10关切换一个场景。

BOSS的安排遵循每5关一小boss,每10关一大BOSS的规律,让玩家尽情体验激战。

部分代码:

    def _create_fleet(self):
        "创建怪物群1"
        self.alien_bloodmax=1
        self.alien_blood=1
        if self.stats.level>=5:
            self.alien_bloodmax =2
            self.alien_blood = 2
            if self.stats.level >=10:
                self.alien_bloodmax = 3
                self.alien_blood = 3
 
                if self.stats.level >=15:
                    self.settings.guainum = 2
                    self.alien_bloodmax =5
                    self.alien_blood =5
                    if self.stats.level >=25:
                        self.alien_bloodmax =10
                        self.alien_blood =10
                        if self.stats.level >= 30:
                            self.alien_bloodmax = 20
                            self.alien_blood = 20
 
                            if self.stats.level >= 40:
                                self.settings.guainum = 3
                                self.alien_bloodmax = 50
                                self.alien_blood = 50
                                if self.stats.level >= 45:
                                    self.alien_bloodmax = 100
                                    self.alien_blood = 100
                                    if self.stats.level >= 50:
                                        self.alien_bloodmax = 150
                                        self.alien_blood = 150
        number_alien=random.randint(5+self.stats.level*1,15+self.stats.level*2)
        for row_number in range(number_alien):
            alien = Alien(self)
            self.aliens.add(alien)

3.实现游戏商城和丰富金融体系

怎么样,小白作者自己一点点做出来的游戏商城还看得过去吧?

左上角是金币,与游戏中杀怪获得的积分挂钩。

右上角是钻石,顾名思义,是属于氪金大佬和少数精英玩家的稀缺资源。

鼠标移动到对应商品上会显示半透明的简介,名称,价格,类别和功能。

加载图片和位置:

self.gaosi1 = pygame.image.load('images/gaosi1.png').convert_alpha()
self.gaosi1rect = pygame.Rect(230, 480, 751, 240)  # 矩形(x,y,width,height)

由鼠标位置确定是否显示商品简介:

button3_clicked = self.gaosirect.collidepoint(mouse_pos)
if button3_clicked:
    self.screen.blit(self.gaosi1, self.gaosi1rect)

至于魔改版的更多讲解和源码我们留到以后讲解。

 三、总结

    本期奇思妙想之超级魔改版外星人入侵小游戏-01就到这里了,感兴趣的朋友可以关注我,后期会相应推出奇思妙想-02-03等系列文章。

    对本游戏有更好想法的朋友也可以提出你的魔改思路,让游戏变得更有趣更好玩,让大家创新思维的火花尽情地碰撞。想要你的魔改方案实施在游戏中,可以在下方评论区留言或私信作者哦。

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我可以为您提供一些关于使用Python代码实现Transformer的指导。 首先,您需要安装PyTorch和torchtext库。然后,您可以按照以下步骤实现Transformer模型: 1. 定义输入和输出的词汇表,并使用torchtext库加载数据集。 2. 定义Transformer模型的编码器和解码器部分。 3. 实现自注意力机制(self-attention)和前向神经网络(feed-forward network)。 4. 实现残差连接(residual connection)和层归一化(layer normalization)。 5. 定义Transformer模型的训练和评估过程。 下面是一个简单的示例代码,用于实现一个基本的Transformer模型: ```python import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchtext.datasets import TranslationDataset, Multi30k from torchtext.data import Field, BucketIterator # 定义输入和输出的词汇表 SRC = Field(tokenize='spacy', tokenizer_language='de', init_token='<sos>', eos_token='<eos>', lower=True) TRG = Field(tokenize='spacy', tokenizer_language='en', init_token='<sos>', eos_token='<eos>', lower=True) # 加载数据集 train_data, valid_data, test_data = Multi30k.splits(exts=('.de', '.en'), fields=(SRC, TRG)) SRC.build_vocab(train_data, min_freq=2) TRG.build_vocab(train_data, min_freq=2) # 定义Transformer模型的编码器和解码器部分 class Encoder(nn.Module): def __init__(self, input_dim, hid_dim, n_layers, n_heads, pf_dim, dropout, device): super().__init__() self.device = device self.tok_embedding = nn.Embedding(input_dim, hid_dim) self.pos_embedding = nn.Embedding(1000, hid_dim) self.layers = nn.ModuleList([EncoderLayer(hid_dim, n_heads, pf_dim, dropout, device) for _ in range(n_layers)]) self.dropout = nn.Dropout(dropout) self.scale = torch.sqrt(torch.FloatTensor([hid_dim])).to(device) def forward(self, src, src_mask): # src: [batch_size, src_len] # src_mask: [batch_size, 1, 1, src_len] batch_size = src.shape[0] src_len = src.shape[1] pos = torch.arange(0, src_len).unsqueeze(0).repeat(batch_size, 1).to(self.device) # pos: [batch_size, src_len] src = self.dropout((self.tok_embedding(src) * self.scale) + self.pos_embedding(pos)) for layer in self.layers: src = layer(src, src_mask) return src class EncoderLayer(nn.Module): def __init__(self, hid_dim, n_heads, pf_dim, dropout, device): super().__init__() self.self_attn_layer_norm = nn.LayerNorm(hid_dim) self.ff_layer_norm = nn.LayerNorm(hid_dim) self.self_attention = MultiHeadAttentionLayer(hid_dim, n_heads, dropout, device) self.positionwise_feedforward = PositionwiseFeedforwardLayer(hid_dim, pf_dim, dropout) self.dropout = nn.Dropout(dropout) def forward(self, src, src_mask):
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值