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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

Q&A

1回答

1972閲覧

Javaでオセロゲームを作成しているのですが、List<List<Grid>>の型の変換の仕方がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

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

0グッド

0クリップ

投稿2018/03/30 13:28

前提・実現したいこと

jAVAでコンソール上で遊べるオセロゲームを作成しています。
入力した座標によって駒を置く場所を決めて順に進めていこうと思っているのですが、

  1. Board classの List<List<Grid>>の型をBoardという型にして他のクラスなどでも使いたいです。
  2. 駒を置く時に条件(隣に駒があり、かつ自分の色ではない)に合う場所のみ置けるようにしたいです。

まだまだ初心者なので上記2点わかる方いらっしゃいましたら回答お願いします。
下記に全クラスのコード記載しております。

playerクラス package javaOthello; import java.util.*; public class Player { List<Grid> firstHasStones = new ArrayList<>(); List<Grid> secondHasStones = new ArrayList<>(); public List<Grid> firstHasStones() { firstHasStones.add(Grid.createBlackStone()); return firstHasStones; } public List<Grid> secondHasStones() { secondHasStones.add(Grid.createWhiteStone()); return secondHasStones; } public static List<List<Grid>> putStone(Integer length, Integer side, List<List<Grid>> board, List<Grid> hasStones) { if (board.get(side).get(length).checkEmpty()) { board.get(length).set(side, hasStones.get(0)); } Board.viewBoard(board); return board; } }
Boardクラス package javaOthello; import java.util.*; public class Board { // 盤面の作成 GRID_SIZEを変えるとマス目の数も変更できる Integer GRID_SIZE = 8; public List<List<Grid>> makeBoard() { List<List<Grid>> board = new ArrayList<>(); Player player = new Player(); // 指定したマス目の盤面を作成 for (Integer i = 0; i < GRID_SIZE; i++) { List<Grid> row = new ArrayList<>(); board.add(row); for (Integer n = 0; n < GRID_SIZE; n++) { row.add(Grid.createEmpty()); } } // 石の生成 Grid black = Grid.createBlackStone(); Grid white = Grid.createWhiteStone(); // 真ん中に石を置く board.get(3).set(3, black); board.get(4).set(4, black); board.get(4).set(3, white); board.get(3).set(4, white); // playerに石を持たせる player.firstHasStones(); player.secondHasStones(); viewBoard(board); return board; } public static void viewBoard(List<List<Grid>> board) { System.out.println(); for (List<Grid> row : board) { System.out.println(); for (Grid grid : row) { if (grid.checkEmpty()) { System.out.print("x "); } else { System.out.print(grid + " "); } } } } }
Gridクラス package javaOthello; public class Grid { private String grid; Grid(String black, String white) { if (black == null) { this.grid = white; } if(white == null){ this.grid = black; } } public static Grid createEmpty() { return new Grid(null, null); } public static Grid createWhiteStone() { return new Grid(null, "○"); } public static Grid createBlackStone() { return new Grid("●", null); } public boolean checkEmpty() { return grid == null; } public String getGrid() { return this.grid; } public String toString() { return grid; } }
mainクラス package javaOthello; import java.util.*; public class PlayOthello { public static void main(String[] args) { Board board = new Board(); board.makeBoard(); putStoneNumber(board.makeBoard()); } public static void putStoneNumber(List<List<Grid>> board) { Player player = new Player(); Scanner sc = new Scanner(System.in); boolean exit = false; Integer count = 0; while (!exit) { String enter = sc.nextLine(); Integer length = sc.nextInt(); Integer side = sc.nextInt(); if (enter != null && side != null && length != null) { if (count % 2 == 0) { Player.putStone(length, side, board, player.firstHasStones()); Board.viewBoard(board); } else if (count % 2 != 0) { Player.putStone(length, side, board, player.secondHasStones()); Board.viewBoard(board); } } count++; } } }

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

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

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

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

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

guest

回答1

0

(A) Board classの List<List<Grid>>の型をBoardという型にして他のクラスなどでも使いたいです。

手っ取り早いのは

class Board extends List<List<Grid>> { }

のように派生クラスとしてBoardを定義することかと思います。必要に応じてpublicなどを補ってください。

他の言語では「型に対して別名を付ける」言語仕様があったりするのですが、Javaではそういう仕様がありません。事前の策として派生クラスとして定義するとList<...>のような長ったらしい表現にせずにすみます。

(B) 駒を置く時に条件(隣に駒があり、かつ自分の色ではない)に合う場所のみ置けるようにしたいです。

矛盾するようですが、このようなことを考えるとき(A)に書いたようにするとBoardを使うクラスからは「Boardって要するにListの入れ子だなぁ」ということになってしまい、setで好きに駒を置けてしまいます。

もし「特定の条件を満たした場合しか駒を指定箇所におけない」ような機能にしたいならそれはもはやListとはいいがたいと思います。Listにはもともとそのような意味付けがないからです。

よって(A)でいったことに反しますがこんなふうにしてみたらどうでしょう。

java

1class Board { 2 private Grid[][] grid; // 外部からは直接参照・設定を許さない 3 4 public boolean canPutAt(int row, int column, Grid grid) { 5 // 処理の都合で、putAtではなく事前に「おけるかどうか」をチェックする 6 // 機能がほしくなるかも知れません。そんな場合はこんなメソッドを用意しておくのも 7 // ありと思います。 8 ... 9 } 10 11 public void putAt(int row, int column, Grid grid) { 12 // 基本的に呼び出し元で置ける場所かどうかチェックするという考え方に 13 // したとすると、一応バグがあったときのことを考えてチェックを入れておく 14 if (!canPutAt(row, column, grid)) { 15 throw new IllegalArgumentException("そこにはおけないです"); 16 } 17 ... 18 } 19 20 public Grid getAt(int row, int column) { 21 ... 22 } 23}

Listから配列に変更してますがそれほど意味はないです。ただ将棋やチェスは盤の大きさが固定とわかっているのでListにする必要がなく配列でも充分ではないかと思ったにすぎません。

すみませんが、ご質問のコードはよく見ておりません。

投稿2018/03/30 14:05

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問