这是很多年前写的,坦克大战,对理解java有很好的帮助,尤其是多线程。每一个线程都是一个生命,包括坦克的出生到被打死,还有炮弹的。源码在后面有公布。
这个是个单机版游戏,可以进行存档,记录分数等基本功能。
初始化界面
游戏进行中
粉色坦克是敌军坦克,黄色坦克是自己,每打掉一个坦克分数会加1,打完所有敌军坦克后进入下一局,打更多的坦克。
按下键盘上W S A D键分别表示上下左右运动键,K键表示发射炮弹。
话说我为了截这个坦克被打掉的图费了老大的力气。
打掉敌军4个坦克
代码太多,这里只贴部分代码了,后面会附上所有源码。
@Override
public void paint(Graphics g) {
if(b){
super.paint(g);
g.fillRect(0, 0, 600, 600);
//敌人坦克剩余数
this.tankDraw(630, 40, g, 3, 2);
//自己坦克剩余数
this.tankDraw(630, 100, g, mytank.gettankType(), 2);
//分数
Font scoreFont=new Font(null,Font.BOLD,18);
g.setColor(Color.BLACK);
g.drawString("分数:", 610, 160);
g.drawString(new Integer(scoreCount).toString(), 640, 160);
//画自己坦克
if(mytank.isLive){
this.tankDraw(mytank.getTankx(), mytank.getTanky(), g, mytank.gettankType(), mytank.getTankdirect());
}
//画敌人坦克
for(int i=0;i<eneVc.size();i++){
Enemy nowEnemy=eneVc.get(i);
if(nowEnemy.isLive){
this.tankDraw(nowEnemy.getTankx(), nowEnemy.getTanky(), g, nowEnemy.gettankType(), nowEnemy.getTankdirect());
}
if(!nowEnemy.isLive){
eneVc.removeElement(nowEnemy);
}
}
//画敌人坦克炮弹
for(int i=0;i<allShell.size();i++){
Shell noweneshell=allShell.get(i);
if(noweneshell!=null&&noweneshell.isLive){
g.draw3DRect(noweneshell.getSx(), noweneshell.getSy(), 2, 2, false);
}else{
allShell.remove(noweneshell);
}
}
//画我坦克的炮弹
for(int i=0;i<mytank.vecShell.size();i++){
Shell myShell=mytank.vecShell.get(i);
if(myShell!=null&&myShell.isLive){//炮弹重发射到毁灭过程画炮弹
g.setColor(Color.YELLOW);
g.draw3DRect(myShell.getSx(), myShell.getSy(), 1, 1, false);
}
if(!myShell.isLive){
mytank.vecShell.removeElement(myShell);
}
}
//画被击中爆炸效果
for(int i=0;i<bombVc.size();i++){
Bomb nowb=bombVc.get(i);
if(nowb.isLive){
if(nowb.life>6){
g.drawImage(bomb1,nowb.bx,nowb.by, 50, 50, this);
}else if(nowb.life>3){
g.drawImage(bomb2,nowb.bx,nowb.by, 50, 50, this);
}else{
g.drawImage(bomb3,nowb.bx,nowb.by, 50, 50, this);
}
}
nowb.lifeDown();
if(!nowb.isLive){
bombVc.removeElement(nowb);
}
}
}
else{//游戏结束
g.setColor(Color.CYAN);
Font tankFont=new Font(null, Font.BOLD, 50);
g.setFont(tankFont);
g.drawString("游戏结束", 200, 200);
}
}
//画坦克
public void tankDraw(int x,int y,Graphics g, int tankType,int tankdirect){
int tt=tankType;
switch (tt) {
case 0:
g.setColor(Color.YELLOW);
break;
case 1:
g.setColor(Color.ORANGE);
break;
case 2:
g.setColor(Color.CYAN);
break;
case 3:
g.setColor(Color.PINK);
break;
default:
g.setColor(Color.WHITE);
break;
}
//根据炮筒端点为坐标确定坦克位置
if(tankdirect==0){//0向右
g.fill3DRect(x-12, y-8, 24, 16, false);
g.drawLine(x, y, x+20, y);
g.fillOval(x-5, y-5, 10, 10);
g.fill3DRect(x-20, y-16, 40, 10, false);
g.fill3DRect(x-20, y+8, 40, 10, false);
}else if(tankdirect==1){//1向左
g.fill3DRect(x-12, y-8, 24, 16, false);
g.drawLine(x, y, x-20, y);
g.fillOval(x-5, y-5, 10, 10);
g.fill3DRect(x-20, y-16, 40, 10, false);
g.fill3DRect(x-20, y+8, 40, 10, false);
}else if(tankdirect==2){//2向上
g.fill3DRect(x-8, y-12, 16, 24, false);
g.drawLine(x, y, x, y-20);
g.fillOval(x-5, y-5, 10, 10);
g.fill3DRect(x+8, y-20, 10, 40, false);
g.fill3DRect(x-18, y-20, 10, 40, false);
}else if(tankdirect==3){//3向下
g.fill3DRect(x-8, y-12, 16, 24, false);
g.drawLine(x, y, x, y+20);
g.fillOval(x-5, y-5, 10, 10);
g.fill3DRect(x+8, y-20, 10, 40, false);
g.fill3DRect(x-18, y-20, 10, 40, false);
}
}
我用的java版本1.8
源码下载,请赏点积分
https://download.csdn.net/download/lb87626/12403337
或者加我v: lb87626 单独发你哈