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

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

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

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

Q&A

解決済

3回答

638閲覧

三つそろった時の表示

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2019/02/08 14:07

編集2019/02/09 17:09

現在、プログラム作成してますが、三列そろったかと勝敗判定につまっています。
解説もつけていただけるとうれしいです。よろしくお願いします。

import java.io.*; class Circle{ public static void main(String args[])throws IOException{ //〇×の盤 int [][] chart=new int[3][3]; while(true){ while(true){ //列行の数字入力(プレイヤー1) //列行の数字入力 System.out.print("列番号入力"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str=br.readLine(); int input=Integer.parseInt(str); //行の数字入力 System.out.print("行番号入力"); String str2=br.readLine(); int input2=Integer.parseInt(str2); //盤表示 for(int x=0;x<chart.length;x++){ System.out.println(" "); for(int y=0;y<chart[x].length;y++){ System.out.print(chart[x][y]); } } //列行の数字入力 while(true){ //列行の数字入力(プレイヤー2) //列行の数字入力 System.out.print("列番号入力"); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String str3=br.readLine(); int input3=Integer.parseInt(str3)-1; //行の数字入力 System.out.print("行番号入力"); String str4=br.readLine(); int input4=Integer.parseInt(str4); //盤表示 for(int x=0;x<chart.length;x++){ System.out.println(" "); for(int y=0;y<chart[x].length;y++){ System.out.print(chart[x][y]); } } } } }

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

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

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

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

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

aikon_marimo

2019/02/08 14:23

これだとそもそもプレイヤー1の//盤表示の箇所に処理がいかないのでは? それと、具体的には勝敗判定のどの部分が分からないでしょうか?文法的な話か、ロジック的な話かを記載いただけると助かります。
退会済みユーザー

退会済みユーザー

2019/02/08 14:31

話→文法・ロジック両方だとありがたいです。 〇を置く→(縦・横・ななめ)どこかそろったか見たいので。。
guest

回答3

0

質問のコードは重複が多かったので、重複を少なくすることと、勝敗判定メソッド追加をしてみました。
chart には 0, 1, 2 でなく 0, -1, 1 を入れるようにして、player の交代を * (-1) でできるようにしています。
勝敗判定は、勝敗をチェックするマス目の列をデータ文にして、そのデータを使って破綻するようにしてみました。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class Example2XX { 6 static final int DIM = 3; 7 static final String[] MARKS = { "○", "・", "✗" }; 8 static int[][] chart = new int[DIM][DIM]; // 〇×の盤 9 static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 10 11 public static void main(String args[]) throws IOException { 12 int player = -1; // -1: ○, 1: ✗ 13 int result = 0; 14 for (int i = 0; i < DIM * DIM && (result == 0); i++) { 15 result = play_hand(player); 16 player *= -1; 17 } 18 show_result(result); 19 } 20 21 static int play_hand(int player) throws IOException { 22 while (true) { 23 int col = input_number("列番号入力:"); 24 int row = input_number("行番号入力:"); 25 if (chart[row][col] == 0) { // 置きたい場所が空いているか? 26 chart[row][col] = player; 27 show_board(); 28 return judge(); 29 } 30 } 31 } 32 33 // 盤表示 34 static void show_board() { 35 String lines = ""; 36 for (int x = 0; x < DIM; x++) { 37 for (int y = 0; y < DIM; y++) { 38 lines += MARKS[chart[x][y] + 1]; 39 } 40 lines += "\n"; 41 } 42 System.out.print(lines); 43 } 44 45 static int input_number(String message) throws IOException { 46 // 数字入力 47 int num = 0; 48 System.out.print(message); 49 while (true) { 50 try { 51 num = Integer.parseInt(br.readLine()); 52 if ((1 <= num) && (num <= DIM)) { 53 return num - 1; 54 } 55 } catch (NumberFormatException e) { 56 } 57 System.out.print("1から" + DIM + "の数字を入力してください:"); 58 } 59 } 60 61 static void show_result(int result) { 62 if ( result == 0) { 63 System.out.println("引き分けです。"); 64 } else { 65 String winer = (result == -1) ? MARKS[0] : MARKS[2]; 66 System.out.println(winer + "の勝ちです。"); 67 } 68 } 69 70 static int judge() { 71 // 勝敗を判定するマス位置の列を列挙 72 int[][][] check_lines = { 73 { { 0, 0 }, { 0, 1 }, { 0, 2 } }, 74 { { 1, 0 }, { 1, 1 }, { 1, 2 } }, 75 { { 2, 0 }, { 2, 1 }, { 2, 2 } }, 76 { { 0, 0 }, { 1, 0 }, { 2, 0 } }, 77 { { 0, 1 }, { 1, 1 }, { 2, 1 } }, 78 { { 0, 2 }, { 1, 2 }, { 2, 2 } }, 79 { { 0, 0 }, { 1, 1 }, { 2, 2 } }, 80 { { 2, 0 }, { 1, 1 }, { 0, 2 } } 81 }; 82 for (int[][] pos : check_lines) { 83 int v0 = chart[pos[0][0]][pos[0][1]]; 84 int v1 = chart[pos[1][0]][pos[1][1]]; 85 int v2 = chart[pos[2][0]][pos[2][1]]; 86 if ((v0 != 0) && (v0 == v1) && (v0 == v2)) { 87 return v0; // 勝負あり 88 } 89 } 90 return 0; // 引き分け 91 } 92} 93

実行例
イメージ説明

tictactow java
で google 検索すると、いろいろなプログラム例を見つけることができると思います。

投稿2019/02/09 08:33

編集2019/02/09 22:38
katoy

総合スコア22324

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

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

0

全てを一度に作ろうとせず, 部分から作られては如何でしょうか.
大きく見て分からないことを分割して, 出来る細かさまで落とすこともプログラミングの技術です.
提示された main メソッドのように全てを並べると, どこが何をしていたのかも分からなくなることがあります.
分割して考えるとともにその分割をメソッドとして表現することで, 作るべき機能に集中して作業することも出来るようになります.

ご質問の機能も, コードが分かったからとこの main メソッドに直接埋め込むと, 例えコメントを書いても埋もれて目立たなくなります.
勝敗判定をメソッドとして設計することで, 他の変数などを気にせずに集中することが出来ます.

まずインターフェースを設計してみましょう.
勝敗判定に必要な盤は chart[0~2][0~2] で表現されています. 値は 0=空き, 1=プレイヤ1, 2=プレイヤ2です. これをパラメータで渡します.
戻りは勝ったプレイヤの番号(1 or 2) または勝敗が決まっていなければ 0 としましょう.
名前は…テキトウに judgment とします.
すると,

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 return 0; 8}

という雛形が作れるだけの情報が決まったことになります.
後はこの中を書くだけです.
全てを考えると面倒なので 1列だけ考えます.
chart[0][0] = 1 かつ chart[0][1] = 1 かつ chart[0][2] = 1 なら 1 の勝ち.
それをそのまま if 文で書きます.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 if(chart[0][0] == 1 & chart[0][1] == 1 & chart[0][2] == 1) return 1; 8 return 0; 9}

2つ目3つ目も同様です.
chart[1][0] = 1 かつ chart[1][1] = 1 かつ chart[1][2] = 1 なら 1 の勝ち.
chart[2][0] = 1 かつ chart[2][1] = 1 かつ chart[2][2] = 1 なら 1 の勝ち.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 if(chart[0][0] == 1 & chart[0][1] == 1 & chart[0][2] == 1) return 1; 8 if(chart[1][0] == 1 & chart[1][1] == 1 & chart[1][2] == 1) return 1; 9 if(chart[2][0] == 1 & chart[2][1] == 1 & chart[2][2] == 1) return 1; 10 return 0; 11}

縦(横)が出来たら次は横(縦) です.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 if(chart[0][0] == 1 & chart[0][1] == 1 & chart[0][2] == 1) return 1; 8 if(chart[1][0] == 1 & chart[1][1] == 1 & chart[1][2] == 1) return 1; 9 if(chart[2][0] == 1 & chart[2][1] == 1 & chart[2][2] == 1) return 1; 10 if(chart[0][0] == 1 & chart[1][0] == 1 & chart[2][0] == 1) return 1; 11 if(chart[0][1] == 1 & chart[1][1] == 1 & chart[2][1] == 1) return 1; 12 if(chart[0][2] == 1 & chart[1][2] == 1 & chart[2][2] == 1) return 1; 13 return 0; 14}

斜めもあります.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 if(chart[0][0] == 1 & chart[0][1] == 1 & chart[0][2] == 1) return 1; 8 if(chart[1][0] == 1 & chart[1][1] == 1 & chart[1][2] == 1) return 1; 9 if(chart[2][0] == 1 & chart[2][1] == 1 & chart[2][2] == 1) return 1; 10 if(chart[0][0] == 1 & chart[1][0] == 1 & chart[2][0] == 1) return 1; 11 if(chart[0][1] == 1 & chart[1][1] == 1 & chart[2][1] == 1) return 1; 12 if(chart[0][2] == 1 & chart[1][2] == 1 & chart[2][2] == 1) return 1; 13 if(chart[0][0] == 1 & chart[1][1] == 1 & chart[2][2] == 1) return 1; 14 if(chart[0][2] == 1 & chart[1][1] == 1 & chart[2][0] == 1) return 1; 15 return 0; 16}

これでプレイヤ1の勝利判定が出来ました. 次にプレイヤ2 は…プレイヤ1の判定をコピペして1を2に書き換えます.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 if(chart[0][0] == 1 & chart[0][1] == 1 & chart[0][2] == 1) return 1; 8 if(chart[1][0] == 1 & chart[1][1] == 1 & chart[1][2] == 1) return 1; 9 if(chart[2][0] == 1 & chart[2][1] == 1 & chart[2][2] == 1) return 1; 10 if(chart[0][0] == 1 & chart[1][0] == 1 & chart[2][0] == 1) return 1; 11 if(chart[0][1] == 1 & chart[1][1] == 1 & chart[2][1] == 1) return 1; 12 if(chart[0][2] == 1 & chart[1][2] == 1 & chart[2][2] == 1) return 1; 13 if(chart[0][0] == 1 & chart[1][1] == 1 & chart[2][2] == 1) return 1; 14 if(chart[0][2] == 1 & chart[1][1] == 1 & chart[2][0] == 1) return 1; 15 if(chart[0][0] == 2 & chart[0][1] == 2 & chart[0][2] == 2) return 2; 16 if(chart[1][0] == 2 & chart[1][1] == 2 & chart[1][2] == 2) return 2; 17 if(chart[2][0] == 2 & chart[2][1] == 2 & chart[2][2] == 2) return 2; 18 if(chart[0][0] == 2 & chart[1][0] == 2 & chart[2][0] == 2) return 2; 19 if(chart[0][1] == 2 & chart[1][1] == 2 & chart[2][1] == 2) return 2; 20 if(chart[0][2] == 2 & chart[1][2] == 2 & chart[2][2] == 2) return 2; 21 if(chart[0][0] == 2 & chart[1][1] == 2 & chart[2][2] == 2) return 2; 22 if(chart[0][2] == 2 & chart[1][1] == 2 & chart[2][0] == 2) return 2; 23 return 0; 24}

これで judgment が出来ました. main から呼び出せば, 勝敗が返されます.
...
おそらく「こんな並べただけのコードは格好悪くてイヤだ」と思われるでしょう.
では「機能が変わらないように」書き方を変えてみましょう.
まずはプレイヤ1とプレイヤ2の判定の違いをループに出来ます.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 for(int player=1; player<=2; player++) { 8 if(chart[0][0] == player & chart[0][1] == player & chart[0][2] == player) return player; 9 if(chart[1][0] == player & chart[1][1] == player & chart[1][2] == player) return player; 10 if(chart[2][0] == player & chart[2][1] == player & chart[2][2] == player) return player; 11 if(chart[0][0] == player & chart[1][0] == player & chart[2][0] == player) return player; 12 if(chart[0][1] == player & chart[1][1] == player & chart[2][1] == player) return player; 13 if(chart[0][2] == player & chart[1][2] == player & chart[2][2] == player) return player; 14 if(chart[0][0] == player & chart[1][1] == player & chart[2][2] == player) return player; 15 if(chart[0][2] == player & chart[1][1] == player & chart[2][0] == player) return player; 16 } 17 return 0; 18}

ここからどうしましょう. chart の添え字が 0,1,2 と変わっているだけの違いの箇所があるので, まとめてみます.

java

1/** 2 * 勝敗を判定します. 3 * @param chart 3x3の盤. 0=空き, 1=プレイヤ1, 2=プレイヤ2 4 * @return 勝ったプレイヤ番号(1 or 2). 勝敗が決して居ない場合は 0. 5 */ 6int judgment(int[][] chart) { 7 for(int player=1; player<=2; player++) { 8 for(int i=0; i<3; i++) { 9 if(chart[i][0] == player & chart[i][1] == player & chart[i][2] == player) return player; 10 if(chart[0][i] == player & chart[1][i] == player & chart[2][i] == player) return player; 11 } 12 if(chart[0][0] == player & chart[1][1] == player & chart[2][2] == player) return player; 13 if(chart[0][2] == player & chart[1][1] == player & chart[2][0] == player) return player; 14 } 15 return 0; 16}

まだ少し気持ち悪さがありますが, これ以上は大分形が変わると思いますのでここまでにします.

投稿2019/02/08 16:04

jimbe

総合スコア12634

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

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

0

ベストアンサー

工夫次第で簡単に記載もできますが、必要なチェックは下記のような簡単なものです。
#質問欄に記載頂いているくらいのソースが書けるなら、下図の2次元配列も理解できてそうなので、自力で出来そうな気がしますけどね。

下記はマルのチェックのみなので、バツのチェックを追加して毎ターン、このチェックを呼び出せば勝敗判定できます。

chart [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] [2][0] [2][1] [2][2] ★横が揃ったかのチェック if (chart[0][0] == 1 && chart[0][1] == 1 && chart[0][2] == 1 ) { // 1行目に、1(マル)が揃ってる } else if (chart[1][0] == 1 && chart[1][1] == 1 && chart[1][2] == 1 ) { // 2行目に、1(マル)が揃ってる } else if (chart[2][0] == 1 && chart[2][1] == 1 && chart[2][2] == 1 ) { // 3行目に、1(マル)が揃ってる } ★縦が揃ったかのチェック if (chart[0][0] == 1 && chart[1][0] == 1 && chart[2][0] == 1 ) { // 1列目に、1(マル)が揃ってる } else if (chart[0][1] == 1 && chart[1][1] == 1 && chart[2][1] == 1 ) { // 2列目に、1(マル)が揃ってる } else if (chart[0][2] == 1 && chart[1][2] == 1 && chart[2][2] == 1 ) { // 3列目に、1(マル)が揃ってる } ★斜めが揃ったかのチェック if (chart[0][0] == 1 && chart[1][1] == 1 && chart[2][2] == 1 ) { // 斜め右下がりに、1(マル)が揃ってる } else if (chart[2][0] == 1 && chart[1][1] == 1 && chart[0][2] == 1 ) { // 斜め右上がりに、1(マル)が揃ってる }

投稿2019/02/08 14:49

編集2019/02/08 14:50
aikon_marimo

総合スコア1083

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

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

退会済みユーザー

退会済みユーザー

2019/02/08 15:01

ありがとうございます!
退会済みユーザー

退会済みユーザー

2019/02/09 12:56

再度すいません。 上記(〇チェック)のプログラムはどこに追加すればよいかご教授いただけますか。
aikon_marimo

2019/02/09 13:23

質問に記載されたソースの最後(//盤表示の先or後)で良いと思います。 追加方法についてはkatoyさんの回答が参考になるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問