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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
package main
import (
"fmt"
"math/rand"
"os"
"time"
)
const (
MAXINT = ^int(0)
)
func klariguLudon(min, max, skip int) {
fmt.Printf(`Bonvenon ĉe "Kaptu la muson"
La celo de la ludo estas diveni numeron de %d ĝis %d.
Vi povas provi tion unu post la alia.
Tamen atentu! La numero povas ĉu ĉiam resti la sama, ĉu supreniri per %d ĉiufoje, ĉu malsupreniri ĉiufoje per la samo.
Se la numero fariĝas pli alta ol %d, ĝi reiras al %d.
Se la numero fariĝas malpli alta ol %d, ĝi reiras al %d.
Multan sukceson!
`, min, max-1, skip, max-1, min, min, max-1)
}
func askPlayers() (n int) {
fmt.Print("Kiom da ludantoj estas? ")
fmt.Scan(&n)
if n < 1 {
return 2
}
return n
}
func askNames(n int) (names []string) {
for i := 1; i <= n; i++ {
name := ""
fmt.Printf("Ludanto %d, kiel mi nomu vin? ", i)
fmt.Scan(&name)
names = append(names, name)
}
return names
}
func getNumber(min, max, skip int, guessed chan bool) (nchan chan int) {
nchan = make(chan int, 0)
go func() {
i := rand.Intn(max-min) + min
s := rand.Intn(3) - 1
for {
select {
case nchan <- i:
case <-guessed:
close(nchan)
}
i += s * skip
switch {
case i >= max:
i = min
case i < min:
i = max - 1
}
}
}()
return nchan
}
func play(name string, number int) (won bool) {
fmt.Printf("Estas la vico de %s: kiu numero estas? ", name)
var guess int
fmt.Scan(&guess)
switch {
case number == guess:
fmt.Println("Prave, la numero estas", number)
return true
case number > guess:
fmt.Println("Ne, la numero estas pli alta ol", guess)
case number < guess:
fmt.Println("Ne, la numero estas pli malalta ol", guess)
}
return false
}
func main() {
rand.Seed(int64(time.Now().Nanosecond()))
min, max, skip := 0, 100, 1
switch len(os.Args) {
case 0:
panic("This shouldn't happen: os.Args is an empty slice.")
case 1:
case 2:
fmt.Sscan(os.Args[1], &max)
case 3:
fmt.Sscan(os.Args[1]+" "+os.Args[2], &min, &max)
default:
fmt.Sscan(os.Args[1]+" "+os.Args[2]+" "+os.Args[3], &min, &max, &skip)
}
klariguLudon(min, max, skip)
players := askPlayers()
names := askNames(players)
guessed := make(chan bool)
numbers := getNumber(min, max, skip, guessed)
for {
for _, name := range names {
if play(name, <-numbers) {
fmt.Printf("Gratulon %s, vi gajnis!\n", name)
return
}
}
}
}
|