JAVA+SQL SERVER 推箱子小游戏

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来表示,用二元数组来存储信息,根据数组信息的变化来确定是否到达终点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值