盒子
盒子
文章目录
  1. Nim编程早茶
    1. Nim语言编程实现 Nim 游戏

Nim 语言实现简单的 Nim 博弈游戏

Nim编程早茶

Nim 游戏,也叫“尼姆博弈”,玩家轮流从一堆石头中,取走一定数量的石头。每次你们轮流拿掉 1 - 3 块石头,拿到最后一块石头的人就输掉了游戏。

Nim语言编程实现 Nim 游戏

我们简单地实现了一个基于命令行的程序。主要使用了 terminal 模块的格式化输出的功能 styledEcho

我们通过命令行参数 paramStr 获取石头的总数,while 循环,通过 readline 不断获取用户的输入,而通过产生 1 ~ 3 的随机数来模拟电脑的操作。

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import random, terminal, strutils, os


const TOTAL = 12

proc tryParseInt(s: string): int =
try:
result = parseInt(s)
except ValueError:
discard

proc succeed() =
styledEcho(styleBright, fgRed, repeat('#', 50))
styledEcho(styleDim, fgBlue, "恭喜你取得了胜利")
styledEcho(styleBright, fgRed, repeat('#', 50))

proc fail() =
styledEcho(styleBright, fgGreen, repeat('#', 50))
styledEcho(styleDim, fgBlue, "不要灰心,下次再来")


proc nimgame(total: int = TOTAL) =
var
total = total
number: int
randomize()
while total > 1:
styledEcho(styleDim, fgBlue, "石头还剩下" & $total & "\n")
styledEcho(styleBright, fgRed, "现在轮到你了")
styledEcho(styleItalic, fgYellow, "拿走你的石头(可以拿 1 ~ 3 个): ")
number = tryParseInt(readLine(stdin))
while number notin {1, 2, 3}:
styledEcho(styleItalic, fgYellow, "拿走你的石头(可以拿 1 ~ 3 个): ")
number = tryParseInt(readLine(stdin))
styledEcho(styleDim, fgBlue, "\n你拿了: " & $number)
dec(total, number)
if total == 1:
succeed()
return
if total > 1:
let choice = rand(1 .. min(3, total))
styledEcho(styleDim, fgBlue, "计算机拿了: " & $choice)
dec(total, choice)
if total == 0:
succeed()
return
styledEcho(styleDim, fgBlue, "石头还剩下" & $total & "\n")
fail()



when isMainModule:
if paramCount() < 1:
echo "请输入石头的总数"
if paramCount() == 1:
var total = tryParseInt(paramStr(1))
if total == 0:
total = 21
nimgame(total)