public Mypanel(){ setSize(352, 352); this.addKeyListener(this); readMap = new ReadMap(); this.map = readMap.getMaps(); this.tempmap=new ReadMap().getMaps(); this.mx = startx; this.my = starty; readmaps(level); requestFocus(); }
时间: 2024-04-04 11:32:57 浏览: 15
这段代码是一个 Mypanel 类的构造方法,用于初始化游戏画面。
在该方法中,设置了 Mypanel 对象的大小为 352x352,并将 KeyListener 监听器添加到该对象中。
接着,创建了一个 ReadMap 对象 readMap,并使用该对象的 getMaps() 方法获取游戏地图的信息,并将该信息存储于 Mypanel 对象的 map 和 tempmap 成员变量中。同时,使用 startx 和 starty 设置了游戏主角的初始位置,并调用 readmaps() 方法读取当前楼层的地图信息。
最后,调用 requestFocus() 方法使 Mypanel 对象获得焦点,以便玩家可以通过键盘进行游戏控制。
相关问题
根据以下代码介绍一下实现的界面 public MyPanel() { //监听键盘事件 this.addKeyListener(this); setSize(600, 600); readFile(level); } Image img11 = GameUtil.getImage("/pic/11.gif"); Image imagetx = GameUtil.getImage("/pic/1.png"); Image imageff = GameUtil.getImage("/pic/004.png"); public void paint(Graphics g) { Image[] maping = SetImage.GetImage(level); super.paint(g); for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { g.drawImage(maping[tempmap[j][i]], i * 30, j * 30, null); } } g.drawImage(img11, 600, 80, null); g.drawImage(imagetx, 620, 550, null); g.drawImage(imagetx, 650, 550, null); g.setColor(new Color(233,150,122)); g.setFont(new Font("幼圆", Font.BOLD, 20)); g.drawString("现在是第" + level + "关", 625, 30); nowlever=level; g.drawString("现在的你,", 605, 220); g.drawString("已经走了:" +nowstep + "步", 605, 240); g.drawString("排行榜", 655, 300); //[排行榜实现 6.22]要有查询操作 返回一个字符数组(排序) g.drawString("第一名:"+id1+" "+"礼物:"+lw1+"步骤"+bz1); order(); for(int i=0;i<sites.size();i++){ g.drawString(sites.get(i),605,330+i*30); } sites.clear(); g.setFont(new Font("幼圆", Font.BOLD, 14)); g.setColor(new Color(255,165,0)); g.drawString("已经得到:" + nowgrift + "分", 605, 260); long usedTimem = (endTime-startTime)/60000; long usedTimes =(endTime-startTime)%60000/1000; Date date = new Date(); g.setColor(new Color(255,140,0)); if(usedTimem>=0||usedTimes>=0) g.drawString("用时:" +usedTimem+ "分钟"+usedTimes+"秒", 605, 280); g.drawString(date.toString(), 600, 590); } //实现排行榜功能取前三名 public void order(){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; conn = JDBCUtils.getConnection(); String sql = "select grift,step,id from user order by grift desc,step asc limit 3 "; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); String s=""; int fc=1; while(rs.next()){ s="第"+fc+"名:"+rs.getNString("id"); sites.add(s); s="得分:"+rs.getInt("grift")+" " +"步数"+rs.getInt("step"); sites.add(s); s=""; fc++; } System.out.println(sites);
这段代码实现了一个界面的绘制功能,继承自Panel类,并且实现了KeyListener接口。以下是对代码的简要介绍:
1. 在构造方法中设置了界面的大小并读取了一个文件。
2. 使用GameUtil的getImage方法加载了三张图片,分别是11.gif、1.png和004.png。
3. 重写了paint方法,在其中绘制了地图和其他的图像和文本信息。
4. 使用双重for循环绘制了地图,根据tempmap数组中的数据选择对应的图像进行绘制。
5. 使用drawImage方法绘制了img11、imagetx和imageff三张图片。
6. 设置了字体颜色和样式,使用drawString方法绘制了一些文本信息,包括当前关卡、已经走的步数、排行榜等。
7. 实现了排行榜功能,在order方法中使用JDBC连接数据库,查询前三名的得分和步数,并将结果存入字符数组sites中。
8. 最后在paint方法中使用drawString方法绘制排行榜信息。
需要注意的是,代码中涉及到一些变量和方法的调用,比如level、tempmap、nowstep、nowgrift等,这些变量和方法的定义部分没有提供,可能在其他文件中定义或实现。同时,代码中还使用了JDBCUtils类来获取数据库连接,需要确保该类的正确性和可用性。
希望以上介绍能对您有所帮助!
java代码实现坦克大战
坦克大战是经典的游戏,以下是一个简单的 Java 代码实现:
```java
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class TankWar extends JFrame {
private static final long serialVersionUID = 1L;
// 窗口大小
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
private MyPanel mp;
public static void main(String[] args) {
new TankWar();
}
public TankWar() {
mp = new MyPanel();
this.add(mp);
this.setTitle("坦克大战");
this.setSize(WIDTH, HEIGHT);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
}
private class MyPanel extends JPanel implements KeyListener {
private static final long serialVersionUID = 1L;
private Tank myTank;
private ArrayList<Tank> enemyTanks;
private ArrayList<Missile> missiles;
private ArrayList<Explode> explodes;
public MyPanel() {
myTank = new Tank(400, 500, true);
enemyTanks = new ArrayList<Tank>();
missiles = new ArrayList<Missile>();
explodes = new ArrayList<Explode>();
for (int i = 0; i < 5; i++) {
enemyTanks.add(new Tank(i * 150, 0, false));
}
this.setFocusable(true);
this.addKeyListener(this);
new Thread(new EnemyTankThread()).start();
new Thread(new MissileThread()).start();
new Thread(new ExplodeThread()).start();
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);
myTank.draw(g);
for (int i = 0; i < enemyTanks.size(); i++) {
enemyTanks.get(i).draw(g);
}
for (int i = 0; i < missiles.size(); i++) {
missiles.get(i).draw(g);
}
for (int i = 0; i < explodes.size(); i++) {
explodes.get(i).draw(g);
}
g.setColor(Color.WHITE);
g.drawString("Missiles: " + missiles.size(), 10, 30);
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
myTank.move(Tank.UP);
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
myTank.move(Tank.DOWN);
} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
myTank.move(Tank.LEFT);
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
myTank.move(Tank.RIGHT);
} else if (e.getKeyCode() == KeyEvent.VK_SPACE) {
missiles.add(myTank.fire());
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
private class EnemyTankThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < enemyTanks.size(); i++) {
enemyTanks.get(i).move((int) (Math.random() * 4));
if (Math.random() < 0.2) {
missiles.add(enemyTanks.get(i).fire());
}
}
repaint();
}
}
}
private class MissileThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < missiles.size(); i++) {
Missile missile = missiles.get(i);
if (missile.isAlive()) {
missile.move();
for (int j = 0; j < enemyTanks.size(); j++) {
Tank enemyTank = enemyTanks.get(j);
if (enemyTank.isAlive() && missile.hit(enemyTank)) {
explodes.add(new Explode(enemyTank.getX(), enemyTank.getY()));
enemyTank.setAlive(false);
missile.setAlive(false);
}
}
if (myTank.isAlive() && missile.hit(myTank)) {
explodes.add(new Explode(myTank.getX(), myTank.getY()));
myTank.setAlive(false);
missile.setAlive(false);
}
} else {
missiles.remove(i);
i--;
}
}
repaint();
}
}
}
private class ExplodeThread implements Runnable {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < explodes.size(); i++) {
Explode explode = explodes.get(i);
if (explode.isAlive()) {
explode.nextStep();
} else {
explodes.remove(i);
i--;
}
}
repaint();
}
}
}
}
}
class Tank {
public static final int UP = 0;
public static final int DOWN = 1;
public static final int LEFT = 2;
public static final int RIGHT = 3;
private static final int SIZE = 30;
private static final int SPEED = 5;
private int x;
private int y;
private boolean good;
private boolean alive;
private int direction;
public Tank(int x, int y, boolean good) {
this.x = x;
this.y = y;
this.good = good;
this.alive = true;
this.direction = UP;
}
public void draw(Graphics g) {
if (alive) {
g.setColor(good ? Color.GREEN : Color.YELLOW);
g.fillOval(x, y, SIZE, SIZE);
g.setColor(good ? Color.DARK_GRAY : Color.LIGHT_GRAY);
switch (direction) {
case UP:
g.fillRect(x + SIZE / 2 - 5, y, 10, SIZE / 2);
break;
case DOWN:
g.fillRect(x + SIZE / 2 - 5, y + SIZE / 2, 10, SIZE / 2);
break;
case LEFT:
g.fillRect(x, y + SIZE / 2 - 5, SIZE / 2, 10);
break;
case RIGHT:
g.fillRect(x + SIZE / 2, y + SIZE / 2 - 5, SIZE / 2, 10);
break;
}
}
}
public void move(int direction) {
this.direction = direction;
switch (direction) {
case UP:
y -= SPEED;
if (y < 0) {
y = 0;
}
break;
case DOWN:
y += SPEED;
if (y > TankWar.HEIGHT - SIZE) {
y = TankWar.HEIGHT - SIZE;
}
break;
case LEFT:
x -= SPEED;
if (x < 0) {
x = 0;
}
break;
case RIGHT:
x += SPEED;
if (x > TankWar.WIDTH - SIZE) {
x = TankWar.WIDTH - SIZE;
}
break;
}
}
public Missile fire() {
int missileX = x + SIZE / 2 - Missile.SIZE / 2;
int missileY = y + SIZE / 2 - Missile.SIZE / 2;
return new Missile(missileX, missileY, direction, good);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
}
class Missile {
public static final int SIZE = 10;
public static final int SPEED = 10;
private int x;
private int y;
private boolean good;
private boolean alive;
private int direction;
public Missile(int x, int y, int direction, boolean good) {
this.x = x;
this.y = y;
this.direction = direction;
this.good = good;
this.alive = true;
}
public void draw(Graphics g) {
if (alive) {
g.setColor(good ? Color.BLUE : Color.RED);
g.fillOval(x, y, SIZE, SIZE);
}
}
public void move() {
switch (direction) {
case Tank.UP:
y -= SPEED;
break;
case Tank.DOWN:
y += SPEED;
break;
case Tank.LEFT:
x -= SPEED;
break;
case Tank.RIGHT:
x += SPEED;
break;
}
if (x < 0 || x > TankWar.WIDTH || y < 0 || y > TankWar.HEIGHT) {
alive = false;
}
}
public boolean hit(Tank tank) {
if (good == tank.good) {
return false;
}
if (x >= tank.getX() && x <= tank.getX() + Tank.SIZE && y >= tank.getY() && y <= tank.getY() + Tank.SIZE) {
return true;
}
return false;
}
public boolean isAlive() {
return alive;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
}
class Explode {
private static final int SIZE = 50;
private static final int STEPS = 5;
private int x;
private int y;
private boolean alive;
private int step;
public Explode(int x, int y) {
this.x = x - SIZE / 2;
this.y = y - SIZE / 2;
this.alive = true;
this.step = 0;
}
public void draw(Graphics g) {
if (alive) {
Color color = g.getColor();
g.setColor(Color.ORANGE);
g.fillOval(x, y, SIZE - step * 10, SIZE - step * 10);
g.setColor(color);
nextStep();
}
}
public void nextStep() {
step++;
if (step == STEPS) {
alive = false;
}
}
public boolean isAlive() {
return alive;
}
}
```
这个代码实现了基本的游戏功能,包括坦克移动、开火、子弹碰撞、爆炸效果等。你可以尝试添加更多的功能来完善这个游戏。