效果預(yù)覽
推方塊
游戲簡介:由 ↑,↓,←,→鍵來控制方向,點(diǎn)擊空格鍵表示重玩當(dāng)前關(guān)卡。文章來源:http://www.zghlxwxcb.cn/news/detail-502509.html
核心代碼部分:就是如何處理人的移動和人和箱子一起時的移動,這里需要對人要走的下一步和人推著箱子一起走的下一步進(jìn)行判斷分析,如果沒有被阻擋就可以繼續(xù)走下一步。(有興趣的小伙伴可以參考我寫的完整代碼,上面都有備注解析)文章來源地址http://www.zghlxwxcb.cn/news/detail-502509.html
完整代碼部分
package demo01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
public class Pushbox005 extends JFrame implements KeyListener, ActionListener, MouseListener {
// 定義一個內(nèi)部類用來創(chuàng)建坐標(biāo)
class Point{
public int x;
public int y;
public Point (int x,int y){
this.x=x;
this.y=y;
}
}
// 行數(shù)(高)
int height=8;
// 列數(shù)(寬)
int width=8;
// 格子的大小
int size=50;
// 標(biāo)題欄的高度
int title=100;
// 記錄窗口大小是否發(fā)生改變
boolean window=false;
// 關(guān)卡地圖信息
class Ditu{
public int [][] ditu;
Ditu(int[][] _ditu){
this.ditu=_ditu;
}
}
// 創(chuàng)建一個二維數(shù)組用來存放關(guān)卡
// 1-10關(guān)地圖
int [][] ditu1={{0,0,1,1,1,0,0,0},{0,0,1,3,1,0,0,0},{0,0,1,2,1,1,1,1},{1,1,1,4,2,4,3,1},{1,3,2,4,5,1,1,1},{1,1,1,1,4,1,0,0},{0,0,0,1,3,1,0,0},{0,0,0,1,1,1,0,0}};
int [][] ditu2= {{1,1,1,1,1,0,0,0,0},{1,2,2,5,1,0,0,0,0},{1,2,4,4,1,0,1,1,1},{1,2,4,2,1,0,1,3,1},{1,1,1,2,1,1,1,3,1},{0,1,1,2,2,2,2,3,1},{0,1,2,2,2,1,2,2,1},{0,1,2,2,2,1,1,1,1},{0,1,1,1,1,1,0,0,0}};
int [][] ditu3={{0,1,1,1,1,1,1,1,0,0},{0,1,2,2,2,2,2,1,1,1},{1,1,4,1,1,1,2,2,2,1},{1,2,5,2,4,2,2,4,2,1},{1,2,3,3,1,2,4,2,1,1},{1,1,3,3,1,2,2,2,1,0},{0,1,1,1,1,1,1,1,1,0}};
int [][] ditu4={{0,1,1,1,1,0},{1,1,2,2,1,0},{1,5,4,2,1,0},{1,1,4,2,1,1},{1,1,2,4,2,1},{1,3,4,2,2,1},{1,3,3,6,3,1},{1,1,1,1,1,1}};
int [][] ditu5={{0,1,1,1,1,1,0,0},{0,1,2,2,1,1,1,0},{0,1,5,4,2,2,1,0},{1,1,1,2,1,2,1,1},{1,3,1,2,1,2,2,1},{1,3,4,2,2,1,2,1},{1,3,2,2,2,4,2,1},{1,1,1,1,1,1,1,1}};
int [][] ditu6={{0,0,0,1,1,1,1,1,1,1,0,0,0},{1,1,1,1,2,2,2,2,2,1,0,0,0},{1,2,2,2,3,1,1,1,2,1,0,0,0},{1,2,1,2,1,2,2,2,2,1,1,0,0},{1,2,1,2,4,2,4,1,3,2,1,0,0},{1,2,1,2,2,6,2,2,1,2,1,0,0},{1,2,3,1,4,2,4,2,1,2,1,0,0},{1,1,2,2,2,2,1,2,1,2,1,1,1},{0,1,2,1,1,1,3,2,2,2,2,5,1},{0,1,2,2,2,2,2,1,1,2,2,2,1},{0,1,1,1,1,1,1,1,1,1,1,1,1}};
int [][] ditu7={{0,0,0,1,1,1,1,1,1,1},{0,0,1,1,2,2,1,2,5,1},{0,0,1,2,2,2,1,2,2,1},{0,0,1,4,2,4,2,4,2,1},{0,0,1,2,4,1,1,2,2,1},{1,1,1,2,4,2,1,2,1,1},{1,3,3,3,3,3,2,2,1,0},{1,1,1,1,1,1,1,1,1,0}};
int [][] ditu8={{0,0,0,1,1,1,1,1,1,0},{0,1,1,1,2,2,2,2,1,0},{1,1,3,2,4,1,1,2,1,1},{1,3,3,4,2,4,2,2,5,1},{1,3,3,2,4,2,4,2,1,1},{1,1,1,1,1,1,2,2,1,0},{0,0,0,0,0,1,1,1,1,0}};
int [][] ditu9={{0,1,1,1,1,1,1,1,1,1,0},{0,1,2,2,1,1,2,2,2,1,0},{0,1,2,2,2,4,2,2,2,1,0},{0,1,4,2,1,1,1,2,4,1,0},{0,1,2,1,3,3,3,1,2,1,0},{1,1,2,1,3,3,3,1,2,1,1},{1,2,4,2,2,4,2,2,4,2,1},{1,2,2,2,2,2,1,2,5,2,1},{1,1,1,1,1,1,1,1,1,1,1}};
int [][] ditu10={{0,0,1,1,1,1,1,1},{0,0,1,2,2,2,2,1},{1,1,1,4,4,4,2,1},{1,5,2,4,3,3,2,1},{1,2,4,3,3,3,1,1},{1,1,1,1,2,2,1,0},{0,0,0,1,1,1,1,0}};
// 創(chuàng)建一個總地圖
Ditu ditu[]={new Ditu(ditu1),new Ditu(ditu2),new Ditu(ditu3),new Ditu(ditu4),new Ditu(ditu5),new Ditu(ditu6),new Ditu(ditu7),new Ditu(ditu8),new Ditu(ditu9),new Ditu(ditu10)};
// 定義一個當(dāng)前關(guān)卡
int guan=1;
// 定義一個最大關(guān)卡
int maxguan=10;
// 定義一個變量判斷是否通關(guān)
boolean tongguan=false;
// 創(chuàng)建一個推箱子的小人
Point man=new Point(4,4);
// 創(chuàng)建箱子
Point [] box= {new Point(3,3),new Point(3,4),new Point(5,3),new Point(4,5)};
// 創(chuàng)建箱子最終要到達(dá)的位置
Point [] home={new Point(1,4),new Point(3,1),new Point(6,3),new Point(4,6)};
// 創(chuàng)建一個墻壁數(shù)組
Point [] qiangbi= {new Point(2,0),new Point(3,0),new Point(4,0),
new Point(2,1),new Point(4,1),
new Point(2,2),new Point(4,2),new Point(5,2),new Point(6,2),new Point(7,2),
new Point(0,3),new Point(1,3),new Point(2,3),new Point(7,3),
new Point(0,4), new Point(5,4), new Point(6,4), new Point(7,4),
new Point(0,5),new Point(1,5),new Point(2,5),new Point(3,5),new Point(5,5),
new Point(3,6),new Point(5,6),
new Point(3,7),new Point(4,7),new Point(5,7)
};
// 創(chuàng)建一個空地數(shù)組
Point [] kongdi={new Point(3,1),
new Point(3,2),
new Point(3,3),new Point(4,3),new Point(5,3),new Point(6,3),
new Point(1,4),new Point(2,4),new Point(3,4),new Point(4,4),
new Point(4,5),
new Point(4,6)
};
// 設(shè)置圖片
private Image image=null;
Graphics gf=null;
// 設(shè)置計時器
Timer timer=new Timer(500,this);
public void Tian(){
// 加載地圖
jiazaiditu(guan);
//設(shè)置窗口的寬高
this.setSize(width*size ,height*size+title);
// 設(shè)置標(biāo)題
this.setTitle("推箱子");
//設(shè)置窗口能看見
this.setVisible(true);
// 設(shè)置窗口頂點(diǎn)坐標(biāo)的位置
this.setLocation(100,100);
//設(shè)置鍵盤監(jiān)聽事件(也就是當(dāng)鍵盤有什么反應(yīng)都會調(diào)用此函數(shù))
this.addKeyListener(this);
}
public void paint(Graphics g){
// 窗口大小改變后,重新創(chuàng)建緩存圖片
if(window == true) {
window = false;
image=this.createImage(width*size,height*size+title);
this.gf =image.getGraphics();
}
//初始化臨時圖片//解決閃爍問題
if(image==null){
image=this.createImage(width*size,height*size+title);
}
if(this.gf ==null){
this.gf =image.getGraphics();
}
// 擦除背景
gf.setColor(Color.white);
gf.fill3DRect(0,0,width*size,title+height*size,true);
// 繪制網(wǎng)格
gf.setColor(Color.GRAY);
// 畫行(畫橫線)
// for (int i = 0; i <= height; i++) {
// gf.drawLine(0,size*i+title,width*size,size*i+title);
// }
畫列(畫豎線)
// for (int i = 0; i <= width; i++) {
// gf.drawLine(i*size,title,i*size,height*size+title);
// }
// 繪制墻
for (int i = 0; i <qiangbi.length ; i++) {
gf.setColor(Color.pink);
gf.fill3DRect(qiangbi[i].x*size,qiangbi[i].y*size+title,size,size,true);
}
// 繪制箱子最終要到達(dá)的位置
for (int i = 0; i <home.length ; i++) {
gf.setColor(Color.black);
gf.drawOval(home[i].x*size,home[i].y*size+title,size,size);
gf.drawLine(home[i].x*size,home[i].y*size+title,home[i].x*size+size,home[i].y*size+title+size);
}
// 繪制真實(shí)的箱子
for (int i = 0; i <box.length ; i++) {
gf.setColor(Color.ORANGE);
gf.fill3DRect(box[i].x*size,box[i].y*size+title,size,size,true);
if(isguiwei(i)){
gf.setColor(Color.red);
gf.fill3DRect(box[i].x*size,box[i].y*size+title,size,size,true);
}
}
// 繪制推箱子的小人
gf.setColor(Color.green);
gf.fillOval(man.x*size,man.y*size+title,size,size);
// 繪制當(dāng)前關(guān)卡信息
if(iswin()==true&&tongguan==true){
gf.setColor(Color.darkGray);
gf.fill3DRect(0,0,width*size,title,true);
gf.setFont(new Font("華文新魏", 10, 55)); //設(shè)置字體
gf.setColor(Color.white);
gf.drawString("恭喜通關(guān)",width*size/2-110,title/2+40);
}else {
gf.setColor(Color.darkGray);
gf.fill3DRect(0,0,width*size,title,true);
gf.setFont(new Font("華文新魏", 10, 55)); //設(shè)置字體
gf.setColor(Color.white);
gf.drawString("弟"+guan+"關(guān)",width*size/2-82,title/2+40);
}
g.drawImage(image,0,0,null);
}
// 按下鍵盤--控制游戲的開始以及方塊的移動方向
public void keyPressed(KeyEvent e) {
// 獲取從鍵盤輸入的鍵
int key = e.getKeyCode();
// 上
if (key == KeyEvent.VK_UP) {
// y-1是空地
if(iscunzai(kongdi,new Point(man.x,man.y-1))==true){
// y-1是空地,且空地上沒有箱子
if(iscunzai(box,new Point(man.x,man.y-1))==false){
man.y--;
}else{//y-2是一個空地,且沒有箱子
// y-2是一個沒有箱子的空地(這種就是上邊已經(jīng)有了一個箱子,箱子的上邊再沒有箱子且是空地)
if ((iscunzai(kongdi,new Point(man.x,man.y-2))==true)&&(iscunzai(box,new Point(man.x,man.y-2))==false)){
// 這種情況下是人和箱子都向上移動一格
for (int i = 0; i < box.length; i++) {
if(box[i].x==man.x&&box[i].y==man.y-1){
box[i].y--;
break;
}
}
man.y--;
//判斷所有箱子是否歸位
if(iswin()==true){
if(guan<maxguan){//不是最后一關(guān)
guan++;
// 加載新一關(guān)的地圖
jiazaiditu(guan);
}else{//是最后一關(guān)
tongguan=true;
}
}
}
}
}
// 下
}else if (key == KeyEvent.VK_DOWN) {
// y-1是空地
if(iscunzai(kongdi,new Point(man.x,man.y+1))==true){
// y-1是空地,且空地上沒有箱子
if(iscunzai(box,new Point(man.x,man.y+1))==false){
man.y++;
}else{//y-2是一個空地,且沒有箱子
// y-2是一個沒有箱子的空地(這種就是上邊已經(jīng)有了一個箱子,箱子的上邊再沒有箱子且是空地)
if ((iscunzai(kongdi,new Point(man.x,man.y+2))==true)&&(iscunzai(box,new Point(man.x,man.y+2))==false)){
// 這種情況下是人和箱子都向上移動一格
for (int i = 0; i < box.length; i++) {
if(box[i].x==man.x&&box[i].y==man.y+1){
box[i].y++;
break;
}
}
man.y++;
//判斷所有箱子是否歸位
if(iswin()==true){
if(guan<maxguan){
guan++;
// 加載新一關(guān)的地圖
jiazaiditu(guan);
}else{
tongguan=true;
}
}
}
}
}
// 左
}else if(key == KeyEvent.VK_LEFT){
if(iscunzai(kongdi,new Point(man.x-1,man.y))==true){
// y-1是空地,且空地上沒有箱子
if(iscunzai(box,new Point(man.x-1,man.y))==false){
man.x--;
}else{//y-2是一個空地,且沒有箱子
// y-2是一個沒有箱子的空地(這種就是上邊已經(jīng)有了一個箱子,箱子的上邊再沒有箱子且是空地)
if ((iscunzai(kongdi,new Point(man.x-2,man.y))==true)&&(iscunzai(box,new Point(man.x-2,man.y))==false)){
// 這種情況下是人和箱子都向上移動一格
for (int i = 0; i < box.length; i++) {
if(box[i].x==man.x-1&&box[i].y==man.y){
box[i].x--;
break;
}
}
man.x--;
//判斷所有箱子是否歸位
if(iswin()==true){
if(guan<maxguan){
guan++;
// 加載新一關(guān)的地圖
jiazaiditu(guan);
}else{
tongguan=true;
}
}
}
}
}
// 右
}else if (key == KeyEvent.VK_RIGHT) {
if(iscunzai(kongdi,new Point(man.x+1,man.y))==true){
// y-1是空地,且空地上沒有箱子
if(iscunzai(box,new Point(man.x+1,man.y))==false){
man.x++;
}else{//y-2是一個空地,且沒有箱子
// y-2是一個沒有箱子的空地(這種就是上邊已經(jīng)有了一個箱子,箱子的上邊再沒有箱子且是空地)
if ((iscunzai(kongdi,new Point(man.x+2,man.y))==true)&&(iscunzai(box,new Point(man.x+2,man.y))==false)){
// 這種情況下是人和箱子都向上移動一格
for (int i = 0; i < box.length; i++) {
if(box[i].x==man.x+1&&box[i].y==man.y){
box[i].x++;
break;
}
}
man.x++;
//判斷所有箱子是否歸位
if(iswin()==true){
if(guan<maxguan){
guan++;
// 加載新一關(guān)的地圖
jiazaiditu(guan);
}else{
tongguan=true;
}
}
}
}
}
}
// 點(diǎn)擊空格鍵重玩當(dāng)前關(guān)卡
if(key == KeyEvent.VK_SPACE) {//空格鍵
// 重置當(dāng)前關(guān)卡
jiazaiditu(guan);
}
repaint();
}
public void keyReleased(KeyEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
// 判斷某個數(shù)組中是否存在某個點(diǎn)
// 判斷point這個點(diǎn)是否在points這個數(shù)組中
public boolean iscunzai(Point [] points,Point point){
for (int i = 0; i < points.length; i++) {
if(points[i].x==point.x&&points[i].y==point.y){
return true;
}
}
return false;
}
// 加載地圖
public void jiazaiditu(int index){
// 清空當(dāng)前數(shù)據(jù)
//
ArrayList<Point> boxlist = new ArrayList<Point>();
ArrayList<Point> homelist = new ArrayList<Point>();
ArrayList<Point> qiangbilist = new ArrayList<Point>();
ArrayList<Point> kongdilist = new ArrayList<Point>();
Ditu d = ditu[index-1];
for(int i= 0;i<d.ditu.length;i++)
{
for(int j=0;j<d.ditu[i].length;j++)
{
// 1是墻壁
if(d.ditu[i][j] == 1){
qiangbilist.add(new Point(j,i));
}
// 2是空地
else if(d.ditu[i][j] == 2){
kongdilist.add(new Point(j,i));
}
// 3是黑店
else if(d.ditu[i][j] == 3){
homelist.add(new Point(j,i));
kongdilist.add(new Point(j,i));
}
// 4箱子
else if(d.ditu[i][j] == 4){
boxlist.add(new Point(j,i));
kongdilist.add(new Point(j,i));
}
// 5人
else if(d.ditu[i][j] == 5){
man.x = j;
man.y = i;
kongdilist.add(new Point(j,i));
}
// 6(箱子在黑點(diǎn)上)
else if(d.ditu[i][j] ==6){
boxlist.add(new Point(j,i));
kongdilist.add(new Point(j,i));
homelist.add(new Point(j,i));
}
// 7(人在黑點(diǎn)上)
else if(d.ditu[i][j] == 7){
man.x = j;
man.y = i;
kongdilist.add(new Point(j,i));
homelist.add(new Point(j,i));
}
}
}
int i=0;
qiangbi = new Point[qiangbilist.size()];
for (Point p:qiangbilist){
qiangbi[i] = new Point(p.x,p.y);
i++;
}
i=0;
kongdi = new Point[kongdilist.size()];
for (Point p:kongdilist){
kongdi[i]=new Point(p.x,p.y);
i++;
}
i=0;
box = new Point[boxlist.size()];
for (Point p:boxlist){
box[i]=new Point(p.x,p.y);
i++;
}
i=0;
home = new Point[homelist.size()];
for (Point p:homelist){
home[i]=new Point(p.x,p.y);
i++;
}
height=d.ditu.length;
width=d.ditu[0].length;
this.setSize(width*size,height*size+title);
window=true;
}
// 判斷單個方塊是否歸位//用于改變顏色
public boolean isguiwei(int i){
for (int i1 = 0; i1 < home.length; i1++) {
if(box[i].x==home[i1].x&&box[i].y==home[i1].y){
return true;
}
}
return false;
}
public void actionPerformed(ActionEvent e) {
}
public void keyTyped(KeyEvent e) {
}
// 判斷游戲是否勝利(判斷方塊是否全部歸位)
public boolean iswin(){
int j=0;
for (int i = 0; i < box.length; i++) {
for (int i1 = 0; i1 < home.length; i1++) {
if(box[i].x==home[i1].x&&box[i].y==home[i1].y){
j++;
if(j==home.length){
return true;
}
}
}
}
return false;
}
public static void main(String[] args) {
Pushbox005 pushbox=new Pushbox005();
pushbox.Tian();
}
}
到了這里,關(guān)于java版本實(shí)現(xiàn)推箱子小游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!