課題 (10:ベーシック)
作業について
今回の課題は以下のパッケージに作成してください。
| パッケージの名前 |
|---|
| j1.lesson10 |
作成するクラスの名前は問題ごとに指示があります。下記を参照してください
課題の提出方法については下記を参照してください。
また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。
問題
1. 参照の共有 (考察課題)
| 作成するファイルの名前 |
|---|
| SharedReference.txt |
ファイルの作成方法については下記を参照してください。
下記は参照を利用したプログラムです。
package j1.lesson10;
import javax.swing.JOptionPane;
public class SharedReference {
public static void main(String[] args) {
new SharedReference().start();
}
void start() {
String[] messages = new String[2];
messages[0] = "hello";
messages[1] = "world";
String[] copy = messages;
copy[0] = "こんにちは";
copy[1] = "世界";
for (int i = 0; i < messages.length; i++) {
JOptionPane.showMessageDialog(null,
"messages[" + i + "]: " + messages[i]);
}
for (int i = 0; i < copy.length; i++) {
JOptionPane.showMessageDialog(null,
"copy[" + i + "]: " + copy[i]);
}
}
}
次の問題に答えて下さい。
- 下記のプログラムを実行すると何が表示されるでしょうか
- プログラム中の変数messages, copyの内容を図示してください
- プログラムを1行だけ書き換えて、次の順番でメッセージが表示されるようにしてください
- messages[0]: hello
- messages[1]: world
- copy[0]: こんにちは
- copy[1]: 世界
2. 参照の差し替え(考察課題)
| 作成するファイルの名前 |
|---|
| ReplaceReference.txt |
下記は参照を利用したプログラムです。
package j1.lesson10;
import javax.swing.JOptionPane;
public class ReplaceReference {
public static void main(String[] args) {
new ReplaceReference().start();
}
void start() {
String[] messages = new String[2];
messages[0] = "hello";
messages[1] = "world";
assign(messages);
for (int i = 0; i < messages.length; i++) {
JOptionPane.showMessageDialog(null,
"messages[" + i + "]: " + messages[i]);
}
}
void assign(String[] array) {
array = new String[2];
array[0] = "こんにちは";
array[1] = "世界";
}
}
次の問題に答えて下さい。
- 下記のプログラムを実行すると何が表示されるでしょうか
- なぜそのように表示されるでしょうか
- プログラムを1行だけ書き換えて、次の順番でメッセージが表示されるようにしてください
- messages[0]: こんにちは
- messages[1]: 世界
3. Tic-Tac-Toe ゲーム
| 作成するクラスの名前 |
|---|
| TicTacToe |
Tic-Tac-Toeというゲームがあります(日本ローカルでは○×ゲームと呼ばれています)。これは3×3マスの上に、2人が順番に○×のマークを埋めていって、縦横斜めのいずれかに自分のマークがそろえば勝ちです。
このTic-Tac-Toeゲームを作成する前に、書きかけのプログラムについて少し説明します。
- playerフィールドは0があなたの手番を表し、1がコンピュータの手番を表します
- boardフィールドは3×3の二次元配列で、board[x][y]のように表します
- board[x][y]が-1のとき、(x, y)はまだ何も書かれていないことを表します
- board[x][y]が0のとき、(x, y)はあなたが○を書きこんだことを表します
- board[x][y]が1のとき、(x, y)はコンピュータが×を書きこんだことを表します
- 上記のインスタンスはcreateGameメソッドで作成できます(先行後攻はランダム)
- □はまだ何も書かれていないマスです
- ○はあなたによって書かれたマスです
- ×はコンピュータによって書かれたマスです
- boardToStringメソッドで3×3の盤面の状態を文字列に変換できます
上記を踏まえて、次の手順でTic-Tac-Toeゲームのプログラムを完成させてください。
-
startメソッドをよく読み、inputCell, isGameSet, changePlayer
メソッドそれぞれの役割とプログラム全体の流れを考えて下さい - changePlayerメソッドの中身を作成してください
- このメソッドは、「あなた」と「コンピュータ」の手番を切り替えるメソッドです
- inputCellByYouメソッドの中身を作成してください
- このメソッドは、「あなた」が盤面に「○」を置く番です
- 現在の盤面を表示して、どこに置くかを入力ダイアログで問い合わせるのがよいでしょう
- すでに○や×が置いてある場所や、3×3の範囲外には置けません
- inputCellByComputerメソッドの中身を作成してください
- このメソッドは、「コンピュータ」が盤面に「×」を置く番です
- AIを作るのは大変なので、ランダムに×を配置して構いません
- すでに○や×が置いてある場所や、3×3の範囲外には置けません
- isGameSetメソッドの中身を作成してください
- このメソッドは、盤面に同じマークが並んでいるかどうかを調べるメソッドです
- 縦、横、斜めのいずれかに0, 1のどちらかが3つ並んでいればtrueを返してください
- isStraightメソッドをうまく利用してください
package j1.lesson10;
import javax.swing.JOptionPane;
public class TicTacToe {
public static void main(String[] args) {
new TicTacToe().start();
}
void start() {
java.awt.Font font = new java.awt.Font("MS ゴシック", 0, 15);
javax.swing.UIManager.put("Label.font", font);
TicTacToeGame game = createGame();
for (int i = 0; i < 9; i++) {
inputCell(game);
if (isGameSet(game.board)) {
JOptionPane.showMessageDialog(null,
playerToString(game.player) + "の勝ちです");
break;
}
changePlayer(game);
}
}
TicTacToeGame createGame() {
TicTacToeGame game = new TicTacToeGame();
game.player = (int) (Math.random() * 2);
game.board = new int[3][3];
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
game.board[x][y] = -1;
}
}
return game;
}
void changePlayer(TicTacToeGame game) {
}
void inputCell(TicTacToeGame game) {
if (game.player == 0) {
inputCellByYou(game.board);
}
else {
inputCellByComputer(game.board);
}
JOptionPane.showMessageDialog(null,
playerToString(game.player) + "の手番が終了しました\n" +
"現在の盤面:\n" +
boardToString(game.board));
}
void inputCellByYou(int[][] board) {
}
void inputCellByComputer(int[][] board) {
}
boolean isGameSet(int[][] board) {
}
boolean isStraight(int a, int b, int c) {
if (a == -1 || b == -1 || c == -1) {
return false;
}
if (a == b && a == c) {
return true;
}
return false;
}
String boardToString(int[][] board) {
String string = "";
for (int y = 0; y < 3; y++) {
for (int x = 0; x < 3; x++) {
string = string + cellToString(board[x][y]);
}
string = string + "\n";
}
return string;
}
String playerToString(int player) {
if (player == 0) {
return "あなた";
}
else {
return "コンピュータ";
}
}
String cellToString(int cell) {
if (cell == -1) {
return "□";
}
else if (cell == 0) {
return "○";
}
else {
return "×";
}
}
boolean canPut(int[][] board, int x, int y) {
if (x < 0 || x > 3) {
return false;
}
if (y < 0 || y > 3) {
return false;
}
if (board[x][y] != -1) {
return false;
}
return true;
}
}
class TicTacToeGame {
int player;
int[][] board;
}
余力があれば、inputCellByComputerメソッドの中身を書き換えてコンピュータを強化してください。たとえば、「あと1手で×が揃うなら揃える」「あと1手で○が揃うなら阻止する」などは比較的簡単に作れると思います。
なお、startメソッドの最初の2行の命令は、Windowsで見た目を整えるための設定です。