2016-09-03 6 views
1

私はmastermindというゲームを複製する基本的なプログラムを試しています。今まで4つのデータポイントと4つのユーザー入力を整数として取得できましたが、4つのデータポイントと4つのユーザー入力を比較するのに問題があります。目標は4つのrng(1から9の範囲)があり、ユーザーは一度に4つの数字を推測することです。彼が与えられた唯一のヒントは、一つの数字が正しいということです。今まで私は4つの変数、ex(a = rng1、b = rng2、c = rng3、d = rng4)とユーザー入力を同様に比較するように設定された非効率なコードを作ることができました。どのようにして効率的にユーザー入力を生成したすべてのrngに比較するのですか?このインスタンスでは、s1とpoopを比較できます。 poop2; poop3;とpoop4。私はそれをするために別の100行のコードを書くつもりはありません。前もって感謝します。コードは以下のとおりです。一度に複数の変数にユーザー入力をどのように比較するのですか?

import java.util.*; 
public class RandomNumberGenerator{; 
private static Scanner in; 
public static void main(String[] args){ 
    Random r = new Random(); 
    float s; 
    in = new Scanner(System.in); 
    int poop = (r.nextInt(10-1)+1); 
    int poop1 = (r.nextInt(10-1)+1); 
    int poop2 = (r.nextInt(10-1)+1); 
    int poop3 = (r.nextInt(10-1)+1); 
for (int i = 0; i < 80; i++) 
{ 
System.out.println("Enter a number from 1-9"); 
s = in.nextFloat(); 
float s1 = in.nextFloat(); 
float s2 = in.nextFloat(); 
float s3 = in.nextFloat(); 

if(poop == s && poop1 == s1 && poop2 == s2 && poop3 == s3) { 
    System.out.println("You are correct HeHe XD"); 
    break; 
    } 
if(poop > s && poop1 == s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop < s && poop1 == s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop > s && poop1 == s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 > s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 < s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 == s1 && poop2 > s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 == s1 && poop2 < s2 && poop3 == s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 == s1 && poop2 == s2 && poop3 > s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop == s && poop1 == s1 && poop2 == s2 && poop3 < s3){ 
    System.out.println("You have 1 wrong"); 
} 
if(poop != s && poop1 != s1 && poop2 == s2 && poop3 == s3){ 
    System.out.println("You have 2 wrong"); 
} 
if(poop != s && poop1 == s1 && poop2 != s2 && poop3 == s3){ 
    System.out.println("You have 2 wrong"); 
} 
if(poop != s && poop1 == s1 && poop2 == s2 && poop3 != s3){ 
    System.out.println("You have 2 wrong"); 
} 
if(poop == s && poop1 != s1 && poop2 != s2 && poop3 == s3){ 
    System.out.println("You have 2 wrong"); 
} 
if(poop == s && poop1 != s1 && poop2 == s2 && poop3 != s3){ 
    System.out.println("You have 2 wrong"); 
} 
if(poop == s && poop1 != s1 && poop2 != s2 && poop3 != s3){ 
    System.out.println("You have 3 wrong"); 
} 
if(poop != s && poop1 == s1 && poop2 != s2 && poop3 != s3){ 
    System.out.println("You have 3 wrong"); 
} 
if(poop != s && poop1 != s1 && poop2 == s2 && poop3 != s3){ 
    System.out.println("You have 3 wrong"); 
} 
if(poop != s && poop1 != s1 && poop2 != s2 && poop3 == s3){ 
    System.out.println("You have 3 wrong"); 
} 
if(poop != s && poop1 == s1 && poop2 != s2 && poop3 != s3){ 
    System.out.println("You have 3 wrong"); 
} 
if(poop != s && poop1 != s1 && poop2 != s2 && poop3 != s3){ 
    System.out.println("You have 4 wrong"); 
} 

} 

} 
} 
+0

コードが動作していることでしょうか? – emotionlessbananas

+2

** tip ** 'int'と' float'の比較を避けてください – emotionlessbananas

+0

@AsteriskNinjaはいコードは動作します –

答えて

1

4つのデータポイントとユーザー入力を格納するために2つのArrayListを使用できます。次に、ArrayList.contains()を使用して比較します。 if conditionをたくさん書く必要はありません。下記の私のコードを参照してください:

public static void main(String[] args) { 
     final int totalPoints = 4; 
     Random r = new Random(); 
     in = new Scanner(System.in); 

     ArrayList<Integer> poops = new ArrayList<Integer>(totalPoints); 
     ArrayList<Integer> userinputs = new ArrayList<Integer>(totalPoints); 

     for (int i=0; i<totalPoints; i++) { 
      int poop = (r.nextInt(10-1)+1); 
      System.out.println("Random datapoints: " + poop); 
      poops.add(poop); 
     } 


     System.out.println("Enter a number from 1-9"); 
     for (int i=0; i<totalPoints; i++) { 
      int s = in.nextInt(); 
      userinputs.add(s); 
     } 

     int correct = 0; 
     for (int i=0; i<4; i++) { 
      if (poops.contains(userinputs.get(i))) { 
       correct++; 
      } 
     } 

     System.out.println("You have " + correct + "correct numbers"); 

} 
+0

神はあなたを祝福します!それは素晴らしい、私はちょうどjavaを開始したので、配列を使用して、それらを学ぶnoobyプログラマーは少し難しいです。どうもありがとう! –

+0

1つの問題は、 'x'が間違っていると言うとループしないということです。 'for =(i = 0; i <4; i ++)'を使用しました。これはコード全体をループするために使用したものです。 –

+0

@ArchitSrivastavaしかし、心に留めておいてください。おそらく学習する最良の方法ではありません。あなたは "キーワード"を拾い、それらの概念をあなた自身が勉強するときにもっと学びます。 "書かれたコード"を読むことは、自分でコードを書くのに比べて、常に "教える時間が少なくなります"。 – GhostCat

1

要素がListであるならば、あなたはcontainsに確認することができますListであなたの変数を入れてください。 実際には、マスターマインドのフィードバックとして2つの数字があります。正しい数字はいくつあり、正しい番号にいくつの数字もあります。 マスターマインドで重複が可能なので、オリジナルのcopyListに、それぞれguessremoveの正しいものをListから作成することができます。それ以外の場合は、すべてnumberと推測すると、その番号が正しい場合はcontainsとなります。

int size = 4; 
List<Integer> poops = new ArrayList<>(); 
for(int i =0; i<size; i++){ 
    poops.add((r.nextInt(10-1)+1)); 
} 
... 
List<Integer> guesses= new ArrayList<>(); 
for(int i =0; i<size; i++){ 
    guesses.add(in.nextInt()); 
} 
int correctNumberCount = 0; 
List<Integer> poopsCopy = new ArrayList<>(poops); 
for(Integer guess: guesses){ 
    if(poopsCopy.contains(guess)){ 
     correctNumberCount ++; 
     //For handling duplicates 
     poopsCopy.remove(guess); 
    } 
} 
int correctCount = 0; 
int counter = 0; 
for(Integer guess: guesses){ 
    if(guess == poops.get(counter)){ 
     correctCount++; 
    } 
    counter++; 
} 
//Inform the user about correctNumberCount and correctCount 
+0

ありがとう、私は今、もう少しそれを得る! –

1

あなたはP1、P2、P3、...

あなたはバックステップと配列の概念について読むという名前の変数にそれをしません!

次に、2つの配列を作成します(intで、floatは使用できません)。 最初の配列は、プログラムが考える4つの値を持ちます。 2番目の配列はユーザ​​ーからの4つの値で埋められます。

次に、を繰り返します。両方の配列です。 "user"配列内のいくつの要素が "computer"配列に与えられているかを調べる。本当に:決しては非常に多くのif/elseステートメントを含むコードを書くべきではありません。そのようなコードは、読んだり維持したりすることは絶対に不可能です。それをしないでください。これまで

また、コレクションは、より洗練されたデータ構造です。あなたの場合、IntegerオブジェクトのList/ArrayListを操作することができます。あなたはそのことに興味があるとき。あなたの好きな検索エンジンを使い、それについて読むことができます。

+0

mastermindでは 'numbers '(元々Colors)を複製することができるので、' Set'はここでは適切ではありません。 – garnulf

+0

@ garnulfああ、そうです。昔、私はそのゲームをプレイしました。その場合、1つの値が複数回使用される場合、その値がカウンタになるMapが必要になります。それはおそらく彼の心を吹くだろう。あなたのご意見ありがとうございます。私は答えからセットの部分を削除しました。 – GhostCat

1

あなたの要件によると、間違った場所ではなく、それぞれの入力の組み合わせが間違っているだけです。したがって、すべての可能性を列挙する必要はありません。

以下のコードを試してみてください。sizeは、入力可能な入力数を示す数字です。

私はListを使用して番号を保存しました。loopで簡単に操作できるように、一連のデータをコンテナに保存しておくことは良い習慣です。loopは、コンピュータの最も強力な機能の1つです。

import java.util.*; 

public class RandomNumberGenerator { 

    private static Scanner in; 

    private static List<Integer> expected = new ArrayList<Integer>(); 
    private static List<Integer> input = new ArrayList<Integer>(); 

    static private final int size = 4; 

    static int correctNumber = 0; 

    public static void check(List<Integer> expected, List<Integer> input) { 
     for (int i = 0; i < size; i++) { 
      if (expected.get(i) == input.get(i)) { 
       correctNumber++; 
      } 
     } 

     if (correctNumber == size) { 
      System.out.println("You are correct HeHe XD"); 
      return; 
     } else { 
      int wrongNumber = size - correctNumber; 
      System.out.println("You have " + wrongNumber + " wrong"); 
      correctNumber = 0; 
     } 
    } 

    public static void main(String[] args) { 
     Random r = new Random(); 
     in = new Scanner(System.in); 

     int count = size; 
     while(count > 0){ 
      expected.add((r.nextInt(10 - 1) + 1)); 
      count--; 
     } 

     for (int i = 0; i < 80; i++) { 
      System.out.println("Enter 4 numbers from 1-9"); 
      count = size; 
      while(count > 0){ 
       input.add(in.nextInt()); 
       count--; 
      } 
      check(expected, input); 
     } 
    } 
} 
-1

方法について:

import java.util.*; 
public class RandomNumberGenerator{; 
private static Scanner in; 
public static void main(String[] args){ 
    Random r = new Random(); 
    float s; 
    in = new Scanner(System.in); 
    int[] poops = new int[4]; 
    for(int i=0;i<poops.length;i++){ 
     poops[i]=r.nextInt(10-1)+1; 
    } 

float[] s = new float[4]; 

for (int i = 0; i < 80; i++){ 
    System.out.println("Enter a number from 1-9"); 
    int error =0; 
    for(int j=0;j<poops.length;j++){ 
     if(poop[j] != in.nextFloat()){ 
      error++; 
     } 
    } 
    if(result == 0){ 
     System.out.println("You are correct HeHe XD"); 
     break; 
    }else{ 
     System.out.println("You have "+error+" wrong"); 
    } 
} 

}

+0

'あなたの変数は 'error'なので、これはコンパイルされません。また、' int'と 'float'を比較すると、問題が発生します。 – garnulf

関連する問題