📄 gameplayer.java~63~
字号:
package GameClient;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.net.*;
import java.io.*;
import java.util.*;
class TankInfor //用于保存敌人的坦克信息,包括当前坐标和行进方向
{
int x;
int y;
int dir; //方向,1--向上,2--向下,3--向左,4--向右
int bomb; //是否放炮,1--YES
public TankInfor(int x, int y, int dir, int bomb)
{
this.x = x;
this.y = y;
this.dir = dir;
this.bomb = bomb;
}
}
class BombInfor //用于保存炮弹信息;
{
int x;
int y;
int dir;
public BombInfor(int x, int y, int dir)
{
this.x = x;
this.y = y;
this.dir = dir;
}
}
class MyTank //用于保存自己坦克的资料
{
int x;
int y;
int dir;
int bombRemainder; //自己所剩炮弹数,初始为MYBOMBTOTAL=20,当炮弹用尽而还没有完全消灭敌人时为输
public MyTank(int x, int y, int dir, int bombRemainder)
{
this.x = x;
this.y = y;
this.dir = dir;
this.bombRemainder = bombRemainder;
}
}
class Message implements Serializable //用于玩家程序与验证程序之间的消息通信类
{
String m1;
String m2;
int m3;
}
public class GamePlayer extends JApplet implements ActionListener
{
String userName;
String userPass;
ObjectOutputStream oos;
ObjectInputStream ois;
JLabel lUser;
JTextField tfName;
JLabel lPass;
JPasswordField pfPass;
JButton btLogin;
JButton btReset;
JPanel mPanel;
AudioClip acBack;
AudioClip acExplode;
AudioClip acGun;
AudioClip acCollide;
int paintStage=0;
final int TANKWIDTH = 28, TANKHEIGHT = 28; //敌人坦克的宽度和高度
final int GAMEX = 15, GAMEY = 15, GAMEWIDTH = 500, GAMEHEIGHT = 500;//坦克的起始位置,游戏界面的大小
final int MYTANKWIDTH=25, MYTANKHEIGHT=25; //我方坦克的宽度和高度
final int DIRUP=1, DIRDOWN=2, DIRLEFT=3, DIRRIGHT=4;
final int MYBOMBTOTAL = 20;
Image tank1, tank2, tank3, tank4; //敌人的四个行进方向的坦克;
Image myTank1,myTank2,myTank3,myTank4; //自己的四个行进方向的坦克;
Image bomb; //炮弹图片
Image tankExa;
Vector tankGroup; //保存敌人的敌人的坦克信息
Vector bombGroup; //保存敌人打炮信息;
MyTank me; //自己的坦克信息
Vector myBomb; //自己打出去的炮弹;
int score = 0;
int level = 1;
String messageFromServer = "不要沉迷游戏";
boolean gameOver = false;
boolean victory = false;
public void init()
{
paintStage=0;
//建立需要的坦克图片
tank1 = this.getImage(this.getCodeBase(),"tankaru.jpg");
tank2 = this.getImage(this.getCodeBase(),"tankard.jpg");
tank3 = this.getImage(this.getCodeBase(),"tankarl.jpg");
tank4 = this.getImage(this.getCodeBase(),"tankarr.jpg");
myTank1 = this.getImage(this.getCodeBase(),"tankmeu.jpg");
myTank2 = this.getImage(this.getCodeBase(),"tankmed.jpg");
myTank3 = this.getImage(this.getCodeBase(),"tankmel.jpg");
myTank4 = this.getImage(this.getCodeBase(),"tankmer.jpg");
bomb = this.getImage(this.getCodeBase(),"bomb.jpg");
tankExa = this.getImage(this.getCodeBase(),"tank2.jpg");
//建立需要的各种声音
acBack = this.getAudioClip(this.getCodeBase(), "bgr.au");
acExplode = this.getAudioClip(this.getCodeBase(), "explode.au");
acGun = this.getAudioClip(this.getCodeBase(), "pgun.au");
acCollide = this.getAudioClip(this.getCodeBase(), "collide.au");
//以下为建立第一登录界面
mPanel = (JPanel)this.getContentPane();
mPanel.setLayout(null);
lUser = new JLabel("UserName :");
lUser.setBounds(10,10,100,20);
tfName = new JTextField(10);
tfName.setBounds(100, 10, 160, 20);
lPass = new JLabel("PassWord :");
lPass.setBounds(10, 40, 100, 20);
pfPass = new JPasswordField(10);
pfPass.setBounds(100, 40, 160, 20);
btLogin = new JButton("Login");
btLogin.setBounds(40, 90, 80, 20);
btLogin.addActionListener(this);
btReset = new JButton("Reset");
btReset.setBounds(130, 90, 80, 20);
btReset.addActionListener(this);
mPanel.add(lUser);
mPanel.add(tfName);
mPanel.add(lPass);
mPanel.add(pfPass);
mPanel.add(btLogin);
mPanel.add(btReset);
//建立敌人坦克资料
//因为初始为1级,在1级时,只有3辆敌人坦克,2级时,有4辆敌人坦克,依此类推
tankGroup = new Vector(8);
tankGroup.addElement(new TankInfor(30, 15, 4, 0));
tankGroup.addElement(new TankInfor(250, 15, 4, 0));
tankGroup.addElement(new TankInfor(470, 15, 4, 0));
bombGroup = new Vector(10);
me = new MyTank(GAMEX+GAMEWIDTH/2,GAMEY+GAMEHEIGHT-MYTANKHEIGHT,1,MYBOMBTOTAL);
myBomb = new Vector(10);
}
public void start()
{
acBack.loop();
}
public void stop()
{
acBack.stop();
}
public void actionPerformed(ActionEvent e)
{
//处理对登录界面按钮的点击
if (e.getSource() == btLogin)
{
/*
try
{
Socket cs = new Socket("127.0.0.1", 10000);
oos = new ObjectOutputStream(cs.getOutputStream());
ois = new ObjectInputStream(cs.getInputStream());
//向验证程序发信息,请求验证用户身份
Message u = new Message();
u.m1 = tfName.getText();
u.m2 = String.valueOf(pfPass.getPassword());
oos.writeObject(u);
Message tu = (Message)ois.readObject();
if (tu.m1.equalsIgnoreCase(new String("OK")))
{
*/
//若为合法用户,则出现游戏界面
gameScreen();
//消息监听线程序:时刻监听从验证来的信息
//MsgReceiver th = new MsgReceiver(ois);
//th.start();
//随机改变敌人坦克的位置和方向,并移动敌人打出的和我方已经打出的炮弹
RandomTank rt = new RandomTank();
rt.start();
/*
}
else //在信息栏或出现一个对话框提示玩家用户名/密码部队
{
//学生自己编写此处代码
}
}
catch(Exception e1)
{
e1.printStackTrace();
}
*/
}
else
{
tfName.setText("");
pfPass.setText("");
}
}
//出现游戏界面
public void gameScreen()
{
paintStage = 1;
mPanel.removeAll();
this.addKeyListener(new KeyHandler()); //设置键盘监听
this.dispatchEvent(new FocusEvent(this, FocusEvent.FOCUS_GAINED, true));
this.requestFocusInWindow(); //设置该APPLET得到程序焦点,因此才可以监听键盘事件
this.resize(600,610);
this.repaint();
}
//该线程监听从验证机来的消息
class MsgReceiver extends Thread
{
ObjectInputStream ois;
public MsgReceiver(ObjectInputStream ois)
{
this.ois = ois;
}
public void run()
{
while(!gameOver)
{
try
{
Message tu = (Message)ois.readObject();
messageFromServer = tu.m1;
}
catch(Exception e) {}
}
}
}
//该线程序随机改变敌人坦克的位置和行进方向,并移动敌人和我方已经打出的炮弹
class RandomTank extends Thread
{
Random rm = new Random();
public void run()
{
int i;
while(!gameOver)
{
for (i=0; i<tankGroup.size(); i++) //随机移动敌人的坦克
{
TankInfor ti = (TankInfor)tankGroup.elementAt(i);
ti.dir = rm.nextInt(4)+1;
switch(ti.dir)
{
case DIRUP: //向上
ti.y -= rm.nextInt(10)+10;
if (ti.y < GAMEY)
{
ti.y = GAMEY;
}
break;
case DIRDOWN: //向下
ti.y += rm.nextInt(10)+10;
if (ti.y > GAMEY+GAMEHEIGHT-TANKHEIGHT)
{
ti.y = GAMEY+GAMEHEIGHT-TANKHEIGHT;
}
break;
case DIRLEFT: //向左
ti.x -= rm.nextInt(10)+10;
if (ti.x < GAMEX)
{
ti.x = GAMEX;
}
break;
case DIRRIGHT: //向右
ti.x += rm.nextInt(10)+10;
if (ti.x > GAMEX+GAMEWIDTH-TANKWIDTH)
{
ti.x = GAMEX+GAMEWIDTH-TANKWIDTH;
}
break;
default:
System.out.println("错误的方向");
}
//判断敌人的坦克是否与我方坦克碰撞,若碰撞,游戏结束
gameOver = judgeCollision(ti, me);
if (gameOver) return;
ti.bomb = rm.nextInt(10); //在随机移动敌人坦克的过程中随机打炮
if (ti.bomb == 1)
{
bombGroup.addElement(new BombInfor(ti.x, ti.y, ti.dir));
acGun.play();
}
}
//朝特定的方向移动敌人打出的每个炮弹,
for(i=0; i<bombGroup.size(); i++)
{
BombInfor bi = (BombInfor)bombGroup.elementAt(i);
switch(bi.dir)
{
case DIRUP: //向上
bi.y -= rm.nextInt(10)+20;
if (bi.y < GAMEY)
{
bombGroup.removeElement(bi);
i--;
}
break;
case DIRDOWN: //向下
bi.y += rm.nextInt(10)+20;
if (bi.y > GAMEY+GAMEHEIGHT)
{
bombGroup.removeElement(bi);
i--;
}
break;
case DIRLEFT: //向左
bi.x -= rm.nextInt(10)+20;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -