背景

  • 90后小时候玩的都是自创的游戏,踢沙包、踢足球(把纸弄成球,包N层)、跳方格、挖沙子、堆泥巴、挖坑道、骑自行车、荡秋千、打卡片、叠元宝、猜猪蹄四角、拍手、跳皮筋、翻花绳、转笔、弹射笔、弹射纸球、画漫画、超能nono撞击挤压、斗鸡、骑马打仗、剪刀石头布等手势博弈游戏,其中扳机作为斗智斗勇的博弈游戏,有其内在的规律和不确定性、刺激性,因此进行游戏的代码复现。
  • 但不只是完全复现,还进行了优化,优化了血量,原来是1次生命,现在是多次机会,可玩性提高了。同时代码运行也能够回合制的形式展示双方的状态信息,更便于玩家进行博弈,后续基于单机版也可以升级开发为联机版,通过socket建立局域网/远程通信进行player2player的博弈,甚至再升级为构造游戏大厅创建为匹配玩家模式的博弈。

代码

'''
@Author:lipch
@Date:2021-11-13
@NOTE:小时候的扳机游戏现在已经被手机游戏所替代了,是时代的进步还是童年的丧失
'''
print("##############扳机游戏单机版V1.0#################")
import time
select_start_menu = str(input("1.设置 2.开始新游戏\n"))
if str(select_start_menu) == '1':
    while (str(select_start_menu) != "2"):
        select_hard = str(input("1.简单 2.困难\n"))
        select_start_menu = input("1.设置 2.开始新游戏\n")
else:
    select_hard = "1"
# 初始化血量
player_blood = 3
pc_blood = 3
player_banji = 0
pc_banji = 0
# 开战
epoch=0
mode_map = {-1:"无敌 切换防御形态" ,0:"无攻击无防御 扳机", 1:"攻击1 手枪攻击", 2:"攻击2 双枪攻击", 3:"攻击3 大炮攻击",}
while((player_blood>0) and (pc_blood>0) ):
    print("************************第%d回合*************************"%epoch)
    # 玩家
    epoch_select = int(input("请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击\n"))
    if epoch_select==0:
        player_banji+=1
        # mode: -1:无敌 0:无攻击无防御 >0:攻击 值为攻击值
        player_mode=epoch_select
    elif epoch_select>0:
        if player_banji-epoch_select>=0:
            player_mode=epoch_select
            player_banji-=epoch_select
        else:
            player_mode=0
    else:
        player_mode=epoch_select
    # 电脑
    # ("请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击")
    # 1.电脑第一回合一定是扳机 2.玩家没有扳机的时候一定是安全的,所以直接扳机
    epoch_select = 0 if (epoch==0)or(player_banji<=0) else int(str(time.time())[-1])
    # 随机数 → 随机选择
    if select_hard=="1":
        select_list= [-1,0,1]#简单难度 则不使用杀伤力高的武器
    else:
        select_list = [-1,0,1,2,3]
    while not epoch_select in select_list:
        epoch_select = int(str(time.time())[-1])
    if epoch_select==0:
        pc_banji+=1
        # mode: -1:无敌 0:无攻击无防御 >0:攻击 值为攻击值
        pc_mode=epoch_select
    elif epoch_select>0:
        if pc_banji-epoch_select>=0:
            pc_mode=epoch_select
            pc_banji-=epoch_select
        else:
            rand_select = [-1,0][int(str(time.time())[-1])%2]
            if rand_select == 0:
                pc_banji += 1
                # mode: -1:无敌 0:无攻击无防御 >0:攻击 值为攻击值
                pc_mode = rand_select
            else:
                pc_mode=rand_select#防御形态
    else:
        pc_mode=epoch_select#防御形态
    # 对战
    print("玩家选择:",mode_map[player_mode],"扳机数量剩余:",player_banji)
    print("电脑选择:",mode_map[pc_mode],"扳机数量剩余:",pc_banji)
    if (player_mode<0) or (pc_mode<0) or (player_mode==pc_mode):
        print("相互制衡!")
    elif player_mode>pc_mode:
        pc_blood-=abs(player_mode-pc_mode)
        print("玩家攻击了电脑%d的血量"%abs(player_mode-pc_mode),"玩家血量剩余:",player_blood,"电脑血量剩余:",pc_blood)
    else:
        player_blood -= abs(player_mode - pc_mode)
        print("电脑攻击了玩家%d的血量" % abs(player_mode - pc_mode), "玩家血量剩余:", player_blood, "电脑血量剩余:", pc_blood)
    epoch+=1
print("玩家胜利!"if player_blood>0 else "电脑胜利!")

运行

选取了一次非常精彩的人机对决:

python.exe 扳机游戏GAME单机版.py日志:

##############扳机游戏单机版V1.0#################
1.设置 2.开始新游戏
2
************************第0回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 1
电脑选择: 无攻击无防御 扳机 扳机数量剩余: 1
相互制衡!
************************第1回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 2
电脑选择: 攻击1 手枪攻击 扳机数量剩余: 0
电脑攻击了玩家1的血量 玩家血量剩余: 2 电脑血量剩余: 3
************************第2回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 3
电脑选择: 无攻击无防御 扳机 扳机数量剩余: 1
相互制衡!
************************第3回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
3
玩家选择: 攻击3 大炮攻击 扳机数量剩余: 0
电脑选择: 攻击1 手枪攻击 扳机数量剩余: 0
玩家攻击了电脑2的血量 玩家血量剩余: 2 电脑血量剩余: 1
************************第4回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 1
电脑选择: 无攻击无防御 扳机 扳机数量剩余: 1
相互制衡!
************************第5回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
1
玩家选择: 攻击1 手枪攻击 扳机数量剩余: 0
电脑选择: 攻击1 手枪攻击 扳机数量剩余: 0
相互制衡!
************************第6回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 1
电脑选择: 无攻击无防御 扳机 扳机数量剩余: 1
相互制衡!
************************第7回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
-1
玩家选择: 无敌 切换防御形态 扳机数量剩余: 1
电脑选择: 攻击1 手枪攻击 扳机数量剩余: 0
相互制衡!
************************第8回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
0
玩家选择: 无攻击无防御 扳机 扳机数量剩余: 2
电脑选择: 无攻击无防御 扳机 扳机数量剩余: 1
相互制衡!
************************第9回合*************************
请选择:-1.切换防御形态 0.扳机 1.手枪攻击 2.双枪攻击 3.大炮攻击
2
玩家选择: 攻击2 双枪攻击 扳机数量剩余: 0
电脑选择: 攻击1 手枪攻击 扳机数量剩余: 0
玩家攻击了电脑1的血量 玩家血量剩余: 2 电脑血量剩余: 0
玩家胜利!

Process finished with exit code 0

总结

可玩性很高,电脑也不是完全随机,有一定的策略在里面,后续也可以考虑结合强化学习实现更强的电脑,但可能随机才是最强,套路的最高境界就是没有套路,说的就是这个道理,玩家完全不知道电脑的策略才是最强电脑,这是个哲学命题,有待进一步探究。

更多推荐