Java练习坦克大战30线程.docx
- 文档编号:10304727
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:19
- 大小:67.88KB
Java练习坦克大战30线程.docx
《Java练习坦克大战30线程.docx》由会员分享,可在线阅读,更多相关《Java练习坦克大战30线程.docx(19页珍藏版)》请在冰豆网上搜索。
Java练习坦克大战30线程
Java练习_坦克大战3.0
结构:
类:
属性:
Hero我的坦克
Ets敌人坦克数组
Ensize敌人坦克数
方法:
构造敌我坦克
Paint(画坦克、画子弹)
画出敌我坦克
run
repaint
监听按键控制方向、移动、发射子弹
属性:
速度
坐标
方向
颜色
方法:
构造方法设置坐标
设置坐标
设置颜色
设置方向
继承tank
属性:
子弹
方法:
发射子弹
上下左右移动
属性:
坐标
方向
速度
生存与否
方法
构造方法坐标、方向、速度
Run根据方向移动子弹、判断子弹是否死亡
属性:
面板
方法:
构造方法
启动面板加入线程并启动
面板加入窗口
面板作为监听者监听消息源窗口的事件
设置窗口相关项
代码:
/**
*java练习_坦克大战3.0
*有敌我坦克,我方坦克可以移动,可以发射炮弹
*引入多线程
*
*/
packageTankGame2;
//packageMyTankGame2;
importjava.awt.*;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.util.*;
importjavax.swing.*;
publicclassMyTankGame2extendsJFrame
{
MyPanelmp=null;
publicstaticvoidmain(String[]args)
{
MyTankGame2mytankgame1=newMyTankGame2();
}
publicMyTankGame2()
{
mp=newMyPanel();
//启动mp线程
Threadt=newThread(mp);
t.start();
this.add(mp);
this.addKeyListener(mp);
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
classMyPanelextendsJPanelimplementsKeyListener,Runnable
{
//定义我的坦克,成员变量
Herohero=null;
//定义敌人的坦克组
Vector
intenSize=3;
publicvoidpaint(Graphicsg)
{
super.paint(g);
g.fillRect(0,0,400,300);
//画出自己的坦克
this.drawTank(hero.getX(),hero.getY(),g,this.hero.direct,1);
//画出子弹
if(hero.s!
=null&&hero.s.isLive==true)
{
g.draw3DRect(hero.s.x,hero.s.y,1,1,false);
}
//画出敌人的坦克
for(inti=0;i { this.drawTank(ets.get(i).getX(),ets.get(i).getY(),g,ets.get(i).getDirect(),0); } } //画出坦克函数(扩展) publicvoiddrawTank(intx,inty,Graphicsg,intdirect,inttype) { //判断类型 switch(type) { case0: g.setColor(Color.cyan);break; case1: g.setColor(Color.yellow);break; } //判断方向 switch(direct) { //向上 case0: //画出我的坦克(到时候再封装成一个函数) //1.画出左面的矩形 //g.drawRect(hero.getX(),hero.getY(),5,30); g.fill3DRect(x,y,5,30,false); //2.画出右边的矩形 g.fill3DRect(x+15,y,5,30,false); //3.画出坦克的中间矩形 g.fill3DRect(x+5,y+5,10,20,false); //画出中间的圆 g.fillOval(x+4,y+10,10,10); //画出线 g.drawLine(x+9,y+15,x+9,y); break; case1: //炮筒向右 //画出上面的矩形 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x+30,y+10); break; case2: //向下 g.fill3DRect(x,y,5,30,false); g.fill3DRect(x+15,y,5,30,false); g.fill3DRect(x+5,y+5,10,20,false); g.fillOval(x+4,y+10,10,10); g.drawLine(x+10,y+15,x+10,y+30); break; case3: //向左 g.fill3DRect(x,y,30,5,false); g.fill3DRect(x,y+15,30,5,false); g.fill3DRect(x+5,y+5,20,10,false); g.fillOval(x+10,y+5,10,10); g.drawLine(x+15,y+10,x,y+10); break; } } publicMyPanel() { hero=newHero(100,100); //初始化敌人的坦克 for(inti=0;i { //创建敌人的坦克对象 EnemyTanket=newEnemyTank((i+1)*50,0); et.setColor(0); et.setDirect (2); ets.add(et); } } //键按下处理a表示左,s表示向下,w表示向上,d表示向右 publicvoidkeyPressed(KeyEvente) { if(e.getKeyCode()==KeyEvent.VK_W) { //设置我的坦克的方向 this.hero.setDirect(0); this.hero.moveUp(); } elseif(e.getKeyCode()==KeyEvent.VK_S) { this.hero.setDirect (2); this.hero.moveDown(); } elseif(e.getKeyCode()==KeyEvent.VK_D) { this.hero.setDirect (1); this.hero.moveRight(); } elseif(e.getKeyCode()==KeyEvent.VK_A) { this.hero.setDirect(3); this.hero.moveLeft(); } if(e.getKeyCode()==KeyEvent.VK_J) { this.hero.shotEnemy(); } //必须重新绘制Panel this.repaint(); } publicvoidkeyReleased(KeyEvente) { } publicvoidkeyTyped(KeyEvente) { } publicvoidrun() { //每个一百毫秒去重画子弹 while(true) { try{ Thread.sleep(100); }catch(InterruptedExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } this.repaint(); } } } //packageMyTankGame2; classTank { //设置坦克的速度 intspeed=1; publicintgetSpeed() { returnspeed; } publicvoidsetSpeed(intspeed) { this.speed=speed; } //表示坦克的横坐标 intx=0; //坦克的纵坐标 inty=0; intdirect=0; intcolor; //坦克方向,0表示上,1表示右,2表示下,3表示左 publicintgetColor(){ returncolor; } publicvoidsetColor(intcolor){ this.color=color; } publicintgetDirect() { returndirect; } publicvoidsetDirect(intdirect) { this.direct=direct; } publicTank(intx,inty) { this.x=x; this.y=y; } publicintgetX() { returnx; } publicvoidsetX(intx) { this.x=x; } publicintgetY() { returny; } publicvoidsetY(inty) { this.y=y; } } classEnemyTankextendsTank { publicEnemyTank(intx,inty) { super(x,y); } } //我的坦克 classHeroextendsTank { //子弹 Shots=null; publicHero(intx,inty) { super(x,y); } //坦克向上移动 //坦克的开火的能力和动作 publicvoidshotEnemy() { switch(this.direct) { case0: s=newShot(x+9,y-1,0); break; case1: s=newShot(x+30,y+10,1); break; case2: s=newShot(x+9,y+30,2); break; case3: s=newShot(x-1,y+9,3); break; } Threadt=newThread(s); t.start(); } publicvoidmoveUp() { this.y-=speed; } publicvoidmoveRight() { this.x+=speed; } publicvoidmoveDown() { this.y+=speed; } publicvoidmoveLeft() { this.x-=speed; } } classShotimplementsRunnable { intx; inty; intdirect; intspeed=1; //是否活着 booleanisLive=true; publicShot(intx,inty,intdirect) { this.x=x; this.y=y; this.direct=direct; } publicvoidrun() { while(true) { try{ Thread.sleep(50); }catch(InterruptedExceptione){ e.printStackTrace(); } switch(direct) { case0: //向上 y-=speed;break; case1: x+=speed;break; case2: y+=speed;break; case3: x-=speed;break; } //子弹何时死亡? //判断该子弹是否碰到边缘 if(x<0||x>400||y<0||y>300) { this.isLive=false; break; } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 练习 坦克 大战 30 线程