要件定義
【要件定義】
機能要件:
・ユーザーは「グー」、「パー」、または「チョキ」のいずれかを選択できる。
・コンピューターはランダムに「グー」、「パー」、または「チョキ」のいずれかを選択する。
・プログラムはユーザーとコンピューターの選択を比較し、勝者を決定する。
・勝ち、負け、の際にそれぞれ結果を表示する
・あいこの場合は、決着がつくまで継続する
非機能要件:
・シンプルで直感的なインターフェース。
・高速な応答時間。
・再プレイ可能性。
制約:
・クラスや関数を使用しない。
優先順位付け:
・正確な勝敗判定が最優先。
・ユーザーの選択の多様性(「グー」、「パー」、「チョキ」の全てが選択可能)。
ステークホルダー:
エンドユーザー(ゲームプレイヤー)。
開発者(プログラムの作成とメンテナンスを担当)。
元の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 = ["グー", "チョキ", "パー"]
while True:
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("あなたの勝ちです!")
break
else:
print("あなたの負けです。")
break
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 = [゛グー゛, ゛チョキ゛, ゛パ
ー゛]
"]
27[/" 【繰返文開始】
22: while True:"\]:::clrPattern2
32["【処理】
23: user_choice = get_user_cho
ice()
"]
34["【処理】
24: computer_choice = get_comp
uter_choice(choices)
"]
35["【出力】
26: print(゛コンピューターの選択: ゛ + com
puter_choice)
"]:::clrPattern5
37["【処理】
28: result = determine_winner(
user_choice, computer_choice)
"]
38{"30: 【条件文】"}:::clrPattern1
41["【出力】
31: print(゛あいこです。もう一度選んでください。゛
)
"]:::clrPattern5
42{"32: 【条件文】"}:::clrPattern1
45["【出力】
33: print(゛あなたの勝ちです!゛)"]:::clrPattern5
46["【break文】
34: break"]
48["【出力】
36: print(゛あなたの負けです。゛)"]:::clrPattern5
49["【break文】
37: break"]
50(("条件文
終了"))
51(("条件文
終了"))
52[\" 【繰返文終了】"/]:::clrPattern2
53("処理 終了")
%%ルート設定
25-->26
26-->27
27-->|ループ開始|32
32-->34
34-->35
35-->37
37-->38
38-->|真(TRUE)|41
38-->|偽(FALSE)|42
41-->50
42-->|真(TRUE)|45
42-->|偽(FALSE)|48
45-->46
46-->52
48-->49
49-->52
50-->51
51-->52
52-->|ループ終了|53
52-->|ループ継続|27
style sg1 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg1["if result == ”draw”:"]
38
end
style sg2 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg2["elif result == ”win”:"]
42
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;
%%データ項目
54{"39: 【条件文】"}:::clrPattern1
57[[" 【ユーザー定義関数呼出】
40: main()"]]:::clrPattern7
58(("条件文
終了"))
%%ルート設定
s([START])-->
54-->|真(TRUE)|57
54-->|偽(FALSE)|58
57-->58
58--> e([end])
style sg1 color:red,fill-opacity:0, stroke-opacity:0;
subgraph sg1["if __name__ == ”__main__”:"]
54
end