【童年游戏回忆】——扳机游戏代码复现

本文介绍了一个90后童年游戏——扳机游戏的代码复现与优化,增加了血量和多次机会,提高了可玩性。游戏以回合制形式展示状态,未来可扩展为联机版。代码中电脑AI有一定的策略,并非完全随机,展现了从简单到复杂的游戏设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • 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

总结

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

### C++实现恶魔轮盘赌游戏 在C++中创建一个简单的“恶魔轮盘赌”游戏可以基于随机数生成器来模拟。这个游戏通常涉及玩家选择一个数字,程序随即从一组预设的选项里抽取一个作为胜利条件。 ```cpp #include <iostream> #include <cstdlib> // For rand() and srand() #include <ctime> // For time() using namespace std; int main(){ int playerChoice; const int maxNumber = 6; // 假设有六个槽位, 类似于手枪的弹巢 bool isPlayerAlive = true; cout << "欢迎来到恶魔轮盘赌游戏!" << endl; cout << "请输入您猜测的位置 (1-" << maxNumber << "): "; cin >> playerChoice; if(playerChoice < 1 || playerChoice > maxNumber){ cout << "输入错误! 范围应在1到" << maxNumber << "." << endl; return 0; } srand(static_cast<unsigned>(time(0))); // 初始化随机种子 int bulletPosition = (rand() % maxNumber) + 1; while(isPlayerAlive && bulletPosition != playerChoice){ cout << "\n点击扳机... 空响!\n"; do{ cout << "再次尝试? 输入新位置 (1-" << maxNumber << ") 或者按其他键退出: "; char choice; cin.clear(); // 清除之前的输入状态 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略缓冲区中的旧数据 if(!(cin >> choice)){ break; } playerChoice = choice - '0'; // 将字符转换成整型数值 }while((playerChoice >= 1 && playerChoice <= maxNumber)); if (!(playerChoice >= 1 && playerChoice <= maxNumber)) { cout << "再见!"; break; } } if(bulletPosition == playerChoice){ cout << "\n砰!\n很遗憾,这次运气不佳..." << endl; }else{ cout << "\n感谢参与本局游戏。\n希望下次还能见到你!" << endl; } return 0; } ``` 这段代码实现了基本的游戏逻辑[^1]。通过`rand()`函数生成了一个介于1至最大槽数之间的随机整数表示子弹所在位置;而用户的输入决定了触发机关时所指向的位置。当两者相匹配,则认为发生了不幸事件;反之则继续循环直到用户决定停止或遭遇失败结局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据李菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值