坦克大战 Java

坦克大战

基本介绍

1.程序概述

​ 本程序是一个简单的坦克游戏程序,使用java语言编写,在jdk环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,知道消灭所有敌人就可以过关。本程序包括23个类,2800多行代码,和三个gif图片。

2.功能介绍

2.1开始游戏

​ 本程序运行的主函数

3.涉及技术

  1. java面向对象编程
  2. 多线程
  3. 文件i/o操作
  4. 数据库

思考----编程-----思考----编程

java绘图坐标体系

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 绘图还必须该清楚一个非常重要的概念-像素

    一个像素等于多少厘米

  2. 计算机屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器分辨率是800x600,表示计算机屏幕上每一行都由900个点组成,共有600行,整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是一个长度单位,两者无法比较

绘图

  • Component类提供了两个和绘图相关的重要方法
    1. paint(Graphics g)绘图组件的外观
    2. repaint()刷新组件的外观
  • 当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。
  • 在以下情况paint()将会被调用:
    1. 窗口最小化,再最大化
    2. 窗口的大小发生变化
    3. repaint函数被调用

Graphics类

Graphics 类你可以理解为画笔,为我们提供了各种绘制图形的方法:

  1. 画直线drawLine(int x1,int y1,int x2,int y2)

  2. 画矩形变矿 drawRect(int x,int y,int width,int height)

  3. 画椭圆边框 drawOval(int x,int y,int width,int height)

  4. 填充矩形 fillRect(int x,int y,int width,int height)

  5. 填充椭圆 fillOval(int x,int y,int width,int height)

  6. 画图片 drawImage(Image img,int x,int y,…)

            //画图片
            //1.获取图片资源
    //        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.jpg"));
    //        g.drawImage(image,10,10,200,200,this);
    
  7. 画字符串 drawString(String str,int x,int y)

    //画字符串
            //设置画笔字体
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,50));
            //这里设置的坐标,原点在左下角
            g.drawString("北京你好",10,10);
    
  8. 设置画笔的字体 setFont(Font font)

  9. 设置画笔的颜色 setColor(Color c)

Java事件处理机制

  • 事件处理机制-看一个问题

    BallMove.java–让小球收到键盘的控制,上下左右移动

    package com.event;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    /*
     * @author 远空_
     * @version 1.0
     * 演示小球通过键盘控制上下左右的移动->讲解Java的事件控制
     * */
    public class BallMove extends JFrame{
        MyPanel mp = null;
        public static void main(String[] args) {
            new BallMove();
        }
    
        public BallMove(){
            mp = new MyPanel();
            this.add(mp);
            this.setSize(400,300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.addKeyListener(mp);
            this.setVisible(true);
        }
    }
    class MyPanel extends JPanel implements KeyListener {
        private int x=10,y=10;
        //为了让小球可以移动,把它的坐标设置成变量
        public void paint(Graphics g){
            super.paint(g);
            g.fillOval(x,y,20,20);//默认黑色
        }
        //有字符输出时,该方法就会触发
        @Override
        public void keyTyped(KeyEvent e) {
    
        }
        //当某个键按下,该方法触发
        @Override
        public void keyPressed(KeyEvent e) {
            //根据用户按下的不同键,来处理小球移动
            //在java中,会给每个键分配一个值
            switch (e.getKeyCode()){
                case KeyEvent.VK_W:
                    y--;
                    break;
                case KeyEvent.VK_S:
                    y++;
                    break;
                case KeyEvent.VK_A:
                    x--;
                    break;
                case KeyEvent.VK_D:
                    x++;
                    break;
            }
            //让面板重绘
            /*在以下情况paint()将会被调用:
            1. 窗口最小化,再最大化
            2. 窗口的大小发生变化
            3. repaint函数被调用*/
            this.repaint();
        }
        //当某个键松开,该方法触发
        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println(e.getKeyCode());
        }
    }
    
  • 介绍

    1. KeyLinstener接口(需要实现)

      //有字符输出时,该方法就会触发
          @Override
          public void keyTyped(KeyEvent e) {
      
          }
          //当某个键按下,该方法触发
          @Override
          public void keyPressed(KeyEvent e) {
      
          }
          //当某个键松开,该方法触发
          @Override
          public void keyReleased(KeyEvent e) {
      		System.out.println(e.getKeyCode());//输出松开的按键
          }
      
    2. JFrame的方法

      this.addKeyListener(mp);//窗口JFrame对象可以监听键盘事件,即可以监听到面板发生的键盘事件。
      

基本说明

java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象就会把此“信息”传递给“事件的监听者”处理,这里说的“信息”实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为“事件的对象”。

image-20221017154720162 image-20221017164148008
  1. 前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们

  2. 事件源:事件源是一个产生事件的对象,比如按钮,窗口等。

  3. 事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有含义被按下键的Code值。java.awt.event包和javax.swing.event包中定义了各种事件类型

  4. 事件类型:查阅jjdk文档

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坦克大战0.3

添加功能:当玩家按下j键,发射一颗子弹。

  • 思路:
    1. 当发射一颗子弹后,就相当于启动了一个线程√
    2. Hero有子弹的对象,当按下J时,我们就启动一个发射行为(线程),让子弹不停移动,形成一个射击的效果√
    3. 我们My Panel 需要不停重绘才能出现该效果√
    4. 当子弹移动到面板的边界时,就应该销毁。(把启动的子弹的线程销毁)√

坦克大战0.4

  • 添加功能
    1. 让敌人的坦克也能够发射子弹(可以有多颗子弹)√
    2. 当我方坦克击中敌人坦克时,敌人的坦克就消失,如果能做出爆炸效果更好。√
    3. 让敌人的坦克也可以自由随机的上下左右移动√
    4. 控制我方的坦克和敌人的坦克在规定的范围移动√
    5. 多个子弹的绘制√
    6. 防止坦克重叠√
  • 思路Myself
    1. 在子弹类使用Vector集合保存所有发射的子弹对象
    2. 子弹对象线程中,当移动后判断是否碰撞敌方坦克,碰撞后敌人坦克从集合中移除
    3. 创建一个爆炸类,以及建立其集合,保存爆炸位置的数据,以及实现动画效果
    4. 随机移动用Random实现
    5. 每次坦克移动均检测是否碰撞实体
    6. 遍历子弹类Vector集合

坦克大战0.5

  • 添加功能

    1. 防止敌人坦克重叠运动

    2. 记录玩家的成绩,存盘退出

      image-20221230171437211
    3. 记录当时敌人的坦克坐标,存盘退出

    4. 玩游戏时,可选择是开新游戏还是继续上局游戏

坦克大战 FinalVersion 开源至gitee

gitee地址:https://gitee.com/darkpumpkin/tank-game

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值