此代碼參考傳智播客推箱子視訊并進行改進 增加esc關閉視窗,用adws或控制方向 的代碼
import game.qust.cn.MainFrame;
//啟動入口
public class App {
public static void main(String[] args) {
new MainFrame();
}
}
package game.qust.cn;
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;
public class MainFrame extends Frame implements KeyListener{
public MainFrame() {
wolfInit();//做人物
sheepInit();//做箱子
targetInit();//做籠子
treeInit();//做障礙
backgroundInit();//背景初始化
//設定整個窗體
setMainFrameUI();
this.addKeyListener(this);//使視窗監聽鍵盤(寫視窗初始化後面)
}
JLabel[][] sheeps=new JLabel[12][16];//用來存儲三隻羊
//場景資料模拟 二維數組
//1代表障礙 0代表空地
int[][] datas= {
{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,0,1,0,0,1,1,1,1,0,1,1,1,0,0,1},
{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1},
{1,0,1,0,0,1,1,1,1,0,1,1,1,0,0,1},
{1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
{1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1},
{1,0,1,0,0,1,1,1,1,0,1,1,1,0,0,1},
{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,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
int wx ;//代表人物橫向位置
int wy ;//代表人物縱向位置
//代表目前有多少個箱子移動到了目标中
int num = 0;
//代表箱子的總數
int total = 3;
private void treeInit() {
//建立圖檔
Icon ic=new ImageIcon("tree.png");
// 周遊二維數組
for(int i=0;i<datas.length;i++) {
for(int j=0;j<datas[i].length;j++) {
if(datas[i][j]==1) {
//障礙初始化
JLabel lab_tree=new JLabel(ic);
lab_tree.setBounds(12+50*j,36+50*i,50,50);//設定位置 大小
this.add(lab_tree);//添加圖像到視窗
}
}
}
}
private void targetInit() {
//用jlabel制作一個籠子
Icon i=new ImageIcon("target.png");
JLabel lab_target1=new JLabel(i);
lab_target1.setBounds(700+12,200+36,50,50);//設定籠子位置 大小
this.add(lab_target1);//添加圖像到視窗
datas[4][14] = 8;
JLabel lab_target2=new JLabel(i);
lab_target2.setBounds(700+12,300+36,50,50);//設定籠子位置 大小
this.add(lab_target2);//添加圖像到視窗
datas[6][14] = 8;
JLabel lab_target3=new JLabel(i);
lab_target3.setBounds(700+12,250+36,50,50);//設定籠子位置 大小
this.add(lab_target3);//添加圖像到視窗
datas[5][14] = 8;
}
private void sheepInit() {
//用jlabel制作一隻羊
Icon i=new ImageIcon("sheep-no.png");
JLabel lab_sheep1=new JLabel(i);
lab_sheep1.setBounds(512,336,50,50);//設定羊位置 大小
this.add(lab_sheep1);//添加圖像到視窗
datas[6][10]=4;
sheeps[6][10]=lab_sheep1;//把這個jlabel元件放入sheeps數組中
JLabel lab_sheep2=new JLabel(i);
lab_sheep2.setBounds(612,486,50,50);//設定羊位置 大小
this.add(lab_sheep2);//添加圖像到視窗
datas[9][12]=4;
sheeps[9][12]=lab_sheep2;//把這個jlabel元件放入sheeps數組中
JLabel lab_sheep3=new JLabel(i);
lab_sheep3.setBounds(312,186,50,50);//設定羊位置 大小
this.add(lab_sheep3);//添加圖像到視窗
datas[3][6]=4;
sheeps[3][6]=lab_sheep3;//把這個jlabel元件放入sheeps數組中
}
private void backgroundInit() {
//用jlabel制作背景
Icon i=new ImageIcon("bg.png");
JLabel lab_bg=new JLabel(i);
lab_bg.setBounds(12,36,800,600);//設定背景位置 大小
this.add(lab_bg);//添加圖像到視窗
}
private void wolfInit() {
wx=6;
wy=1;//人物位置
//用jlabel制作灰太狼
Icon i=new ImageIcon("wolf-zm.png");
lab_wolf=new JLabel(i);
lab_wolf.setBounds(12+wx*50,36+wy*50,50,50);//設定狼位置 大小(位置對背景修正)
this.add(lab_wolf);//添加圖像到視窗
}
JLabel lab_wolf;
private void setMainFrameUI() {
this.setLayout(null);//窗體自由布局
this.setSize(824,650); //窗體大小
this.setLocation(150,150);//窗體位置
this.setTitle("推箱子 v1.0");//窗體頭顯示内容
//設定視窗顯示
this.setVisible(true);
}
public void keyReleased(KeyEvent e) {
//點選鍵盤後現在程式有動作執行了
//如何分辨使用者點選的是鍵盤上的某個按鍵?
//通過鍵碼值分辨是哪一個按鍵
//擷取鍵碼值的方式:
//key代表了你輸入的是哪個按鍵
//左 37
//上 38
//右 39
//下 40
int key = e.getKeyCode();
if(key == 39|key == 68){
//讓人物向右移動
//方向上第一位的坐标是 wy wx+1
//方向上第二位的坐标是 wy wx+2
if(datas[wy][wx+1] == 0){
wx = wx+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x+50, y);
Icon i = new ImageIcon("wolf-ym.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy][wx+1] == 1){
return;
}
if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 1){
return;
}
if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 4){
return;
}
if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 12){
return;
}
if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 1){
return;
}
if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 4){
return;
}
if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 12){
return;
}
if(datas[wy][wx+1] == 8){
wx = wx+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x+50, y);
Icon i = new ImageIcon("wolf-ym.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 0){
datas[wy][wx+1] = 0;
datas[wy][wx+2] = 4;
}
if(datas[wy][wx+1] == 4 && datas[wy][wx+2] == 8){
datas[wy][wx+1] = 0;
datas[wy][wx+2] = 12;
num++;
}
if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 0){
datas[wy][wx+1] = 8;
datas[wy][wx+2] = 4;
num--;
}
if(datas[wy][wx+1] == 12 && datas[wy][wx+2] == 8){
datas[wy][wx+1] = 8;
datas[wy][wx+2] = 12;
}
sheeps[wy][wx+1].setLocation(12+wx*50+100,36+wy*50);
sheeps[wy][wx+2] = sheeps[wy][wx+1];
sheeps[wy][wx+1] = null;
wx = wx+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x+50, y);
Icon i = new ImageIcon("wolf-ym.png");
lab_wolf.setIcon(i);
//判斷勝利
victory();
return;
}
if(key==37|key==65){
//讓人物向左移動
//方向上第一位的坐标是 wy wx-1
//方向上第二位的坐标是 wy wx-2
if(datas[wy][wx-1] == 0){
wx = wx-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x-50, y);
Icon i = new ImageIcon("wolf-zb.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy][wx-1] == 1){
return;
}
if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 1){
return;
}
if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 4){
return;
}
if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 12){
return;
}
if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 1){
return;
}
if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 4){
return;
}
if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 12){
return;
}
if(datas[wy][wx-1] == 8){
wx = wx-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x-50, y);
Icon i = new ImageIcon("wolf-zb.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 0){
datas[wy][wx-1] = 0;
datas[wy][wx-2] = 4;
}
if(datas[wy][wx-1] == 4 && datas[wy][wx-2] == 8){
datas[wy][wx-1] = 0;
datas[wy][wx-2] = 12;
num++;
}
if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 0){
datas[wy][wx-1] = 8;
datas[wy][wx-2] = 4;
num--;
}
if(datas[wy][wx-1] == 12 && datas[wy][wx-2] == 8){
datas[wy][wx-1] = 8;
datas[wy][wx-2] = 12;
}
sheeps[wy][wx-1].setLocation(12+wx*50-100,36+wy*50);
sheeps[wy][wx-2] = sheeps[wy][wx-1];
sheeps[wy][wx-1] = null;
wx = wx-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x-50, y);
Icon i = new ImageIcon("wolf-zb.png");
lab_wolf.setIcon(i);
victory();
return;
}
if(key == 38|key == 87){
//讓人物向上移動
//方向上第一位的坐标是 wy wx-1
//方向上第二位的坐标是 wy wx-2
if(datas[wy-1][wx] == 0){
wy = wy-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y-50);
Icon i = new ImageIcon("wolf-sm.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy-1][wx] == 1){
return;
}
if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 1){
return;
}
if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 4){
return;
}
if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 12){
return;
}
if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 1){
return;
}
if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 4){
return;
}
if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 12){
return;
}
if(datas[wy-1][wx] == 8){
wy = wy-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y-50);
Icon i = new ImageIcon("wolf-sm.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 0){
datas[wy-1][wx] = 0;
datas[wy-2][wx] = 4;
}
if(datas[wy-1][wx] == 4 && datas[wy-2][wx] == 8){
datas[wy-1][wx] = 0;
datas[wy-2][wx] = 12;
num++;
}
if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 0){
datas[wy-1][wx] = 8;
datas[wy-2][wx] = 4;
num--;
}
if(datas[wy-1][wx] == 12 && datas[wy-2][wx] == 8){
datas[wy-1][wx] = 8;
datas[wy-2][wx] = 12;
}
sheeps[wy-1][wx].setLocation(12+wx*50,36+wy*50-100);
sheeps[wy-2][wx] = sheeps[wy-1][wx];
sheeps[wy-1][wx] = null;
wy = wy-1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y-50);
Icon i = new ImageIcon("wolf-sm.png");
lab_wolf.setIcon(i);
victory();
return;
}
if(key == 40|key == 83){
//讓人物向下移動
//方向上第一位的坐标是 wy wx+1
//方向上第二位的坐标是 wy wx+2
if(datas[wy+1][wx] == 0){
wy = wy+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y+50);
Icon i = new ImageIcon("wolf-zm.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy+1][wx] == 1){
return;
}
if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 1){
return;
}
if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 4){
return;
}
if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 12){
return;
}
if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 1){
return;
}
if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 4){
return;
}
if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 12){
return;
}
if(datas[wy+1][wx] == 8){
wy = wy+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y+50);
Icon i = new ImageIcon("wolf-zm.png");
lab_wolf.setIcon(i);
return;
}
if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 0){
datas[wy+1][wx] = 0;
datas[wy+2][wx] = 4;
}
if(datas[wy+1][wx] == 4 && datas[wy+2][wx] == 8){
datas[wy+1][wx] = 0;
datas[wy+2][wx] = 12;
num++;
}
if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 0){
datas[wy+1][wx] = 8;
datas[wy+2][wx] = 4;
num--;
}
if(datas[wy+1][wx] == 12 && datas[wy+2][wx] == 8){
datas[wy+1][wx] = 8;
datas[wy+2][wx] = 12;
}
sheeps[wy+1][wx].setLocation(12+wx*50,36+wy*50+100);
sheeps[wy+2][wx] = sheeps[wy+1][wx];
sheeps[wy+1][wx] = null;
wy = wy+1;
int x =(int)lab_wolf.getLocation().getX();
int y =(int)lab_wolf.getLocation().getY();
lab_wolf.setLocation(x, y+50);
Icon i = new ImageIcon("wolf-zm.png");
lab_wolf.setIcon(i);
victory();
return;
}
if(key == 27) {
this.setVisible(false);
}
}
private void victory() {
if(num == total){
System.out.println("勝利");
}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO 自動生成的方法存根
}
@Override
public void keyTyped(KeyEvent e) {
// TODO 自動生成的方法存根
}
}
在這裡插入圖檔描述
