day5 自制地图功能实现
package diyMap;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import game.drawimage;
public class DiyMap extends JFrame implements KeyListener{
/*素材宽度*/
static int SOUREC_WIDTH = 30;
/*素材高度*/
static int SOUREC_HEIGHT =30;
/*地图宽度*/
static int MAP_WIDTH =720;
/*地图高度*/
static int MAP_HEIGHT=720;
static int[][] map1 = new int[MAP_WIDTH / SOUREC_WIDTH][MAP_HEIGHT / SOUREC_HEIGHT];
static ImageIcon[][] icons = new ImageIcon[MAP_WIDTH / SOUREC_WIDTH][MAP_HEIGHT / SOUREC_HEIGHT];
String PATH="F:\\PushBoxGame\\map";
int mp[][]=new int[105][105];
int temp[][]=new int[105][105];
Image[] image;
JPanel jp=new MySetPanel();
int num=0;
int posY;
int posX;
int total=0;
void create() {
for(int i=0;i<mp.length;i++)
temp[i]=mp[i].clone();
}
public DiyMap() {
image = new Image[6];
image[1] = drawimage.getimage("picture/box1.png");
image[2] = drawimage.getimage("picture/wall.png");
image[3] = drawimage.getimage("picture/box2.png");
image[4] = drawimage.getimage("picture/destination.png");
image[5] = drawimage.getimage("picture/player.png");
this.add(jp);
this.setSize(720, 720);
this.setTitle("KERRY 推箱子");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setBackground(Color.white);
GetMap();
create();
this.addKeyListener(this);
}
void GetMap() {
try {
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(PATH + "\\diy"+".map")));
int i = in.readInt();
int j = in.readInt();
//System.out.println(i+" "+j);
for (int ii = 0; ii < i; ii++) {
for (int jj = 0; jj < j; jj++) {
mp[ii][jj] = in.readInt();
if(mp[ii][jj]==4)this.total++;
else if(mp[ii][jj]==5) {
this.posY=ii;
this.posX=jj;
}
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
class MySetPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < MAP_HEIGHT / SOUREC_HEIGHT; i++) {
for (int j = 0; j < MAP_WIDTH / SOUREC_WIDTH; j++) {
if(mp[i][j]!=0)
g.drawImage(image[mp[i][j]], getDrawX(j), getDrawY(i), SOUREC_WIDTH, SOUREC_HEIGHT,
null);
else g.clearRect( getDrawX(j), getDrawY(i), SOUREC_WIDTH, SOUREC_HEIGHT);
}
}
}
}
// 将数组下标转化成对应的图片左上角坐标
public int getDrawX(int j) {
int x = j * 30;
return x;
}
// 将数组下标转化成对应的图片左上角坐标
public int getDrawY(int i) {
int y = i * 30;
return y;
}
public void keyPressed(KeyEvent e) {//0是空地,1是箱子,2是墙,3是到达地点的箱子,4是目的地,5是人
// TODO Auto-generated method stub
char ch=e.getKeyChar();
//JOptionPane.showMessageDialog(null, "你按了"+ch);
/*posX,posY代表人物的位置*/
// for(int i=0;i<mp.length;i++)
// for(int j=0;j<mp[i].length;j++) {
// System.out.print(temp[i][j]);
// if(j==mp[i].length-1)System.out.println();
// }
if(ch=='w'||ch=='W'){
//向上走动
if(mp[posY-1][posX]==0){
mp[posY-1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY--;
}
else if(mp[posY-1][posX]==1||mp[posY-1][posX]==3){
if(mp[posY-2][posX]==0) {
if(temp[posY-1][posX]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY-2][posX]=1;
mp[posY-1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY--;
}
else if(mp[posY-2][posX]==4){
if(temp[posY-1][posX]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY-2][posX]=3;
mp[posY-1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY--;
num++;
}
}
else if(mp[posY-1][posX]==4) {
mp[posY-1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY--;
}
}
else if(ch=='s'||ch=='S'){
//向下走动
if(mp[posY+1][posX]==0){
mp[posY+1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY++;
}
else if(mp[posY+1][posX]==1||mp[posY+1][posX]==3){
if(mp[posY+2][posX]==0) {
if(temp[posY+1][posX]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY+2][posX]=1;
mp[posY+1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY++;
}
else if(mp[posY+2][posX]==4) {
if(temp[posY+1][posX]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY+2][posX]=3;
mp[posY+1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY++;
num++;
}
}
else if(mp[posY+1][posX]==4) {
mp[posY+1][posX]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posY++;
}
}
else if(ch=='a'||ch=='A'){
//向左走
if(mp[posY][posX-1]==0){//判断下一个位置
mp[posY][posX-1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX--;
}
else if(mp[posY][posX-1]==1||mp[posY][posX-1]==3){
if(mp[posY][posX-2]==0) {
if(temp[posY][posX-1]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY][posX-2]=1;
mp[posY][posX-1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX--;
}
else if(mp[posY][posX-2]==4) {
if(temp[posY][posX-1]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY][posX-2]=3;
mp[posY][posX-1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX--;
num++;
}
}
else if(mp[posY][posX-1]==4) {
mp[posY][posX-1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX--;
}
}
else if(ch=='d'||ch=='D'){
//向右走
if(mp[posY][posX+1]==0){
mp[posY][posX+1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX++;
}
else if(mp[posY][posX+1]==1||mp[posY][posX+1]==3){
if(mp[posY][posX+2]==0) {
if(temp[posY][posX+1]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY][posX+2]=1;
mp[posY][posX+1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX++;
}
else if(mp[posY][posX+2]==4) {
if(temp[posY][posX+1]==4)num--;//如果箱子移动前所在的位置是目的地,那么移动后到达的数量要减1
mp[posY][posX+2]=3;
mp[posY][posX+1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX++;
num++;
}
}
else if(mp[posY][posX+1]==4) {
mp[posY][posX+1]=5;
if(temp[posY][posX]==4)mp[posY][posX]=temp[posY][posX];
else mp[posY][posX]=0;
posX++;
}
}
jp.repaint();
if(num==total) {
JOptionPane.showMessageDialog(null,"通关成功");
this.dispose();
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
本游戏采用了上下左右用字母W、S、A、D来表示,用二元数组来存储信息,根据数组信息的变化来确定是否到达终点。