情報学部 | 菅沼ホーム | 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 目次 | 索引 |