自己啓発マン  2021/02/03更新

javaでタイピングゲームを作る


javaでタイピングゲームを作ろう

今回はjavaでタイピングゲームを作る

まずはタイピング言語を収録したクラスが必要であるのでDicクラスを作る

public class Dic {
	public static int count=0;
	public static int num=0;
	public static String dic[] = { /*ここに好きな単語をいれる*/};

}

そしてここにある、dicからランダムに数字を取り出してそれをタイピングしたものと比較したいので

まずはタイピングしたものとdicを比較するクラスを作成する

そして、そのクラスではDicクラスからランダムに選ばれたものを表示してそれとタイピング結果を比較する

選ばれた言語はもう出ないようにnullで上書きしておく

そして比較した結果正しければまたランダムで選ぶ

この時もしnullが選ばれたらもう一度ランダムで選ぶようにする

そして比較した結果が間違えていた場合は新たにこのクラスを作り、先ほど入力した言語をもう一度タイピングするようにクラスを生成した

その結果が下記である

import java.util.Scanner;

public class Typing {
	// TODO Auto-generated method stub
	private String lang=null;
	private String data=null;
	private int i;
	private String choise;
	
	Dic d = new Dic();
	Scanner s = new Scanner(System.in);
	
	public void play(String scan) {
		if(scan=="start") {
			this.lang=scan;
		}
		do{
			if(this.lang!=null) {
				do {
					if(Dic.count==/*言語の数*/) {
						System.out.println(
                                                "全問終了、正答率は"
                                                +(100-100*Dic.num//*言語の数*/)
                                                +"%です");
						return;
					}
					i = d.Numbers();
					choise=Dic.dic[i];

				}while(choise==null);
				this.lang=choise;
				Dic.dic[i]=null;

				System.out.println(this.lang);
				this.data=s.nextLine();	
			}	  
			if(this.lang==null) {
				System.out.println("もう一度入力してください");
				this.lang=scan;
				System.out.println(this.lang);
				this.data=s.nextLine(); 
			}
			if(this.data.equals(this.lang)) {
				Dic.count++;
			}

		}while(this.data.equals(this.lang));

		if(this.data.equals("end")) {
			System.out.println("終了します");
			return;
		}
		Dic.num++;
		Typing t = new Typing();
		t.play(this.lang);  
	}
}

ちなみにendで終了、または全問正解すると終わるようにした

また、ランダムに選ぶためにDicクラスにランダムクラスの活用するメソッドと、共通して使いたいフィールドをstaticで宣言した

それが以下のクラスである

import java.util.Random;

public class Dic {
	public static int count=0;
	public static int num=0;
	public static String dic[] = {/*ここに好きな言語をいれる*/};

		public int Numbers() {
			Random r = new Random();
			return r.nextInt(/*言語の数*/);
		}
}

あとはタイピングクラスを動かすメインクラスを作るのみである

今回はメインクラスにタイマーを設置してタイピングクラスのプレイメソッドが終了するまでの時間を計測できるようにした

public class Start {
	public static void main(String[] args) {

		long ts = System.currentTimeMillis();
		
		System.out.println("タイピングゲームを始めます");
		System.out.println("終わりたい時はendと入力してください");
		Typing t = new Typing();
		t.play("start");

		long te = System.currentTimeMillis();
		long tmsec = te - ts;
		double tsec = (double)tmsec / 1000.0;
		System.out.println( "かかった時間 : " + tsec + "秒です" );
	}
}

これでタイピングゲームを完成することができた

実行結果↓



今回のコードではタイピング言語をstatic領域で共有することでインスタンスを多く生成しないで、一度使った言語を非表示にすることができた

しかしstaticにあるため外部からは簡単に改竄できる脆弱性が見られた

また、同じく他のstaticもこのクラスだけでは共有して上手く使えているが同じく外部からは簡単に改竄できてしまうので脆弱性は同じくあるだろう

タイピングクラス内のフィールドはカプセル化はできた


まだまだstaticを使わずにカプセル化を図る改善は必要だろう




タイトルとURLをコピーしました