跳过正文
  1. Ps/

小游戏 箱子大战java版源代码

·2898 字·6 分钟· loading · loading · ·

写于2011年7月,一直在草稿箱里:

实习的时候无聊,把高三那年在文曲星上用类c的LavaX写的小游戏用java重写了,写了2天,第一天思路错了,监听器怎么都搞不定,方向控制也偷懒想要取巧,结果搞得自己都混乱了,各种bug无从下手。于是第二天全部删掉重写,一天下来总算是能运行了,虽然bug一大堆!然后又用了一天时间测试和bug fix,一休息就拉企鹅过来试玩,期间各种棍子乱飞,箱子乱飞,改代码改了一上午,终于是能玩完一局不出错了,感觉上和高三那年写的一样一样啊,下午又小修修补补的,已知的bug全部搞定,又加了些新功能,玩起来已经非常欢乐了。。。
游戏说明:
由于是简单的使用线程睡眠来控制速度的,所以不同电脑速度表现差别会很大,速度不合理的可以修改 SPEED 的值。
二人游戏,通过Ctrl和Enter键推动上下移动的推杆,推动中间的箱子掉下去砸碎对方的蛋。。。

游戏过程中会出现随机物品,捡到会发现以下事件:(这个是高三那年写的LavaX版没有的哦)
1.所有箱子移动一次
2.对方的杆子变粗
3.自己的杆子变成最细
4.自己的速度加快
5.在对方区域出现障碍物
另外中间有两个区域,碰到可以使对方变大或者自己变小。
转载或者再次编译请保留作者信息就行了。
多指教!

/**** 代码开始  ****/
/****作者:小乜 ****/
/****2011.7.8 ****/
/*转载或二次编译请保留作者信息!*/

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.*;

public class BoxFight {
	public static void main(String[] args){
		JFrame f=new JFrame("箱子大战--BoxFight!  V1.0--小乜作品");
		f.setSize(400,400);
		f.setLocation(100,100);
		f.setResizable(false);
		MyPanel mp=new MyPanel();
		f.add(mp);
		//创建进程
		Thread t=new Thread(mp);
		f.addKeyListener(mp);
		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
		mp.addKeyListener(mp);
		f.show();
		JOptionPane.showMessageDialog(f,"游戏说明:\n二人游戏,使用Ctrl键(1P)和小键盘Enter键(2P)操作\n把中间红色的箱子推到对手一边掉下即获胜\n游戏随机出现的超级物品可获得极大的帮助\n碰到变大区域可将对手推杆变大\n碰到变小区域可将自己的推杆缩小");
		t.start();
		
	}

}

class MyPanel extends Panel implements Runnable,KeyListener{
	
	public static final int PUSHHEIGHT=5;  //推杆的初始厚度
	public static final int PUSHWEIGHT=40; //推杆的初始宽度
	public static final int BOXX=30;//箱子高
	public static final int BOXY=40;//箱子宽
	public static final int SPEED=5;//游戏延时 单位毫秒  
	public static final int ITEMCOUNT=800;//物品出现间隔 单位为移动的像素点
	public static final int ITEM=15;//物品长宽
	int right_x=0,right_y=2,left_x=2,left_y=2;//左右推杆的坐标
	int right_w=PUSHHEIGHT,left_w=PUSHHEIGHT;//推杆厚度
	boolean justpushL=false,justpushR=false;//刚推完一次,为true时不允许再推
	boolean rightgo=true,leftgo=true;//推杆是否上下移动
	boolean rightpush=false,leftpush=false;//推杆是否左右移动
	boolean isrightpush=false,isleftpush=false;//推杆是否正在移动
	boolean rightUD=true,leftUD=true;//左右推杆的上下  true为下 false为上
	boolean rightLR=true,leftLR=true;//左右推杆的左右  true为推 false为返回
	boolean isitem=false;//是否出现物品
	int[] box_x={180,180,180};//箱子坐标
	int[] box_y={0,0,0};
	int[] boxlevel={120,140,160,180,200,220,240};//箱子移动边界
	int[] boxnow={3,3,3};//箱子当前位置
	int itemR=-ITEM,itemL=-ITEM;//物品纵坐标
	int itemcount=0;//物品出现时机计数
	int isWin;
	boolean[] ismove={false,false,false};//箱子是否移动
	boolean[] moveright={false,false,false};//箱子被右边推
	boolean[] moveleft={false,false,false};//箱子被左边推
	int whowin=-150,wholose=-150;//谁赢了,也作为画胜利文字的横坐标
	int movestepR=1,movestepL=1;//上下移动步长
	boolean movestopR=false,movestopL=false;//左右障碍
	int stopcount=0;//障碍出现时长计数

	//判断输赢 返回被退下的箱子编号 否则返回-1
	public int isWin(){
		for(int i=0;i<=2;i++){
			if(box_x[i]<=120||box_x[i]>=240){
				return i;
			}
		}
		return -1;
	}
	
	
	//延时函数
//	public void Delay(int t){
//		for(long i=0;i<t*10;i++){
//			for(long j=0;j<t;j++);
//		}
//	}
	
	public void paint(Graphics g){
		
		//画背景
		g.setColor(Color.black);
		g.fillRect(160, 0, 80, 70);
		g.fillRect(160, 100, 80, 60);
		g.fillRect(160, 190, 80, 60);
		g.fillRect(160, 280, 80, 90);
		//画变大变小区域
		g.setColor(Color.yellow);
		g.fillRect(160, 20, 80, 20);
		g.setColor(Color.gray);
		g.fillRect(160, 300, 80, 20);
		g.setColor(Color.black);
		g.drawString("变大", 190, 35);
		g.drawString("变小", 190, 315);
		//画推杆
		g.setColor(Color.green);
		g.fillRect(left_x, left_y, PUSHWEIGHT, left_w);
		g.setColor(Color.blue);
		g.fillRect(350+right_x,right_y, PUSHWEIGHT, right_w);
		//画蛋
		g.setColor(Color.red);
		g.fillOval(140, 340, 20, 30);
		g.fillOval(239, 340, 20, 30);
		g.setColor(Color.yellow);
		g.drawString("蛋", 145, 360);
		g.drawString("蛋", 243,360);
		//画箱子
		g.setColor(Color.red);
		g.fillRect(box_x[0],70+box_y[0],BOXY,BOXX);
		g.fillRect(box_x[1],160+box_y[1],BOXY,BOXX);
		g.fillRect(box_x[2],250+box_y[2],BOXY,BOXX);
		//画物品
		if(isitem){
			g.setColor(Color.cyan);
			g.fillRect(140-ITEM,itemL,ITEM,ITEM);
			g.fillRect(260,itemR,ITEM,ITEM);
		}
		//画障碍
		g.setColor(Color.black);
		if(movestopR){
			g.fillRect(100,0,5,350);
		}
		if(movestopL){
			g.fillRect(300,0,5,350);
		}
		//画胜利提示
		if(isWin!=-1){
			g.setColor(Color.red);
			g.fillRect(whowin,150,80,20);
			g.setColor(Color.yellow);
			g.drawString("恭喜,你赢了!!", whowin, 165);
			g.setColor(Color.black);
			g.fillRect(wholose,150,80,20);
			g.setColor(Color.white);
			g.drawString("恭喜,你蛋碎了!", wholose, 165);
		}

	}
	
	//从右向左移动第i个箱子
	public void MoveRight(int i){
		rightLR=false;
		ismove[i]=true;
		moveright[i]=true;
		moveleft[i]=false;
		boxnow[i]--;
		justpushR=true;
		
	}
//	从左向右移动第i个箱子
	public void MoveLeft(int i){
		leftLR=false;
		ismove[i]=true;
		moveleft[i]=true;
		moveright[i]=false;
		boxnow[i]++;
		justpushL=true;
		
	}
	
	//随机获得物品 参数-1为左边 1为右边
	public void getitem(int lr){
		Random r=new Random();
		int itemnum=r.nextInt(6);
		//itemnum=4;
		if(itemnum==0){ //所有箱子移动
			if(lr==-1){
				for(int i=0;i<=2;i++){
					if(boxnow[i]<5){
						MoveLeft(i);
					}
				}
				isleftpush=true;			
			}
			else if(lr==1){
				for(int i=0;i<=2;i++){
					if(boxnow[i]>1){
						MoveRight(i);
					}
				}
				isrightpush=true;
			}		
		}else if(itemnum==1){//对方变大
			if(lr==-1){
				right_w+=30;
			}else if(lr==1){
				left_w+=30;
			}
		}else if(itemnum==2){//自己变小为1
			if(lr==1){
				right_w=1;
			}else if(lr==-1){
				left_w=1;
			}
		}else if(itemnum==3){//自己速度变快
			if(lr==-1){
				movestepL=3;
			}else if(lr==1){
				movestepR=3;
			}
		}else if(itemnum>=4){//对方出现障碍
			if(lr==1){
				movestopR=true;
			}else if(lr==-1){
				movestopL=true;
			}
		}

		
	}
	
	public void run(){
		while(true){
			//碰到箱子的移动边界
			for(int i=0;i<=2;i++){
			    //右边推箱子
				if(!justpushR&&right_x+350==box_x[i]+BOXY&&right_y>=70+i*90-right_w&&right_y<=70+i*90+BOXX){
					MoveRight(i);
				}
			}
			
			for(int i=0;i<=2;i++){
			    //左边推箱子
				if(!justpushL&&left_x+PUSHWEIGHT==box_x[i]&&left_y>=70+i*90-left_w&&left_y<=70+i*90+BOXX){
					MoveLeft(i);
				}
			}
			
			//碰到物品判断
			//左
			if(left_x+PUSHWEIGHT>=140-ITEM&&left_y<=itemR+ITEM&&left_y+PUSHWEIGHT>=itemR){
				isitem=false;
				itemcount=0;
				itemR=-ITEM;
				itemL=-ITEM;
				leftLR=false;
				getitem(-1);
			}
			//右
			if(right_x<=-90&&right_y<=itemL+ITEM&&right_y+PUSHWEIGHT>=itemL){
				isitem=false;
				itemcount=0;
				itemR=-ITEM;
				itemL=-ITEM;
				rightLR=false;
				getitem(1);
			}
			
			//推杆移动边界
			//上下
			if(right_y>=320-right_w){
				rightUD=false;
			}
			if(right_y<=1){
				rightUD=true;
			}
			if(left_y>=320-left_w){
				leftUD=false;
			}
			if(left_y<=1){
				leftUD=true;
			}
			//左右
			if(right_x==-112&&((right_y>0&&right_y<=70)||(right_y>100-right_w&&right_y<=160)||(right_y>190-right_w&&right_y<=250)||(right_y>280-right_w&&right_y<=370))){
				rightLR=false;
				if(right_y>=20-right_w&&right_y<=40)left_w+=10;
				if(right_y>=300-right_w&&right_y<=320)right_w-=10;
				if(right_w<=0)right_w=1;
			}
			if(left_x==159-PUSHWEIGHT&&((left_y>0&&left_y<=70)||(left_y>100-left_w&&left_y<=160)||(left_y>190-left_w&&left_y<=250)||(left_y>280-left_w&&left_y<=370))){
				leftLR=false;
				if(left_y>=20-left_w&&left_y<=40)right_w+=10;
				if(left_y>=300-left_w&&left_y<=320)left_w-=10;
				if(left_w<=0)left_w=1;
				
			}
			//障碍判断
			if(movestopR){
				if(left_x==100-PUSHWEIGHT)leftLR=false;
			}
			if(movestopL){
				if(right_x==-50)rightLR=false;
			}//障碍结束
			
			if(right_x==1){
				rightpush=false;
				rightgo=true;
				right_x=0;
				rightLR=true;
				isrightpush=false;
				justpushR=false;
			}
			if(left_x==1){
				leftpush=false;
				leftgo=true;
				left_x=2;
				leftLR=true;
				isleftpush=false;
				justpushL=false;
			}
			
			
		isWin=isWin();
		if(isWin==-1){
		//推杆移动
			//右推杆上下移动
			if(rightgo){
				if(rightUD){
					right_y+=movestepR;
				}else{
					right_y-=movestepR;
				}
			}
			//左推杆上下移动
			if(leftgo){
				if(leftUD){
					left_y+=movestepL;
				}else{
					left_y-=movestepL;
				}
			}
		    //右推杆左右移动
			if(rightpush){
				if(rightLR){
					right_x--;
				}else{
					right_x++;
				}
			}
			//左推杆左右移动
			if(leftpush){
				if(leftLR){
					left_x++;
				}else{
					left_x--;
				}
			}
			//障碍计数
			if(movestopR||movestopL){
				stopcount++;
				if(stopcount==500){
					stopcount=0;
					movestopR=false;
					movestopL=false;
				}
			}

			
//			物品出现控制
			itemcount++;
			if(itemcount==ITEMCOUNT){
				itemcount=0;
				isitem=true;				
				movestepR=1;//将移动步长恢复为1
				movestepL=1;
			}
			
			if(isitem){
				itemR++;
				itemL++;
				if(itemR==400){
					itemR=-ITEM;
					isitem=false;
				}
				if(itemL==400){
					itemL=-ITEM;
					isitem=false;
				}
			}
		}else{
			box_y[isWin]+=5;
			if(box_y[isWin]>=350-(isWin*90+70)-30){
				whowin=boxnow[isWin]==0?280:40;
				wholose=boxnow[isWin]==0?40:280;
				//JOptionPane.showMessageDialog(this,isWin==6?"右边":"左边"+"的家伙赢了!");
				//break;
				box_y[isWin]=350-(isWin*90+70)-10;
			}
		}
        //箱子移动
			for(int i=0;i<=2;i++){
				if(ismove[i]){
					if(moveright[i]){
						box_x[i]--;
					}
					if(moveleft[i]){
						box_x[i]++;
					}
					
					if(box_x[i]==boxlevel[boxnow[i]])ismove[i]=false;
				}
				
			}
									
			//推杆超出范围的重置 迫不得已这样的
			if(left_x==401-PUSHWEIGHT)left_x=-PUSHWEIGHT;
			if(right_x==-405)right_x=0;
			repaint();
			//线程睡眠 改变速度
			try{
				Thread.sleep(SPEED);//毫秒居然也延迟那么久  纠结
			}catch(InterruptedException e){
				
				e.printStackTrace();
			}
			//Delay(SPEED);
		}
		
		
	}
	
	//按键响应
	public void keyPressed(KeyEvent e) {
		//Enter键 右推杆
		if((e.getKeyCode()==10)&&!isrightpush){		
			rightpush=true;		
			rightgo=false;
			isrightpush=true;
		}
		//Ctrl键 左推杆
		else if((e.getKeyCode()==17)&&!isleftpush){
			leftpush=true;
			leftgo=false;
			isleftpush=true;
		}		
		//System.out.print(e.getKeyCode());
	}

	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub		
	}

	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
	}	
}


/**** 代码结束  ****/
/****作者:小乜 ****/
/****2011.7.8 ****/
/*转载或二次编译请保留作者信息!*/
小乜
作者
小乜
这里是我的数字分身。