Javase-坦克大战小游戏,为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着
//为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着
package TanKe.lbl;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.util.concurrent.atomic.DoubleAdder;
//JFrame为事件源
public class MytankGame extends JFrame{
Mypanel mp = null;
public static void main(String[] args) {
MytankGame mg = new MytankGame();
}
//构造方法设置画布属性,定义自己的画框,并将划款添加进JFrame
public MytankGame() {
this.setTitle("坦克大战");
mp = new Mypanel();
this.add(mp);
//启动线程
Thread t = new Thread(mp);
t.start();
//创建监听
this.addKeyListener(mp);
this.setSize(400,300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//定义自己的画框,并且作为监听者类
class Mypanel extends JPanel implements KeyListener,Runnable{
Ltank LL = null;
Vector<Dtank> vv = new Vector<Dtank>();
int enSize = 6;
//构造函数实例化我的坦克
public Mypanel() {
LL = new Ltank(170,130);//坦克的初始坐标
//创建敌人坦克引用
for(int i = 0; i < enSize; i ++) {
Dtank dd = new Dtank((i+1) * 60, 0);
//设置颜色
dd.setColor(1);
//设置方向
dd.setDirect(1);
//将引用添加到集合里
vv.add(dd);
}
}
//重写父类的画笔方法
public void paint(Graphics g) {
super.paint(g);
//设置地图为黑色
g.fillRect(0, 0, 400, 300);
//画出自己的坦克
this.drawTank(LL.getX(), LL.getY(), g, LL.direct, 0);
//判断子弹不为空
if(LL.ss != null&&LL.ss.isLive == true) {
g.draw3DRect(LL.ss.x, LL.ss.y, 1, 1, false);
}
//画出敌方坦克
for(int i = 0; i < vv.size(); i ++) {
//取出坦克并且赋予坐标等属性画出来
this.drawTank(vv.get(i).getX(), vv.get(i).getY(), g, vv.get(i).direct, 1);
}
}
//画的动作,这么画,如何画
public void drawTank(int x, int y, Graphics g, int direct, int type) {
switch (type) {
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.blue);
break;
}
switch (direct) {
//向上
case 0:
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x + 15, y, 5, 30, false);
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
g.drawLine(x + 10, y + 15, x + 10, y);
break;
//向下
case 1:
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x + 15, y, 5, 30, false);
g.fill3DRect(x + 5, y + 5, 10, 20, false);
g.fillOval(x + 5, y + 10, 10, 10);
g.drawLine(x + 10, y + 15, x + 10, y + 30);
break;
//向左
case 2:
g.fill3DRect(x, y, 30, 5, false);
g.fill3DRect(x, y + 15, 30, 5, false);
g.fill3DRect(x + 5, y + 5, 20, 10, false);
g.fillOval(x + 10, y + 5, 10, 10);
g.drawLine(x + 15, y + 10, x, y + 10);
break;
//向右
case 3:
g.fill3DRect(x, y, 30, 5, false);
g.fill3DRect(x, y + 15, 30, 5, false);
g.fill3DRect(x + 5, y + 5, 20, 10, false);
g.fillOval(x + 10, y + 5, 10, 10);
g.drawLine(x + 15, y + 10, x + 30, y + 10);
break;
}
}
//重写监听者的方法
public void keyPressed(KeyEvent arg0) {
//识别按键
if(arg0.getKeyCode() == KeyEvent.VK_W) {
this.LL.setDirect(0);
this.LL.moveup();
}
else if(arg0.getKeyCode() == KeyEvent.VK_S) {
this.LL.setDirect(1);
this.LL.movedown();
}
else if(arg0.getKeyCode() == KeyEvent.VK_A) {
this.LL.setDirect(2);
this.LL.moveleft();
}
else if(arg0.getKeyCode() == KeyEvent.VK_D) {
this.LL.setDirect(3);
this.LL.moveright();
}
//坦克开火
if (arg0.getKeyCode() == KeyEvent.VK_J) {
this.LL.shotDtank();
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.repaint();
}
}
}
//定义子弹类,实现线程接口
class Shot implements Runnable{
int x;
int y;
int direct;
int speed = 2;
boolean isLive = true;
public Shot(int x, int y, int direct) {
this.x = x;
this.y = y;
this.direct = direct;
}
//线程方法
public void run() {
while(true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch(direct) {
case 0:
y = y - speed;
case 1:
y = y + speed;
case 2:
x = x - speed;
case 3:
x = x + speed;
}
//何时死亡
//子弹碰到边缘
if(x<0||x>400||y<0||y>300) {
this.isLive = false;
break;
}
}
}
}
//定义一个坦克类
class Tank {
int x = 0;
int y = 0;
//0,1,2,3分别是上下左右
int direct = 0;
int speed = 1;
int color;
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public Tank( int x, int y) {
this.x = x;
this.y = y;
}
//获取坦克的x,y坐标
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
//方向
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
//速度
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
}
//我方坦克类
class Ltank extends Tank {
Shot ss = null;
public Ltank(int x, int y) {
super(x,y);
}
//开火方法
public void shotDtank() {
//判断子弹方向
switch(this.direct){
case 0:
ss = new Shot(x + 10, y, 0);
break;
case 1:
ss = new Shot(x + 10, y + 30, 1);
break;
case 2:
ss = new Shot(x, y + 10,2);
break;
case 3:
ss = new Shot(x + 30, y + 10,3);
break;
}
//启动子弹线程
Thread t = new Thread(ss);
t.start();
}
//坦克向上移动
public void moveup() {
y= y - speed;
}
//向下移动
public void movedown() {
y= y + speed;
}
//向左移动
public void moveleft() {
x= x - speed;
}
//向右移动
public void moveright() {
x= x + speed;
}
}
//敌方坦克类
class Dtank extends Tank {
public Dtank(int x, int y) {
super(x,y);
}
}
Javase-坦克大战小游戏,为什么会出现上方向和左方向的子弹不能发射的情况?检查了好久,有大佬帮帮忙吗,小白睡不着的更多相关文章
- 《HTML5经典坦克大战》游戏(代码)
前几天粗略地学了HTML5,然后就用它写了一个<经典坦克大战>游戏. 现在想分享一下我写的代码,写得不好请大家多多指教. 给大家推荐一个网站,这个网站是为大学生而做,为方便学习编程的同学而 ...
- day22 01 初识面向对象----简单的人狗大战小游戏
day22 01 初识面向对象----简单的人狗大战小游戏 假设有一个简单的小游戏:人狗大战 怎样用代码去实现呢? 首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字nam ...
- canvas绘制“飞机大战”小游戏,真香!
canvas是ArkUI开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活.高效等优点,被广泛应用于UI界面开发中. 本期,我们将为大家介绍canvas组件的使用. 一.canvas介绍 1 ...
- 用面向对象的编程方式实现飞机大战小游戏,java版
概述 本文将使用java语言以面向对象的编程方式一步一步实现飞机大战这个小游戏 本篇文章仅供参考,如有写的不好的地方或者各位读者哪里没看懂可以在评论区给我留言 或者邮件8274551712@qq.co ...
- docker项目——搭建飞机大战小游戏
项目2:搭建打飞机小游戏,验证数据持久化(最底下有链接) 第一步:拉取镜像 [root@localhost docker-image]# docker load < httpd_img.tar. ...
- 喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结
2015春节前,葡萄城的软件工程师以特有的方式来迎接新年——2015新年编程邀请赛. 邀请赛的初衷,是和大家一起,寻找编程最初的单纯的快乐. 在代码的世界里,添加动力,继续远航. ...
- IOS学习之路五(SpriteKit 开发飞机大战小游戏一)
参考SpriteKit 创建游戏的教程今天自己动手做了一下,现在记录一下自己怎么做的,今天之做了第一步,一共有三个部分. 第一步,项目搭建. 项目所用图片资源:点击打开链接 1.在Xcode打开之后, ...
- Python小游戏之 - 飞机大战美女 !
用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...
- Python小游戏之 - 飞机大战 !
用Python写的"飞机大战"小游戏 源代码如下: # coding=utf-8 import random import os import pygame # 用一个常量来存储屏 ...
随机推荐
- FWT 入门
#include <bits/stdc++.h> using namespace std; #define ll long long const ll maxn = 3e5+5; cons ...
- .NetCore自定义WebAPI返回Json的格式大小写的三种方式
.NetCore的Controller/WebAPI可以帮我们将返回结果自动转换为Json格式给前台,而且可以自由设定格式(大写.小写.首字母大写等),我总结了三种方法,对应三种灵活度,供大家参考 ( ...
- 如何用rflask快速初始化Flask Restful项目
如何用rflask快速初始化Flask Restful项目 说明 多啰嗦两句 我们在创建flask项目的时候,使用pycharm创建出来的项目比较简陋,而且随着项目的功能完善,项目目录结构会比较多,多 ...
- 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 【JQ】 validate验证表单时多个name相同的元素的解决办法
使用jQuery.validate插件http://jqueryvalidation.org/,当节点的name相同时候,脚本特意忽略剩余节点,导致所有相关节点的errMsg都显示在第一个相关节点上. ...
- atx测试框架实现手机应用UI自动化测试
最近工作中遇到游戏APP需要实现UI自动化测试,这个app中真的是典型的混合App,有Android原生控件,有webview控件,以及游戏操作页面.研究了Appium,发现appium实现跨应用操作 ...
- zabbix3.4源码安装步骤
zabbix3.4源码安装步骤1.安装环境: 安装机器:22.224.9.227 以下简称监控机: 操作系统信息:内核版本: Linux version 2.6.18-194.1.AXS3 (pack ...
- HanLP《自然语言处理入门》笔记--2.词典分词
2. 词典分词 中文分词:指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本. 中文分词算法大致分为基于词典规则与基于机器学习这两大派. 2.1 什么是词 在基于词典的中文分词中,词 ...
- Shell使用技巧之逐行读取
重定向读取 #!/bin/bash while read line do echo $line done < /etc/passwd 管道读取 #!/bin/bash cat /etc/pass ...
- SpringMVC进阶(二)
一.高级参数绑定 1.1. 绑定数组 Controller方法中可以用String[]接收,或者pojo的String[]属性接收.两种方式任选其一即可. /** * 包装类型 绑定数组类型,可以使用 ...