首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

刚开始学习java,用java写了一个坦克小游戏的程序,但是有点有关问题,希望高手可以指点一下

2012-02-02 
刚开始学习java,用java写了一个坦克小游戏的程序,但是有点问题,希望高手可以指点一下!就是坦克移动的时候,

刚开始学习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);//定义画笔颜色


break;

}
//判断坦克的方向
switch(direct)
{
//向上
case 0:
g.setColor(Color.CYAN);//定义画笔颜色
g.fill3DRect(x, y, 8, 60,false);
g.fill3DRect(x+28, y, 8, 60,false);
g.fill3DRect(x+8, y+10, 20, 40,false);
g.fillOval(x+8, y+20, 20, 20);
g.drawLine(x+17, y+30, x+17, y-4);
break;
//向下
case 1:
g.setColor(Color.CYAN);//定义画笔颜色
g.fill3DRect(x, y, 8, 60,false);
g.fill3DRect(x+28, y, 8, 60,false);
g.fill3DRect(x+8, y+10, 20, 40,false);
g.fillOval(x+8, y+20, 20, 20);
g.drawLine(x+17, y+30, x+17, y+63);
break;
//向左
case 2:
g.setColor(Color.CYAN);//定义画笔颜色
g.fill3DRect(x, y, 60, 8,false);
g.fill3DRect(x, y+28, 60, 8,false);
g.fill3DRect(x+10, y+8, 40, 20,false);
g.fillOval(x+19, y+8, 20, 20);
g.drawLine(x+22, y+17, x-4, y+17);
break;
//向右
case 3:
g.setColor(Color.CYAN);//定义画笔颜色
g.fill3DRect(x, y, 60, 8,false);
g.fill3DRect(x, y+28, 60, 8,false);
g.fill3DRect(x+10, y+8, 40, 20,false);
g.fillOval(x+19, y+8, 20, 20);
g.drawLine(x+22, y+17, x+66, y+17);
break;


}


}
//画出墙的函数
public void drawQiang(int x,int y,Graphics g,int type)
{
//判断墙的类型
switch(type)
{
case 0:
g.setColor(Color.pink);//定义画笔颜色
for(int i=0;i<50;i++)
{

g.fill3DRect(x+(i*5), y, 5, 30,false);
}

break;
case 1:
g.setColor(Color.red);//定义画笔颜色
for(int i=0;i<50;i++)
{
g.fill3DRect(x+(i*5), y, 5, 30,false);
}
break;

}

}
//键按下的处理
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP)
{  


this.wantank.setDriect(0);

this.wantank.moveUp();
System.out.println(x);
System.out.println(y);

}else if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
this.wantank.setDriect(1);

this.wantank.moveDown();
}else if(e.getKeyCode()==KeyEvent.VK_LEFT)
{
this.wantank.setDriect(2);

this.wantank.moveLeft();
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
{
this.wantank.setDriect(3);

this.wantank.moveRight();
}
this.repaint();
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}




}
//坦克类
class Tank
{

//表示坦克的横坐标,纵坐标
int x=0;
int y=0;
//坦克的方向变量
int driect=0;
//表示速度
int speed=5;
//构造函数
public Tank(int x,int y)
{

this.x=x;
this.y=y;

}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getDriect() {
return driect;
}
public void setDriect(int driect) {
this.driect = driect;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}

}


//玩家的坦克
class WanTank extends Tank
{


public WanTank(int x,int y)
{

super(x,y);
}

//坦克向上移动
public void moveUp()
{

System.out.println("你好");
y-=speed;

System.out.println(x);



System.out.println(y);
}
//坦克向下移动
public void moveDown()
{
y+=speed;
}
//坦克向左移动
public void moveLeft()
{


x-=speed;
}
//坦克向右移动
public void moveRight()
{
x+=speed;
}



}
class EnemyTank extends Tank
{


public EnemyTank(int x,int y)
{

super(x,y);
}

////坦克向上移动
//public void moveUp()
//{
////System.out.println("爱你");
//y-=speed;
////System.out.println("爱你,woaini");
//}
////坦克向下移动
//public void moveDown()
//{
//y+=speed;
//}
////坦克向左移动
//public void moveLeft()
//{
//x-=speed;
//}
////坦克向右移动
//public void moveRight()
//{
//x+=speed;
//}
//
//

}

//墙类
class Qiang
{
//表示墙的横坐标,纵坐标
int x=0;
int y=0;
//构造函数
public Qiang(int x,int y)
{
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}








}


[解决办法]
主要原因在于你在重绘TankPanel的时候使用的坐标都是初始坐标x,y,初始坐标x y是固定值,所以后台的坐标更改了但是前台重绘还是初始值,

Java code
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(wantank.getX(), wantank.getY(), g, this.wantank.driect, 0); 

热点排行