python 自制黄金矿工游戏(设计思路+源码)

1.视频效果演示

python自制黄金矿工,细节拉满沉浸式体验,看了你也会


链接:https://pan.quark.cn/s/39fa45aa8fd3

1对应的源码

2.打包好的可执行文件

3.开发文档

都放在压缩包了

2.开发准备的工具

python3.8, pygame库(python3.5以上的版本应该都可以)

图片处理工具,美图秀秀

截图工具,电脑自带的

自动抠图网页:https://koutu.gaoding.com/m

mp4格式文件转游戏音频:https://www.aconvert.com/cn/audio/mp4-to-wav/#google_vignette

声音录制工具,oCam

3.开发和设计思路

素材来源:主要是在4399的黄金矿工游戏,录制游戏音频,和截图游戏里面的元素

游戏设计了12个关卡,

3.1游戏中的元素

游戏矿石7种:大黄金,小黄金,中等黄金,钻石,小石头,大石头,盲盒

大黄金价值:500

小黄金价值:75

中等黄金价值:200

钻石价值:600

小石头价值:20

大石头价值:60

盲盒:  -300 --- 700  也就是有可能,抓的盲盒是负的

钻石会随着等级的升级而变得更贵,

7种矿石在每局游戏种会随机出现。并不会每次全部出现。

游戏道具6种:小黄金升值道具,钻石升值道具,钻石数量增加道具,时间延长道具,幸运四叶草,强壮水,石头收藏书

在商城里面每次只会提供三种道具,这是随机的

游戏道具每次的价格是随机的所以要根据你的金钱数量,调整游戏策略

小黄金道具:如果购买了小黄金的价格会变成125 + 25 * 游戏关卡,小黄金的价格

钻石升值道具:使用了钻石变成600 + 300 增值300  300 + 75 * Game_config.level

钻石数量增加道具:如果在商店购买了,钻石的数量会在之前的基础上,生成钻石的随机值,最大的可能值会+3

时间延长道具:使用之后游戏时间会变成80秒,正常一局游戏60s

幸运四叶草: 幸运四叶草,在商店买了的化,抓取到了神秘礼包盲盒,金额会随机的变多

     500 -- 1000

    否则是

     -300 --- 700

强壮水:抓取物品的速度会变的更快,speed +2

石头收藏书: 石头增值道具,如果买了大石头的价格会*4

1到12关的目标金额: [1000, 2200, 3600, 5400, 7500, 10000, 12500, 17000, 21500, 26000, 30000, 45000]

3.2音频素材

音频素材6段:抓到大黄金的声音,抓到石头的声音,绳子变长的声音,金钱变多的声音,绳子摆动的声音,目标分数的声音;

3.2游戏界面

游戏界面四个:开始界面,游戏界面,商城界面,失败或者结束界面

3.3关于如何让矿工动起来

关于如何让矿工动起来: 使用不同的图片,让pygame在不同时间播放不同的图片。

我最喜欢这个游戏的部分就是,矿工满头大汗,抓矿石的样子,哈哈哈。

还有就是商城道具和矿石的随机性

3.4如何让绳子和钩子动起来

如何让钩子和绳子动起来。

钩子的摆动幅度是-70 到 70 度,每次变化的幅度是3度

这里使用了三角函数,sin cos 来实现

总共有9张钩子的图片,随着角度的变化,显示不同的图片

3.5关于每个关卡矿石的生成策略

#每个关卡游戏界面物品的生成

 钻石的基础数量是0

如果在商店买了钻石水 3

如果等级能被4整除

 钻石的数量 no_diamond += 2 +int(level/3)

 如果等级大于6

钻石的数量 no_diamond += 2

 如果等级大于等于8

钻石的数量 no_diamond += 4

 如果等级大于等于12

钻石的数量 no_diamond += 10

 神秘包裹盲盒的数量

如果等级能被2整除 no_random += 3 +int(level/2)

否则 no_random = 1

 大黄金的数量

如果等级大于等于3no_big = 1 no_big += level//2

否则大黄金数量等于0

 如果等级大于等于6 no_big += 2

 如果等级大于等于8 no_big += 3

如果等级大于等于12 no_big = 6

base 一些物品的最小基础值

如果等级大于等于6 base = 1 否则 base = 0

如果等级大于等于8 base = 2

 如果等级大于等于12 base = 5

 如果等级大于等于8 小石头的数量[0,2]

 如果等级大于等于8 小黄金的数量[0,2或者3]

如果等级小于8 小石头的数量 [5,7]

如果等级小于8 小黄金的数量 5 + level // 2, 12 + level // 2

中等黄金的数量

0, random.randint(5+level//2, 8+level//2)

大石头的数量

 0, random.randint(1 + level // 4 + base, 3 + level // 4 + base)

 大黄金的数量

 0, random.randint(base, no_big)

 钻石的数量

0, random.randint(base, no_diamond)

神秘包裹的数量

0, random.randint(base, no_random)

游戏的fps

ticks_per_second = 30 表示是1000/30 的刷新频率

如果生成的物品模型发生了重叠,那么要重新生成

3.6代码文件

代码文件:gamebox.py  对pygame库的二次封装

Gold_mine.py 游戏逻辑主要代码

4.代码部分

gold_miner.py文件

import time

import  pygame
from enum import Enum, unique
import gamebox
import random
import math

@unique    #此装饰器可以帮助我们检查保证没有重复值
class Screen(Enum):
    screen_begin        = 0
    screen_game         = 1
    screen_shop         = 2
    screen_target_score = 3
    screen_failed       = 4


@unique    #此装饰器可以帮助我们检查保证没有重复值
class Character(Enum):
    character_up                 = 0
    character_down               = 1


class Character_Getthing(Enum):
    character_up_getthin = 0
    character_down_getthin = 1


class Game_Background(Enum):
    background_begin = 0
    background_game_heard = 1
    background_game_body  = 2
    background_shop = 3
    background_target_score = 4
    background_failed = 5


class Audio(Enum):
    audio_money_increase = 0
    audio_target_score   = 1
    audio_rope_swing     = 2
    audio_go_long        = 3
    audio_get_big_gold   = 4
    audio_get_stone      = 5
#矿石
@unique
class Mineral(Enum):
    gold_small  = 0
    gold_middle = 1
    gold_big    = 2
    stone_small = 3
    stone_big   = 4
    Diamond     = 5
    random_big  = 6

#钩子的每一帧图片

hook_dict = {}
hook_dict[-70] = "hook/hook_70.png"
hook_dict[-43] = "hook/hook_43.png"
hook_dict[-31] = "hook/hook_31.png"
hook_dict[-16] = "hook/hook_16.png"
hook_dict[1] = "hook/hook_1.png"
hook_dict[14] = "hook/hook14.png"
hook_dict[32] = "hook/hook32.png"
hook_dict[44] = "hook/hook44.png"
hook_dict[68] = "hook/hook68.png"




#游戏配置类
class Game_config():
    speed = 5
    # 游戏关卡,从第一关开始
    level = 1
    #游戏金钱
    money = 0
    #钩子摆动的角度 -70 ---  70
    radins = -70
    #摆动的角度每次偏移的值
    radins_offset = 3
    radins_min = -70
    radins_max = 70
    #绳子的初始长度距离
    chain_distance = 30
    #绳子的变化速度 抓到不同的重量 速度不一样
    weight_item_caught = speed +5
    #钩子的变化速度控制,抓到不同物体速度变化不一样
    pict_index = 0
    #控制一局游戏的时间 和刷新频率有关系 当前1s刷新15次,计数器60s刷新900次
    counter = 900
    popped_up_word_counterdown = 16
    #大黄金的价格和标志
    gold_large_value = 500
    gold_small_value = 75
    gold_middle_value = 200
    dimaond_value = 600
    small_rock_value = 20
    big_rock_value  =  60
    #抓到了神秘背包,那么绳子移动速度是随机的(-4,+5)
    #价值也是随机的
    # 每局游戏的目标分数
    money_goal = [1000, 2200, 3600, 5400, 7500, 10000, 12500, 17000, 21500, 26000, 30000, 45000]
    #矿石生成的随机区域的范围控制
    mineral_race_min_x = 50
    mineral_race_max_x =  900
    mineral_race_min_y =  240
    mineral_race_max_y =  690

    #按钮的范围绘制
    #开始按钮的坐标范围
    button_start_min_x = 38
    button_start_max_x = 400
    button_start_min_y = 18
    button_start_max_y = 370

    #音频文件
    #游戏开始和目标分数的音频
    sound_start ="sound/audio_target_score.wav"
    #绳子摆动的音频
    sound__rope_swing = "sound/audio_rope_swing.wav"
    #金钱增加的声音
    sound__money_increase = "sound/audio_money_increase.wav"
    #绳子变长的声音
    sound_go_long = "sound/audio_go_long.wav"
    #抓到石头的声音
    sound_get_stone = "sound/audio_get_stone.wav"
    #抓到大黄金的声音
    sound_get_big_gold = "sound/audio_get_big_gold.wav"
    #商店的三个格子每次只能点击一次
    store_index = False
    store_index2 = False
    store_index3 = False
    #生成物品的算法如果发生了碰撞最多尝试10次
    try_times = 10

#商店
class Store():
    # 如果购买了小黄金的价格会变成125 + 25 * level
    item_gold_modifer = False
    # 如果购买了,钻石的价值会增加300
    item_polisher = False
    # 如果在商店购买了,钻石的数量会在之前的基础上,生成钻石的随机值,最大的可能值会+3
    item_lamp = False
    # 时间延长器如果在商店买了计数增加到1200
    item_time = False
    #幸运四叶草,在商店买了的化,抓取到了神秘礼包,金额会随机的变多
    # 500 -- 1000
    # 否则是
    # -300 --- 700
    item_luck = False
    #如果购买了会变得强壮速度+2
    item_strong = False
    # 石头增值道具,如果买了大石头的价格会*4
    item_rocks = False

#商品的枚举类型
@unique
class Store_index(Enum):
    index_gold_modifer = 0
    index_polisher = 1
    index_lamp = 2
    index_time = 3
    index_luck = 4
    index_strong = 5
    index_rocks = 6


dict_goods_picture = {}
dict_goods_picture[Store_index.index_gold_modifer.value] = "goods/gold_modifer.png"
dict_goods_picture[Store_index.index_polisher.value] = "goods/polisher.png"
dict_goods_picture[Store_index.index_lamp.value] = "goods/lamp.png"
dict_goods_picture[Store_index.index_time.value] = "goods/time.png"
dict_goods_picture[Store_index.index_luck.value] = "goods/luck.png"
dict_goods_picture[Store_index.index_rocks.value] = "goods/rocks.png"
dict_goods_picture[Store_index.index_strong.value] = "goods/strong.png"
dict_goods_text = {}

dict_goods_text[Store_index.index_gold_modifer.value] = "小黄金会变得更值钱"
dict_goods_text[Store_index.index_polisher.value] = "钻石会变得更值钱"
dict_goods_text[Store_index.index_lamp.value] = "钻石会变得更多"
dict_goods_text[Store_index.index_time.value] = "游戏时间会变得更长"
dict_goods_text[Store_index.index_luck.value] = "神秘礼包的金额会变得更多"
dict_goods_text[Store_index.index_rocks.value] = "大石头的价格会增加4倍"
dict_goods_text[Store_index.index_strong.value] = "矿工会变更强壮,加快"


#矿石图片存储列表
picture_mineral   = ["picture/gold_small.png","picture/gold_middle.png","picture/gold_big.png","picture/rock_small.png","picture/rock_big.png","picture/dimaond.png","picture/mystery_bag.png"]
#平常状态的角色
picture_list_character = ["picture/character_up.png","picture/character_down.png"]
#抓取到东西的时候的角色图片
picture_list_character_getthing = ["picture/character_up_getthin.png","picture/character_down_getthin.png"]
#商品的图片
picture_list_goods = ["picture/character_up_getthin.png"]
#音频文件
sound_list  = ["sound/audio_money_increase.png","sound/audio_target_score.png","sound/audio_rope_swing.png","picture/audio_go_long.png","picture/audio_get_big_gold.png","picture/audio_get_stone7.png"]
picture_list_screen = ["picture/screen_begin.png","picture/screen_game_head.png","picture/screen_game_body.png","picture/screen_shop.png","picture/screen_target_score.png","picture/screen_failed.png"]




#全局变量
#界面index
#0开始界面
#1游戏界面
#2商城界面
#3目标分数界面
#4失败界面
screen = 0
#游戏界面的长宽
camera=gamebox.Camera(1000, 700)
# 在左上角绘制文字
pygame.display.set_caption('制作人:慕白白ls')

#Item value
#抓到的东西的价格
value_caught = 0
#人物角色的控制每一帧显示的图片
character_index =0

#bool 游戏中元素的状态值
#钩子的状态
chain_thrown_out= False
#钩子的方向状态 右-> 左  or 左->右
direction_left_to_right=True
#钩子是否被仍出去了
chain_thrown_out= False
#绳子是伸长状态还是收缩状态
chain_thrown_out_away = True
#钩子是否抓取到了东西
chain_thrown_out_catchsomething = False


#钩子对象
chainhead = gamebox.from_image(200, 200, hook_dict[-70])
#人物对象
character = gamebox.fr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值