当前位置:文档之家› 坦克大战实验报告

坦克大战实验报告

坦克大战实验报告
坦克大战实验报告

坦克大战实验报告

班级:1205 姓名:许广龙学号:121010182一、系统简介

使用JAVA编写一个人机游戏,有开始启动面板(Stage 1),并有闪烁效果。在开始面板中有游戏(G)和帮助(H)两个菜单。其中游戏(G)菜单中有开始游戏(N)、退出游戏(E)、保存游戏(S)、继续游戏(C)选项;帮助(H)菜单中有关于坦克如何操作的提示信息。

玩家有1辆坦克(有3条命),电脑有6辆坦克,我的坦克可以通过键盘控制进行移动和发射子弹,敌人坦克可自由运动并自动发射子弹。敌人坦克相互之间不能重叠,敌人坦克与我的坦克不能重叠,我的坦克与敌人坦克不能重叠。当子弹击中坦克时坦克死亡,并显示爆炸效果。当我的坦克生命为0时游戏结束(显示GAMEOVER),当敌方的所有坦克死亡时游戏结束(显示VICTORY)。

二、需求分析

设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。用户可以选择开始游戏(N),退出游戏(E),保存游戏(S),继续游戏(C),游戏帮助(H)。

界面中包含我的坦克和敌人坦克以及坦克发出的子弹和爆炸后的效果。

坦克:坦克分为两种,敌人坦克和我的坦克。我的坦克和敌人坦克均可以发射子弹,可以改变路径行走,且在行走过程中碰到边界或碰到其它坦克会自动换方向,坦克之间不能相互穿越。

子弹:子弹可以由敌方坦克和我的坦克发射,且发射出去的子弹可以直线移动,直到碰到其它坦克或超越边界就消失。坦克受到一颗子弹攻击便死亡,死亡后坦克消失。

爆炸:当子弹射击到坦克身上时,要产生爆炸效果。

方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。

具体功能:

1、坦克可以上下左右移动

2、坦克可以发子弹(可以连发,最多5发子弹)

3、当坦克中弹时,坦克消失,并显示爆炸效果。

4、我的坦克被击中后显示爆炸效果

5、防止敌人坦克重叠运动、我的坦克与敌人坦克重叠运动、敌人坦克与我的坦克重叠运动

6、玩游戏时可以保存游戏和继续游戏

7、记录玩家的成绩

三、系统设计

程序流程图:

总体框架:

项目名:TankGame1

主类文件:MyFrame.java

坦克父类文件:Tank.java

坦克子类(我的坦克):MyTank.java

坦克子类(敌人坦克):EnemyTank.java

我的面板:MyPanel.java

子弹类:Shot.java

开始面板:MyStartPanel.java

记录类:Recorder.java

爆炸类:Bomb.java

四、详细设计

(一) 、画坦克

1、Tank类

class Tank{

int x,y;//坦克的位置

int direct;//坦克的方向

int color;//坦克的颜色,值为0时为的我的坦克,为1时为敌人的坦克

int speed;

public Tank(int x, int y) {

this.x = x;

this.y = y;

}

setter与getter方法(代码略)

public void moveUp(){//向上移动,y坐标值减,方向值为0

y-=speed;

this.setDirect(0);

}

public void moveDown(){//向下移动,y坐标值增,方向值为2

y+=speed;

this.setDirect(0);

}

public void moveRight(){//向右移动,x坐标值增,方向值为1

x+=speed;

this.setDirect(0);

}

public void moveLeft(){//向左移动,x坐标值减,方向值为3

x-=speed;

this.setDirect(0);

}

}

2、我的坦克类MyTank

class MyTank extends Tank{

public MyTank(int x, int y) {

super(x, y);

}

}

3、主类MyFrame

public class MyFrame extends JFrame{

MyPanel mp=null;

public static void main(String[] args) {

MyFrame tankGame1=new MyFrame();

MyFrame.setVisible(true);

}

public MyFrame() {

mp=new MyPanel();

this.add(mp);

this.setBounds(200,200,600,500);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

4、在MyFrame.java中创建MyPanel类

class MyPanel extends JPanel

{

MyTank mytank=null;

public MyPanel()

{

mytank=new MyTank(200,200);//创建我的坦克并设置其初始位置}

//重载MyPanel类的paint函数以实现画坦克

public void paint(Graphics g)//窗口大小改变或重绘窗口时,执行repaint()时会自动调用{

super.paint(g);

g.fillRect(0,0,600,500);

this.drawTank(mytank.getX(),mytank.getY(),mytank.getDirect(),mytank.getColor(), 5, g); }

//在MyPanel画坦克的函数,参数包括坦克的位置、方向、类型(用于设置颜色)、画笔:public void drawTank(int x, int y, int direct, int color, int size,

Graphics g) {

switch (color) {

case 0://我的坦克的颜色

g.setColor(Color.cyan);

break;

case 1:

g.setColor(Color.yellow);

break;

case 2://敌人坦克的颜色

g.setColor(Color.green);

break;

}

switch (direct) {

case 0:

g.fill3DRect(x, y, size, 6 * size, false);

g.fill3DRect(x + 3 * size, y, size, 6 * size, false);

g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);

g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);

g.drawLine(x + 2 * size, y, x + 2 * size, y + 3 * size);

break;

case 3:

g.fill3DRect(x, y, 6 * size, size, false);

g.fill3DRect(x, y + 3 * size, 6 * size, size, false);

g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);

g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);

g.drawLine(x, y + 2 * size, x + 3 * size, y + 2 * size);

break;

case 1:

g.fill3DRect(x, y, 6 * size, size, false);

g.fill3DRect(x, y + 3 * size, 6 * size, size, false);

g.fill3DRect(x + size, y + size, 4 * size, 2 * size, false);

g.fillOval(x + 2 * size, y + size, 2 * size, 2 * size);

g.drawLine(x + 6 * size, y + 2 * size, x + 3 * size, y + 2 * size);

break;

case 2:

g.fill3DRect(x, y, size, 6 * size, false);

g.fill3DRect(x + 3 * size, y, size, 6 * size, false);

g.fill3DRect(x + size, y + size, 2 * size, 4 * size, false);

g.fillOval(x + size, y + 2 * size, 2 * size, 2 * size);

g.drawLine(x + 2 * size, y + 6 * size, x + 2 * size, y + 3 * size);

break;

}

}

(二)、移动坦克(事件监听)

在主类注册键盘事件监听,在MyPanel类中实现事件监听。

在这里,本文通过另一种新的方法来实现坦克的移动,通过实现keyPressed(KeyEvent e)与keyReleased(KeyEvent e)这两个事件处理方法,再创建一个action()方法,即可达到坦克移动更加敏捷顺畅,并且可为后面坦克发射子弹做重要铺垫,即可做到坦克边移动,边发射子弹的效果。

//L表示向左,R表示向右,U表示向上,D表示向下

boolean L = false, R = false, U = false, D = false;

@Override

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

U = true;

} else if (e.getKeyCode() == KeyEvent.VK_D) {

R = true;

} else if (e.getKeyCode() == KeyEvent.VK_S) {

D = true;

} else if (e.getKeyCode() == KeyEvent.VK_A) {

L = true;

}

}

@Override

public void keyReleased(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

U = false;

} else if (e.getKeyCode() == KeyEvent.VK_D) {

R = false;

} else if (e.getKeyCode() == KeyEvent.VK_S) {

D = false;

} else if (e.getKeyCode() == KeyEvent.VK_A) {

L = false;

}

}

public void action() {

if (U) {

this.mytank.setDirect(0);

this.mytank.moveUp();

} else if (R) {

this.mytank.setDirect(1);

this.mytank.moveRight();

} else if (D) {

this.mytank.setDirect(2);

this.mytank.moveDown();

} else if (L) {

this.mytank.setDirect(3);

this.mytank.moveLeft();

}

}

// 重新绘制窗口

this.repaint();

}

再将action()方法放到run()中。

(三)、画出敌人的坦克

1、.创建敌人的坦克类EnemyTank.java

public class EnemyTank extends Tank

{

public EnemyTank(int x,int y)

{

super(x,y);

}

}

2、在MyPanel中,创建敌人的坦克组

ArrayList ets = new ArrayList();

EnemyTank et = null;

public static int ensize=6;

在构造函数中初始化敌人的坦克:

// 创建敌人坦克

for (int i = 0; i < ensize; i++) {

et = new EnemyTank(20 + i * 50, 0);

}

在paint中画出敌人的坦克

public void paint(Graphics g) {

super.paint(g);

// 画出我的坦克

if (mytank.isLive()) {

this.drawTank(mytank.getX(), mytank.getY(), mytank.getDirect(),

mytank.getColor(), 5, g);

}

// 画出敌人的坦克

for (int i = 0; i < ets.size(); i++) {

et = ets.get(i);

drawTank(et.getX(), et.getY(), et.getDirect(), et.getColor(), 5, g);

}

(四)、线程----让坦克能发射子弹并击中敌人坦克

坦克要能发射子弹(按J键时发射子弹),子弹要以一定的速度移动,发射子弹的频率不能过快,当子弹击中敌人的坦克时,子弹死亡,敌人的坦克生命值减少。

基本思路:

●创建一个子弹类线程,在该类中定义子弹的属性,并通过run方法实现子弹的移动

●在我的坦克类MyTank()中创建子弹集合,添加一个方法shotEnemy用于按方向创

建并子弹,同时将创建的子弹添加到子弹集合中,然后启动子弹线程

●在MyPanel类中添加发射子弹的事件处理:按J键时调用MyTank()类的shotEnemy

方法创建子弹在paint方法中画出子弹。

●将MyPanel类改为线程类,并在其run方法中调用相关方法判断子弹是否击中坦克

实现爆炸效果。

1、创建子弹类Shot.java

在members.java中定义子弹类,该类通过Runnable实现线程

package TankWar;

public class Shot implements Runnable{

private int x;

private int y;

private int direct;

private int speed=6;

private boolean isLive=true;

public Shot(){}

public Shot(int x, int y, int direct) {

this.x = x;

this.y = y;

this.direct = direct;

}

@Override

public void run() {

while(true)

{

try {

Thread.sleep(50);

} catch (InterruptedException e) {

e.printStackTrace();

}

switch(this.direct)

{

case 0:

y-=speed;

break;

case 1:

x+=speed;

break;

case 2:

y+=speed;

break;

case 3:

x-=speed;

break;

}

//判断子弹是否跑出界面

if(x<=0||x>=480||y<=0||y>=360)

{

isLive=false;

break;

}

}

}

}

2.、在MyTank类中创建子弹集,并定义一个方法ShotEnemy,创建子弹并将子弹添加到子弹集中,启动子弹线程。

在MyTank类中添加向量ss用于存放子弹:

// 创建子弹集

ArrayList ss = new ArrayList();

Shot s = null;

在MyTank类添加一个创建子弹并启动子弹线程的方法

// ShotEnemy创建子弹并将子弹添加到子弹集中,启动子弹线程

public void shotEnemy() {

switch (this.direct) {

case 0:

s = new Shot(x + 2 * size, y, 0);

ss.add(s);

break;

case 1:

s = new Shot(x + 6 * size, y + 2 * size, 1);

ss.add(s);

break;

case 2:

s = new Shot(x + 2 * size, y + 6 * size, 2);

ss.add(s);

break;

case 3:

s = new Shot(x, y + 2 * size, 3);

ss.add(s);

break;

}

// 启动子弹线程

Thread t = new Thread(s);

t.start();

}

3、发射子弹的键盘事件的实现

分别在MyPanel的public void keyPressed(KeyEvent e) 和public void keyReleased(KeyEvent e)中添加按j键的事件。

Boolean SHOT = false;

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_J) {

SHOT = true;

}

}

@Override

public void keyReleased(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_J) {

SHOT = false;

}

}

public void action() {

if (SHOT) {

if (this.mytank.isLive() && this.mytank.ss.size() <= 4)// 最多可连续发5枚子弹{

this.mytank.shotEnemy();

}

}

}

4、画出子弹

(1) 在paint方法中画出子弹:

// 从ss,中取出每颗子弹,并画出

for (int i = 0; i < mytank.ss.size(); i++) {

Shot myShot = mytank.ss.get(i);// 从子弹集合中取出子弹

if (myShot != null && myShot.isLive() == true)// 若子弹集不空,且子弹没有消{

g.draw3DRect(myShot.getX(), myShot.getY(), 1, 1, false);

}

if (myShot.isLive() == false)// 子弹消失

{

// 从ss中删除掉该子弹

mytank.ss.remove(myShot);

}

}

(2)、使子弹能自动移动:

S1:在MyPanel中的接口中加入Runnable:

public class MyPanel extends JPanel implements Runnable

S2:实现接口中的抽象方法run:

@Override

public void run() {

// 每隔100毫秒去重绘

while (true) {

action();

try {

Thread.sleep(100);

} catch (Exception e) {

e.printStackTrace();

}

// 重绘

this.repaint();

}

S3:创建并启动MyPanel线程

在主类的构造函数中创建我的面板线程并启动。

mp=new MyPanel();//创建我的面板

Thread t=new Thread(mp);

t.start();//线程启动

5、当子弹击中坦克时坦克消失

(1)、在Tank类中添加一个变量用于判断坦克是否死亡

boolean isLive=true;

(2)、在MyPanel中添加下面两个函数用于判断子弹是否击中目标

// 写一个函数专门判断子弹是否击中敌人坦克

public boolean hitTank(Shot s, Tank et) {

boolean b2 = false;// 用于判断子弹是否击中坦克

switch (et.direct) {

// 如果敌人坦克的方向是上或者是下

case 0:

case 2:

if (s.getX() > et.x && s.getX() < et.x + 20 && s.getY() > et.y

&& s.getY() < et.y + 30) {

s.setLive(false);// 子弹死亡

et.setLive(false); // 敌人坦克死亡

b2 = true;

Bomb b = new Bomb(et.x, et.y);// 创建一颗炸弹,放入ArrayList

bombs.add(b); // 放入ArrayList

}

break;

case 1:

case 3:

if (s.getX() > et.x && s.getX() < et.x + 30 && s.getY() > et.y

&& s.getY() < et.y + 20) {

s.setLive(false);// 子弹死亡

et.setLive(false); // 敌人坦克死亡

b2 = true;

Bomb b = new Bomb(et.x, et.y);// 创建一颗炸弹,放入ArrayList

bombs.add(b); // 放入ArrayList

}

}

return b2;

}

// 判断我的子弹是否击中敌人的坦克

public void hitEnemyTank() {

// 判断是否击中敌人的坦克

for (int i = 0; i < mytank.ss.size(); i++) {

// 取出子弹

Shot myShot = mytank.ss.get(i);

// 判断子弹是否有效

if (myShot.isLive()) {

// 取出每个坦克

for (int j = 0; j < ets.size(); j++) {

EnemyTank et = ets.get(j);

if (et.isLive())// 如果坦克还存在

{// 调用函数判断子弹是否击中坦克

if (this.hitTank(myShot, et))// 如果击中

{

ets.remove(j);// 将敌人的坦克从集合中去除

total++;

ensize--;

}

}

}

}

}

}

(3)、在MyPanel类的run函数中添加下面代码,用于处理是否击中目标坦克

if (mytank.isLive()) {

this.hitEnemyTank();

}

(五)、.爆炸效果

基本原理:当子弹击中敌人的坦克时创建一枚炸弹并加入到炸弹集中,在paint方法中画出炸弹(从大到小显示三张图片,每张图片显示一定的时间(通过生命和paint函数的调用间隔确定))

1、引入爆炸图片并将其复制到scr中

2、创建一个炸弹类

package TankWar;

public class Bomb {

// 定义炸弹的坐标

int x, y;

// 炸弹的生命

int life = 9;

boolean isLive = true;

public Bomb(){}

public Bomb(int x, int y) {

this.x = x;

this.y = y;

}

// 减少生命值

public void lifeDown() {

if (life > 0) {

life--;

} else {

this.isLive = false;

}

}

}

3、在MyPanel中定义三张图片和定义爆炸集合,并在构造函数中初始化

// 定义三张图片,三张图片才能组成一颗炸弹

Image image1 = null;

Image image2 = null;

Image image3 = null;

// 定义炸弹集合

ArrayList bombs = new ArrayList();

Recorder recorder = null;

用另一种新的方法初始化图片,使能够第一次击中坦克时会产生爆炸效果。image1 = ImageIO.read(MyPanel.class.getResourceAsStream("bomb_1.gif"));

image2 = ImageIO.read(MyPanel.class.getResourceAsStream("bomb_2.gif"));

image3 = ImageIO.read(MyPanel.class.getResourceAsStream("bomb_3.gif"));

4、在hitTank()中的switch结构中创建炸弹

switch (et.direct) {

// 如果敌人坦克的方向是上或者是下

case 0:

case 2:

if (s.getX() > et.x && s.getX() < et.x + 20 && s.getY() > et.y

&& s.getY() < et.y + 30) {

s.setLive(false);// 子弹死亡

et.setLive(false); // 敌人坦克死亡

b2 = true;

Bomb b = new Bomb(et.x, et.y);// 创建一颗炸弹,放入ArrayList

bombs.add(b); // 放入ArrayList

}

break;

case 1:

case 3:

if (s.getX() > et.x && s.getX() < et.x + 30 && s.getY() > et.y

&& s.getY() < et.y + 20) {

s.setLive(false);// 子弹死亡

et.setLive(false); // 敌人坦克死亡

b2 = true;

Bomb b = new Bomb(et.x, et.y);// 创建一颗炸弹,放入ArrayList

bombs.add(b); // 放入ArrayList

}

}

5、在MyPanel的paint函数中画出炸弹

// 画出炸弹

for (int i = 0; i < bombs.size(); i++) {

// 取出炸弹

Bomb b = bombs.get(i);

if (b.life > 6) {

g.drawImage(image1, b.x, b.y, 30, 30, this);

} else if (b.life > 3) {

g.drawImage(image2, b.x, b.y, 30, 30, this);

} else {

g.drawImage(image3, b.x, b.y, 30, 30, this);

}

// 让b的生命值减小

b.lifeDown();

// 如果炸弹生命值为0,就把该炸弹从bombs向量去掉

if (b.life == 0) {

bombs.remove(b);

}

}

(六)、让敌人的坦克动起来并发射子弹

1、把敌人的坦克修改为线程类

public class EnemyTank extends Tank implements Runnable

2、重载抽象方法run用于敌人坦克的运动

@Override

public void run() {

// 敌人坦克改变方向

switch (this.direct) {

case 0:

// 前进一段距离后改变方向

for (int i = 0; i < 30; i++) {

if (y > 6 * size + speed && !this.isTouchOtherTank())

this.moveUp();

else

break;

try {

Thread.sleep(50);

} catch (InterruptedException ex) {

}

}

break;

case 1:

for (int i = 0; i < 30; i++) {

if (x < 600 - 6 * size - speed && !this.isTouchOtherTank())

this.moveRight();

else

break;

try {

Thread.sleep(50);

} catch (InterruptedException ex) {

}

}

break;

case 2:// 前进一段距离后改变方向

for (int i = 0; i < 30; i++) {

if (y < 500 - 6 * size - speed && !this.isTouchOtherTank())

this.moveDown();

else

break;

try {

Thread.sleep(50);

} catch (InterruptedException ex) {

}

}

break;

case 3:

for (int i = 0; i < 30; i++) {

if (x > 6 * size + speed && !this.isTouchOtherTank())

this.moveLeft();

else

break;

try {

Thread.sleep(50);

} catch (InterruptedException ex) {

}

}

break;

}

j++;

if (j % 2 == 0)

this.direct = (int) (Math.random() * 4);

}

}

3、敌人的坦克之间不能重叠

在EnemyTank类中添加一个方法isTouchOtherEnemy()用于判断敌人的坦克之间是否相

遇。

// isTouchOtherTank()用于判断敌人的坦克之间是否相遇

public boolean isTouchOtherTank() {

for (int i = 0; i < ets.size(); i++) {

EnemyTank et = ets.get(i);

if (et != this) {

switch (this.direct) {

case 0:// 方向向上,判断左上角和右上角顶点是否在另一两坦克内

if (et.direct == 0 || et.direct == 2) {

if (x >= et.x && x <= et.x + 4 * size && y >= et.y

&& y <= et.y + 6 * size)

return true;

if (x + 4 * size >= et.x

&& x + 4 * size <= et.x + 4 * size && y >= et.y

&& y <= et.y + 6 * size)

return true;

}

if (et.direct == 1 || et.direct == 3) {

if (x >= et.x && x <= et.x + 6 * size && y >= et.y

&& y <= et.y + 4 * size)

return true;

if (x + 4 * size >= et.x

&& x + 4 * size <= et.x + 6 * size && y >= et.y

&& y <= et.y + 4 * size)

return true;

}

break;

case 1:// 方向向右,判断右上角和右下角顶点是否在另一两坦克内

if (et.direct == 0 || et.direct == 2) {

if (x + 6 * size >= et.x

&& x + 6 * size <= et.x + 4 * size && y >= et.y

&& y <= et.y + 6 * size)

return true;

if (x + 6 * size >= et.x

&& x + 6 * size <= et.x + 4 * size

&& y + 4 * size >= et.y

&& y + 4 * size <= et.y + 6 * size)

return true;

}

if (et.direct == 1 || et.direct == 3) {

if (x + 6 * size >= et.x

&& x + 6 * size <= et.x + 6 * size && y >= et.y

&& y <= et.y + 4 * size)

return true;

if (x + 6 * size >= et.x

&& x + 6 * size <= et.x + 6 * size

&& y + 4 * size >= et.y

&& y + 4 * size <= et.y + 4 * size)

return true;

}

break;

case 2:// 方向向下,判断左下角和右下角顶点是否在另一两坦克内if (et.direct == 0 || et.direct == 2) {

if (x >= et.x && x <= et.x + 4 * size

&& y + 6 * size >= et.y

&& y + 6 * size <= et.y + 6 * size)

return true;

if (x + 4 * size >= et.x

&& x + 4 * size <= et.x + 4 * size

&& y + 6 * size >= et.y

&& y + 6 * size <= et.y + 6 * size)

return true;

}

if (et.direct == 1 || et.direct == 3) {

if (x >= et.x && x <= et.x + 6 * size

&& y + 6 * size >= et.y

&& y + 6 * size <= et.y + 4 * size)

return true;

if (x + 4 * size >= et.x

&& x + 4 * size <= et.x + 6 * size

&& y + 6 * size >= et.y

&& y + 6 * size <= et.y + 4 * size)

return true;

}

break;

case 3:// 方向向左,判断左上角和左下角顶点是否在另一两坦克内if (et.direct == 0 || et.direct == 2) {

if (x >= et.x && x <= et.x + 4 * size && y >= et.y

&& y <= et.y + 6 * size)

return true;

if (x >= et.x && x <= et.x + 4 * size

&& y + 4 * size >= et.y

&& y + 4 * size <= et.y + 6 * size)

return true;

}

if (et.direct == 1 || et.direct == 3) {

if (x >= et.x && x <= et.x + 6 * size && y >= et.y

&& y <= et.y + 4 * size)

return true;

if (x >= et.x && x <= et.x + 6 * size

&& y + 4 * size >= et.y

&& y + 4 * size <= et.y + 4 * size)

return true;

}

break;

}

}

}

return false;

}

4、敌人的坦克不能与我的坦克重叠

在EnemyTank类中添加一个方法isTouchMyTank()用于判断敌人坦克与我的坦克是否相遇。

// isTouchMyTank()用于判断敌人坦克是否与我的坦克相碰

public boolean isTouchMyTank() {

switch (this.direct) {

case 0:// 方向向上,判断左上角和右上角顶点是否在另一两坦克内

if (mt.getDirect() == 0 || mt.getDirect() == 2) {

if (x >= mt.getX() && x <= mt.getX() + 4 * size

&& y >= mt.getY() && y <= mt.getY() + 6 * size)

return true;

if (x + 4 * size >= mt.getX()

&& x + 4 * size <= mt.getX() + 4 * size

&& y >= mt.getY() && y <= mt.getY() + 6 * size)

return true;

}

if (mt.getDirect() == 1 || mt.getDirect() == 3) {

if (x >= mt.getX() && x <= mt.getX() + 6 * size

&& y >= mt.getY() && y <= mt.getY() + 4 * size)

return true;

if (x + 4 * size >= mt.getX()

&& x + 4 * size <= mt.getX() + 6 * size

&& y >= mt.getY() && y <= mt.getY() + 4 * size)

return true;

}

break;

case 1:// 方向向右,判断右上角和右下角顶点是否在另一两坦克内

if (mt.getDirect() == 0 || mt.getDirect() == 2) {

if (x + 6 * size >= mt.getX()

&& x + 6 * size <= mt.getX() + 4 * size

&& y >= mt.getY() && y <= mt.getY() + 6 * size) return true;

if (x + 6 * size >= mt.getX()

&& x + 6 * size <= mt.getX() + 4 * size

&& y + 4 * size >= mt.getY()

&& y + 4 * size <= mt.getY() + 6 * size)

return true;

}

if (mt.getDirect() == 1 || mt.getDirect() == 3) {

if (x + 6 * size >= mt.getX()

&& x + 6 * size <= mt.getX() + 6 * size

&& y >= mt.getY() && y <= mt.getY() + 4 * size) return true;

if (x + 6 * size >= mt.getX()

&& x + 6 * size <= mt.getX() + 6 * size

&& y + 4 * size >= mt.getY()

&& y + 4 * size <= mt.getY() + 4 * size)

return true;

}

break;

case 2:// 方向向下,判断左下角和右下角顶点是否在另一两坦克内if (mt.getDirect() == 0 || mt.getDirect() == 2) {

if (x >= mt.getX() && x <= mt.getX() + 4 * size

&& y + 6 * size >= mt.getY()

&& y + 6 * size <= mt.getY() + 6 * size)

return true;

if (x + 4 * size >= mt.getX()

&& x + 4 * size <= mt.getX() + 4 * size

&& y + 6 * size >= mt.getY()

&& y + 6 * size <= mt.getY() + 6 * size)

return true;

}

if (mt.getDirect() == 1 || mt.getDirect() == 3) {

if (x >= mt.getX() && x <= mt.getX() + 6 * size

&& y + 6 * size >= mt.getY()

&& y + 6 * size <= mt.getY() + 4 * size)

return true;

if (x + 4 * size >= mt.getX()

&& x + 4 * size <= mt.getX() + 6 * size

&& y + 6 * size >= mt.getY()

&& y + 6 * size <= mt.getY() + 4 * size)

韩顺平java坦克大战1.0版本_源代码

/**画坦克1.0 */ import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; import javax.swing.JPanel; public class MyTankGame extends JFrame { MyPanel mp=null; public static void main(String[] args) { MyTankGame mtk=new MyTankGame(); } public MyTankGame() { mp=new MyPanel(); this.add(mp);//把面板加入窗体 //注册监听 this.addMouseListener(mp); this.addKeyListener(mp); this.addMouseMotionListener(mp); this.addWindowListener(mp); this.setTitle("坦克大战");//窗体标题 this.setSize(600,400);//大小,宽,高(像素) this.setLocation(300,300);//显示位置。左边距,上边距 //禁止用户改变窗口大小 this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);//显示 } } //我的面板 class MyPanel extends JPanel implements

坦克大战 实验报告

本科实验报告 课程名称:Java语言程序设计 实验项目:TankWar 实验地点:致远楼B403 专业班级:软件工程1219 学号:2012005496 学生姓名:柴丁方 指导教师:任少斌 2014年 1 月7 日

import java.awt.*; import java.awt.event.*; public class TankWarClient extends Frame { //构造游戏开始的界面 public void KaiShiJieMian() { this.setLocation(400,200); //游戏窗口的左上点在屏幕的位置 this.setSize(800, 600);//游戏窗口的尺寸 //使按窗口的“X”时,可以关闭程序

较上一次实验添加的代码段为: public void paint (Graphics g) { Color c = g.getColor();//color类是 java。awt 中的,因此可以直接 color c g.setColor(Color.green);// 类 java.awt.Graphics 中的方法,将此图形上下文的当前颜色设置为指定颜色。 g.fillOval(50, 50, 30, 30);//int x, int y,int width,int height,分别为坐标与椭圆的长宽 g.setColor(c); }

变更2: 较上一次实验添加的代码段为: 1.更改如下代码段中的“常量值”为“x”“y”,使所填充的椭圆位置可以随值改变,为静态的图形动起来打下了基础。 static int x=50,y=50;

项目坦克大战设计报告

《JA V A程序开发课程设计》项目设计 项目名称:TankWar 软件 专业:软件工程班级:13软工1班姓名:毛晨光学号:24 一、需求分析: 基本功能: 1.玩家控制的坦克能够四处移动并且打击敌方坦克; 2.敌方坦克能够随机四处移动并且打击玩家控制的坦克; 3.玩家控制的坦克拥有血量,而敌方坦克没有; 4.坦克受到攻击时血条会缩短; 5.敌方坦克被消灭完之后,提示游戏胜利; 6.用户方坦克被消灭后提示游戏结束; 特色功能: 1.坦克具有图片,不单单只是个圈圈。 2.增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加 血量。 二、系统设计: 类:实现游戏界面地图的初始化。 类:绘制和重绘功能。 :监听用户的键盘输入。 类:实现坦克的初始化,绘制,移动,发射等功能。 :实现敌方坦克的初始化,绘制,移动,发射等功能。 类:实现炮弹的初始化,绘制,移动,攻击功能。 类:实现爆炸的初始化。绘制功能,爆炸效果由绘制半径从小到大再到小的圆实现。 类:包含枚举。 类:用于实现血包的功能。 三、功能实现。 一.绘制地图功能: public class TankMap extends Frame{ tart(); }

制坦克功能:public class Tank { 方坦克的绘制方法 public class EnemyTank extends Tank{ 弹绘制方法public class Shell { ntersects())){

ntersects())){ "hittanks"); (false); =false; Explor ex=new Explor(x-3,y-3,; return true; } } return true; } }

Java语言坦克大战游戏设计(附有代码和图片)

JISHOU UNIVERSITY 本科生毕业设计 题目:基于java语言坦克大战游戏开发作者: 学号: 所属学院:信息科学与工程学院 专业年级: 指导教师:职称: 完成时间: 吉首大学教务处制

目录 基于java语言坦克大战游戏开发 (1) 摘要 (1) Based on the development of Java language Tank Wars Game (2) 第一章游戏简要说明 (3) 第二章开发环境介绍 (4) 2.1 开发环境 (4) 2.2 java语言特点简介 (4) 2.3 Eclipse开发工具的简介 (5) 第三章系统总体设计 (6) 3.1程序功能的总和 (6) 3.2主体模块 (6) 3.3子弹模块 (6) 3.4坦克模块 (7) 3.5 墙模块 (7) 3.6血液模块 (7) 3.7爆炸模块 (8) 第四章游戏详细设计过程 (9) 4.1创建游戏窗口 (9) 4.2改变游戏背景颜色。 (11) 4.3创建坦克 (11) 4.4 让坦克动起来 (12) 4.5改变窗口的大小 (13) 4.6让坦克受控制 (14) 4.7创建一个Tank类 (15) 4.8让坦克向8个方向移动 (16)

4.9修改4.8中所设计的不足 (18) 4.10添加子弹类 (19) 4.11根据己方坦克的位置,打出子弹 (21) 4.12修改坦克停下来不能打出子弹的问题 (21) 4.13让坦克能够打出多发子弹 (23) 4.14解决炮弹不消亡和坦克出界的问题 (23) 4.15增加敌方坦克 (24) 4.16击毙出现的敌方坦克 (25) 4.17加入爆炸效果 (26) 4.18添加多辆敌方坦克 (27) 4.19让敌方坦克智能化 (29) 4.20建立游戏障碍物 (31) 4.21阻止坦克互相穿越 (32) 4.22为我方坦克添加大招和血条 (33) 4.23添加血块 (34) 4.24重新载入敌军或我军坦克 (35) 4.25加入图片 (35) 第五章游戏的可行性测试 (37) 5.1游戏界面介绍 (37) 5.2游戏运行测试 (40) 第六章总结 (43) 参考文献 (44)

funcode C++课程设计坦克大战

课程设计一坦克大战 一、游戏介绍 相信大部分同学都玩过或看过“坦克大战”这款经典游戏。现在,就由我们自己动手来开发它。只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。 二、实验目标 综合运用C++及其面向对象的知识开发一款小游戏。 三、实验内容 在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。游戏的具体要求如下: 1、游戏有一个初始页面,如下图。 2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。 3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。 4、敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。 5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。 游戏开始前 进入游戏

四、游戏的整体框架 五、实验指南 实验准备 打开FunCode,创建一个新的C++项目。注意:项目名称必须为英文和数字,且不能有空格。 点击“项目”→“导入地图模板”,从对话框中选取名称为TankWar的模板导入。导入成功后,界面如下: 实验一游戏开始 【实验内容】 1、设置游戏标题 2、按空格键,提示图片消失,游戏进入开始状态. 【实验运行结果】 游戏开始前 按下空格键后 【实验思路】

按下空格键是键盘按下事件,可在CSystem::OnKeyDown函数中编写响应代码。为了保证程序结构的清晰、一致,更好的办法是在CGameMain类中添加一个相应的键盘按下事件处理函数,然后在CSystem::OnMouseClick函数中进行调用。 g_GameMain是CGameMain类的对象,它是全局变量,在程序运行时最先被创建。【实验指导】 1、C++程序的执行入口是主函数。FunCode的主函数名称叫WinMain,写在Main.cpp 文件中。CSystem::SetWindowTitle是设置程序运行窗口标题的函数,修改如下:CSystem::SetWindowTitle("坦克大战"); 2、参考CSystem::OnKeyDown函数,为CGameMain类创建一个OnKeyDown函数。 CGameMain类的头文件是LessonX.h文件,实现代码写在LessonX.cpp文件中。因此,先在LessonX.h文件对函数进行声明。函数的返回值和参数列表都与 CSystem::OnKeyDown函数保持一致。访问权限应该是public。代码如下: voidOnKeyDown(constintiKey,constboolbAltPress,constboolbShiftPress,cons tboolbCtrlPress); 3、接着,在Lesson.cpp文件中对该函数进行定义: voidCGameMain::OnKeyDown(constintiKey,constboolbAltPress,constboolbShif tPress,constboolbCtrlPress) { }

java开发坦克大战

j a v a开发坦克大战 IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】

坦克大战游戏演示为什么选择这个项目 1、好玩 2、涉及到java各个方面的技术 1、java面向对象编程; 2、界面编程; 3、绘图技术; 4、多线程; 5、文件i/o操作; 6、数据库 3、巩固旧知识,学习新知识 java绘图坐标体系 绘图坐标本系--介绍 坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在java的坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点X个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点Y个像素。 坐标体系--像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。 绘图原理(1)[] Component类提供了两个和绘图相关最重要的方法: 1、paint(Graphicsg)绘制组件的外观 2、repaint()刷新组件的外观

当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件 .*; .*; publicclassWindow013extendsJFrame{ ; 7、画字符串drawString(Stringstr,intx,inty); 8、设置画笔的字体setFont(Fontfont); 9、设置画笔的颜色setColor(Colorc); ; .*; publicclassWindow014extendsJFrame{ ; .*; publicclassWindow015extendsJFrame{ ; .*; import publicclassWindow016extendsJFrameimplementsActionListener{ quals("黑色")){ 点击了黑色按钮"); ; }elseif().equals("红色")){ 点击了红色按钮"); ; }else{ 不知道"); } } } classCatimplementsActionListener{ publicvoidactionPerformed(ActionEventarg0){ if().equals("黑色")){ 也知道你按下了黑色按钮");

java坦克大战毕业设计论文

基于J2SE的网络版坦克大战游戏设计 摘要 [摘要]:J2SE (Java 2 Standard Edition)就是Java2的标准版,主要用于桌面应用软件的编程,是伴随着计算机技术的飞速发展而诞生的一项新的开发技术。随着个人电脑的日益普及、Java 功能在个人电脑上的实现,Java应用程序产生的单机增值服务逐渐体现出其影响力,对丰富人们的生活内容、愉悦身心、开发智力等起着不可忽视的作用。该论文通过总结和分析JA V A 游戏的开发流程和代码框架的设计,开发了一款基于J2SE架构的游戏——坦克大战。本设计采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单。在开始游戏后,启动服务器和客户端,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中,随屏幕刷新的频率而移动。坦克将在游戏开始时进行初始化,然后将坦克绘制在地图的上层。本设计主要实现的功能是让坦克能向八个方向移动,并且打出炮弹,子弹击中敌人坦克,子弹和敌人坦克同时消失,产生爆炸,CPU坦克能智能的移动并且打出炮弹。能够支持网络对战和单机对战两种模式。 Java良好的跨平台特性在软件的开发中显示出了巨大的威力,“一次编写,随处运行”,java 系统可以运行在不同的操作系统和硬件上。随着linux的持续增长以及MacOSX完全支持java 技术,跨平台的特性变得越来越有分量。 由于免费、跨平台、java语言本身技术先进,在高校中,java已经成为许多学科研究、课程和计算的首选语言,用java做上机作业,一般都是鼓励的。据我所知,北大、清华许多院系的研究生入学考试都可以用java语言答题。实际上,用java来完成这些工作,大多数情况下要比用C或其他语言简洁得多,你可以把注意力集中在算法等核心部分,从而获得更高分数。 [关键词] 面向对象坦克大战游戏J2SE Socket

java开发坦克大战

坦克大战游戏演示 为什么选择这个项目 1、好玩 2、涉及到java各个方面的技术 1、java面向对象编程; 2、界面编程; 3、绘图技术; 4、多线程; 5、文件i/o操作; 6、数据库 3、巩固旧知识,学习新知识 java绘图坐标体系 绘图坐标本系--介绍 坐标原点位于左上角,以像素为单位。像素是计算机屏幕上最小的显示单位。在java 的坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点X个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点Y个像素。 坐标体系--像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800×600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,而厘米是长度单位,两者无法比较。 绘图原理(1)[Window013.java] Component类提供了两个和绘图相关最重要的方法: 1、paint(Graphics g)绘制组件的外观 2、repaint()刷新组件的外观 当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件 import java.awt.*; import javax.swing.*; public class Window013 extends JFrame{ //定义组件 MyPanel mp=null; public static void main(String[] args) { Window013 th=new Window013();

《面向对象的编程技术》课程设计实验报告

《面向对象的编程技术》课程设计实验报告 系计算机科学与技术 班级计114 姓名石险峰 学号119074122 指导教师胡增涛 计算机学院 2012年12月

一.应用程序的名称 设计:“坦克大战” (1)参考(《PC游戏编程(窥门篇)》谭文洪著)中的“坦克大战”(TankWar工程),并对其进行完善、扩充,程序要能看出专业水平和商业化产品的效果。 (2)要求:修改案例中“子弹可以穿透石头墙”的错误;增加上帝模式(无敌);修改一种敌军坦克,使之威力更大(要求坦克画面采用学生自己的头像)(需要重新编译资源包;之所以“改”而不是“增”,是因为同学们无法修改地图编辑器,另一个办法是在程序运行后动态加入);回答“坦克大战”指导书.doc(或pdf)和TankWar剖析.doc(或pdf)中带有蓝色《….?》标记的问题。 二.应用程序的设计目的 面向对象的编程技术》课程设计是一门独立开设的实验课程,旨在进一步强化学生对类、封装、继承、多态等面向对象基本概念的理解和OOP(面向对象编程)实际动手能力,并进一步拓展到OOD(面向对象设计)原则、技巧和初步的OOA(面向对象分析)方法。 在中国,电子游戏曾一度被大家斥为“电子海洛因”。然而电子游戏在青年学生中大受欢迎却又是一个不争的事实。正如水能载舟,亦能覆舟一样,任何事物都有其两面性。与其千方百计地封堵,还不如让同学们从技术的角度来研究它,这样既可以掌握复杂系统的设计技巧,也可以破除对电子游戏的神秘感。我相信,一个人如果自己能制作游戏,如果能清楚地知道那个绚丽多彩的虚拟世界背后无非就是一些类、变量、函数的话,他就不可能再沉迷于打游戏———与一堆对象、内存变量和函数较劲。同时,从技术上讲,游戏程序的开发异常复杂,能充分体现面向对象的拟人化思想和面向对象设计技巧。通过游戏程序的制作,可以帮助学生真正掌握面向对象程序设计的精髓。 三.应用程序简介 设计目的:C++电脑游戏开发:侧重利用面向对象的拟人化思想解决复杂问题和OOD技巧; 运行环境: 1.本设计采用Microsoft Visual C++6.0编译,并能够在WIN98,WIN2000下运行 2.游戏基于Windows Game Engine(WGE游戏引擎,添翼虎科技)(没提供源程序,不过不用担心,你可以把它看成是利用DirectX快速处理图片、声音、键鼠的类库) ,该引擎需要DirectX7.0 SDK支持(仅有Runtime运行库不够,必须包含开发语言需要的Header&Libs 头文件和库文件) 功能介绍: ○1修改案例中“子弹可以穿透石头墙”而且增加了敌军坦克子弹不能穿过 箱子:无论是敌军坦克还是玩家坦克的子弹都不能穿过石头,敌军坦克子弹不能透过箱子,一旦它们相碰撞子弹会自动销毁。 ○2增加上帝模式(无敌):玩家1通过按F1键变为上帝模式,再按一次,还原,一旦玩家进入上帝模式,敌军坦克的子弹对玩家坦克没任何损伤。 ○3修改火坦克的性能,使之威力更大,并且将该敌军坦克改为其他图像,通过更改火坦克的一些属性,使火坦克的子弹射程、威力,坦克的移动速

坦克大战课程设计论文

坦克大战游戏设计 1.课程设计的目的 随着手机的日益普及,java功能在移动设备上的实现及java 应用程序产生的影响力,对丰富人们的生活内容,提供便捷的咨询起着不可忽视的作用。本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。本项目重点运用了图形化用户界面GUI,Thread多线程的有关知识,其中涉及了绘图工具的运用,事件处理操作以及图形的碰撞检测等知识点。通过此课程设计,使学生巩固所学知识、培养学生动手能力,了解Java的面向对象的体系结构。学生用Java语言设计一个完整的应用程序,综合应用所学知识完成软件的分析、设计、调试和总结,提高学生对Java语言的综合应用能力和解决问题的能力。 2.设计方案论证 2.1设计思路 本项目介绍了坦克大战的基本构建方法、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse3.2环境下编程。 一、游戏基本元素:坦克,炮管,子弹,墙壁,地雷 二、它的主要功能: (1)能够朝四个方向移动:上、下、左、右键。 (2) 按下鼠标左键发射普通子弹;按下鼠标右键发射散弹;子 弹爆炸的效果,普通子弹和炮弹的效果 (3)敌人能够移动

(4)能够模拟爆炸 (5)能够产生障碍 (6)能够增长生命 玩家控制主坦克(上方有血条的)的移动以及炮弹的发射。若玩家将敌方坦克全部打掉则玩家胜;若期间由玩家控制的主坦克被打掉则视为玩家失败。游戏中只有普通墙作为障碍物,玩家无法穿越它们并且普通子弹不能将墙打穿 ;但是玩家可以用炮弹将普通墙打掉。桃心可以将坦克的血加满。 2.2简要的设计流程: 键盘监听器 2.2设计方法 2.2.1构建游戏主类

毕业设计论文 基于J2ME的Java游戏--坦克大战的开发

目录 摘要 ................................................................................................................... - I - Abstract .................................................................................................................... - I - 引言 ...................................................................................................................... II 第一章绪论 .................................................................................................... - 1 - 1.1 手机软件现状.......................................................................................... - 1 - 1.2 游戏业务及J2ME概况............................................................................ - 1 - 1.3 任天堂(Nintendo)的8位FC机器和Battle City背景介绍............ - 3 - 1.4 本章小结.................................................................................................. - 3 - 第二章开发环境及相关技术的介绍 ................................................................ - 5 - 2.1 开发环境.................................................................................................. - 5 - 2.2 Java语言的特点..................................................................................... - 5 - 2.3 关于JBuilder9....................................................................................... - 5 - 2.4 关于Wireless Tool Kit....................................................................... - 6 - 2.5 Java Appication Manager.................................................................... - 6 - 2.6 本章小结.................................................................................................. - 6 - 第三章程序结构、思想和相关技术 ................................................................ - 7 - 3.1 本程序需解决的有关技术问题.............................................................. - 7 - 3.2 程序流程.................................................................................................. - 8 - 3.3 绘图与MIDP2.0新增的GameCanvas包.............................................. - 10 - 3.3.1 提供低级绘制的Canvas类....................................................... - 10 - 3.3.2 Graphics类................................................................................ - 10 - 3.3.3 PNG格式...................................................................................... - 10 - 3.3.4 Game包中的新功能.................................................................... - 11 - 3.3.5 有关绘图的一些技术................................................................. - 12 - 3.4 坦克的控制和敌方的智能运行............................................................ - 12 - 3.5 子弹的运行和控制................................................................................ - 13 - 3.6 RMS数据库系统..................................................................................... - 14 - 3.7 内存使用的最佳化................................................................................ - 15 - 3.8 混淆器(Obfuscator)的使用................................................................ - 16 - 3.9 模拟器的相关调试................................................................................ - 16 - 3.10 本章小结.............................................................................................. - 17 - 第四章程序分析和具体实现 .............................................................................. - 18 - 4.1 游戏进入前的选择................................................................................ - 18 - 4.2 主游戏逻辑及其涉及到的若干类........................................................ - 19 - 4.3 坦克的共同行为.................................................................................... - 21 - 4.4 玩家坦克的功能属性............................................................................ - 22 - 4.5 敌人坦克的功能属性............................................................................ - 22 - 4.6 子弹的运行和控制................................................................................ - 24 - 4.7 记分系统................................................................................................ - 25 -

程序设计实训坦克大战实验报告材料

程序设计实训报告 坦克大战 专业班级:装控1401 实习时间:2015年7月10日至7月14日实习地点:微401 成员 1:赵振华 成员 2:许晨欢 成员 3:蒋绪涛

一、作品概述 1.1 创新点: 1、自定义并命名树林和钢板精灵,设置树林属性为不接受碰撞可以自由穿梭,钢板为接受任何碰撞但不做任何处理(即子弹和坦克均不能摧毁钢板)。 2、添加坦克发炮、击中目标和坦克移动的特殊声效。 1.2 概述: 这款游戏是我们QWER小组以经典90版坦克大战为背景制作的坦克大战的改编款,玩家通过控制坦克摧毁敌方坦克来保卫主基地不被摧毁。当敌我双方坦克相碰或己方基地被子弹摧毁时游戏结束(敌我双方子弹均可摧毁基地),每隔3秒钟出现一辆敌方坦克,游戏最大时长为100秒。此款游戏与经典90版坦克大战较为相似,操作简单,能唤起我们对童年的回忆。 二、功能设计 玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中或与敌方坦克相撞、玩家指挥部被击中或游戏时间到,一局游戏结束。 按下空格键后游戏开始,“空格开始”消失,载入地图,100秒倒计时开始,并把玩家坦克设置在指挥部左侧。 游戏时间到,玩家坦克被敌方坦克摧毁,与敌方坦克相撞,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。 玩家用W、A、S、D键控制坦克上、下、左、右运行,按J键开炮。坦克行进过程中有特殊声效,坦克发射或击中目标都有相应的声效。玩家坦克碰到墙和钢板就停下来,需要调转方向才能继续前进。玩家坦克开炮,一炮就能摧毁一块墙或者一辆敌方坦克,但不能摧毁钢板,玩家可穿梭于树林中。玩家每摧毁一辆敌方坦克,加1分。 玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。 每隔3秒钟,就会产生一辆敌方坦克。敌方坦克每隔一段时间,就自动开炮。敌方坦克遇到墙就会停下来。停下来的坦克,前方的墙如果被摧毁了,又能继续前进。每隔几秒钟,敌方坦克就会顺时针变换一个方向前进。每局最大时长为100秒。

项目-坦克大战-设计报告

《JAVA程序开发课程设计》项目设计 项目名称:TankWar 软件 专业:软件工程班级:13软工1班姓名:毛晨光学号:1322120124 一、需求分析: 基本功能: 1.玩家控制的坦克能够四处移动并且打击敌方坦克; 2.敌方坦克能够随机四处移动并且打击玩家控制的坦克; 3.玩家控制的坦克拥有血量,而敌方坦克没有; 4.坦克受到攻击时血条会缩短; 5.敌方坦克被消灭完之后,提示游戏胜利; 6.用户方坦克被消灭后提示游戏结束; 特色功能: 1.坦克具有图片,不单单只是个圈圈。 2.增加了血包功能,地图上会随机出现一个血包,我方坦克开过会增加 血量。 二、系统设计: 1.TankMap类:实现游戏界面地图的初始化。 2.PainTread类:绘制和重绘功能。 3.DirectionHandler:监听用户的键盘输入。

4.Tank类:实现坦克的初始化,绘制,移动,发射等功能。 5.EnemyTank:实现敌方坦克的初始化,绘制,移动,发射等功能。 6.Shell类:实现炮弹的初始化,绘制,移动,攻击功能。 7.Explor类:实现爆炸的初始化。绘制功能,爆炸效果由绘制半径从小到 大再到小的圆实现。 8.Direction类:包含枚举。 9.Blood类:用于实现血包的功能。 三、功能实现。 一.绘制地图功能: public class TankMap extends Frame{ //定义地图的尺寸。 public static final int MAPWIDTH=800; public static final int MAPHEIGHT=600; //我方坦克 Tank t=null; //定义随机出现的血包 Random r=new Random(); Image bufferImage=null; public static java.util.Listshells=new ArrayList(); //地方坦克集合 public static java.util.List-> enemys=new ArrayList();

基于Java的网络版坦克大战游戏设计_毕业设计

伊犁师范学院 本科生毕业论文(设计) 论文题目:基于Java的网络版坦克大战游戏设计

基于Java的网络版坦克大战游戏设计 (伊犁师范学院计算机科学系06-2班,新疆伊宁市 835000) 摘要:本设计采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单。在开始游戏后,启动服务器和客户端,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。用户控制的坦克运行在主线程中,随屏幕刷新的频率而移动。坦克将在游戏开始时进行初始化,然后将坦克绘制在地图的上层。本设计主要实现的功能是让坦克移动并能够智能的打出炮弹,躲避子弹,炸毁对方坦克。能够支持网络对战和单机对战两种模式。 关键词:面向对象;坦克大战;网络游戏;Java;Socket 类 中图分类号:TP311.1 目录

摘要 ......................................................................... 第1章前言.. (1) 1.1游戏设计的需求分析 (1) 1.1.1国内外电子网络游戏的现状 (1) 1.1.2本系统的现实意义 (1) 1.1.3本系统和其他开发游戏区别 (2) 1.2开发技术概述 (2) 1.2.1J AVA、C语言、C++三种主流编程技术比较 (2) 1.3本章小结 (2) 第2章相关技术理论 (3) 2.1系统运行环境 (3) 2.1.1系统运行的软件环境 (3) 2.1.2系统运行的硬件环境 (3) 2.2相关理论 (3) 2.2.1关于E CLIPSE的介绍 (3) 2.2.2J2SE框架 (3) 2.2.3联机通信机制 (4) 2.2.4J AVA图形编程 (5) 2.3本章小结 (5) 第3章系统设计 (5) 3.1系统可行性分析 (6) 3.1.1技术可行性 (6) 3.1.2经济可行性 (6) 3.1.3操作可行性 (6) 3.2系统需求分析 (6) 3.2.1在人机对战模式下实现的功能 (6) 3.2.2在网络对战模式下实现的功能 (6) 3.3系统功能设计 (6) 3.3.1坦克大战总体功能设计 (7)

坦克大战java源代码

有些图片路径会出错要注意package com.tankgame; import java.util.Vector; //坦克类 class Tank { int x=0; int y=0; int color=0; int speed=1; int direct=0; boolean isLive=true; 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 getDirect() { return direct; } public void setDirect(int direct) { this.direct = direct;

} public int getColor() { return color; } public void setColor(int color) { this.color = color; } } //我的坦克 class Hero extends Tank { Shot shot=null; Vector shotm=new V ector(); public Hero(int x,int y) { super(x,y); this.color=5; } //坦克具有一个打击敌人的方法 public void shotenemy(int x,int y,int direct) { switch(direct) { case 0: shot=new Shot(this.x+10,this.y,0); shotm.add(shot); break; case 1: shot=new Shot(this.x+30,this.y+10,1); shotm.add(shot); break; case 2: shot=new Shot(this.x+10,this.y+30,2); shotm.add(shot); break; case 3: shot=new Shot(this.x,this.y+10,3); shotm.add(shot);

坦克大战系统《Java程序开发实训》综合实训报告

《Java程序开发实训》综合实训报告 题目:坦克大战系统 姓名:方庆 学号:2010203206 班级:10软件(2)班

一、系统实现的主要功能及运行结果截图 选择的语言的原因 游戏本身是一种娱乐方式,带给人无尽的乐趣,而且游戏行业的发展也将是带动周边行业的发展。同样对做出游戏的人的要求也会越来越高一满足游戏爱好者的要求。本次期末设计就是设计一种娱乐性较强的小游戏坦克大战,说到大战其实是不敢当的。但游戏基本拥有可玩性。java语言是一种跨平台,适合与分布计算环境的面向对象编程语言,java主要用在web开发,手机游戏及一些平台游戏的开发,他有很好的跨平台性。所以本次的设计坦克游戏选择的是java。 系统软件的软件环境 1.网络服务器操作系统:Window是 XP以上 2.开发工具:Eclipse 3运行环境:J2sdk 4.编程语言:java语言。 人机对战模式功能 1.能够发射子弹打击敌人 2.敌人能够移动 3.能够模拟爆炸 4.能够产生障碍 5能够增长生命6.能够使用超级子弹 坦克可以发射子弹

玩家坦克被击中血量减少。 被击中的坦克发生爆炸并且吃血块可以加血量。

玩家坦克可以从把方向发射超级子弹 自己的TankHealth为<=0时,。说明玩家坦克已死亡。游戏结束

本系统的坦克大战是基于java语言设计的开发,具有较高的人工智能和相对的图形处理。游戏可一人作战每次电脑方有10辆坦克, 此一举消灭全部的敌方坦克为目的。在这过程中坦克有机会得到血块来添加自己的生命值。从而变得强大。也利用wall来形成阻击敌人。 游戏拥有开挂的功能。可以穿过墙体来攻击敌方坦克。还给玩家坦克 置了超级炮弹。从八个方向同时射出炮弹来摧毁敌方坦克。主要功能 简单罗列如下: 1.屏幕左上方显示游戏的状态,当玩家方坦克全数为0是游戏结束 2.敌方坦克只在空地上行走,不可通过Wall 3.游戏打坏敌方坦克后,可随机位置随机出现血块奖励。坦克经过该 位置可获得相应的生命值加成。 4.玩家坦克的游戏资格和电脑坦克不同。 TankClient类设计流程 游戏系统类关联图

相关主题
文本预览
相关文档 最新文档