【桌游】谁是凶手

桌游“谁是凶手”的代码实现

这样一个原理类似于扫雷的推理游戏,以纸牌作为外在形式。因此,在实现的过程中,有些初步的想法。

游戏界面

首先这是一个多人的游戏,游戏人数2-4,需要联机。还有纸牌的形式,最好能构建一个图形化的界面。目前想到的相对简单的平台是微信小程序

貌似界面设计不会很复杂。简易的色块配合描述文字代表相应卡牌(horizontal scroll),设置一块空白区域(此区域类似一个表格),用于推理过程中已知信息的标记。标记本身是一个可以被玩家移动的小图标(movable-view)。玩家每个回合的操作要配备相应的按钮,设想是在界面的下方区域规划一块operate的区域,在这块区域里,先让玩家选择要进行的操作。

  1. 如果玩家有手牌,可选择:(a)要求“厨师”、“管家”、“女仆(pǔ)”和“情妇”中的一种,其他玩家将手中拥有的相同花色的牌,选一张给这位玩家,如果没有则不需要给牌。拿牌之后,需要打出手牌,打出规则是相同数字的3张牌或同花顺3张,如果没有,单打一张任意牌。(b)猜出真正的凶手。若猜对结果,游戏结束,公布所有人手牌(以结算列表来表示);若猜错,该玩家所猜错误结果也公布,并展示其手牌,游戏继续,该玩家出局。
  2. 如果玩家无手牌,可选择:(a)查看桌面某摞(3张牌为一摞)牌的其中一张;(b)猜凶手。

选择的界面,第一行为四种花色的按钮(button),第二行为无手牌时的看牌选项和猜凶手选项(checkbox)。

界面的中间部分为玩家的手牌显示界面,可以横向滑动。在拿牌之后,弹出要打的牌的勾选框(checkbox),系统后台验证出牌是否符合规范,玩家还需要选择要展示的牌,任意一张即可(一摞牌的情况)。

界面上方为桌面,显示其他玩家和自己曾经打出的牌(flex-direction:row/Horizontal Scroll),三张牌会附加标记(数组元素个数不同用于区别玩家某次出牌的数量)。屏幕一侧显示玩家头像,旁边信息包含此时手牌数量。

游戏内部规则

游戏规则较为简单:

  1. 系统发牌。根据不同玩家人数判定不同的发牌方式,扣押底牌。更新玩家手牌界面和手牌数。
  2. 玩家轮流行动,系统检验出牌是否符合规则。随时更新手牌界面和手牌数。
  3. 猜牌结束后的结算界面,公布每人的手牌情况。

初步计划

先尝试一下微信小程序能不能做成界面,毕竟以前没做过类似的东西。不行的话,再找找其他工具。

根据题意,侦查员判断四人中有三人说的是真话,一人说的是假话。我们可以通过逻辑推理来解决这个问题。我们可以为每个人的话分别赋予一个假设,然后根据假设来检查哪一个是不一致的,从而找到凶手。 在C语言中,我们可以通过定义每个说法的真伪来构建一个简单的逻辑推理程序。以下是C语言代码实现: ```c #include <stdio.h> int main() { // 假设A、B、C、D是否说谎分别为1表示说谎,0表示说真话 int A = 0, B = 0, C = 0, D = 0; int killer = -1; // 凶手编号,初始设为-1表示未找到 // 假设A说谎 A = 1; for (killer = 0; killer <= 3; killer++) { // 假设凶手可能是A、B、C、D中的一个 if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { // 如果有三个一致,即找到了凶手 continue; // 跳过当前循环 } } // 如果上面没有找到凶手,那么A说的是真话,我们需要重新检查 if (killer == -1) { A = 0; // 假设B说谎 B = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } // 如果上面没有找到凶手,那么B说的是真话,我们需要重新检查 if (killer == -1) { B = 0; // 假设C说谎 C = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } // 如果上面没有找到凶手,那么C说的是真话,我们需要重新检查 if (killer == -1) { C = 0; // 最后假设D说谎 D = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } } } } // 输出凶手 switch (killer) { case 0: printf("A是凶手\n"); break; case 1: printf("B是凶手\n"); break; case 2: printf("C是凶手\n"); break; case 3: printf("D是凶手\n"); break; default: printf("没有找到凶手\n"); } return 0; } ``` 这段代码使用了一个简单的穷举法来检查每个假设,最终确定哪个假设与其他三个陈述一致,从而找出凶手。注意,这个代码逻辑上是正确的,但没有进行优化,实际可能有更加高效的算法来解决这个问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值