背景图片可自行选择(标准为1024*683像素)
代码已上传,地址http://download.csdn.net/download/assene/9901512
(代码源自传智播客)
package com.wuxian;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
/**
* @author JPQ1
*/
//KeyListener 用于接收键盘事件(击键)的侦听器接口
public class Mymain extends Frame implements KeyListener{
//设置窗口属性,构造方法,
/*
* 1显示页面frame
* 2添加图片new ImageIcon()
* new JLabel各种调,设置窗口位置,设置大小,
*
* */
public Mymain() {
//推的对象
xianzi1();
xianzi2();
xianzi3();
//添加显示的东西
renwu();
//黑框
kuan1();
kuan2();
kuan3();
//加载的墙体
treeiod();
//制作背景 UIbug:所有的添加,都放在窗体设置上
background();
//设置窗体
setmain();
//使窗口监督用户点击事件
this.addKeyListener(this);
}
public void setmain(){
//设置自由布局
this.setLayout(null);
//设置窗口大小
this.setSize(920,590);
//设置窗口位置
this.setLocation(150,100);
//设置窗口标题
this.setTitle("推箱子 v1.0");
//窗口显示
this.setVisible(true);
}
private void background(){
//加载图片
Icon i=new ImageIcon("bg.jpg");
JLabel lag=new JLabel(i);
//设置要添加的组件位置大小
lag.setBounds(0, 0,920,590);
//窗体添加一个东西
this.add(lag);
}
private void renwu(){
//默认初始化的人物位置
renx=1;
reny=5;
//加载人物图片
Icon i1=new ImageIcon("renwu.jpg");
lag1=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag1.setBounds(10+renx*50,30+reny*50 ,50,50);
//窗体添加一个东西
this.add(lag1);
}
//3个推的箱子
private void xianzi1(){
//加载图片
Icon i1=new ImageIcon("aa.jpg");
JLabel lag1=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag1.setBounds(110,330, 50, 50);
//窗体添加一个东西
this.add(lag1);
date[6][2]=2;
sleep[6][2]=lag1;
}
private void xianzi2(){
//加载图片
Icon i1=new ImageIcon("aa.jpg");
JLabel lag2=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag2.setBounds(110,380, 50, 50);
//窗体添加一个东西
this.add(lag2);
date[7][2]=2;
sleep[7][2]=lag2;
}
private void xianzi3(){
//加载图片
Icon i1=new ImageIcon("aa.jpg");
JLabel lag3=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag3.setBounds(260,430, 50, 50);
//窗体添加一个东西
this.add(lag3);
date[8][5]=2;
sleep[8][5]=lag3;
}
private void kuan1(){
//决定游戏结束的黑图位置☞
Icon i1=new ImageIcon("ss.png");
JLabel lag5=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag5.setBounds(810,380, 50, 50);
//窗体添加一个东西
this.add(lag5);
date[7][16]=0;
sleep[7][16]=lag5;
}
private void kuan2(){
//决定游戏结束的黑图位置☞
Icon i1=new ImageIcon("ss.png");
JLabel lag5=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小;
lag5.setBounds(810,330, 50, 50);
//窗体添加一个东西
this.add(lag5);
date[6][16]=0;
sleep[6][16]=lag5;
}
private void kuan3(){
//决定游戏结束的黑图位置☞
Icon i1=new ImageIcon("ss.png");
JLabel lag5=new JLabel(i1);
//设置要添加的组件位置大小(x,y,大小);
lag5.setBounds(810,280, 50, 50);
//窗体添加一个东西
this.add(lag5);
date[5][16]=0;
sleep[5][16]=lag5;
}
//增大作用域
JLabel lag1;
//程序执行
public static void main(String[] args) {
new Mymain();
}
@Override
public void keyPressed(KeyEvent e) {
//System.out.println("点击了向上键(w)");
//a:65,w:87,d:68,s:83
//使用lag1.getLocation()可以得到人物的位置*/
int x=(int) lag1.getLocation().getX();
int y=(int) lag1.getLocation().getY();
int qw=e.getKeyCode();
// 通过键码值的方法
if(qw==65){
//碰撞检测
if(date[reny][renx-1]==1){
//System.out.println(reny+"========"+renx);
return;
}
//移动箱子
if(date[reny][renx-1]==2){
//判断推到的位置!=1且!=2
if(date[reny][renx-2]!=1&& date[reny][renx-2]!=2){
//当前箱子变成0
date[reny][renx-1]=0;
//移动后的箱子位置为2
date[reny][renx-2]=2;
//获取箱子对象,计算坐标
sleep[reny][renx-1].setLocation(10+renx*50-100,30+reny*50);
//组件位置调整
sleep[reny][renx-2]=sleep[reny][renx-1];
//原始位置数据清除
sleep[reny][renx-1]=null;
}
}
//处理箱子位置上的空地
if(date[reny][renx-1]==0){
renx=renx-1;
lag1.setLocation(x-50,y);
}
}
if(qw==87){
if(date[reny-1][renx]==1){
return;
}
if(date[reny-1][renx]==2){
if(date[reny-2][renx]!=1&& date[reny-2][renx]!=2){
//当前箱子变成0
date[reny-1][renx]=0;
//移动后的箱子位置为2
date[reny-2][renx]=2;
//获取箱子对象,计算坐标
sleep[reny-1][renx].setLocation(10+renx*50,30+reny*50-100);
//组件位置调整
sleep[reny-2][renx]=sleep[reny-1][renx];
//原始位置数据清除
sleep[reny-1][renx]=null;
}
}
if(date[reny-1][renx]==0){
reny=reny-1;
lag1.setLocation(x,y-50);
}
}
if(qw==68){
if(date[reny][renx+1]==1){
return;
}
if(date[reny][renx+1]==2){
//判断推到的位置!=1且!=2
if(date[reny][renx+2]!=1&& date[reny][renx+2]!=2){
//当前箱子变成0
date[reny][renx+1]=0;
//移动后的箱子位置为2
date[reny][renx+2]=2;
//获取箱子对象,计算坐标
sleep[reny][renx+1].setLocation(10+renx*50+100,30+reny*50);
//组件位置调整
sleep[reny][renx+2]=sleep[reny][renx+1];
//原始位置数据清除
sleep[reny][renx+1]=null;
}
}
if(date[reny][renx+1]==0){
renx=renx+1;
lag1.setLocation(x+50,y);
}
}
if(qw==83){
if(date[reny+1][renx]==1){
return;
}
if(date[reny+1][renx]==2){
if(date[reny+2][renx]!=1&& date[reny+2][renx]!=2){
//当前箱子变成0
date[reny+1][renx]=0;
//移动后的箱子位置为2
date[reny+2][renx]=2;
//获取箱子对象,计算坐标
sleep[reny+1][renx].setLocation(10+renx*50,30+reny*50+100);
//组件位置调整
sleep[reny+2][renx]=sleep[reny+1][renx];
//原始位置数据清除
sleep[reny+1][renx]=null;
}
}
if(date[reny+1][renx]==0){
reny=reny+1;
lag1.setLocation(x,y+50);
}
}
//判断游戏结束
if(date[7][16]==2&&date[5][16]==2&&date[6][16]==2){
System.out.println("游戏结束");
}
}
//以下结束页面显示框
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
JLabel[][] sleep=new JLabel[11][18];
//墙体场景数据的模拟,10*17
int [] [] date={
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1},
{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1},
{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
//代表人物在数组中位置
int renx;
int reny;
//障碍的初始化
private void treeiod(){
//加载图片
Icon i2=new ImageIcon("qq.png");
for (int i = 0; i < date.length; i++) {
for (int j = 0; j < date[i].length; j++) {
if(date[i][j]==1){
JLabel lag1=new JLabel(i2);
//设置要添加的组件位置大小(x,y,大小);
lag1.setBounds(10+50*j,30+50*i, 50,50);
//窗体添加一个东西
this.add(lag1);
}
}
}
}
}
对此代码有不明白的地方,欢迎投递邮件至[email protected]