day7 主线游戏设置
package game;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class gamepanel extends JPanel implements KeyListener{
Map map;
int mp[][]=new int [25][25];//当前地图
int temp[][]=new int[25][25];//保存最初的地图样式
int pre[][]=new int [25][25];//上一步地图样式
int num,pnum;//num,pnum记录当前到达目的地的箱子数量和上一步到达目的地的箱子数量
int total;//记录该地图总箱子数目
int posX,posY,pposX,pposY;//记录人物位置
int op;//当前的选择
int tot=0;//记录通过关卡数
long startTime = System.currentTimeMillis();//获取当前时间
JFrame j;
public void create(int op){
map = new Map(op);
num=0;
posX=Checkpoint.getx(op);
posY=Checkpoint.gety(op);
total=Checkpoint.getnum(op);
for(int i=0;i<map.map.length;i++)
mp[i]=map.map[i].clone();
for(int i=0;i<mp.length;i++) {
temp[i]=mp[i].clone();
map.getMap(mp);
}
}
public gamepanel(int op,JFrame j){
create(op);
this.op=op;
this.j=j;
}
public void paint(Graphics g){
map.draw(g);
}
public int getTot() {
return tot;
}
@Override
public void keyPressed(KeyEvent e) {//0是空地,1是箱子,2是墙,3是到达地点的箱子,4是目的地,5是人
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
for(int i=0;i<mp.length;i++)
mp[i]=temp[i].clone();
//新建一个窗口,用于输入个人id,以便连接数据库记录排行榜,记录了运行的时间
int time=(int) ((System.currentTimeMillis()-startTime)/1000);
j.dispose();
InputId id=new InputId(tot,time);//输入游戏玩家的信息
}
char ch=e.getKeyChar();
//JOptionPane.showMessageDialog(null, "你按了"+ch);
if(ch=='r'||ch=='R') {
//返回上一步
for(int i=0;i<mp.length;i++)mp[i]=pre[i].clone();
num=pnum;
posX=pposX;
posY=pposY;
}
else {
for(int i=0;i<mp.length;i++)pre[i]=mp[i].clone();
pnum=num;
pposX=posX;
pposY=posY;
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++;
}
}
}
map.getMap(mp);
this.repaint();
if(num==total) {
JOptionPane.showMessageDialog(null,"恭喜恭喜 成功啦!!!");
for(int i=0;i<mp.length;i++)
mp[i]=temp[i].clone();
this.tot++;
//还需要判断是否全部通关,然后存入数据库
this.removeAll();
this.repaint();
create(++op);
this.revalidate();
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
号外
游戏数据存入数据库时一定要做完整循环 即各个地图都要判断一次只记录游戏的最高关卡以及游戏的最长时间