質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

3973閲覧

【janken.RandomTacitcs cannot be resolved to a type】Javaのエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2015/05/09 17:31

以下コードの下から4行目の部分で
janken.RandomTacitcs cannot be resolved to a type
とエラーが出ます。
どのように修正すればいいでしょうか?
宜しくお願いします。

lang

1package Ovject; 2 3public class janken { 4 // インターフェースの作成 5 public interface Tactis { 6 public int readTactis(); // メソッドの作成 7 } 8 9 // ランダムに手を決める戦略クラス.インタフェースをじっそうする 10 public class Player { 11 public int stone = 0; 12 int scissors = 1; 13 int paper = 2; 14 15 private String name_; 16 private int Wincount_ = 0; 17 18 private Tactis tactis_; 19 20 // コンストラクタ 21 Player(String name_) { 22 this.name_ = name_; 23 } 24 void SetTactics(Tactis tactis) { 25 tactis_ = tactis; 26 } 27 28 // showHandを実行するのではなく、readTactisを実行するようにする 29 int showHand() { 30 int hand = tactis_.readTactis(); 31 return hand; 32 } 33 public class RandomTacitcs implements Tactis { 34 public int readTactis() { 35 double num = Math.random() * 3; 36 int hand = 0; 37 if (num < 1) { 38 hand = stone; 39 System.out.println("ぐー"); 40 } else if (num < 2) { 41 hand = scissors; 42 System.out.println("ちょき"); 43 } else { 44 hand = paper; 45 System.out.println("パー"); 46 } 47 return hand; 48 } 49 } 50 // メソッド 51 public void notifyResult(boolean result) { 52 if (result = true) { 53 Wincount_++; 54 } 55 } 56 57 public String getName() { 58 return name_; 59 } 60 61 public int getWincount() { 62 return Wincount_; 63 } 64 } 65 66 public class Judge { 67 // メソッド 68 public void StartJunken(Player player1, Player player2) { 69 System.out.println("ジャンケンを開始します"); 70 for (int i = 0; i < 3; i++) { 71 System.out.println(i + "回戦"); 72 Player winner = judgeJanken(player1, player2); 73 if (winner != null) { 74 System.out.println(winner.getName() + "が勝ちました"); 75 } else { 76 System.out.println("引き分けです"); 77 } 78 } 79 System.out.println("じゃんけんを終了しました!"); 80 Player finalWinner = judgeFinalWinner(player1, player2); 81 if (finalWinner != null) { 82 System.out.println(finalWinner.getName() + "の勝ちです!"); 83 } else { 84 System.out.println("引き分けです!"); 85 } 86 } 87 88 private Player judgeJanken(Player player1, Player player2) { 89 Player winner = null; 90 int playerhand1 = player1.showHand(); 91 int playerhand2 = player2.showHand(); 92 if (playerhand1 == player1.stone && playerhand2 == player2.scissors 93 || playerhand1 == player1.scissors 94 && playerhand2 == player2.paper 95 || playerhand1 == player1.paper 96 && playerhand2 == player2.stone) { 97 winner = player1; 98 player1.Wincount_++; 99 } else if (playerhand2 == player1.stone 100 && playerhand1 == player2.scissors 101 || playerhand2 == player1.scissors 102 && playerhand1 == player2.paper 103 || playerhand2 == player1.paper 104 && playerhand1 == player2.stone) { 105 winner = player2; 106 player2.Wincount_++; 107 } 108 return winner; 109 } 110 111 private Player judgeFinalWinner(Player player1, Player player2) { 112 Player wineer = null; 113 int player1Wincounr = player1.getWincount(); 114 int player2Wincounr = player2.getWincount(); 115 if (player1Wincounr > player2Wincounr) { 116 wineer = player1; 117 } else if (player1Wincounr < player2Wincounr) { 118 wineer = player2; 119 } else { 120 return null; 121 } 122 return wineer; 123 } 124 } 125 126 public class Yamada extends Player { 127 public Yamada(String name_) { 128 super(name_); 129 } 130 131 public int showHand() { 132 System.out.println("ぐー"); 133 return stone; 134 } 135 } 136 137 public class Murata extends Player { 138 public Murata(String name_) { 139 super(name_); 140 } 141 142 public int showHand() { 143 System.out.println("ぱー"); 144 return paper; 145 } 146 } 147 148 public static void main(String[] args) { 149 janken j = new janken(); 150 Judge saito = j.new Judge(); 151 Player murata = j.new Murata("村田さん"); 152 Player yamada = j.new Yamada("山田さん"); 153 ///エラー部分 154 Tactis murataTactis = j.new RandomTacitcs(); 155 murata.SetTactics(murataTactis); 156 saito.StartJunken(murata, yamada); 157 } 158} 159

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

コードをいろいろ変更してみました。
参考になれば幸いです。
主な変更点;

  • inner class は使わないようにした。
  • じゃんけんの手を enum にした。
  • じゃんけんの手の勝敗を if 文での判定でなく、勝敗表を引いて判定するようにした。
  • Murata, Yamada というクラスは無くして、 Playser クラスで名前を持つようにした。

lang

1package Ovject; 2 3import java.util.HashMap; 4 5enum Hand { 6 STONE("グー"), SCISSORS("チョキ"), PAPER("パー"); 7 8 private final String name_; 9 10 private Hand(String name) { 11 this.name_ = name; 12 } 13 14 public String getName() { 15 return this.name_; 16 } 17} 18 19// 戦術インターフェースの定義 20interface Tactics { 21 public Hand nextHand(); 22} 23 24// ランダムに手を選ぶ戦術 25class RandomTactics implements Tactics { 26 27 private final Hand[] hands = {Hand.STONE, Hand.SCISSORS, Hand.PAPER}; 28 29 @Override 30 public Hand nextHand() { 31 double num = Math.random() * 3; 32 return hands[(int) num]; 33 } 34} 35 36class Player { 37 private final String name_; // 名前 38 private Tactics tactics_; // 戦術 39 private final HashMap<String, Integer> records_ = new HashMap<>(); // スコア 40 41 Player(String name) { 42 this(name, null); 43 } 44 45 Player(String name, Tactics tactics) { 46 this.name_ = name; // 名前 47 this.tactics_ = tactics; // 戦術 48 this.records_.put("win", 0); // 勝ちの回数 49 this.records_.put("lose", 0); // 負けの回数 50 this.records_.put("draw", 0); // 引分の回数 51 } 52 53 Hand nextHand() { 54 if (this.tactics_ != null) { 55 return this.tactics_.nextHand(); 56 } else { 57 // デフォルトの戦術: 常に "グー" を出す 58 return Hand.STONE; 59 } 60 } 61 62 public void notifyResult(int result) { 63 final String[] keys = {"draw", "win", "lose"}; 64 String key = keys[result + 1]; 65 this.records_.put(key, 1 + this.records_.get(key)); 66 } 67 68 public String getName() { 69 return name_; 70 } 71 72 public int score(String key) { 73 return this.records_.get(key); 74 } 75 76 String scoreStr() { 77 return this.getName() 78 + " 勝ち:" + this.records_.get("win") 79 + " 負け:" + this.records_.get("lose") 80 + " 引分:" + this.records_.get("draw"); 81 } 82} 83 84class Judge { 85 // じゃんけんの勝敗表 ["player1 の手 player2 の手", 勝敗"] 86 // 勝敗項の値: 0: 引分, 1: player1 の勝ち, -1: player1 の負け 87 private static final HashMap<String, Integer> match = new HashMap<>(); 88 Judge() { 89 // 勝敗表の設定 90 match.put("グー グー", 0); 91 match.put("グー チョキ", 1); 92 match.put("グー パー", -1); 93 94 match.put("チョキ_グー", -1); 95 match.put("チョキ_チョキ", 0); 96 match.put("チョキ_パー", 1); 97 98 match.put("パー グー", 1); 99 match.put("パー チョキ", -1); 100 match.put("パー パー", 0); 101 } 102 103 public void StartJunken(Player player1, Player player2, int times) { 104 105 System.out.println("ジャンケンを開始します"); 106 for (int i = 0; i < times; i++) { 107 System.out.println(i + "回戦"); 108 109 final Player winner = play(player1, player2); 110 if (winner == null) { 111 System.out.println("引き分けです"); 112 } else { 113 System.out.println(winner.getName() + "が勝ちました"); 114 } 115 } 116 System.out.println("じゃんけんを終了しました!"); 117 118 Player finalWinner = judgeScore(player1, player2); 119 if (finalWinner == null) { 120 System.out.println("引き分けです!"); 121 } else { 122 System.out.println(finalWinner.getName() + "の勝ちです!"); 123 } 124 } 125 126 Player play(Player player1, Player player2) { 127 Hand hand1 = player1.nextHand(); 128 Hand hand2 = player2.nextHand(); 129 String key = hand1.getName() + " " + hand2.getName(); 130 System.out.println(key); // 互いの手を表示する 131 int result = Judge.match.get(key); 132 133 final Player ret; 134 if (result == 0) { 135 ret = null; // 引き分け 136 } else if (result == 1) { 137 ret = player1; // player1 の勝ち 138 } else { 139 ret = player2; // player2 の勝ち 140 } 141 player1.notifyResult(result); 142 player2.notifyResult(result * (-1)); 143 return ret; 144 } 145 146 Player judgeScore(Player player1, Player player2) { 147 final Player wineer; 148 int player1Wincount = player1.score("win"); 149 int player2Wincount = player2.score("win"); 150 151 if (player1Wincount > player2Wincount) { 152 wineer = player1; 153 } else if (player1Wincount < player2Wincount) { 154 wineer = player2; 155 } else { 156 wineer = null; 157 } 158 return wineer; 159 } 160} 161 162public class Janken { 163 public static void main(String[] args) { 164 // 審判 165 Judge saito = new Judge(); 166 // プレーヤー 167 Player yamada = new Player("山田さん"); 168 Player murata = new Player("村田さん", new RandomTactics()); 169 // 対戦の開始 3 回勝負 170 saito.StartJunken(yamada, murata, 3); 171 System.out.println(yamada.scoreStr()); 172 System.out.println(murata.scoreStr()); 173 } 174}

実行例:

ジャンケンを開始します 0回戦 グー チョキ 山田さんが勝ちました 1回戦 グー グー 引き分けです 2回戦 グー パー 村田さんが勝ちました じゃんけんを終了しました! 引き分けです! 山田さん 勝ち:1 負け:1 引分:1 村田さん 勝ち:1 負け:1 引分:1

投稿2015/05/10 21:21

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/11 12:22

回答ありがとうございました。 説明もつけてくださり、とても見やすいです。 知識が乏しく、enum、HashMapのあたりを調べながら理解いたします。
guest

0

RandomTacitcs が Player class 内に実装されているため、
janken.Player.RandomTacitcs を作らなければいけないのに、
janken.RandomTacitcs を作ろうとしてるので、そんなclassありませんよ、とエラーを出しているのでしょう。

ちなみに コードを記載する際には、用語統一することを心がけてください。
英単語の "tactics" を コード上では tactis と書いてあったり tacitcs と書いてあったりしていますね。
誤字だから悪い、と言っているのではなく、同じ概念を別の表記で扱うことは、
この瞬間のあなたが理解できても、他人やすぐ将来のあなたには分からなくなって
しまいかねない、という点で、注意したいものですね。

投稿2015/05/09 17:50

okayu3

総合スコア200

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/05/09 18:02

回答ありがとうございます。 > ちなみに コードを記載する際には、用語統一することを心がけてください。 ありがとうございます。参考になります。 Tactis murataTactis = j.new RandomTacitcs(); エラー部分を下記のように直すということでしょうか? 以下のように修正してもエラーがでてきます。 Tactis murataTactis = j.new Player.RandomTacitcs(); どのように修正すべきかを教えていただけると幸いです。
okayu3

2015/05/09 18:14

RandomTactics を Player classの inner classとして定義しなくてはいけない理由がわかりませんが、そのまま行くなら、Player Classのインスタンスをつくって、そのインスタンスを設定すればいいかと思います。 私なら、 RandomTactics を Player Classから出してあげますね。そうすれば j.new RandomTactics() で インスタンス作れますね。 ちなみに、inner class を多用するのは なぜなんでしょうね。 javaの場合、用途は限定されていると思いますが。
okayu3

2015/05/09 18:18

そうか。codeを書けってことかな? では class 定義をそのままにしたいなら、 Player dummyPlayer = j.new Player(); Tactics takticsOfMurata = dummyPlayer.new RandomTactics(); という感じですか。 やっぱり Playerのinner classで定義する意味がよく分からないですね。
退会済みユーザー

退会済みユーザー

2015/05/09 18:23

okayu3さん 回答ありがとうございます。 >私なら、 RandomTactics を Player Classから出してあげますね。そうすれば >j.new RandomTactics() で インスタンス作れますね。 Player Classから出した場合に hand = stone; 【stone cannot be resolved to a variable】 のエラーが出てどのように修正すればいいかわからず、Player Classの 中にいれていました。 Player Classの外にだした場合はどのように修正すればいいのでしょうか? 回答頂けますと幸いです。
退会済みユーザー

退会済みユーザー

2015/05/09 18:25

2つめの回答を読んでいなかったです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問