package com.yidu.yx;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Stack;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
*
* 描述:
*
* @author xwc
* @date 2018年3月20日下午3:14:37
* @version 1.0
*/
public class GamePanel extends JPanel implements KeyListener {
/**
*
*/
//private static final long serialVersionUID = 1L;
//创建地图的图片数组
private Image [] image=new Image[10];
//地图二维数组
private int [][] map=new int [20][20];
private int [][] newmap=new int [20][20];
//人物坐标
int myX,myY;
//申明一个栈
Stack<Integer> stack=new Stack<Integer>();
public GamePanel() {
this.setBounds(20, 50, 600, 600);
this.setBackground(Color.white);
for (int i = 0; i < image.length; i++) {
image[i]=Toolkit.getDefaultToolkit().getImage("pic/"+i+".gif");
}
this.addKeyListener(this);
this.setVisible(true);
}
/**
*
*功能说明:推箱子方法
*
*leve 关卡
*date2018年3月21日下午3:04:22
*
*/
int level=1;
public void tuixiangzi(int leve){
this.level=leve;
//调用读取地图的方法得到二维数组
int [][]temp=new ReadMap().read(leve);
int [][]temp1=new ReadMap().read(leve);
//将数组读取到地图中去
for (int i = 0; i < temp.length; i++) {
for (int j = 0; j < temp[i].length; j++) {
map[i][j]=temp[i][j];
if(map[i][j]==5){
myY=i;
myX=j;
}
}
}
//创建一个新的地图
for (int i = 0; i < temp1.length; i++) {
for (int j = 0; j < temp1[i].length; j++) {
newmap[i][j]=temp1[i][j];
}
}
this.repaint();
}
public void paint(Graphics gr){
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
gr.drawImage(image[map[i][j]], j*30, i*30, this);
//设置颜色
gr.setColor(new Color(0, 0, 0));
//设置字体
gr.setFont(new Font("楷体 _3212",Font.BOLD,30));
//设置文字
gr.drawString("现在是第", 180, 40);
gr.drawString(String.valueOf(level), 325, 40);
gr.drawString("关", 360, 40);
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//控制往上走
if(e.getKeyCode()==KeyEvent.VK_UP){
moveup();
//控制往下走
}else if(e.getKeyCode()==KeyEvent.VK_DOWN){
movedown();
}else if(e.getKeyCode()==KeyEvent.VK_LEFT){
moveleft();
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
moveright();
}
//判断是否过关或通关
if(iswin()){
//判断是否通关
if(level==50){
JOptionPane.showMessageDialog(this, "恭喜你通关了");
}else{
//提示语句
String str="恭喜过关,是否进入下一关";
//是否进行下一关
int yn=JOptionPane.YES_NO_OPTION;
//提示框标题
String title="过关";
//创建下一关的开关变量
int c=0;
//提示框
c=JOptionPane.showConfirmDialog(null, str,title,yn);
if(c==1){//判断不进入下一关
System.out.println(0);
}else{
level++;
tuixiangzi(level);
repaint();
}
}
}
}
/*
* 悔一步的方法
*/
public void hui(){
if(stack.isEmpty()){
JOptionPane.showMessageDialog(null, "你还没有开始推箱子");
return;
}
int value=stack.pop();
switch (value) {
case 1:
//System.out.println("悔棋");
if(newmap[myY][myX]==9||newmap[myY][myX]==4){//走一步所在的位置
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY+1][myX]=8;
myY++;
break;
case 2:
map[myY][myX]=3;
map[myY-1][myX]=4;
map[myY+1][myX]=8;
myY++;
break;
case 3:
map[myY][myX]=3;
map[myY-1][myX]=2;
map[myY+1][myX]=8;
myY++;
break;
case 4:
map[myY][myX]=9;
map[myY-1][myX]=2;
map[myY+1][myX]=8;
myY++;
break;
case 5:
map[myY][myX]=9;
map[myY-1][myX]=4;
map[myY+1][myX]=8;
myY++;
break;
case 6:
if(newmap[myY][myX]==9||newmap[myY][myX]==4){//走一步所在的位置
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY-1][myX]=5;
myY--;
break;
case 7:
map[myY][myX]=3;
map[myY+1][myX]=4;
map[myY-1][myX]=5;
myY--;
break;
case 8:
map[myY][myX]=3;
map[myY+1][myX]=2;
map[myY-1][myX]=5;
myY--;
break;
case 9:
map[myY][myX]=9;
map[myY+1][myX]=2;
map[myY-1][myX]=5;
myY--;
break;
case 10:
map[myY][myX]=9;
map[myY+1][myX]=4;
map[myY-1][myX]=5;
myY--;
break;
case 11:
if(newmap[myY][myX]==9||newmap[myY][myX]==4){//走一步所在的位置
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY][myX+1]=6;
myX++;
break;
case 12:
map[myY][myX]=3;
map[myY][myX-1]=4;
map[myY][myX+1]=6;
myX++;
break;
case 13:
map[myY][myX]=3;
map[myY][myX-1]=2;
map[myY][myX+1]=6;
myX++;
break;
case 14:
map[myY][myX]=9;
map[myY][myX-1]=2;
map[myY][myX+1]=6;
myX++;
break;
case 15:
map[myY][myX]=9;
map[myY][myX-1]=4;
map[myY][myX+1]=5;
myX++;
break;
case 16:
if(newmap[myY][myX]==9||newmap[myY][myX]==4){//走一步所在的位置
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY][myX-1]=7;
myX--;
break;
case 17:
map[myY][myX]=3;
map[myY][myX+1]=4;
map[myY][myX-1]=7;
myX--;
break;
case 18:
map[myY][myX]=3;
map[myY][myX+1]=2;
map[myY][myX-1]=7;
myX--;
break;
case 19:
map[myY][myX]=9;
map[myY][myX+1]=2;
map[myY][myX-1]=7;
myY--;
break;
case 20:
map[myY][myX]=9;
map[myY][myX+1]=4;
map[myY][myX-1]=7;
myX--;
break;
default:
break;
}
map[myY][myX]=5;
repaint();
}
/**
* 控制人物向上移动
*/
public void moveup(){
if(map[myY-1][myX]==4||map[myY-1][myX]==2){//判断上面是草地或者跳板
map[myY-1][myX]=8;
if(newmap[myY][myX]==4||newmap[myY][myX]==9){//
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
repaint();
myY--;
stack.push(1);
}else if(map[myY-1][myX]==3){//判断上面是箱子
if(map[myY-2][myX]==4){//判断上面第二个是跳板
if(newmap[myY][myX]==4||newmap[myY][myX]==9){
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY-1][myX]=8;
map[myY-2][myX]=9;
repaint();
myY--;
stack.push(2);
}else if(map[myY-2][myX]==2){//判断上面第二个是草地
if(newmap[myY][myX]==4||newmap[myY][myX]==9){
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY-1][myX]=8;
map[myY-2][myX]=3;
repaint();
myY--;
stack.push(3);
}else{
map[myY][myX]=8;
repaint();
}
}else if(map[myY-1][myX]==9){//判断上面是红色箱子
if(map[myY-2][myX]==2){//判断上面第二个是草地
if(newmap[myY][myX]==4||newmap[myY][myX]==9){
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY-1][myX]=8;
map[myY-2][myX]=3;
repaint();
myY--;
stack.push(4);
}else if(map[myY-2][myX]==4){//判断上面第二个是跳板
if(newmap[myY][myX]==4||newmap[myY][myX]==9){
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
map[myY-1][myX]=8;
map[myY-2][myX]=9;
repaint();
myY--;
stack.push(5);
}
else{
map[myY][myX]=8;
repaint();
}
}else{
map[myY][myX]=8;
repaint();
}
}
/**
* 控制人物向下移动
*/
public void movedown(){
if(map[myY+1][myX]==4||map[myY+1][myX]==2){//判断下面是草地或者跳板
map[myY+1][myX]=5;
if(newmap[myY][myX]==4||newmap[myY][myX]==9){
map[myY][myX]=4;
}else{
map[myY][myX]=2;
}
repaint();
myY++;
stack.push(6);
}else if(map[myY+1][myX]==3){//判断下面是箱子
if(map[myY+2][myX]==4){//判断下面第二个是跳板
if(newmap[myY][myX]==4||newmap[myY][myX]==9){