學完Java就開始躍躍欲試了,便寫了個極其簡陋的坦克,/捂臉
首先是主函數部分:
package game;
public class Main {
public static void main(String[] args) {
new GameInterface();
}
}
接下來是坦克本身部分:
package game;
import java.awt.Color;
public class Tank {
private int tank_x; //坦克x軸座標
private int tank_y; //坦克y軸座標
private int tank_radius; //坦克半徑
private int speed = 5;
public GameInterface game;
public boolean dir_up = false;
public boolean dir_down = false;
public boolean dir_left = false;
public boolean dir_right = false;
public Tank( GameInterface game,int tank_x, int tank_y, int tank_radius) {
this.game = game;
this.tank_x = tank_x;
this.tank_y = tank_y;
this.tank_radius = tank_radius;
}
//畫坦克
public void drawTank(Graphics g) {
g.setColor(Color.BLACK); //顏色爲黑色
g.drawOval(tank_x, tank_y, tank_radius*2, tank_radius*2); //畫出一個圓
g.fillOval(tank_x, tank_y, tank_radius*2, tank_radius*2); //內部顏色填充
//畫炮筒
if(dir_up){
g.drawRect(tank_x+tank_radius-2, tank_y-tank_radius, 4, 50);
g.fillRect(tank_x+tank_radius-2, tank_y-tank_radius, 4, 50);
}else if(dir_down) {
g.drawRect(tank_x+tank_radius-2, tank_y+tank_radius, 4, 50);
g.fillRect(tank_x+tank_radius-2, tank_y+tank_radius, 4, 50);
}else if(dir_left) {
g.drawRect(tank_x-tank_radius, tank_y+tank_radius-2, 50, 4);
g.fillRect(tank_x-tank_radius, tank_y+tank_radius-2, 50, 4);
}else if(dir_right) {
g.drawRect(tank_x+tank_radius, tank_y+tank_radius-2, 50, 4);
g.fillRect(tank_x+tank_radius, tank_y+tank_radius-2, 50, 4);
}else {
g.drawRect(tank_x+tank_radius, tank_y+tank_radius-2, 50, 4);
g.fillRect(tank_x+tank_radius, tank_y+tank_radius-2, 50, 4);
}
}
//坦克的移動
public void move() {
if(dir_up){
this.tank_y-=speed; //編程中y軸正方向朝下
}else if(dir_down) {
this.tank_y+=speed;
}else if(dir_left) {
this.tank_x-=speed;
}else if(dir_right) {
this.tank_x+=speed;
}
}
//坦克發射子彈
public void shootBullets() {
if(dir_up){
addBullets("UP");
}else if(dir_down) {
addBullets("DOWN");
}else if(dir_left) {
addBullets("LEFT");
}else if(dir_right) {
addBullets("RIGHT");
}else {
addBullets("RIGHT");
}
}
//坦克增加子彈
public void addBullets(String dir) {
if(dir.equals("UP")) {
Bullets bullet = new Bullets(dir, tank_x+tank_radius-5/2, tank_y, 5);
this.game.bullets.add(bullet);
}else if(dir.equals("DOWN")) {
Bullets bullet = new Bullets(dir, tank_x+tank_radius-5/2, tank_y, 5);
this.game.bullets.add(bullet);
}else if(dir.equals("LEFT")) {
Bullets bullet = new Bullets(dir, tank_x, tank_y+tank_radius-5/2, 5);
this.game.bullets.add(bullet);
}else if(dir.equals("RIGHT")) {
Bullets bullet = new Bullets(dir, tank_x, tank_y+tank_radius-5/2, 5);
this.game.bullets.add(bullet);
}
}
}
坦克控制部分:
package game;
import java.awt.event.KeyAdapter;
public class ListerTank extends KeyAdapter{
public GameInterface game;
public ListerTank(GameInterface game) {
this.game = game;
}
@Override
public void keyPressed(KeyEvent e) {
//若是按下↑,↓,←,→,空格鍵
if(e.getKeyCode() == KeyEvent.VK_UP) {
this.game.tank.dir_up = true;
}else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
this.game.tank.dir_down = true;
}else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
this.game.tank.dir_left = true;
}else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
this.game.tank.dir_right = true;
}else if(e.getKeyCode() == KeyEvent.VK_SPACE){
this.game.tank.shootBullets();
}
}
@Override
public void keyReleased(KeyEvent e) {
//若是鬆開↑,↓,←,→,空格鍵
if(e.getKeyCode() == KeyEvent.VK_UP) {
this.game.tank.dir_up = false;
}else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
this.game.tank.dir_down = false;
}else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
this.game.tank.dir_left = false;
}else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
this.game.tank.dir_right = false;
}
}
}
子彈部分:
package game;
import java.awt.Color;
public class Bullets {
private int bullet_x;
private int bullet_y;
private int bullet_radius;
private String bullet_dir;
private int speed = 1;
public Bullets(String bullet_dir, int bullet_x, int bullet_y, int bullet_radius) {
this.bullet_dir = bullet_dir;
this.bullet_x = bullet_x;
this.bullet_y = bullet_y;
this.bullet_radius = bullet_radius;
}
//畫子彈
public void drawBullets(Graphics g) {
g.setColor(Color.GREEN);
if(bullet_dir.equals("UP")) {
g.drawOval(bullet_x, bullet_y-=speed, bullet_radius*2, bullet_radius*2);
g.fillOval(bullet_x, bullet_y-=speed, bullet_radius*2, bullet_radius*2);
}else if(bullet_dir.equals("DOWN")) {
g.drawOval(bullet_x, bullet_y+=speed, bullet_radius*2, bullet_radius*2);
g.fillOval(bullet_x, bullet_y+=speed, bullet_radius*2, bullet_radius*2);
}else if(bullet_dir.equals("LEFT")) {
g.drawOval(bullet_x-=speed, bullet_y, bullet_radius*2, bullet_radius*2);
g.fillOval(bullet_x-=speed, bullet_y, bullet_radius*2, bullet_radius*2);
}else if(bullet_dir.equals("RIGHT")) {
g.drawOval(bullet_x+=speed, bullet_y, bullet_radius*2, bullet_radius*2);
g.fillOval(bullet_x+=speed, bullet_y, bullet_radius*2, bullet_radius*2);
}
}
}
界面顯示:
package game;
import javax.swing.JPanel;
public class GameInterface extends JPanel{
public JFrame game_jfram;
public Tank tank;
public ArrayList<Bullets> bullets;
public GameInterface() {
tank = new Tank(this,100, 100, 25);
game_jfram = new JFrame("坦克大戰");
bullets = new ArrayList<>();
game_jfram.setSize(800,600);
game_jfram.setLayout(null);
game_jfram.setLocationRelativeTo(null); //居中
game_jfram.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//關閉時釋放資源
game_jfram.setResizable(false);
ListerTank listertank = new ListerTank(this);
game_jfram.addKeyListener(listertank);
this.setSize(800,600); //創建一個長800寬600的面板
this.setLayout(null);
this.setBackground(Color.GRAY); //設置背景色
game_jfram.add(this);
game_jfram.setVisible(true);
//匿名線程
new Thread() {
public void run() {
while(true) {
try {
tank.move();
sleep(20);
}catch(Exception e) {
}
}
}
}.start();
}
public void paint(Graphics g) {
super.paint(g);
tank.drawTank(g); //畫坦克
//畫子彈
for( int i=0; i<bullets.size(); i++) {
Bullets bullet = bullets.get(i);
bullet.drawBullets(g);
}
repaint();
}
}