神机妙算

神机妙算

小学的时候,在一位好友的家里一起看了一本数学书,在里面我们学到了一个游戏-神机妙算。
不得不说,这确实一个有趣的游戏,以至于我们在中学阶段依旧在玩,而且还教会更多的人学会这个游戏,其乐无穷也。
对了,这本书叫《天哪!数学原来可以这样学》,在第三章中的第30节可以找到这个游戏。

规则

由两名玩家参与,各自在纸上写下自己的key,注意不能让对方看到,key由三个数字组成,在1-9中选择,不能重复。
互相猜对方的key,每回合各攻守一次,攻方猜时报出三个数字(在0-9中选择,不能重复,顺序自定),守方根据攻方报出的数字与自己的key对比,当有一个数字被猜中,但是位置不对时,称为“一击”;当有一个数字被猜中,而且位置正确时,称为“一命”。
例如,守方的key为“123”,攻方报出数字“142”,此时守方应回答“一命一击”,攻守转换,进行猜测,一回合结束。
直到某回合功方完全猜中守方的key,若攻方为先手方,守方有一次追平的机会进行进攻;若攻方为后手方,游戏结束,攻方胜利。
注 此处的规则与书中所描述的规则略有不同。

计划

制作系列动画视频。
P1 游戏规则介绍
P2 游戏玩法拓展
P3 微信小程序开发
P4 AI对抗算法

拓展

1 猜的数字可以用“0”补位
2 数字可以增加“0”
3 数字允许重复
4 key改为由四个数字组成

可能

第一轮猜测有如下可能(用“v”表示命中,用“o”表示击中)
vvv 三命
voo 一命两击
ooo 三击
vv 两命
vo 一命一击
oo 两击
v一命
o 一击
Ø 空

算法1

在此用自然语言(就是自己瞎说)表示算法。
key 123

进攻算法

vvv 三命

直接获胜

voo 一命两击

① 132/321/213 调换1、2/1、3/2、3位
② vvv 123 Win!
② ooo 312 定一动一
③ oo 21x
③ vo 1x2
④ vvv 123 Win!

ooo 三击

① 312/231 定一动一
② oo 21x
② vo 1x2
③ vvv 123 Win!

vv 两命

vo 一命一击

oo 两击

v一命

o 一击

Ø 空

另猜3个数字

算法2

用C语言表示算法。

初步判断程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c, x, y, z, v = 0, o = 0;
printf("请输入Key\n");
scanf_s("%1d%1d%1d", &x, &y, &z);
system("cls");
printf("key录入成功,请发起进攻\n");
while (v != 3)
{
v = 0, o = 0;
//printf("请继续进攻\n");
scanf_s("%1d%1d%1d", &a, &b, &c);
if (a == x)v++;
if ((a == y) || (a == z))o++;
if (b == y)v++;
if ((b == x) || (b == z))o++;
if (c == z)v++;
if ((c == y) || (c == x))o++;
printf("%d命%d击\n", v, o);
}
printf("You win!\n");
return 0;
}

神机妙算
http://example.com/2023/01/14/Project项目-神机妙算/
许可协议