黑马程序员技术交流社区

标题: 新人,编写的简单tankgame,求交流 [打印本页]

作者: 田得聖老师    时间: 2015-2-4 20:13
标题: 新人,编写的简单tankgame,求交流
package com.TankGame;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import javax.swing.*;


public class TankGame extends JFrame implements ActionListener{
       
        //定义面板mypanel
        MyPanel mypanel=null;
        //定义开始面板msp
        MystartPanel msp=null;
       
        //定义菜单栏 jmb
        JMenuBar jmb=null;
        //定义菜单jm1
        JMenu jm1=null;
        //定义菜单选项
        JMenuItem jmi1=null;
        JMenuItem jmi2=null;
        JMenuItem jmi3=null;
        JMenuItem jmi4=null;
        //主函数
        public static void main(String[] args) {
                //创建tg
                TankGame tg=new TankGame();
        }
        //构造函数
        public TankGame(){
                //初始化菜单栏、菜单、菜单选项
                jmb=new JMenuBar();
               
                jm1=new JMenu("游戏(G)");
                jm1.setMnemonic('G');
               
                jmi1=new JMenuItem("开始新游戏");
                jmi4=new JMenuItem("继续游戏");
                jmi2=new JMenuItem("退出游戏");
                jmi3=new JMenuItem("存盘退出");
               
                //菜单选项注册监听
                jmi1.addActionListener(this);
                jmi1.setActionCommand("newgame");
               
                jmi2.addActionListener(this);
                jmi2.setActionCommand("exit");
               
                jmi3.addActionListener(this);
                jmi3.setActionCommand("saveExit");
               
                jmi4.addActionListener(this);
                jmi4.setActionCommand("conGame");
               
                //初始化开始面板
                msp=new MystartPanel();
                //把菜单选项加入到菜单
                jm1.add(jmi1);
                jm1.add(jmi4);
                jm1.add(jmi2);
                jm1.add(jmi3);
                //把菜单加入到菜单栏
                jmb.add(jm1);
                //把菜单栏加入到开始面板
                msp.add(jmb);
               
                //把面板加入到JFrame
                this.add(msp);
                //添加菜单栏
                this.setJMenuBar(jmb);
                //执行线程msp
                Thread t=new Thread(msp);
                t.start();
                //窗口大小
                this.setSize(800,600);
                //初始位置
                this.setLocation(250,200);
                //关闭窗口
                this.setDefaultCloseOperation(EXIT_ON_CLOSE);
                //显示窗口
                this.setVisible(true);
               
        }
                //监听事件处理
        public void actionPerformed(ActionEvent arg0) {
                //如果点击newgame
                if(arg0.getActionCommand().equals("newgame")){
                        //初始化面板mypanel
                        mypanel=new MyPanel("newgame");
                        //执行线程mypanel
                        Thread t2=new Thread(mypanel);
                        t2.start();
                        //从窗口中移除开始面板msp
                        this.remove(msp);
                        //窗口加入mypanel
                        this.add(mypanel);
                        //注册监听
                        this.addKeyListener(mypanel);
                        //显示面板
                        this.setVisible(true);
                }else if(arg0.getActionCommand().equals("exit")){
                       
                       
                        //调用记录类保存函数
                        Recorder.keepRecording();
                        //系统退出
                        System.exit(0);
                }else if(arg0.getActionCommand().equals("saveExit")){
                        Recorder rd=new Recorder();
                        //保存敌人坦克坐标
                        rd.setEts(mypanel.enemy);
                       
                        rd.keepRecAndEnemyTank();
                        System.exit(0);
                }else if(arg0.getActionCommand().equals("conGame")){
                        //初始化面板mypanel
                        mypanel=new MyPanel("con");
                       
                       
                        //执行线程mypanel
                        Thread t2=new Thread(mypanel);
                        t2.start();
                        //从窗口中移除开始面板msp
                        this.remove(msp);
                        //窗口加入mypanel
                        this.add(mypanel);
                        //注册监听
                        this.addKeyListener(mypanel);
                        //显示面板
                        this.setVisible(true);
                       
                       
                }
        }

}
//创建初始化面板类MystartPanel


作者: 田得聖老师    时间: 2015-2-4 20:14
class MystartPanel extends JPanel implements Runnable{
       
        int times=100;
        //覆盖父类paint函数
        public void paint(Graphics g){
                super.paint(g);
                //画出面板大小
                g.fillRect(0, 0, 420, 300);
                //间隔1秒
                if(times%2==0){
                //画笔颜色、字体
                g.setColor(Color.yellow);       
                Font myfont= new Font("华文新魏",Font.BOLD,30);
                //获取当前字体
                g.setFont(myfont);
                //画出字符串
                g.drawString("Stage:1",150,150);
               
                }
        }

        //线程,让开始面板闪烁
        public void run() {
                //循环
                while(true){
                        try {
                        //休眠50毫秒
                                Thread.sleep(50);
                        } catch (Exception e) {
                                e.printStackTrace();
                               
                        }
                        //重画
                        this.repaint();
                        times--;
                }
               
}
       
       
}
//定义面板MyPanel
class MyPanel extends JPanel implements KeyListener,Runnable{
        private        int intsize=3;
                //定义我的坦克、敌人坦克、我的子弹、敌人子弹
                HeroTank hero;
                EnemyTank enemytank;
                Shot myshot;
                Shot enemyshot;
                //向量敌人坦克、我的子弹、炸弹
                Vector<EnemyTank> enemy=new Vector<EnemyTank>();
                Vector<Shot> heroshots=new Vector<Shot>();
                Vector<Bomb> bombs=new Vector<Bomb>();
                Vector<Node> nodes=new Vector<Node>();
                //定义图片
                Image image1=null;
                Image image2=null;
                Image image3=null;
               

//                构造函数
        public MyPanel(String flag){
//                调用记录
                Recorder.getRecording();
//                初始化我的坦克
                hero=new HeroTank(190, 270,0, 0, 2,null);
//                初始化敌人坦克
                if(flag.equals("newgame")){
                for(int i=0;i<intsize;i++){
                        enemytank=new EnemyTank(i*195, 0, 1, 2, 2, null);
                       
                        enemy.add(enemytank);
                       
                        enemytank.setEts(enemy);
                       
                        Thread t2=new Thread(enemytank);
                        t2.start();
//                        初始化敌人子弹
                        enemyshot=new Shot(enemytank.x+10,enemytank.y+30, enemytank.direction, true);
                        enemytank.enemyshots.add(enemyshot);
                       
                        Thread t4=new Thread(enemyshot);
                        t4.start();
                       
                }       
                }else{
                        nodes=new Recorder().getNodesAndEnNums();
                        for(int i=0;i<nodes.size();i++){
                               
                                Node node=nodes.get(i);
                                enemytank=new EnemyTank(node.x, node.y, 1,node.direction, 2, null);
                               
                                enemy.add(enemytank);
                               
                                enemytank.setEts(enemy);
                               
                                Thread t2=new Thread(enemytank);
                                t2.start();
//                                初始化敌人子弹
                                enemyshot=new Shot(enemytank.x+10,enemytank.y+30, enemytank.direction, true);
                                enemytank.enemyshots.add(enemyshot);
                               
                                Thread t4=new Thread(enemyshot);
                                t4.start();
                               
                        }
                }
               
//                初始化爆炸效果图片
                image3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/111.jpg"));
                image2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/222.jpg"));
                image1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/333.jpg"));
               
        }
//                重写父类paint函数
        public void paint(Graphics g){
                super.paint(g);
//                面板大小
                g.fillRect(0, 0, 420, 300);
//                画出面板记录
                this.showInfo(g);
                if(hero.isLive){
                        g.setColor(Color.CYAN);
                        this.drawTank(hero.getX(), hero.getY(), hero.getType(), hero.getDirection(),hero.getSpeed(), g);
                }
//                画出炸弹
                for(int i=0;i<bombs.size();i++){
                        Bomb bomb=bombs.get(i);
                        if(bomb.life>6){
                               
                                g.drawImage(image1,bomb.x, bomb.y, 30,30, this);
                       
                        }else if(bomb.life>3){
                               
                                g.drawImage(image2,bomb.x, bomb.y, 30,30, this);
                               
                        }else{
                                g.drawImage(image3,bomb.x, bomb.y, 30,30, this);
                        }
                        bomb.lifeDown();
                       
                        if(bomb.life==0){
                                bombs.remove(bomb);
                        }
                       
                }
               
               
//                画出敌人坦克
                for(int i=0;i<enemy.size();i++){
                        EnemyTank enemytank=enemy.get(i);
                        if(enemytank.isLive==true){
                        this.drawTank(enemytank.getX(),enemytank.getY(),enemytank.getType(),
                                        enemytank.getDirection(),enemytank.getSpeed(), g);
                                for(int j=0;j<enemytank.enemyshots.size();j++){
                                        Shot enemyshot=enemytank.enemyshots.get(j);
                                        if(enemyshot.isLive==true){
                                                g.fillOval(enemyshot.x, enemyshot.y, 1, 2);
                                        }else{
                                               
                                                enemytank.enemyshots.remove(enemyshot);
                                        }
                                }
                       
                }
                }
//                画出我的子弹
                for(int i=0;i<heroshots.size();i++){
                        myshot=heroshots.get(i);
                       
               
                if(myshot!=null&&myshot.isLive==true){
                        g.setColor(Color.WHITE);
                        g.fillOval(myshot.x, myshot.y, 1, 2);
                        repaint();
                }
                if(myshot.isLive==false){
                        heroshots.remove(myshot);
                }
                }
        }
//                画出面板记录函数
        public void showInfo(Graphics g){
                this.drawTank(70, 335, 0, 0, 0, g);
                g.setColor(Color.black);
                Font myfont= new Font("华文新魏",Font.BOLD,30);
                g.setFont(myfont);
                g.drawString("  X  "+Recorder.getMyLife(), 100, 360);
                this.drawTank(70, 375, 1, 0, 0, g);
                g.setColor(Color.black);
                Font myfont2= new Font("华文新魏",Font.BOLD,30);
                g.setFont(myfont2);
                g.drawString("  X  "+Recorder.getEnNum(), 100, 400);
               
                g.setColor(Color.black);
                Font myfont3=new Font("华文新魏", Font.BOLD, 50);
                g.drawString("您的总成绩", 525, 50);
               
                this.drawTank(535,80, 1, 0, 0, g);
                g.setColor(Color.BLACK);
                g.drawString(" X  "+Recorder.getAllenNum(), 580, 105);
        }
//                画坦克函数
        public void drawTank(int x, int y,int type, int direction, int speed,Graphics g){
                switch(type){
                case 0:
                        g.setColor(Color.YELLOW);
                        break;
                case 1:
                        g.setColor(Color.GREEN);
                        break;
                }
                switch(direction){
//                坦克方向↑
                case 0:
                        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+5, y+10,10, 10);
                        g.drawLine(x+10,y, x+10, y+15);
                        break;
//                坦克方向→
                case 1:
                        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;
//                坦克方向↓
                case 2:
                        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+5, y+10,10, 10);
                        g.drawLine(x+10,y+30, x+10, y+15);
                        break;
//                坦克方向←
                case 3:
                        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;
                }
               
        }
//                创建我的子弹
        public void shotEnemy(int x,int y,int direction,boolean isLive){
//                判断我的坦克方向
                switch(hero.direction){
                case 0:
                        myshot=new Shot(x+10,y,0, true);
                        heroshots.add(myshot);
                        break;
                case 1:
                        myshot=new Shot(x+30,y+10,1,true);
                        heroshots.add(myshot);
                        break;
                case 2:
                        myshot=new Shot(x+10,y+30,2,true);
                        heroshots.add(myshot);
                        break;
                case 3:
                        myshot=new Shot(x,y+10,3, true);
                        heroshots.add(myshot);
                        break;
                        }
//                执行我的子弹线程
                Thread t=new Thread(myshot);
                t.start();
               
               
}
//                线程函数
                public void run() {
                       
                        while(true){
                                try {
                                Thread.sleep(100);
                                } catch (Exception e) {
                               
                                e.printStackTrace();
                                }
                       
                       
                                this.hitEnemyTank();
                                this.hitHeroTank();
                                this.repaint();
                       
                        }
                       
}
               
       

//                事件处理
        public void keyPressed(KeyEvent e) {
               
                if(e.getKeyCode()==KeyEvent.VK_W){
                        this.hero.setDirection(0);
                        this.hero.moveUp();
                        repaint();
                }
                else if(e.getKeyCode()==KeyEvent.VK_S){
                        this.hero.setDirection(2);
                        this.hero.moveDown();
                        repaint();
                }
                else if(e.getKeyCode()==KeyEvent.VK_A){
                        this.hero.setDirection(3);
                        this.hero.moveLeft();
                        repaint();
                }
                else if(e.getKeyCode()==KeyEvent.VK_D){
                        this.hero.setDirection(1);
                        this.hero.moveRight();
                       
                        repaint();
                }
                else if(e.getKeyCode()==KeyEvent.VK_J){
                        if(heroshots.size()<=4&&hero.isLive==true){
                               
                                this.shotEnemy(hero.x, hero.y,hero.direction, true);
                                repaint();
                                }
                        }
                }
//                击中敌人坦克
        public void hitEnemyTank(){
                for(int i=0;i<heroshots.size();i++){
                        myshot=heroshots.get(i);
                                if(myshot.isLive){
                                        for(int j=0;j<enemy.size();j++){
                                                enemytank=enemy.get(j);
                                                if(enemytank.isLive){
                                                        if(this.hitTank(enemytank, myshot)){
                                                                Recorder.reduceEnEnm();
                                                                Recorder.addallenNum();
                                                        }
                                                       
                                                }
                                               
                                        }
                                }
                        }
        }
//                我的坦克被击中
        public void hitHeroTank(){
                for(int i=0;i<this.enemy.size();i++){
                       
                        EnemyTank enemytank=enemy.get(i);
                        if(enemytank.isLive){
                        for(int j=0;j<enemytank.enemyshots.size();j++){
                                Shot enemyshot=enemytank.enemyshots.get(j);
                                if(hero.isLive){
                               
                                       
                                       
                                        if(this.hitTank(hero, enemyshot)){
                                                Recorder.reducemyLife();
                                               
                                        }
                               
                               
                                }
                        }
                        }
                }
        }
//                判断子弹是否击中坦克
        public boolean hitTank(Tank enemytank,Shot shot){
               
                boolean b=false;
               
                switch(enemytank.direction){
                case 0:
                case 2:
               
                        if(shot.x>enemytank.x&&shot.x<enemytank.x+20&&shot.y>enemytank.y&&shot.y<enemytank.y+30){
                               
                                shot.isLive=false;
                                enemytank.isLive=false;
                                Recorder rd=new Recorder();
                               
                                b=true;
                                Bomb bomb=new Bomb(enemytank.x, enemytank.y);
                                bombs.add(bomb);
                        }break;
                case 1:
                case 3:
                        if(shot.x>enemytank.x&&shot.x<enemytank.x+30&&shot.y>enemytank.y&&shot.y<enemytank.y+20){
                               
                                shot.isLive=false;
                                enemytank.isLive=false;
                                Recorder rd=new Recorder();
                                b=true;
                                Bomb bomb=new Bomb(enemytank.x, enemytank.y);
                                bombs.add(bomb);
                        }break;
                }
                return b;
        }


       
        public void keyReleased(KeyEvent e) {
               
        }

        public void keyTyped(KeyEvent e) {
       
               
        }
       
}
作者: 田得聖老师    时间: 2015-2-4 20:19
//                我的坦克类
class HeroTank extends Tank{
       
       
        public HeroTank(int x, int y,int type, int direction, int speed,Graphics g) {
                super(x, y, type,direction, speed,g);
               
        }
       
       
}
//                敌人坦克类
class EnemyTank extends Tank implements Runnable{
       
        int times=0;
        Vector<Shot> enemyshots=new Vector<Shot>();
        Vector<EnemyTank> ets=new Vector<EnemyTank>();
        public EnemyTank(int x, int y,int type, int direction, int speed,Graphics g) {
                super(x, y,type, direction, speed,g);
               
        }
        public void setEts(Vector<EnemyTank> vv){
                this.ets=vv;
        }
//                控制敌人坦克不重叠
        public boolean isTouchOtherEnmenyTank(){
                boolean b=false;
               
                switch(this.direction){
                case 0:
                        for(int i=0;i<ets.size();i++){
                                EnemyTank et=ets.get(i);
                                if(et!=this){
                                        if(et.direction==0&&et.direction==2);{
                                                if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){
                                                        return true;
                                                }
                                                if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){
                                                        return true;
                                                }               
                                        }
                                        if(et.direction==1&&et.direction==3);{
                                                if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){
                                                        return true;
                                                }
                                                if(this.x+20>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){
                                                        return true;
                                                }               
                                        }
                                }
                               
                        }
                        break;
                case 1:
                        for(int i=0;i<ets.size();i++){
                                EnemyTank et=ets.get(i);
                                if(et!=this){
                                        if(et.direction==0&&et.direction==2);{
                                                if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){
                                                        return true;
                                                }
                                                if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30){
                                                        return true;
                                                }               
                                        }
                                        if(et.direction==1&&et.direction==3);{
                                                if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){
                                                        return true;
                                                }
                                                if(this.x+30>=et.x&&this.x+30<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30){
                                                        return true;
                                                }               
                                        }
                                }
                               
                        }
                        break;
                case 2:
                        for(int i=0;i<ets.size();i++){
                                EnemyTank et=ets.get(i);
                                if(et!=this){
                                        if(et.direction==0&&et.direction==2);{
                                                if(this.x>=et.x&&this.x<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30){
                                                        return true;
                                                }
                                                if(this.x+20>=et.x&&this.x+20<=et.x+20&&this.y+30>=et.y&&this.y+30<=et.y+30){
                                                        return true;
                                                }               
                                        }
                                        if(et.direction==1&&et.direction==3);{
                                                if(this.x>=et.x&&this.x<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20){
                                                        return true;
                                                }
                                                if(this.x+20>=et.x&&this.x+20<=et.x+30&&this.y+30>=et.y&&this.y+30<=et.y+20){
                                                        return true;
                                                }               
                                        }
                                }
                               
                        }
                        break;
                case 3:
                        for(int i=0;i<ets.size();i++){
                                EnemyTank et=ets.get(i);
                                if(et!=this){
                                        if(et.direction==0&&et.direction==2);{
                                                if(this.x>=et.x&&this.x<=et.x+20&&this.y>=et.y&&this.y<=et.y+30){
                                                        return true;
                                                }
                                                if(this.x>=et.x&&this.x<=et.x+20&&this.y+20>=et.y&&this.y+20<=et.y+30){
                                                        return true;
                                                }               
                                        }
                                        if(et.direction==1&&et.direction==3);{
                                                if(this.x>=et.x&&this.x<=et.x+30&&this.y>=et.y&&this.y<=et.y+20){
                                                        return true;
                                                }
                                                if(this.x>=et.x&&this.x<=et.x+30&&this.y+20>=et.y&&this.y+20<=et.y+20){
                                                        return true;
                                                }               
                                        }
                                }
                               
                        }
                        break;
                }
                return b;
        }
作者: 田得聖老师    时间: 2015-2-4 20:22
什么是内部错误  无法显示   后面代码复制不上去了呢
作者: janfrost    时间: 2015-2-4 20:38
最好把代码托管带git上面。这样大家看着舒服些。。。
作者: 田得聖老师    时间: 2015-2-4 20:46
janfrost 发表于 2015-2-4 20:38
最好把代码托管带git上面。这样大家看着舒服些。。。

不会啊。怎么做




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2