日期:2014-05-20 浏览次数:20969 次
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.border.Border;
public class QuareGame extends JFrame implements ActionListener {
private GamePanel gamePanel ;
//菜单工具组件
JMenuBar menuBar = new JMenuBar();
//menuBar.setSize(20, 20);
JMenu menuFile = new JMenu("游戏");
JMenuItem newGame = new JMenuItem("新游戏");
JMenuItem pauseGame = new JMenuItem("暂停");
JMenuItem overGame = new JMenuItem("结束");
JMenu menuHelp=new JMenu("帮助");
//
JLabel labLevel=new JLabel("选择关卡:");
JTextField txtLevel=new JTextField();
public QuareGame(GamePanel gp) {
setBounds(500, 100, 338, 480);
setTitle("my small game");
setLayout(new BorderLayout());
JFrame.setDefaultLookAndFeelDecorated(true);
//添加菜单条
setJMenuBar(createMenuBar());
this.gamePanel = gp;
if(gamePanel!=null){
add(gamePanel);
addKeyListener(gamePanel);
}
labLevel.setBounds(260, 140, 50, 30);
txtLevel.setBounds(260, 180, 50, 30);
// add(labLevel);
// add(txtLevel);
setVisible(true);
// setResizable(false);
}
// 菜单条
public JMenuBar createMenuBar() {
menuFile.add(newGame);
menuFile.add(pauseGame);
menuFile.add(overGame);
menuBar.add(menuFile);
menuBar.add(menuHelp);
menuHelp.add(new JMenuItem("版本号"));
//添加事件
newGame.addActionListener(this);
pauseGame.addActionListener(this);
overGame.addActionListener(this);
return menuBar;
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
QuareGame game = new QuareGame(new GamePanel(new int[22][12] ,new int[2][2]));
}
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println(e.getActionCommand());
if(e.getActionCommand(). equals("新游戏")){
System.out.println("newgame");
if(gamePanel!=null){
remove(gamePanel);
removeKeyListener(gamePanel);
}
this.gamePanel = new GamePanel(new int[22][12] ,new int[2][2]);
add(gamePanel);
addKeyListener(gamePanel);
}else if(e.getActionCommand().equals("暂停")){
pauseGame.setText("继续");
gamePanel.timer.stop();
}else if(e.getActionCommand().equals("继续")){
pauseGame.setText("暂停");
gamePanel.timer.start();
}else if(e.getActionCommand().equals("结束")){
if(gamePanel!=null)
this.remove(gamePanel);
gamePanel=null;
}
}
}
class GamePanel extends JPanel implements KeyListener {
/**
*
*/
private static final long serialVersionUID = 1L;
Random random=new Random();
JLabel labLevel=new JLabel("选择关卡:");
JTextField txtLevel=new JTextField();
int size = 20;// 显示大小
// 座标
int x = 4, y;
int i = 0, j = 0;
Timer timer=null;
int level=1;
int score =0;
int steep=1000;//方块下降的速度
TimerAction timerAction;
//绘图颜色
Color mapColor;
Color moveShapColor;
int colors[][]={{255, 222, 173},{47 ,79, 79},{255, 228 ,225},{0 ,255 ,0},{0, 0 ,255},{255, 193, 37}
,{156 ,156 ,156 },{202 ,225, 255},{171, 130, 255},{224 ,102 ,255},{255 ,62 ,150},{255, 0 ,0}};
// squareType类型和 squareState状态
int squareType, squareState;
int nextState=0;//每次产生一个新的会自加1并取2的余数赋给自己
int map[][];// = new int;
int nextTypeAndState [][];
// 方块的几种形状态和状态 (每个方块由一个4*4的矩阵构成)
// I O T Z S L J
int shape[][][];
//构造函数
public GamePanel(int map[][],int nextTypeAndState[][]) {
this.nextTypeAndState=nextTypeAndState;
this.map=map;
this.shape=this.initShap();
setBackground(new Color(250, 250, 250));
initMap();
initWall();
createdSquare();
timerAction=new TimerAction();
timer = new Timer(steep, timerAction);
timer.start();
score = 0;
initTypeAndState();
this.mapColor=createColor();
this.moveShapColor=createColor();
// setLayout();
//
// labLevel.setBounds(260, 140, 80, 30);
// txtLevel.setBounds(50, 80, 50, 80);
// txtLevel.setText("111");
// txtLevel.setSize(10, 10);
// add(labLevel,BorderLayout.EAST);
// add(txtLevel,BorderLayout.EAST);
setSize(400, 480);
}
public int[][][] initShap(){
return new int[][][]{
{ { 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 void initMap() {
for (i = 0; i < map.length; i++) {
for (j = 0; j < map[0].length; j++) {
map[i][j] = 0;
}
}
}
// 初始化围墙
public void initWall() {
for (i = 0; i < map.length; i++) {
map[i][0] = 2; // 两边为2 (1.表示普通2 表示围墙)
map[i][11] = 2;
}
// 底部
for (j = 0; j < 12; j++) {
map[map.length - 1][j] = 2;
}
}
// 产生新方块方法
public void createdSquare() {
x = 4;
y = 0;
nextState=(nextState+1)%2;
getTypeAndState(nextState);
}
//获取当前方块数据,并计算下一个方块数据
public void getTypeAndState(int index){
squareType= nextTypeAndState[0][index];
nextTypeAndState[0][index]=(int) (Math.random() * 100) % 7;
squareState=nextTypeAndState[1][index];
nextTypeAndState[1][index]=(int) (Math.random() * 100) % 4;
}
//初始化当前方块和下一个方块
public void initTypeAndState(){
for (int i = 0; i < nextTypeAndState[0].length; i++) {
nextTypeAndState[0][i]=(int) (Math.random() * 100) % 7;
}
for (int i = 0; i < nextTypeAndState[1].length; i++) {
nextTypeAndState[1][i]=(int) (Math.random() * 100) % 4;
}
}
//随机产生颜色方法
public Color createColor(){
int temp[]=colors[random.nextInt(colors.length)];//此处不用减1
return new Color(temp[0],temp[1],temp[2]);
}
// 是否超出边界
public int isOverstep(int x, int y, int squareType, int squareState) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (shape[squareType][squareState][i * 4 + j] == 1) {
if (map[y + i][j + x] > 0) {
return 0;
}
}
}
}
// 0 1 0 0 0 1 0 0
// 1 1 1 0 0 1 0 0
// 0 0 0 0 0 1 0 0
// 0 0 0 0 0 1 0 0
return 1;
}