日期:2014-05-20  浏览次数:20900 次

刚开始学习java,用java写了一个坦克小游戏的程序,但是有点问题,希望高手可以指点一下!
就是坦克移动的时候,我把移动封装成四种moveUp()、moveDown()、moveLeft()、moveRight()方法,然后去调用这些方法,但是当按键盘上、下、左、右键的时候,坦克的坐标数值会不停的变化,可是就是坦克不会移动,不知道是怎么回事,希望可以指点一下,谢谢!

/*
 * 功能:坦克大战游戏(1.0)
 * 
 */



package com.tank;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Tankgame extends JFrame{

TankPanel tankpanel=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
Tankgame tankgame=new Tankgame();

}
//构造函数
public Tankgame()
{
tankpanel=new TankPanel();
this.add(tankpanel);


Menu menu=new Menu();
//添加到窗体中
this.add(menu.jmb,BorderLayout.NORTH);
this.addKeyListener(tankpanel);

//设置窗体
this.setTitle("坦克游戏");
this.setSize(800,600);
this.setLocation(200, 100);
this.setResizable(false);//禁止改变窗体大小
this.setVisible(true);//显示窗体
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

//编写菜单类,实现菜单的功能
class Menu 
{
//定义组件
JMenuBar jmb;//菜单条组件
JMenu jme1,jme2,jme3;//一级菜单
  JMenuItem jmei1,jmei2,jmei3,jmei4,jmei5,jmei6;//二级菜单
   
  //构造函数
  public Menu()
  {
  //创建组件


//一级菜单
  jmb=new JMenuBar();
  jme1=new JMenu("游戏(G)");
jme1.setMnemonic('G');
jme2=new JMenu("设置(T)");
jme2.setMnemonic('T');
jme3=new JMenu("帮助(H)");
jme3.setMnemonic('H');


//二级菜单
jmei1=new JMenuItem("开始游戏(S)");
jmei2=new JMenuItem("重置游戏(R)");
jmei3=new JMenuItem("退出(X)");
jmei4=new JMenuItem("设置游戏(E)");
jmei5=new JMenuItem("游戏记录(C)");
jmei6=new JMenuItem("游戏说明(H)");


  //添加组件

jmb.add(jme1);
jmb.add(jme2);
jmb.add(jme3);

jme1.add(jmei1);
jme1.add(jmei2);
jme1.addSeparator();//添加分割线
jme1.add(jmei3);
jme2.add(jmei4);
jme2.add(jmei5);
jme3.add(jmei6);
  }




}
//游戏面板
class TankPanel extends JPanel implements KeyListener
{
int x=400;
int y=450;
//定义一个玩家的坦克
WanTank wantank=null;
EnemyTank enemytank=null;
//定义墙
Qiang qiang1=null;
Qiang qiang2=null;
Qiang qiang3=null;
Qiang qiang4=null;
Qiang qiang5=null;
Qiang qiang6=null;

public TankPanel()
{
wantank=new WanTank(400,450);
enemytank=new EnemyTank(500,10);

qiang1=new Qiang(100,100);
qiang2=new Qiang(500,100);
qiang3=new Qiang(100,300);
qiang4=new Qiang(100,130);
qiang5=new Qiang(500,130);
qiang6=new Qiang(500,300);
}
//重写paint方法
public void paint(Graphics g)//画笔
{
super.paint(g);
g.fillRect(0, 0, 800, 600);//定义坦克的活动区域
this.drawTank(x, y, g, this.wantank.driect, 0);
// this.drawTank(x, y, g,this.enemytank.driect(1) , 2);


this.drawQiang(qiang1.getX(), qiang1.getY(), g, 0);
this.drawQiang(qiang2.getX(), qiang2.getY(), g, 0);
this.drawQiang(qiang3.getX(), qiang3.getY(), g, 0);
this.drawQiang(qiang4.getX(), qiang4.getY(), g, 0);
this.drawQiang(qiang5.getX(), qiang5.getY(), g, 0);
this.drawQiang(qiang6.getX(), qiang6.getY(), g, 0);
}
//画出坦克的函数
public void drawTank(int x,int y,Graphics g,int direct,int type)
{
//判断坦克的类型
switch(type)
{
case 0:
g.setColor(Color.CYAN);//定义画笔颜色
break;
case 1:
g.setColor(Color.yellow);//定义画笔颜色
break;
case 2:
g.setColor(Color.red);//定义画笔颜色