監(jiān)控鍵盤事件,監(jiān)控方向鍵,然后根據(jù)方向鍵判斷角色的對應(yīng)方向是否有箱子,有箱子,在判斷箱子的前方是否有路;沒有箱子就角色移動到那個位置。
站在用戶的角度思考問題,與客戶深入溝通,找到江源網(wǎng)站設(shè)計與江源網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋江源地區(qū)。
假設(shè)有個方法判斷坐標(biāo)是箱子還是空地或者越界check(int x,int y)通過返回類型判斷,返回類型可以自己定義,這里定義成int類型,0代表箱子,1代表空地,2代表越界
if(check(X+1,y)==0){
if(check(x+2,y)==1){
//箱子往右移動一格,同時角色也往右移動一個
}else if(check(x+2,y)==2){
//箱子推不動,角色也不動,箱子到了墻角,給出提示或者保持角色和箱子原地不動、
}
}
if(check(x+1,y)==1){
//角色往右移動,箱子不動
}
同理等于2的時候,角色原地不動。。。
這只是簡單的做了判斷,具體的實(shí)現(xiàn)看你自己了,可以把人和箱子分開判斷。。總之把思路分析清楚就OK
我有java的,你可以看看:一個拼圖
import java.lang.Math.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
class MainFrame extends JFrame implements ActionListener{ //定義整個框架
private JButton[] jb = new JButton[8];
private JButton jbs = new JButton("開 局");
private JButton jbres = new JButton("重新開始");
private JPanel jp1 = new JPanel();
private JPanel jp2 = new JPanel();
private int[] n = new int[9];
private int[] n1 = new int[9];
private int position = 8,p,q;
private boolean bl,startbl=false;
private JLabel jl = new JLabel();
private int count = 0;
private JLabel jl1 = new JLabel(" "+Integer.toString(0));
public MainFrame(){ //框架的構(gòu)造方法
int i;
for(int j = 0; j n.length; j++){
n[j] = j;
n1[j] = n[j];
}
for(i = 0; i jb.length; i++){ //給每個按鈕賦相應(yīng)的值,并注監(jiān)聽器
jb[i] = new JButton(Integer.toString(i+1));
jb[i].setFont(new Font("宋體",Font.BOLD,48));
jp2.add(jb[i]);
jb[i].addActionListener(this);
}
for(i = 0; i n.length; i++){
if(n[i] == position)
jp2.add(jl);
else
jp2.add(jb[n[i]]);
}
jp2.setLayout(new GridLayout(3,3));//注冊監(jiān)聽器
jbs.addActionListener(this);
jbres.addActionListener(this);
jp1.add(jbs);
jp1.add(jbres);
jp1.add(jl1);
jp1.setLayout(new FlowLayout()); //將jp1設(shè)置為流布局
setLayout(new BorderLayout()); //整體布局為邊界布局
this.add("North",jp1);
this.add("Center",jp2);
this.setTitle("拼圖游戲");
this.setBounds(100,100,300,350);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //實(shí)現(xiàn)關(guān)閉按鈕
this.setResizable(false);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){ //實(shí)現(xiàn)按鈕的事件
if(e.getSource()==jbres){ // 重新開始按鈕事件
for(int j = 0; jn.length;j++)
n[j] = n1[j];
reShow();
startbl=true;
count = 0;
jl1.setText(" "+Integer.toString(0));
}
else if(e.getSource()==jbs) //開局按鈕事件
this.Init();
else if(startbl){ //按鈕1-8移動事件
for(int i = 0; i jb.length; i++)
if(e.getSource() == jb[i]){
//System.out.println(i+1);
for(int a=0;an.length;a++){
if(n[a]==i)
p=a;
if(n[a]==position)
q=a;
}
}
if(p != 0 p != 1 p != 2)
if((p-3) == q)
swap(p,q);
if(p != 0 p != 3 p != 6)
if((p-1) == q)
swap(p,q);
if(p != 2 p != 5 p != 8)
if((p+1) == q)
swap(p,q);
if(p != 6 p != 7 p != 8)
if((p+3) == q)
swap(p,q);
}
}
public void swap(int x,int y){ //按鈕1-8與空白圖片交換
int z;
z = n[x];
n[x] = n[y];
n[y]=z;
jl1.setText(" "+Integer.toString(++count));
reShow();
win();
}
public void Init(){ //隨機(jī)產(chǎn)生游戲界面
int i=0,j,x;
boolean bl ;
while(i9){
bl = true;
x=(int)(Math.random()*9);
for(j=0;ji;j++)
if(n[j] == x)
bl=false;
if(bl){
n [i++] = x;
n1[i-1] = x;
}
}
reShow();
startbl=true;
count = 0;
jl1.setText(" "+Integer.toString(0));
}
public void reShow(){ //對游戲界面的重寫
for(int i = 0; i n.length; i++){
if(n[i] == position)
jp2.add(jl);
else
jp2.add(jb[n[i]]);
}
jp2.revalidate();
}
public void win(){ //判斷是否成功
boolean winbl=true;
for(int i=0;in.length;i++)
if(n[i]!=i)
winbl=false;
if(winbl){
JOptionPane.showMessageDialog(this,"祝賀你,你成功了! "+"你用了"+Integer.toString(count)+"步","",JOptionPane.INFORMATION_MESSAGE);
startbl=false;
}
}
}
public class Collage { // 主函數(shù)類
public static void main(String[] args){
new MainFrame();
}
}
自已以前編的,不是很好,你就參考參考吧
這個十分容易,我說下基本的就是了,你是一個5*5的黑點(diǎn),箱子是5*5的白點(diǎn),所有的箱子的坐標(biāo)在一個arraylist里,每次你按方向是,判斷你的位置先,如果是邊就不動,如果不是邊,就判斷有沒有箱子,如果有箱子再判斷后面,用while就行了,記得你把可能會移動的東西記下到另外的arraylist,如果可以動,就把另外的arraylist的元素的坐標(biāo)適應(yīng)加5,然后重畫下
推箱子小游戲代碼,包含音樂,換圖功能,同時可以進(jìn)行鼠標(biāo)或鍵盤操作-Sokoban game code, including music, for map features, at the same time can be a mouse or keyboard operation
[MoveNut.rar] - 推箱子游戲,無密碼可解壓。 經(jīng)典游戲一個,歡迎大家下載。
[tftp_server_linux.rar] - linux下的tftp源代碼,比較經(jīng)典的一個,好東西大家分享
[ProxyService.rar] - 用socket做的代理程序,對于外網(wǎng)連內(nèi)網(wǎng)很有用
[tuixz.rar] - 這個程序基本實(shí)現(xiàn)了推箱子的所有功能,加入了背景音樂,有5首背景音樂可供 選擇,并可以跳關(guān)、選關(guān)等,并且可以無限悔步,一直悔到當(dāng)前關(guān)卡的開始狀態(tài)。
[mine60.rar] - Java推箱子游戲(一共有50關(guān)卡,帶好聽的音效),完整版源碼,圖形界面,看上去夠?qū)I(yè)。界面和泡泡堂游戲有點(diǎn)相似,學(xué)習(xí)游戲編程的JAVA朋友值得一看。
1. 確定的功能:讓玩家通過按上下左右鍵推箱子,當(dāng)箱子們都推到了目的地后出現(xiàn)過關(guān)信息,并顯示下一關(guān)。推錯了玩家還按空格鍵從新玩過這關(guān)。直到過完全部關(guān)卡。
2. 定義的核心數(shù)據(jù)結(jié)構(gòu):我們定義一個二維數(shù)組ghouse來記錄屏幕上各點(diǎn)的狀態(tài)。char ghouse[20][20]; 其中:0表示什么都沒有,'b'表示箱子,'w'表示墻壁,'m'表示目的地,'i'表示箱子在目的地。
3. 對整個進(jìn)行功能模塊劃分。
(1)。初始化:在屏幕上輸出歡迎信息,把ghouse數(shù)組的元素初始化為0。并根據(jù)各關(guān)的要求在屏幕上輸出墻、箱子、目的地和人。并用ghouse 數(shù)組記錄各點(diǎn)的狀態(tài)。
(2)。進(jìn)入游戲循環(huán):這個游戲主循環(huán)是等待按鍵。當(dāng)接受到上下左右鍵時執(zhí)行相關(guān)操作:接受ESC鍵時退出游戲;接受空格鍵時返回本關(guān)開頭;接受無效按鍵時做忽略處理。重點(diǎn)介紹按上下左右鍵時如何執(zhí)行相關(guān)操作。
(3)。判斷是否過關(guān):用一個鏈表win由每關(guān)的初始化函數(shù)傳給main函數(shù)。Win鏈表主要記錄屏幕上的哪些點(diǎn)是目的地,并記錄目的地的位置。Main函數(shù)每執(zhí)行一次操作后就判斷屏幕上的目的地是不是都有箱子了。