---
# System prepended metadata

title: じゃんけん

---

# じゃんけん

## フローチャート
```mermaid
graph TD
  start([開始])
  input[入力を受け取る]
  check{不正な入力?}
  stop([終了])
  cpu[敵の手をランダムに決定]
  player_hand[プレイヤーの手を決定]
  cmp{Win or Lose or draw}
  win[プレイヤー勝利処理]
  lose[プレイヤー敗北処理]
  draw[あいこの処理]
  
  start --> input
  input --> player_hand

  player_hand --> check
 
  check -- yes --> input
  check -- no --> cpu
  cpu --> cmp
  
  cmp -- win --> win
  win --> stop
  
  cmp -- lose --> lose
  lose --> stop
  
  cmp -- draw --> draw
  draw --> input

```

## 分担例(3人用)
### 1人目
```cpp=
void player_win();
void player_lose();
void draw();
```


### 2人目
```cpp=
enum class Hand;
enum class BattleResult

string input();
Hand determine_player_hand(string input);
Hand determine_enemy_hand_random();
BattleResult compare_hands(Hand player, Hand enemy);
```
### 3人目
```cpp=
int main();
```

## データ構造
### 手を表す
```cpp=
enum class Hand {
    Paper,
    Rock,
    Scissors,
    Unexpected,
};
```

### 勝敗を表す
```cpp=
enum class BattleResult {
    Win,
    Lose,
    Draw,
}
```

## 関数
### 入力を受け取る関数
```cpp=
string input() {}
```
1. 標準出力に手の指定方法を出力する
1. 標準入力から手の指定を受け取る
1. 文字列を返す

### プレイヤーの手を決定する関数
```cpp=
Hand determine_player_hand(string input) {}
```
`input`が
- パーを表していれば`Hand::Paper`
- グーを表していれば`Hand::Rock`
- チョキを表していれば`Hand::Scissors`
- それ以外であれば`Hand::Unexpected`
を返す

### 敵の手をランダムに決定する関数
```cpp=
Hand determine_enemy_hand_random() {}
```
ランダムに`Hand::Paper`, `Hand::Rock`, `Hand::Scissors`
のいずれかを返す。

### 手を比較する関数
```cpp=
BattleResult compare_hands(Hand player, Hand enemy) {}
```
プレイヤーの手と敵の手を受け取り、勝敗を返す。

### プレイヤー勝利処理
```cpp=
void player_win() {}
```
プレイヤーが勝利したことを標準出力に出力する

### プレイヤー敗北処理
```cpp=
void player_lose() {}
```
プレイヤーが敗北したことを標準出力に出力する

### あいこ処理関数
```cpp=
void draw() {}
```
あいこであったことを標準出力に出力する