一先ず完結・Javaでサイコロ(六面体)のアクションを考えてみる

f:id:ts0818:20190505131901j:plain

は~い...その通り!サイコロが複数パターンです、どうもボクです。

最近、思うんですよね...こんなこといくらやってても無駄なんじゃないかと...

だが、しかし!

kiniblog.com

学ぶって言うのはまねぶって言うじゃん?みんな最初は誰かの真似、おんなしおんなし。

SHIROBAKO」名言 発言キャラ:井口 祐未

私の一言:まずはできる人からいい部分を真似していけばいい。「まねぶ」だよ!

漫画・アニメの名言集124選!心に残る・やる気の出る・かっこいいセリフなど|きにぶろぐ.com

⇧  アニメのセリフって、確かに励まされる言葉が多いですね。アニメぜんぜん見てないけど...

というわけで、今回で一先ずはサイコロについては、一旦は完了ということで。

そんでは、レッツトライ~ 。

 

サイコロは同じか

まぁ、前と同じく、サイコロが同じかどうかを判定するやつなんですが、今回は、サイコロの数が「2 ≤ n ≤ 100」ってことみたい...

Eclipseを起動し、適当なJavaプロジェクト、クラスを作成で。

f:id:ts0818:20190505135117p:plain

ソースコードはこんな感じで。

Dice.java

package dto;

public class Dice {
  private int number[];
  private int work[];

  public Dice() {

  }

  public Dice(String[] args) {
    number = new int[args.length];
    work = new int[args.length];
    // サイコロの初期化
    for (int i = 0; i < args.length; i++) {
      number[i] = Integer.parseInt(args[i]);
    }
  }

  public void rollDice(char action, int num) {
    for (int i = 0; i < num; i++) {
      this.work[i] = this.number[i];
    }

    switch (action) {
    case 'E':
      // West→Top, South→South, Top→East, Bottm→West, North→North, East→Bottom
      setNumber(work[3], work[1], work[0], work[5], work[4], work[2]);
      break;
    case 'N':
      // South→Top, Bottom→South, East→East, West→West, Top→Nouth, Nouth→Bottom
      setNumber(work[1], work[5], work[2], work[3], work[0], work[4]);
      break;
    case 'S':
      // North→Top, Top→South, East→East, West→West, Bottom→North, South→Bottom
      setNumber(work[4], work[0], work[2], work[3], work[5], work[1]);
      break;
    case 'W':
      // East→Top, South→South, Bottom→East, Top→West, North→North, West→Bottom
      setNumber(work[2], work[1], work[5], work[0], work[4], work[3]);
      break;
    default :
      break;
    }
  }

  public void setNumber(int n1, int n2, int n3, int n4, int n5, int n6) {
    this.number[0] = n1;
    this.number[1] = n2;
    this.number[2] = n3;
    this.number[3] = n4;
    this.number[4] = n5;
    this.number[5] = n6;
  }
  
  public int[] getNumber () {
    return this.number;
  }

  public int takeTopNumber() {
    return this.number[0];
  }
  
  public int takeSouthNumber() {
    return this.number[1];
  }
  
  public int takeEastNumber() {
    return this.number[2];
  }
  
  public boolean equals(Object obj, char[] order) {
    if (obj == this) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (!(obj instanceof Dice)) {
      return false;
    }
    
    Dice another = (Dice)obj;
    
    boolean isSame = false;
    for (int i = 0; i < order.length; i++) {
      this.rollDice(order[i], another.getNumber().length);

      for (int j = 0; j < another.getNumber().length; j++) {
        if (this.number[j] == another.number[j]) {          
          isSame = true;
          
        } else {
          isSame = false;
          break;
        }
      }
      if (isSame) {
        break;
      }

    }    
    return isSame;
  }
}

TestDice04.java

package main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import dto.Dice;

public class TestDice04 {

  public static void main(String[] args) {
    // TODO 自動生成されたメソッド・スタブ
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    List<Dice> diceList = new ArrayList<>();
    int isSameCount = 0;
    
    try {
      String order = "NNNNWNNNWNNNENNNENNNWNNN";
      char[] orderChar = order.toCharArray();

      int n = Integer.parseInt(br.readLine());
      for (int i = 0; i < n; i++) {
        diceList.add(new Dice(br.readLine().split("\\s")));
      }
      for (int i = 0; i < diceList.size(); i++) {
        for (int j = i+1; j < diceList.size(); j++) {
          if (diceList.get(i).equals(diceList.get(j), orderChar)) {
            isSameCount++;
          } 
        }
      }
      
      if(isSameCount == 0) {
        System.out.println("Yes");
      } else {
        System.out.println("No");
      }
      
    } catch (NumberFormatException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    } catch (IOException e) {
      // TODO 自動生成された catch ブロック
      e.printStackTrace();
    }
  }
}

んで、実行。

f:id:ts0818:20190505135712p:plain

入力値は、

Input

1行目にサイコロの個数 n が与えられます。続く n 行に各サイコロの面の整数が与えられます。

各サイコロについて各面の整数が、ラベルの順番に空白区切りで1行に与えられます。

サイコロ 4 | プログラミング入門 | Aizu Online Judge

ということで、入力。

f:id:ts0818:20190505135911p:plain

もう一度、実行して、最初とは違うパターンで入力。

f:id:ts0818:20190505134850p:plain

できました~。

まぁ、なんていうか、n = 100 の時とかの場合、インスタンスを100個生成しちゃうことになるので、もっと良いアルゴリズムを考えんといかん気はするけど...(哀)。

今回はこのへんで。