Javaのお題を通してVimの練習をしましょう。

お題(Hit & Blow)

1~9の数字を使ってできる4桁の数字が何かを当てるゲームだ。(この4桁の数字に重複はない)
この数字はランダムで決定されるが例えば1357としよう。

プレイヤーはその数字が何かを予測し、入力する。

1234

この場合1は数字も位置も同じだ。この場合をHitとする。

3は数字は一致しているが位置が違うこれはBlowだ。
この結果

Hit:1,blow:1

と表示される。

これを繰り返し正解までの試行回数を競う。

[実行例]

数字を4桁で入力してください>1234
Hit:0,blow:1
数字を4桁で入力してください>5678
Hit:1,blow:2
数字を4桁で入力してください>9998
Hit:0,blow:0
数字を4桁で入力してください>1567
Hit:1,blow:2
数字を4桁で入力してください>2567
Hit:1,blow:3
数字を4桁で入力してください>6572
Hit:4,blow:0
6回でClear

[作例]
この処理の作例をVimで入力してみよう。

import java.util.*;
public class Main {
	public static void main(String[] args) {
		final int NUM_COUNT=4;
		int[] nums={1,2,3,4,5,6,7,8,9};
		int[] ans=new int[NUM_COUNT];
		for(int i=0;i<NUM_COUNT;i++){
			int index=new Random().nextInt(nums.length-i);
			ans[i]=nums[index];
			nums[index]=nums[nums.length-1-i];
		}
		int count=0,hit,blow;
		do{
			count++;
			hit=0;
			blow=0;
			System.out.printf("数字を%d桁で入力してください>",NUM_COUNT);
			int input=new Scanner(System.in).nextInt();
			int[] userAns=new int[NUM_COUNT];
			for(int i=ans.length-1;i>=0;i--){
				userAns[i]=input %10;
				input /=10;
			}
			for(int i=0;i<NUM_COUNT;i++){
				if(userAns[i]==ans[i]){
					hit++;
				}else{
					for(int j=0;j<NUM_COUNT;j++){
						if(userAns[i]==ans[j]){
							blow++;
						}
					}
				}
			}
			System.out.printf("Hit:%d,Blow:%d%n", hit,blow);
		}while(hit!=NUM_COUNT);
		System.out.printf("%d回でClear%n", count);
	}
}