#目次
- はじめに
- 指スマとは
- ルール説明
- 環境
- コード
- まとめ
- 参考文献
#はじめに
どうもプログラミング学習初心者のものです。
自分は今Java言語を使ってプログラミング学習をしているのですが、何か自分でプログラムを作ってみたいと思い立ち、かといって大それたものは作れないので何か遊び的なものをプログラム上で動かしてみようと思い、ふと浮かんだ**「指スマ」**にしようとしました。
#指スマとは
指スマを知らない人に向けて説明してと言われても自分で簡単に説明ができないので、weblioサイトで引用した説明を下記に載せておきました。
「数人で行われるゲームの一つで、参加者が自身の手のひらを向かい合わせにして握りこんだ状態から、掛け声に合わせて一斉に親指を立てた数を「親」が当てるというもののこと。「親」の予想した数は掛け声と共に言われる。フジテレビの番組SMAP×SMAPで指スマと呼ばれたことから定着した名前であるが、実際は番組以前にも存在していたゲームである。地域によって呼び方や掛け声に差があり、代表的なものには「いっせーのせ」や「バリチッチ」などが存在する。ゲームの名称と掛け声は一致する傾向にあり、例えば「親」が3本の親指が立つと予想する場合、「指スマ3」という掛け声になることが多い。」(weblio辞書 指スマ解説分より抜粋)
#ルール説明
- 参加人数を入力させ、各参加者の名前を入力させる
- 一人目から順番に「親」となりランダムに指数を宣言し、ランダムに参加者も指をランダムに出力する。
- 「親」が宣言した指数と参加者が出力した指数の合計が同じであればその「親」は指を一つおろし、もう一回当たれば上がることができる
- 最後の参加者(ドベ)が決まるまで繰り返す
ルール自体は通常の指スマと同じです。
これをプログラミング上で実装します。
#環境構築
java version "13.0.2" 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)
Eclipse Version: 2020-09 (4.17.0)
#コード実装
package java_2020_11;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/*
指スマのプログラム
操作手順:
0:指スマ開始するかの入力値を作る
1:人数を指定できるように入力値を作る
2:一人ひとりの名前を記録し、1番目の人から指の数を入力できるようにする
3:かく順番が回ってくるのでその都度入力値として受け取った指の数を出力する。
4:3と同時に他のメンバーの指の数もランダム値として出力させる。
5:3と4の出力値が一致していた場合はあたりの判定を出力、外れの判定を出力する。
6:一回当たると、指を一つへらし、計2回当たると上がれる
7:最後のひとりになるまでこの処理を繰り返す。
*/
public class Yubisuma {
public static void main(String[] args) {
Input in = new Input();
Calculation ca = new Calculation();
System.out.print("指スマを開始しますか。「はい」か「いいえ」を入力してください:: ");
String choice = in.letter();
switch (choice) {
case "はい":
System.out.println("それでは指スマを開始します。");
System.out.print("何人でやりますか?(半角数字で入力):: ");
int peoples = in.numbers();
int f_numbers = ca.finger_index(peoples); //指の数が代入される
System.out.println("指の合計数は" + f_numbers + "です");
ArrayList<String> NamesList = new ArrayList<String>();
int[] count = new int[peoples]; //2回当たると上がれることを記憶するカウント配列
for(int i=1; i<=peoples; i++) {
System.out.println (i + "番目の人の名前を入力してください。");
String name = in.letter();
NamesList.add(name);
count[i-1] = 2;
System.out.println(i + "番目の人の名前が" + name + "で登録されました。");
}
System.out.println(NamesList + "全員の名前が登録されたのでゲームを始めます");
while(peoples != 1) {
for (int i=0; i < peoples; i++) {
int sum = 0;
int a_fn = ca.finger(f_numbers); //指定した指の数を返す
System.out.println(NamesList.get(i) + "さんの番です。" + "(" + NamesList.get(i) + ")" +"いっせっせーの" + a_fn + "!");
for (int j=0; j < peoples; j++) {
int a = ca.other_finger(count[j]); //全員分の指数を返す。
System.out.print(NamesList.get(j) + ":" + a + " ");
sum += a;
}
System.out.println("合計指数:" + sum);
if(a_fn == sum) {
System.out.println(NamesList.get(i) + "さんあたりです!");
if (count[i] != 1) {
count[i] -= 1;
f_numbers -= 1;
System.out.println(NamesList.get(i) + "さんあと一揃いで抜けれます。頑張ってください");
}else {
System.out.println(NamesList.get(i) + "さんアガリです!");
f_numbers -= 1;
peoples -= 1;
NamesList.remove(i);
}
}else {
System.out.println(NamesList.get(i) + "さん外れです");
}
}
}
System.out.println(NamesList.get(0) + "さんドベです。残念でした。");
System.out.println("皆さんお疲れ様でした。");
break;
case "いいえ":
System.out.println("お疲れ様でした。");
break;
}
}
public static class Input { //入力値クラス
Scanner scanner = new Scanner(System.in);
public String letter() { //文字列入力の場合はletter()メソッド
String le = scanner.nextLine();
return le;
}
public int numbers() { //数字入力の場合はnumbers()メソッド
int num = scanner.nextInt();
return num;
}
}
public static class Calculation { //計算クラス
int finger_numbers;
Random r = new Random();
public int finger_index(int peoples) {
finger_numbers = peoples * 2;
return finger_numbers;
}
public int finger(int f_numbers) { //i番の指定した指の本数をreturnでランダム数で返す
int answer_index = r.nextInt(f_numbers + 1);
return answer_index;
}
public int other_finger(int count) { //一人が上げる親指の本数
int other_answer_index;
if (count == 2) {
other_answer_index = r.nextInt(3);
}else {
other_answer_index = r.nextInt(2);
}
return other_answer_index;
}
}
}
####コードの補足
- 各参加者の名前を入力してもらった時に格納するのが配列だとうまくいかないのでArrayListを使いました。また、誰かが言い当てた時、または上がれた時はその人の指を減らし、上がれた場合にはArrayList内に格納した人を削除する必要があったのでArrayListが最適でした。
- 今回は指の数を当て合うのはRomdom関数で全て自動にしたため、勝敗も自動で決まってしまいます。
- 指スマは計2回言い当てなければいけなくそのカウント配列もあらかじめ用意しました。
- 1クラスだけでは面白くないと思い、処理ごとにクラスを分けてみました。
- なぜか最初の参加者の名前だけ入力できない(2人目以降はしっかり名前を入力できるのに…)。それでもちゃんと動作するから原因が分からずじまい(泣)。
#まとめ
###感想
基礎的な処理の連続なのでコードの内容自体はシンプルなはずです。(これぐらいしかまだ実力がない…)
今までは何かの参考書を買い、そこに載っているコードをただ写経するだけでしたのでどれほど自分が理解できているのかわからなく、かつ理解してる風な状態だなと感じ、それが嫌だったわけで今に至るわけですが、案の定たくさん行き詰まり、自分がプログラミングというものを全く理解していないことを痛感しました。
また、それと同時に何かを自らの手で作り上げる楽しさを感じれたのでこれからは簡単な遊びだけでなくもっと実用的なものを考え、自らの手で作り上げたいと思います。
###オブジェクト指向に関して
javaで実装しているからオブジェクト指向型のコードを作ろうと必死にクラスを生成したりしてやろうとしましたが、自分でも「これ、なんか違うくね?」と違和感を感じます。笑笑
なんか「無理やりオブジェクト指向型にしてみよう」感がだだ漏れのコードだなぁと正直感じました。(実際なっているかも分からない。)
次何か作るときにはもっとうまく、そして見易いコードにしたいと思います。
#参考文献
weblio辞書 https://www.weblio.jp/content/指スマ
Markdown記法 チートシート https://qiita.com/Qiita/items/c686397e4a0f4f11683d