Go 言語で「基礎プログラミング演習 I 〜100 本ノック上級編」を解いてみる-No.83「じゃんけん 5 回勝負」

はじめに

「基礎プログラミング演習 I 〜100 本ノック上級編」を解いてみます。

取り扱う問題は以下のサイトを引用させていただきました。

検証環境

1
2
3
4
5
6
7
8
9
$ uname -moi
x86_64 unknown GNU/Linux

$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"

$ go version | head -n 1
go version go1.16.3 linux/amd64

問題

No. 83 じゃんけん 5 回勝負

次の仕様のじゃんけんプログラムを作成せよ。 ・人間は、グー、チョキ、パーをそれぞれ 0、1、2 の数字で入力する。 ・コンピュータは乱数を使って出す手を選ぶ。乱数の使い方は演習資料の高度なテクニック集を見よ。 ・5 回勝負として、人間とコンピュータの勝った回数を数え、勝敗がつくたびに 1 回ずつ表示する。あいこは決着がつくまで再勝負。途中でどちらかが 3 勝しても、5 回最後まで勝負を続ける。 ・指定された範囲以外の値を入力したら負けにする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 【実行例。下線部は入力値の例。メッセージはこの通りでなくてよい。】
$ ./knock83
あなたの手を選んでください(グー0、チョキ1、パー2): 0
コンピュータはチョキ
あなたの勝ち
あなた1勝、わたし0勝
あなたの手を選んでください(グー0、チョキ1、パー2): 2
コンピュータはパー
あいこ
あなたの手を選んでください(グー0、チョキ1、パー2): 2
コンピュータはチョキ
わたしの勝ち
あなた1勝、わたし1勝
あなたの手を選んでください(グー0、チョキ1、パー2): 3
そんな手はありません。あなたの負け
あなた1勝、わたし2勝
(中略)
あなた3勝、わたし2勝
あなたの総合勝利です。参りました。

回答

knock83.go

 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
package main

import (
	"fmt"
	"math/rand"
	"strconv"
	"time"
)

func main() {
	r := rand.New(rand.NewSource(time.Now().UnixNano()))

	choices := map[int]string{
		0: "グー",
		1: "チョキ",
		2: "パー",
	}

	wins := 0
	for i := 0; i < 5; i++ {
		isSettled := false
		for !isSettled {
			var choice int

			fmt.Print("あなたの手を選んでください(グー0、チョキ1、パー2): ")
			fmt.Scan(&choice)
			if choices[choice] == "" {
				fmt.Println("そんな手はありません。あなたの負け")
				break
			}

			computerChoice := r.Intn(3)
			fmt.Println("コンピュータは" + choices[computerChoice])

			switch computerChoice - choice {
			case 1, -2:
				fmt.Println("あなたの勝ち")
				wins++
				isSettled = true
			case 0:
				fmt.Println("あいこ")
			default:
				fmt.Println("コンピュータの勝ち")
				isSettled = true
			}
		}
		fmt.Println("あなた" + strconv.Itoa(wins) + "勝、コンピュータ" + strconv.Itoa(i+1-wins) + "勝")
	}

	if wins*2 > 5 {
		fmt.Println("あなたの総合勝利です。参りました。")
	}
}

実行

1
$ go run knock83.go

ひとこと

ロジックが汚い。マジックナンバー残ったまま。