###★ 関数にする部分を考える
関数の主なメリットは「プログラムが読みやすくなる」「プログラムが再利用しやすくなる」の2つでした。
今回は「再利用」の予定がないので「プログラムが読みやすくなる」メリットを重点的に考えていきます。
▲ジャンケンゲームを構成する機能
- 人間に手を入力してもらう機能........................................................getHumHand関数
- 入力氏がおかしかったときにメッセージを出す機能........................そのまま利用
- コンピュータの手を決める機能........................................................getComHand関数
- 最終的な結果を表示する機能...........................getResult関数、getResultMsg関数
###★ 人間に手を入力してもらう
1.ジャンケンの手の番号を設定する
/* 変数定義 ************************/
// ジャンケンの手の番号を設定
var GU = 1;
var CHOKI = 2;
var PA = 3;
2.ジャンケンの手の入力を関数化する
ジャンケンの手の入力処理を処理していた部分を関数化します。
関数の機能は「人間のジャンケンの手を取得すること」なので、英語の「get Human Hand」を略して「getHumHand」としてみます。
ジャンケンの手に該当するときは入力された値をそのまま返し、それ以外のときはundefinedを返します。
/* 関数定義 ************************/
// 人間に手を入力してもらう機能
function getHumHand() {
var hum = prompt('半角数字で1~3の数字を入力してください。\n\n' + GU + ':グー\n' + CHOKI + ':チョキ\n' + PA + ':パー');
hum = parseInt(hum, 10);
if (hum !== GU && hum !== CHOKI && hum !== PA) {
return undefined;
} else {
return hum;
}
}
3.作った関数を呼び出す
/* 実行する処理 ************************/
var hum = getHumHand();
console.log(hum); この行は動作確認したらすぐ消す
}
}
★入力値がおかしいときにメッセージを表示する
1.入力値に応じて条件分岐する
「入力値がおかしかったときにメッセージを表示する機能」は、元々簡単なので、ここでは関数化しません。
point→
条件式で偽になる値
- 数値の0
- 数値のNaN
- 空白文字列の"(シングルクォート2つ)
- undefined
- null
- false
/* 実行する処理 ************************/
var hum = getHumHand();
if (!hum) {
alert('入力値をうまく認識できませんでした。ブラウザを再読み込みすると、もう一度挑戦できます。');
} else {
}
###★ コンピュータの手を決める
1.コンピュータの手の決定を関数化する
関数名は英語の「get Computer Hand」を略して「getComHand」にしてみました。
Point→ 関数化前のプログラムでは乱数を求めている事しかわかりません。関数化してgetComHandという名前を付けると、目的が分かりやすくなります。
// コンピュータの手を決める
function getComHand() {
return Math.floor(Math.random() * 3) + 1;
} // 以上は今回の書き込みの部分
/* 実行する処理 ************************/
var hum = getHumHand();
if (!hum) {
alert('入力値をうまく認識できませんでした。ブラウザを再読み込みすると、もう一度挑戦できます。');
} else { // 関数を呼び出す 以下は今回の書き込み部分
var com = getComHand();
console.log(com); // この行は動作を確認したらすぐ消す
}
★ 最終的な結果を表示する
1.手の名前の取得を関数化する
「最終的な結果を表示する機能」は複雑なので、「コンピュータの手の名前を取得する機能」「ジャンケンの勝敗結果を判定する機能」「最終的な結果のメッセージを作る機能」の3つに分けて、それぞれ関数化していきます。
// コンピュータの手の名前を取得
function getHandName(num) {
switch (num) {
case GU:
return 'グー';
case CHOKI:
return 'チョキ';
case PA:
return 'パー';
}
}
Point→ getHandName関数は、「ジャンケンの手を表わす1~3の数値を受け取って、それに対応する「グー」「チョキ」「パー」のいずれかの文字列を返します。なので、関数の定義で引数numを用意してそこに数値を渡してもらい、return文で文字列を返しております。
2.ジャンケンの勝敗結果を判定する機能を関数化する
「Get Result」をそのまま「getResult」にしてみました。
// 結果の判定
function getResult(com, hum) {
if (hum === com) {
return '結果はあいこでした。';
} else if ((com === GU && hum === PA) || (com === CHOKI && hum === GU) || (com === PA && hum === CHOKI)) {
return '勝ちました。';
} else {
return '負けました。';
}
}
3.最終的な結果のメッセージを作る機能を関数化する
「Get Result Message」として、それを連想できる「getResultMsg」を関数化してみました。
// 最終的な結果のメッセージ
function getResultMsg(com, hum) {
return getResult(com, hum) + 'コンピュータの出した手は「' + getHandName(com) + '」でした';
}
4.最終的な結果のメッセージを作る機能を関数化する
取得したメッセージをalertで表示します。
/* 実行する処理 ************************/
var hum = getHumHand();
if (!hum) {
alert('入力値をうまく認識できませんでした。ブラウザを再読み込みすると、もう一度挑戦できます。');
} else {
var com = getComHand(); // 関数を呼び出して結果を表示
alert(getResultMsg(com, hum));
}
}
5.全体を1つの関数「janken」にする
function janken () {
/* 変数定義 ************************/
// ジャンケンの手の番号を設定
alert(getResultMsg(com, hum));
}
}
janken();
まとめ
function janken () {
/* 変数定義 ************************/
// ジャンケンの手の番号を設定
var GU = 1;
var CHOKI = 2;
var PA = 3;
/* 関数定義 ************************/
// 人間に手を入力してもらう機能
function getHumHand() {
var hum = prompt('半角数字で1~3の数字を入力してください。\n\n' + GU + ':グー\n' + CHOKI + ':チョキ\n' + PA + ':パー');
hum = parseInt(hum, 10);
if (hum !== GU && hum !== CHOKI && hum !== PA) {
return undefined;
} else {
return hum;
}
}
// コンピュータの手を決める
function getComHand() {
return Math.floor(Math.random() * 3) + 1;
}
// コンピュータの手の名前を取得
function getHandName(num) {
switch (num) {
case GU:
return 'グー';
case CHOKI:
return 'チョキ';
case PA:
return 'パー';
}
}
// 結果の判定
function getResult(com, hum) {
if (hum === com) {
return '結果はあいこでした。';
} else if ((com === GU && hum === PA) || (com === CHOKI && hum === GU) || (com === PA && hum === CHOKI)) {
return '勝ちました。';
} else {
return '負けました。';
}
}
// 最終的な結果のメッセージ
function getResultMsg(com, hum) {
return getResult(com, hum) + 'コンピュータの出した手は「' + getHandName(com) + '」でした';
}
/* 実行する処理 ************************/
var hum = getHumHand();
if (!hum) {
alert('入力値をうまく認識できませんでした。ブラウザを再読み込みすると、もう一度挑戦できます。');
} else {
var com = getComHand();
alert(getResultMsg(com, hum));
}
}
janken();
####無名関数
varを定義するときにfunctionの後の関数名を省略することができます。
この書き方を「無名関数」と言います。
単に関数を省略しただけだと呼び出すことができず「何も起きない」ので、一般的には定義と同時に変数に記憶したり、他の関数の引数として利用します。変数に記憶した場合は、名前のある関数と同じように「変数名()」という形式で呼び出すことができます。
var 変数名 = function (引数1,引数2,...) {
行いたい処理
return 戻り値;
};