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