1 Star 0 Fork 0

DarkPumpkin / TankGame

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

坦克大战

img

基本介绍

1.程序概述

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

2.功能介绍

2.1开始游戏

​ 本程序运行的主函数

3.涉及技术

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

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

java绘图坐标体系

image-20221017083251603

  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文档

    image-20221017170648885

坦克大战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. 玩游戏时,可选择是开新游戏还是继续上局游戏

空文件

简介

坦克大战 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/darkpumpkin/tank-game.git
git@gitee.com:darkpumpkin/tank-game.git
darkpumpkin
tank-game
TankGame
master

搜索帮助