写于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 ****/
/*转载或二次编译请保留作者信息!*/