import java.awt.*;
import java.awt.event.*;
import java.util.*;public class TestGame extends Frame {
int temporaryType, temporaryChape;
int ;
Panel PUP = new Panel() {
public void paint(Graphics g) {
g.setColor(Color.blue);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[temporaryType][temporaryChape][i][j] != 0)
g.fillRect(45 + j * 10, 15 + i * 10, 10, 10);
}
}
}
};
final int[][][][] map = new int[][][][] {
// i
{ { { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, { { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } }, { { 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }, { { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } } },
// s
{
{ { 0, 1, 1, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 0, 0, 0, }, { 1, 1, 0, 0, }, { 0, 1, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 1, 1, 0, }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 0, 0, 0, }, { 1, 1, 0, 0, }, { 0, 1, 0, 0 },
{ 0, 0, 0, 0 } } },
// z
{
{ { 1, 1, 0, 0 }, { 0, 1, 1, 0, }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 1, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 0, 1, 1, 0, }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 1, 0, 0, 0 },
{ 0, 0, 0, 0 } } },
// j
{
{ { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 1, 0, 0, 0 }, { 1, 0, 0, 0 },
{ 0, 0, 0, 0 }, },
{ { 1, 1, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } } },
// o
{
{ { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } } },
// L
{
{ { 1, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 1, 0 }, { 1, 0, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 0, 1, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } } },
// t
{
{ { 0, 1, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 1, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 0 },
{ 0, 0, 0, 0 } },
{ { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 },
{ 0, 0, 0, 0 } } } }; public static void main(String[] args) {
TestGame tg = new TestGame();
Game gui = tg.new Game();
tg.UI(gui);
gui.automatic();
}
// 画外框
void UI(Game gui) {
this.setBounds(400, 400, 260, 260);
this.addKeyListener(new MyKeyMonitor());
this.setLayout(new GridLayout(1, 2));
Panel p = new Panel();
p.setLayout(new GridLayout(1, 2));
p.add(gui);
Panel p3 = new Panel();
p3.setLayout(new GridLayout(3, 1));
p.add(p3);
PUP.setBackground(Color.cyan);
p3.add(PUP);
Panel pCentre = new Panel();
pCentre.setBackground(Color.green);
p3.add(pCentre);
Panel pDown = new Panel();
pDown.setLayout(new GridLayout(4, 1));
AllListener al = new AllListener();
Button b1 = new Button("重新开始");
b1.addActionListener(al);
pDown.add(b1);
Button b3 = new Button("开始");
b3.addActionListener(al);
pDown.add(b3);
Button b2 = new Button("暂停");
b2.addActionListener(al);
pDown.add(b2);
Button b = new Button("退出");
b.addActionListener(al);
pDown.add(b);
p3.add(pDown);
this.add(p);
this.setVisible(true);
}

class Game extends Panel {
private boolean over = false;
private int mapX = 4;
private int mapY;
private int[][] container;
private int typeMap;
private int chapeMap; public Game() {
containerMap();
newMap();
newMap();
} // 绘制
public void paint(Graphics g) {
g.setColor(Color.blue);
// g.fillRect(10, 10, 50,50);
for (int i = 0; i < 22; i++) {
for (int j = 0; j < 12; j++) {
if (container[i][j] != 0)
g.fillRect(j * 10, i * 10, 10, 10);
}
}
g.setColor(Color.black);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[typeMap][chapeMap][i][j] != 0)
g.fillRect(mapX * 10 + j * 10, mapY * 10 + i * 10, 10,
10);
}
}
} // 画墙
void containerMap() {
container = new int[22][12];
for (int y = 0; y < 22; y++) {
if (y == 21) {
for (int x = 0; x < 12; x++) {
container[y][x] = 2;
}
}
container[y][0] = 2;
container[y][11] = 2;
}
} // 算出新方块
void newMap() {
typeMap = temporaryType;
chapeMap = temporaryChape;
int i = new Random().nextInt(28);
temporaryType = i % 7;
temporaryChape = i % 4;
TestGame.this.PUP.repaint();
} // 判断是否合法
boolean ifMap(int x, int y) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[typeMap][chapeMap][i][j] == 1) {
if (container[y + i][x + j] != 0)
return false;
}
}
}
return true;
} // 判断是否over
boolean ifOver() {
int x = 0; for (int i = 0; i < 21; i++) {
for (int j = 1; j < 11; j++) {
if (container[i][j] != 0) {
x++;
break;
}
}
if (x >= 20)
return true;
}
return false;
} // 判断消除
void ifScores() {
int ifscores = 0;
for (int i = 0; i < 21; i++) {
for (int j = 1; j < 11; j++) {
if (container[i][j] == 1)
ifscores++;
}
if (ifscores == 10) {
++;
this.soures(i);
}
ifscores = 0;
}
} // 消除后整合
void soures(int y) {
for (int i = (y - 1); i >= 0; i--) {
for (int j = 1; j < 11; j++) {
container[i + 1][j] = container[i][j];
}
}
} // 右移动
void right() {
if (this.ifMap(mapX - 1, mapY))
mapX--;
} // 左移动
void left() {
if (this.ifMap(mapX + 1, mapY))
mapX++;
} // 下移动
void down() {
if (this.ifMap(mapX, mapY + 1)) {
this.mapY++;
} else {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (map[typeMap][chapeMap][i][j] == 1) {
container[mapY + i][mapX + j] = map[typeMap][chapeMap][i][j];
}
}
}
this.ifScores();
over = this.ifOver();
mapX = 4;
mapY = 0;
this.newMap();
}
} // 旋转
void spin() {
chapeMap = (chapeMap + 1) % 4;
if (!ifMap(mapX, mapY))
chapeMap = (chapeMap + 3) % 4;
} // 自动下落
void automatic() {
while (!over) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(0);
}
down();
repaint();
}
System.out.println("game over");
}
} class AllListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
String s = ae.getActionCommand();
if (s.equals("重新开始"))
System.out.println("000");
if (s.equals("开始"))
System.out.println("001");
if (s.equals("暂停"))
System.out.println("002");
if (s.equals("退出"))
System.exit(0);
}
}
class MyKeyMonitor extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP) {
System.out.println("UP");
}
}
}
}

解决方案 »

  1.   

    Lz你的监听器要加在frame而不是panel上?
      

  2.   

    好像应该加在panel上,不过加在frame上应该也有点反应吧
      

  3.   

    点击开始后,焦点就落到按钮上了,所以你注册在Frame上的监听器,就得不到东西了。要么就在启动后,主动让Frame获取focus()
      

  4.   


    说的不准确,其实你一启动,焦点就不再Frame上了,而是在 Button b1 上,所以:在 void UI(Game gui) { 最后一句话,加上:
    this.requestFocus();在public void actionPerformed(ActionEvent ae) { 最后一句话加上:
    TestGame.this.requestFocus();