| 情報学部 | 菅沼ホーム | Java 目次 | 索引 |

/*************************/
/* 8パズル */
/* coded by Y.Suganuma */
/*************************/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import main.*;
public class Game {
public static void main (String[] args)
{
Win win = new Win("8パズル");
}
}
class Win extends JFrame
{
/******************/
/* コンストラクタ */
/******************/
Win(String name)
{
// JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す)
super(name);
// Windowの大きさ
setSize(230, 230); // 40+20, 70+20
// MainPanel の大きさを決定
Dimension size = getSize();
size.width -=60;
size.height -=90;
// ContentPain を取得し,設定
Container CP = getContentPane(); // ContentPane を取得
CP.setLayout(null); // レイアウトマネージャを停止
CP.setBackground(new Color(220, 255, 220)); // 背景色
// MainPanel を追加し,設定
MainPanel pn = new MainPanel(size); // MainPanel オブジェクトの生成
CP.add(pn); // MainPanel オブジェクトを ContentPane に追加
pn.setSize(size.width, size.height);
pn.setLocation(10, 10);
// ウィンドウを表示
setVisible(true);
// イベントリスナ
addWindowListener(new WinEnd());
}
/******************************/
/* 上,左,下,右の余白の設定 */
/******************************/
public Insets getInsets()
{
return new Insets(50, 20, 20, 20);
}
/************/
/* 終了処理 */
/************/
class WinEnd extends WindowAdapter
{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
}
package main;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import start.*;
import game.*;
import clear.*;
public class MainPanel extends JPanel implements Runnable
{
Dimension size; // パネルの大きさ
boolean in_game = true; // ゲーム実行中はtrue
public int state = 0; // ゲーム状態(0:表紙,1:ゲーム,2:クリア,3:終了)
public int level = 1; // ゲームレベル
int old_state = 0; // 直前のゲーム状態
StartPanel sp;
GamePanel gp;
GameClearPanel gcp;
Thread td;
// コンストラクタ
public MainPanel(Dimension size1)
{
size = size1;
// グリッドレイアウト
setLayout(new GridLayout(1, 1, 0, 0));
// ゲームパネルの生成
sp = new StartPanel(size, this); // スタート(タイトル)
add(sp);
// スレッドの生成
td = new Thread(this);
td.start();
}
// ゲームの状態を変更
public void run()
{
while (in_game) {
try {
td.sleep(100); // 100 ms 毎の実施
}
catch (InterruptedException e) {}
if (state != old_state) {
// 前のパネルの削除
if (old_state == 0)
remove(sp);
else if (old_state == 1)
remove(gp);
else
remove(gcp);
// 新しいパネルの追加
if (state == 3) // ゲーム終了
in_game = false;
else {
if (state == 0) { // StartPanel
sp = new StartPanel(size, this);
add(sp);
}
else if (state == 1) { // GamePanel
gp = new GamePanel(size, this);
add(gp);
}
else { // GameClearPanel
gcp = new GameClearPanel(size, this);
add(gcp);
}
validate();
old_state = state;
}
}
}
}
}
001 package start;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import main.*;
007
008 public class StartPanel extends JPanel implements ActionListener
009 {
010 boolean in_game = true;
011 Dimension size; // パネルの大きさ
012 MainPanel mp;
013 JButton bt;
014 // コンストラクタ
015 public StartPanel(Dimension size1, MainPanel mp1)
016 {
017 size = size1;
018 mp = mp1;
019 // レイアウトマネージャの停止
020 setLayout(null);
021 // 背景色の設定
022 setBackground(Color.white);
023 // ボタンの配置
024 Font f = new Font("SansSerif", Font.BOLD, 20);
025 FontMetrics fm = getFontMetrics(f);
026 String str = "遊び方";
027 int w = fm.stringWidth(str) + 40;
028 int h = fm.getHeight() + 10;
029 bt = new JButton(str);
030 bt.setFont(f);
031 bt.addActionListener(this);
032 bt.setSize(w, h);
033 bt.setLocation(size.width/2-w/2, 5);
034 add(bt);
035 // マウスリスナの追加
036 addMouseListener(new Mouse());
037 }
038 // 描画
039 public void paintComponent(Graphics g)
040 {
041 super.paintComponent(g); // 親クラスの描画
042 FontMetrics fm;
043 Font f;
044 String str;
045 int w, h;
046
047 f = new Font("SansSerif", Font.BOLD, 40);
048 fm = g.getFontMetrics(f);
049 str = "8パズル";
050 w = fm.stringWidth(str);
051 h = fm.getHeight();
052 g.setFont(f);
053 g.drawString(str, size.width/2-w/2, size.height/2);
054
055 f = new Font("Serif", Font.PLAIN, 20);
056 fm = g.getFontMetrics(f);
057 str = "ゲーム開始";
058 w = fm.stringWidth(str);
059 h = size.height - 2 * fm.getHeight();
060 g.setFont(f);
061 g.drawString(str, size.width/2-w/2, h);
062 str = "ダブルクリック";
063 w = fm.stringWidth(str);
064 h = size.height - fm.getHeight();
065 g.drawString(str, size.width/2-w/2, h);
066 }
067 // ボタンがクリックされたときの処理
068 public void actionPerformed(ActionEvent e)
069 {
070 if (e.getSource() == bt) {
071 Method db = new Method();
072 db.setVisible(true);
073 requestFocusInWindow();
074 }
075 }
076 // ダブルクリックされたときの処理
077 class Mouse extends MouseAdapter {
078 public void mouseClicked(MouseEvent e) {
079 if (e.getClickCount() == 2)
080 mp.state = 1;
081 }
082 }
083 }
084
085 /******************/
086 /* ゲームの遊び方 */
087 /******************/
088 class Method extends JDialog
089 {
090 // コンストラクタ
091 Method()
092 {
093 setTitle("ゲームの遊び方");
094 // ContetPain
095 Container cp = getContentPane();
096 cp.setLayout(new FlowLayout(FlowLayout.CENTER));
097 cp.setBackground(new Color(220, 255, 220)); // 背景色
098 Font f = new Font("MS 明朝", Font.PLAIN, 20);
099 setSize(550, 160);
100 // TextArea の追加
101 JTextArea ta = new JTextArea(5, 50);
102 ta.setFont(f);
103 ta.setEditable(false);
104 ta.setLineWrap(true);
105 ta.setText("・ゲーム開始: 画面上でダブルクリック\n");
106
107 ta.append("・コマの移動: 移動したいコマをクリック\n");
108 JScrollPane scroll = new JScrollPane(ta);
109 cp.add(scroll);
110 // Window を閉じるため
111 addWindowListener(new WinEnd());
112 }
113 // 終了処理
114 class WinEnd extends WindowAdapter
115 {
116 public void windowClosing(WindowEvent e) {
117 setVisible(false);
118 }
119 }
120 }
01 package game;
02
03 import java.awt.*;
04 import javax.swing.*;
05 import main.*;
06
07 public class GamePanel extends JPanel
08 {
09 JButton bt[][] = new JButton [3][3];
10 // コンストラクタ
11 public GamePanel(Dimension size, MainPanel mp)
12 {
13 // グリッドレイアウト
14 setLayout(new GridLayout(3, 3, 10, 10));
15 // 背景色の設定
16 setBackground(Color.white);
17 // ボタンの配置
18 for (int i1 = 0; i1 < 3; i1++) {
19 for (int i2 = 0; i2 < 3; i2++) {
20 bt[i1][i2] = new JButton();
21 bt[i1][i2].setBackground(Color.cyan);
22 add(bt[i1][i2]);
23 }
24 }
25 }
26 }
int x[][] = new int [2][3];
int x[][] = new int [2][]; x[0] = new int [3]; // 以下,繰り返し文を使用可能 x[1] = new int [3];
int x[][] = {{1, 2, 3}, {4, 5, 6}}; // 内側の括弧が各行に相当
int x1[] = {1, 2, 3};
int x2[] = {4, 5, 6};
int x[][] = {x1, x2};
package clear;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import main.*;
public class GameClearPanel extends JPanel implements ActionListener
{
Dimension size; // パネルの大きさ
MainPanel mp;
JButton bt1, bt2;
// コンストラクタ
public GameClearPanel(Dimension size1, MainPanel mp1)
{
size = size1;
mp = mp1;
// レイアウトマネージャの停止
setLayout(null);
// 背景色の設定
setBackground(Color.white);
// ボタンの配置
Font f = new Font("SansSerif", Font.BOLD, 15);
FontMetrics fm = getFontMetrics(f);
String str1 = "Finish";
int w1 = fm.stringWidth(str1) + 40;
int h1 = fm.getHeight() + 10;
bt1 = new JButton(str1);
bt1.setFont(f);
bt1.addActionListener(this); // アクションリスナ
bt1.setSize(w1, h1);
String str2;
if (mp.level == 2)
str2 = "First";
else
str2 = "Next";
int w2 = fm.stringWidth(str2) + 40;
int h2 = fm.getHeight() + 10;
bt2 = new JButton(str2);
bt2.setFont(f);
bt2.addActionListener(this); // アクションリスナ
bt2.setSize(w2, h2);
bt1.setLocation(size.width/2-(w1+w2+5)/2, size.height-h1-20);
add(bt1);
bt2.setLocation(size.width/2-(w1+w2+5)/2+w1+5, size.height-h2-20);
add(bt2);
}
// 描画
public void paintComponent(Graphics g)
{
super.paintComponent(g); // 親クラスの描画
Font f = new Font("SansSerif", Font.BOLD, 40);
FontMetrics fm = g.getFontMetrics(f);
String str = "Clear!";
int w = fm.stringWidth(str);
g.setFont(f);
g.drawString(str, size.width/2-w/2, size.height/2);
}
// ボタンがクリックされたときの処理
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == bt1) {
mp.state = 3;
bt1.setEnabled(false);
bt2.setEnabled(false);
}
else {
mp.level++;
if (mp.level > 2) { // 最初からゲーム再開
mp.state = 0;
mp.level = 1;
}
else // レベルアップ
mp.state = 1;
}
}
}
001 package game; 002 003 import java.awt.*; 004 import javax.swing.*; 005 import java.util.Random; 006 import main.*; 007 008 public class GamePanel extends JPanel 009 { 010 MainPanel mp; 011 JButton bt[][] = new JButton [3][3]; 012 Random rn; 013 int i_state[][] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; 014 int g_state[][] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; 015 // コンストラクタ 016 public GamePanel(Dimension size, MainPanel mp1) 017 { 018 mp = mp1; 019 // グリッドレイアウト 020 setLayout(new GridLayout(3, 3, 10, 10)); 021 // 背景色の設定 022 setBackground(Color.white); 023 // ボタンの配置 024 Font f = new Font("SansSerif", Font.BOLD, 25); 025 for (int i1 = 0; i1 < 3; i1++) { 026 for (int i2 = 0; i2 < 3; i2++) { 027 bt[i1][i2] = new JButton(); 028 bt[i1][i2].setBackground(Color.cyan); 029 bt[i1][i2].setFont(f); 030 add(bt[i1][i2]); 031 } 032 } 033 // ランダム変数の初期化 034 rn = new Random(); 035 // 初期状態の生成 036 create(); 037 // ボタンへ名前を表示 038 for (int i1 = 0; i1 < 3; i1++) { 039 for (int i2 = 0; i2 < 3; i2++) { 040 if (i_state[i1][i2] > 0) 041 bt[i1][i2].setText(Integer.toString(i_state[i1][i2])); 042 } 043 } 044 } 045 // 初期状態の生成 046 void create() 047 { 048 int ct = (mp.level == 1) ? 10 : 100; 049 int dr, k1, k2, wk; 050 boolean sw = true; 051 052 while (sw) { 053 k1 = 1; 054 k2 = 1; 055 // 移動 056 for (int i1 = 0; i1 < ct; i1++) { 057 dr = rn.nextInt(4); 058 switch (dr) { 059 case 0: // 上 060 if (k1 > 0) { 061 wk = i_state[k1-1][k2]; 062 i_state[k1-1][k2] = 0; 063 i_state[k1][k2] = wk; 064 k1--; 065 } 066 break; 067 case 1: // 下 068 if (k1 < 2) { 069 wk = i_state[k1+1][k2]; 070 i_state[k1+1][k2] = 0; 071 i_state[k1][k2] = wk; 072 k1++; 073 } 074 break; 075 case 2: // 左 076 if (k2 > 0) { 077 wk = i_state[k1][k2-1]; 078 i_state[k1][k2-1] = 0; 079 i_state[k1][k2] = wk; 080 k2--; 081 } 082 break; 083 default: // 右 084 if (k2 < 2) { 085 wk = i_state[k1][k2+1]; 086 i_state[k1][k2+1] = 0; 087 i_state[k1][k2] = wk; 088 k2++; 089 } 090 break; 091 } 092 } 093 // ゴールと同じか否かのチェック 094 for (int i1 = 0; i1 < 3 && sw; i1++) { 095 for (int i2 = 0; i2 < 3 && sw; i2++) { 096 if (i_state[i1][i2] != g_state[i1][i2]) 097 sw = false; 098 } 099 } 100 } 101 } 102 }
変数 = (論理式) ? 式1 : 式2
switch (式) { [case 定数式1 : ] [文1] [case 定数式2 : ] [文2] ・・・・・ [default : ] [文n] }
001 package game; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import javax.swing.*; 006 import java.util.Random; 007 import main.*; 008 009 public class GamePanel extends JPanel implements ActionListener 010 { 011 MainPanel mp; 012 JButton bt[][] = new JButton [3][3]; 013 Random rn; 014 int i_state[][] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; 015 int g_state[][] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}}; 016 // コンストラクタ 017 public GamePanel(Dimension size, MainPanel mp1) 018 { 019 mp = mp1; 020 // グリッドレイアウト 021 setLayout(new GridLayout(3, 3, 10, 10)); 022 // 背景色の設定 023 setBackground(Color.white); 024 // ボタンの配置 025 Font f = new Font("SansSerif", Font.BOLD, 25); 026 for (int i1 = 0; i1 < 3; i1++) { 027 for (int i2 = 0; i2 < 3; i2++) { 028 bt[i1][i2] = new JButton(); 029 bt[i1][i2].setBackground(Color.cyan); 030 bt[i1][i2].setFont(f); 031 bt[i1][i2].addActionListener(this); // アクションリスナ 032 add(bt[i1][i2]); 033 } 034 } 035 // ランダム変数の初期化 036 rn = new Random(); 037 // 初期状態の生成 038 create(); 039 // ボタンへ名前を表示 040 for (int i1 = 0; i1 < 3; i1++) { 041 for (int i2 = 0; i2 < 3; i2++) { 042 if (i_state[i1][i2] > 0) 043 bt[i1][i2].setText(Integer.toString(i_state[i1][i2])); 044 } 045 } 046 } 047 // 初期状態の生成 048 void create() 049 { 050 int ct = (mp.level == 1) ? 10 : 100; 051 int dr, k1, k2, wk; 052 boolean sw = true; 053 054 while (sw) { 055 k1 = 1; 056 k2 = 1; 057 // 移動 058 for (int i1 = 0; i1 < ct; i1++) { 059 dr = rn.nextInt(4); 060 switch (dr) { 061 case 0: // 上 062 if (k1 > 0) { 063 wk = i_state[k1-1][k2]; 064 i_state[k1-1][k2] = 0; 065 i_state[k1][k2] = wk; 066 k1--; 067 } 068 break; 069 case 1: // 下 070 if (k1 < 2) { 071 wk = i_state[k1+1][k2]; 072 i_state[k1+1][k2] = 0; 073 i_state[k1][k2] = wk; 074 k1++; 075 } 076 break; 077 case 2: // 左 078 if (k2 > 0) { 079 wk = i_state[k1][k2-1]; 080 i_state[k1][k2-1] = 0; 081 i_state[k1][k2] = wk; 082 k2--; 083 } 084 break; 085 default: // 右 086 if (k2 < 2) { 087 wk = i_state[k1][k2+1]; 088 i_state[k1][k2+1] = 0; 089 i_state[k1][k2] = wk; 090 k2++; 091 } 092 break; 093 } 094 } 095 // ゴールと同じか否かのチェック 096 for (int i1 = 0; i1 < 3 && sw; i1++) { 097 for (int i2 = 0; i2 < 3 && sw; i2++) { 098 if (i_state[i1][i2] != g_state[i1][i2]) 099 sw = false; 100 } 101 } 102 } 103 } 104 // ボタンがクリックされたときの処理 105 public void actionPerformed(ActionEvent e) 106 { 107 int sw = 0; 108 // 移動 109 for (int i1 = 0; i1 < 3 && sw == 0; i1++) { 110 for (int i2 = 0; i2 < 3 && sw == 0; i2++) { 111 if (e.getSource() == bt[i1][i2]) { 112 sw = 1; 113 if (i1 > 0 && i_state[i1-1][i2] == 0) { // 上 114 sw = 2; 115 bt[i1][i2].setText(""); 116 bt[i1-1][i2].setText(Integer.toString(i_state[i1][i2])); 117 i_state[i1-1][i2] = i_state[i1][i2]; 118 i_state[i1][i2] = 0; 119 } 120 else if (i1 < 2 && i_state[i1+1][i2] == 0) { // 下 121 sw = 2; 122 bt[i1][i2].setText(""); 123 bt[i1+1][i2].setText(Integer.toString(i_state[i1][i2])); 124 i_state[i1+1][i2] = i_state[i1][i2]; 125 i_state[i1][i2] = 0; 126 } 127 else if (i2 > 0 && i_state[i1][i2-1] == 0) { // 左 128 sw = 2; 129 bt[i1][i2].setText(""); 130 bt[i1][i2-1].setText(Integer.toString(i_state[i1][i2])); 131 i_state[i1][i2-1] = i_state[i1][i2]; 132 i_state[i1][i2] = 0; 133 } 134 else if (i2 < 2 && i_state[i1][i2+1] == 0) { // 右 135 sw = 2; 136 bt[i1][i2].setText(""); 137 bt[i1][i2+1].setText(Integer.toString(i_state[i1][i2])); 138 i_state[i1][i2+1] = i_state[i1][i2]; 139 i_state[i1][i2] = 0; 140 } 141 } 142 } 143 } 144 // ゴールか? 145 if (sw > 1) { 146 for (int i1 = 0; i1 < 3 && sw > 1; i1++) { 147 for (int i2 = 0; i2 < 3 && sw > 1; i2++) { 148 if (i_state[i1][i2] != g_state[i1][i2]) 149 sw = 0; 150 } 151 } 152 if (sw > 1) 153 mp.state = 2; 154 } 155 } 156 }
| 情報学部 | 菅沼ホーム | Java 目次 | 索引 |