要件定義 「あいこの場合は、決着がつくまで継続する」 を 機能要件に入れ忘れてしまった
【要件定義】
機能要件:
・ユーザーは「グー」、「パー」、または「チョキ」のいずれかを選択できる。
・コンピューターはランダムに「グー」、「パー」、または「チョキ」のいずれかを選択する。
・プログラムはユーザーとコンピューターの選択を比較し、勝者を決定する。
・勝ち、負け、の際にそれぞれ結果を表示する
非機能要件:
・シンプルで直感的なインターフェース。
・高速な応答時間。
・再プレイ可能性。
制約:
・クラスや関数を使用しない。
優先順位付け:
・正確な勝敗判定が最優先。
・ユーザーの選択の多様性(「グー」、「パー」、「チョキ」の全てが選択可能)。
ステークホルダー:
エンドユーザー(ゲームプレイヤー)。
開発者(プログラムの作成とメンテナンスを担当)。
元のpythonソースコード
import random
def get_user_choice():
return input("グー、チョキ、パーの中から選んでください: ")
def get_computer_choice(choices):
return random.choice(choices)
def determine_winner(user_choice, computer_choice):
if user_choice == computer_choice:
return "draw"
elif (user_choice == "グー" and computer_choice == "チョキ") or \
(user_choice == "チョキ" and computer_choice == "パー") or \
(user_choice == "パー" and computer_choice == "グー"):
return "win"
else:
return "lose"
def main():
choices = ["グー", "チョキ", "パー"]
user_choice = get_user_choice()
computer_choice = get_computer_choice(choices)
print("コンピューターの選択: " + computer_choice)
result = determine_winner(user_choice, computer_choice)
if result == "draw":
print("引き分けです。")
elif result == "win":
print("あなたの勝ちです!")
else:
print("あなたの負けです。")
if __name__ == "__main__":
main()
フローチャート図で表現したもの
%%{init:{'theme':'base','themeVariables':{
'primaryColor':'white',
'primaryTextColor':'black',
'primaryBorderColor':'#000000',
'lineColor':'gray',
'textColor':'#6A7FABCC',
'fontSize':'15px'}}}%%
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TD;
classDef default fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern1 fill:yellow,stroke:#333,stroke-width:2px;
classDef clrPattern2 fill:khaki,stroke:#333,stroke-width:2px;
classDef clrPattern3 fill:005060,stroke:#333,stroke-width:2px;
classDef clrPattern4 fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern5 fill:springgreen,stroke:#333,stroke-width:2px;
classDef clrPattern6 fill:wheat,stroke:#333,stroke-width:2px;
classDef clrPattern7 fill:lightsteelblue,stroke:#333,stroke-width:2px;
linkStyle default stroke:gray,stroke-width:2px;
%%データ項目
1("処理 開始")
3[/" 【return文】
4: return input(゛グー、チョキ、パーの中から
選んでください: ゛)
"/]
4("処理 終了")
%%ルート設定
1-->3
3-->4
%%{init:{'theme':'base','themeVariables':{
'primaryColor':'white',
'primaryTextColor':'black',
'primaryBorderColor':'#000000',
'lineColor':'gray',
'textColor':'#6A7FABCC',
'fontSize':'15px'}}}%%
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TD;
classDef default fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern1 fill:yellow,stroke:#333,stroke-width:2px;
classDef clrPattern2 fill:khaki,stroke:#333,stroke-width:2px;
classDef clrPattern3 fill:005060,stroke:#333,stroke-width:2px;
classDef clrPattern4 fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern5 fill:springgreen,stroke:#333,stroke-width:2px;
classDef clrPattern6 fill:wheat,stroke:#333,stroke-width:2px;
classDef clrPattern7 fill:lightsteelblue,stroke:#333,stroke-width:2px;
linkStyle default stroke:gray,stroke-width:2px;
%%データ項目
5("処理 開始")
7["【処理】
7: return random.choice(choice
s)
"]
8("処理 終了")
%%ルート設定
5-->7
7-->8
%%{init:{'theme':'base','themeVariables':{
'primaryColor':'white',
'primaryTextColor':'black',
'primaryBorderColor':'#000000',
'lineColor':'gray',
'textColor':'#6A7FABCC',
'fontSize':'15px'}}}%%
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TD;
classDef default fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern1 fill:yellow,stroke:#333,stroke-width:2px;
classDef clrPattern2 fill:khaki,stroke:#333,stroke-width:2px;
classDef clrPattern3 fill:005060,stroke:#333,stroke-width:2px;
classDef clrPattern4 fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern5 fill:springgreen,stroke:#333,stroke-width:2px;
classDef clrPattern6 fill:wheat,stroke:#333,stroke-width:2px;
classDef clrPattern7 fill:lightsteelblue,stroke:#333,stroke-width:2px;
linkStyle default stroke:gray,stroke-width:2px;
%%データ項目
9("処理 開始")
12{"10: 【条件文】"}:::clrPattern1
15[/" 【return文】
11: return ゛draw゛"/]
16{"12: 【条件文】"}:::clrPattern1
19[/" 【return文】
15: return ゛win゛"/]
21[/" 【return文】
17: return ゛lose゛"/]
22(("条件文
終了"))
23(("条件文
終了"))
24("処理 終了")
%%ルート設定
9-->12
12-->|真(TRUE)|15
12-->|偽(FALSE)|16
15-->22
16-->|真(TRUE)|19
16-->|偽(FALSE)|21
19-->22
21-->22
22-->23
23-->24
style sg1 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg1["if user_choice == computer_choice:"]
12
end
style sg2 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg2["elif (user_choice == ”グー” and computer_choice == ”チョキ”) or \"]
16
end
%%{init:{'theme':'base','themeVariables':{
'primaryColor':'white',
'primaryTextColor':'black',
'primaryBorderColor':'#000000',
'lineColor':'gray',
'textColor':'#6A7FABCC',
'fontSize':'15px'}}}%%
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TD;
classDef default fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern1 fill:yellow,stroke:#333,stroke-width:2px;
classDef clrPattern2 fill:khaki,stroke:#333,stroke-width:2px;
classDef clrPattern3 fill:005060,stroke:#333,stroke-width:2px;
classDef clrPattern4 fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern5 fill:springgreen,stroke:#333,stroke-width:2px;
classDef clrPattern6 fill:wheat,stroke:#333,stroke-width:2px;
classDef clrPattern7 fill:lightsteelblue,stroke:#333,stroke-width:2px;
linkStyle default stroke:gray,stroke-width:2px;
%%データ項目
25("処理 開始")
26["【処理】
20: choices = [゛グー゛, ゛チョキ゛, ゛パ
ー゛]
"]
28["【処理】
22: user_choice = get_user_cho
ice()
"]
30["【処理】
23: computer_choice = get_comp
uter_choice(choices)
"]
31["【出力】
24: print(゛コンピューターの選択: ゛ + com
puter_choice)
"]:::clrPattern5
33["【処理】
26: result = determine_winner(
user_choice, computer_choice)
"]
34{"28: 【条件文】"}:::clrPattern1
37["【出力】
29: print(゛引き分けです。゛)"]:::clrPattern5
38{"30: 【条件文】"}:::clrPattern1
41["【出力】
31: print(゛あなたの勝ちです!゛)"]:::clrPattern5
43["【出力】
33: print(゛あなたの負けです。゛)"]:::clrPattern5
44(("条件文
終了"))
45(("条件文
終了"))
46("処理 終了")
%%ルート設定
25-->26
26-->28
28-->30
30-->31
31-->33
33-->34
34-->|真(TRUE)|37
34-->|偽(FALSE)|38
37-->44
38-->|真(TRUE)|41
38-->|偽(FALSE)|43
41-->44
43-->44
44-->45
45-->46
style sg1 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg1["if result == ”draw”:"]
34
end
style sg2 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg2["elif result == ”win”:"]
38
end
%%{init:{'theme':'base','themeVariables':{
'primaryColor':'white',
'primaryTextColor':'black',
'primaryBorderColor':'#000000',
'lineColor':'gray',
'textColor':'#6A7FABCC',
'fontSize':'15px'}}}%%
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TD;
classDef default fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern1 fill:yellow,stroke:#333,stroke-width:2px;
classDef clrPattern2 fill:khaki,stroke:#333,stroke-width:2px;
classDef clrPattern3 fill:005060,stroke:#333,stroke-width:2px;
classDef clrPattern4 fill:#FFFFDE,stroke:#333,stroke-width:2px;
classDef clrPattern5 fill:springgreen,stroke:#333,stroke-width:2px;
classDef clrPattern6 fill:wheat,stroke:#333,stroke-width:2px;
classDef clrPattern7 fill:lightsteelblue,stroke:#333,stroke-width:2px;
linkStyle default stroke:gray,stroke-width:2px;
%%データ項目
47{"35: 【条件文】"}:::clrPattern1
50["【処理】
36: main()"]
51(("条件文
終了"))
%%ルート設定
s([START])-->
47-->|真(TRUE)|50
47-->|偽(FALSE)|51
50-->51
51--> e([end])
style sg1 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg1["if __name__ == ”__main__”:"]
47
end