Android 在eclipse中import java.awt.Image;

eclipse

Android Studio

Android 在eclipse中import java.awt.Image; 没有问题,但是在Android Studio中就报错。

1个回答

android studio的gradle是无法直接引入jre的类库,建议用android的图形处理类,或在eclipse中创建工程,把DNS等这些工具类添加进去,然后在Build Path中计入jre library。然后Export这些工具类,作为jar包添加入Android studio的工程的libs中

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
import com.sun.image.codec.jpeg.JPEGCodec;Eclipse编译无法通过
import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; 这两个包在编译期间无法通过,设置了forbidden reference(access rules) 为warning 但是编译还是没有办法通过,完整代码如下: package com.demo.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.Random; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class ImageUtil { private static final char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' }; private static final int SIZE = 4; private static final int LINES = 20; private static final int WIDTH = 100; private static final int HEIGHT = 60; private static final int FONT_SIZE = 40; public static Map<String, BufferedImage> createImage() { StringBuffer sb = new StringBuffer(); BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR); Graphics graphics = image.getGraphics(); graphics.setColor(Color.LIGHT_GRAY); graphics.fillRect(0, 0, WIDTH, HEIGHT); Random rm = new Random(); // 随机字符 for (int i = 1; i <= SIZE; i++) { int r = rm.nextInt(chars.length); graphics.setColor(getRandomColor()); graphics.setFont(new Font(null, Font.BOLD + Font.ITALIC, FONT_SIZE)); graphics.drawString(chars[r] + "", (i - 1) * WIDTH / SIZE, HEIGHT / 2); sb.append(chars[i]); } // 干扰线 for (int i = 1; i < LINES; i++) { graphics.setColor(getRandomColor()); graphics.drawLine(rm.nextInt(WIDTH), rm.nextInt(HEIGHT), rm.nextInt(WIDTH), rm.nextInt(HEIGHT)); } Map<String, BufferedImage> map = new HashMap<String, BufferedImage>(); map.put(sb.toString(), image); return map; } public static Color getRandomColor() { Random rm = new Random(); Color color = new Color(rm.nextInt(256), rm.nextInt(256), rm.nextInt(256)); return color; } public static InputStream getInputStream(BufferedImage image) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); encoder.encode(image); byte[] imageBts = bos.toByteArray(); InputStream in = new ByteArrayInputStream(imageBts); return in; } }
eclipse打不开图片,在家里就可以,到学校就不行了,用浏览器可以打开。
package subject; import java.awt.Image; import java.awt.image.BufferedImage; import java.net.URL; import java.util.Base64.Decoder; import javax.imageio.ImageIO; /* * 游戏工具类 * 用于加载图片为Image格式 */ public class GameUtile { public static Image getImage(String path) { URL url=GameUtile.class.getClassLoader().getResource(path); BufferedImage image=null; try { image=ImageIO.read(url); }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return image; } } ``` ```
飞机小游戏程序能执行,但是键盘监听按上下左右键没反应
package cn.sxt.game; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyEvent; public class Plane extends GameObject { int speed=3; boolean left,up,right,down; public void drawSelf(Graphics g){ g.drawImage(img, (int)x, (int)y, null); if(left){ x -= speed; } if(right){ x += speed; } if(up){ y -= speed; } if(down){ y -= speed; } } public Plane(Image img,double x,double y){ this.img = img; this.x = x; this.y = y; } public void addDirection(KeyEvent e){ System.out.println("############"); switch(e.getKeyCode()){ case KeyEvent.VK_LEFT: left = true; break; case KeyEvent.VK_UP: up = true; break; case KeyEvent.VK_RIGHT: right = true; break; case KeyEvent.VK_DOWN: down = true; break; } } public void minusDirection(KeyEvent e){ switch(e.getKeyCode()){ case KeyEvent.VK_LEFT: left = false; break; case KeyEvent.VK_UP: up = false; break; case KeyEvent.VK_RIGHT: right = false; break; case KeyEvent.VK_DOWN: down = false; break; } } } ``` ``` package cn.sxt.game; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; public class MyGameFrame extends JFrame { Image bg=GameUtil.getImage("images/bg.jpg"); Image planeImg=GameUtil.getImage("images/plane.png"); Plane plane = new Plane(planeImg,250,250); @Override public void paint(Graphics g) { // TODO Auto-generated method stub super.paint(g); g.drawImage(bg, 0, 0, null); plane.drawSelf(g); } class paintThread extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); while(true){ repaint(); try { Thread.sleep(40); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } class KeyMonitor extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { plane.addDirection(e); } @Override public void keyReleased(KeyEvent e) { plane.minusDirection(e); } } public void launchFrame(){ this.setTitle("尚学堂学员_程序猿作品"); this.setVisible(true); this.setSize(500, 500); this.setLocation(300, 300); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); new paintThread().run(); addKeyListener(new KeyMonitor()); } private Image offScreenImage = null; public void update(Graphics g) { if(offScreenImage == null) offScreenImage = this.createImage(500,500);//这是游戏窗口的宽度和高度 Graphics gOff = offScreenImage.getGraphics(); paint(gOff); g.drawImage(offScreenImage, 0, 0, null); } public static void main(String[] args){ MyGameFrame g=new MyGameFrame(); g.launchFrame(); } }
java frame 添加 方向键监听问题
``` package Demo; import java.awt.Canvas; import java.awt.Color; import java.awt.Component; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.Panel; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.ImageObserver; import javax.swing.ImageIcon; public class Demo { frame f = null; public Demo(){ f = new frame(); Canvas c = new Canvas(); Panel p = new Panel(); f.setLayout(null); p.setLayout(null); f.setSize(600, 600); c.setSize(600, 600); f.add(p); p.add(c); f.requestFocus(); f.addKeyListener(f); f.setBackground(Color.black); f.setVisible(true); } public static void main(String[] args) { Demo d = new Demo(); } } class frame extends Frame implements KeyListener{ private Image img = null; private int x =50; private int y = 50; private ImageIcon ii = new ImageIcon("D:\\Eclipse\\WORKPLACE\\image\\ccr.jpg"); public frame(){ super(); } /*public void Frame(){ frame f = new frame(); Panel p = new Panel(); Canvas c = new Canvas(); f.setSize(300, 300); f.add(p); p.setSize(300, 300); p.add(c); c.setSize(300, 300); f.setVisible(true); }*/ @Override public void paint(Graphics g) { super.paint(g); img = ii.getImage(); g.drawImage(img, x, y,15,15, this); } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub int z; switch(e.getKeyCode()) { case KeyEvent.VK_UP: y-=7; //调用repaint()函数,重新绘制小球位置 // z=1; this.repaint(); break; case KeyEvent.VK_DOWN: y+=7; //调用repaint()函数,重新绘制小球位置 //z=2; this.repaint(); break; case KeyEvent.VK_LEFT: x-=7; //调用repaint()函数,重新绘制小球位置 // z=3; this.repaint(); break; case KeyEvent.VK_RIGHT: x+=7; //调用repaint()函数,重新绘制小球位置 //z=4; this.repaint(); break; } } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } } ```
java eclipse中同一个包运行效果
我在eclipse中建了一个工程,下面建了一个包,里面有几个程序,现在我只要一运行 就是这个程序在执行,我同一个包下的另一个程序,是我复制的这个程序,我想修改一下并测试一下,然后发现一直都运行的第一个代码的效果,是因为同一个包下面只会有一个主方法main吗?还是什么,不是很懂 package GameFram; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class TextFrame extends Frame{ Image image = GameUtil.getImage("Image/sun.jpg"); /** * 画面加载 */ public void LoadFrame() { setBounds(200, 200, 500, 500); setVisible(true); new PaintThread().start(); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.exit(0); } } ); } private double x=100,y=100; private boolean left = true; private boolean up = true; @Override public void paint(Graphics g) { //System.out.println("paint"); //repaint相当于执行这个paint Color c = g.getColor(); g.drawLine(200, 100, 200, 200); g.setColor(Color.blue); g.drawRect(300, 200, 150, 130); Font f = new Font("宋体",Font.BOLD,200);//要set进去才行 g.setFont(f); g.drawOval(200, 100, 200, 200); g.drawString("DDDDD", 200, 200); g.drawImage(image, (int)x, (int)y, null); if(left) { x += -10; }else { x+=10; } if(x<0) { left=false; }else if(x>500-30) left=true; } /** * 重画线程类 * @author * */ class PaintThread extends Thread { public void run() { while(true) { repaint();//重画 try { Thread.sleep(40); //1s = 1000ms } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { TextFrame tf = new TextFrame(); tf.LoadFrame(); } } 我外部类的名字是改了的,也就是在之前那个包下面重新建了一个类,除了外部类的类名我改了,其他都是复制过来的,然而运行的结果还是之前的结果
JAVA飞机大战小游戏求解答
JAVA小白的大作业写了个飞机大战小游戏,现在想加一个按下键盘上某个键可以重新开始游戏的功能,求大佬解答。 下面是我游戏窗口实现的代码。 package Game; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Date; //建立游戏的主窗口 public class GameFrame extends Frame{ //GameFrame继承了Frame private volatile boolean flag = true; //volatile指线程之间可以共享变量 Image plane = GameUtil.getImage("image/plane.png"); Image bg = GameUtil.getImage("image/bg1.jpg"); Plane p = new Plane(plane,350,400,60,60); Shell[] shells = new Shell[30]; //30为炮弹个数 Date startTime = new Date(); Date endTime; int period; public void paint(Graphics g) { //变量g相当于一支画笔 super.paint(g); //调用父类的paint g.drawImage(bg, 0, 0, 700, 500, null); p.drawSelf(g); //画飞机 //碰撞检测 for(int i = 0; i < shells.length; i++) { shells[i].draw(g); boolean peng = shells[i].getRect().intersects(p.getRect()); if(peng) { p.live = false; Color c = g.getColor(); g.setColor(Color.RED); Font f = new Font("黑体",Font.PLAIN,30); g.setFont(f); g.drawString("GAME OVER!",320,250); g.setColor(c); endTime = new Date(); period =(int)((endTime.getTime()-startTime.getTime())/1000); flag = false; } if(!p.live) { Color a = g.getColor(); g.setColor(Color.WHITE); Font f1 = new Font("黑体",Font.PLAIN,15); g.setFont(f1); g.drawString("持续时间:"+ period + "秒",(int)p.x, (int)p.y); g.setColor(a); } } } //反复重画窗口 线程 class PaintThread extends Thread{ //内部类 public void run() { while(flag) { repaint(); //重画 try { Thread.sleep(50); //50ms } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //定义键盘监听的内部类 class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { super.keyPressed(e); p.addDirection(e); } @Override public void keyReleased(KeyEvent e) { super.keyReleased(e); p.minusDirection(e); } } public void launchFrame(){ //初始化窗口 this.setTitle("飞机大作战"); //窗口的标题 this.setVisible(true); // 窗口默认不可见,此步是让其可见。 this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT); //设置窗口大小 this.setLocation(300,100); //设置窗口位置 this.addWindowListener(new WindowAdapter() { //匿名内部类,让关闭窗口时程序也关闭 public void windowClosing(WindowEvent e) { System.exit(0); // 0表示正常结束 } }); new PaintThread().start(); //启动重画窗口的线程 addKeyListener(new KeyMonitor()); //给窗口增加键盘的监听 //初始化炮弹 for(int i = 0; i < shells.length; i++) { shells[i] = new Shell(); } } //添加双缓冲技术,让游戏窗口不闪 private Image offScreenImage = null; public void update(Graphics g) { if(offScreenImage == null) offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT); Graphics goff = offScreenImage.getGraphics(); paint(goff); g.drawImage(offScreenImage, 0, 0, null); } public static void main(String[] args) { GameFrame f = new GameFrame(); //创建窗口对象 f.launchFrame(); //调用launchFrame方法 } } ``` ``` 求大佬解答。
java贪吃蛇怎样设置向左时不能向右
package moonsake; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class MPanel extends JPanel implements KeyListener/*实现接口KeyListener开始监听键盘输入*/ ,ActionListener{ private ImageIcon title = new ImageIcon("title.jpg"); private ImageIcon right = new ImageIcon("right.png"); private ImageIcon body = new ImageIcon("body.png"); private ImageIcon down = new ImageIcon("down.png"); private ImageIcon left = new ImageIcon("left.png"); private ImageIcon up = new ImageIcon("up.png"); private ImageIcon food = new ImageIcon("food.png"); int len = 3;//长度 int score = 0;//分数 private static int speed =150; int[] snakex = new int[750]; int[] snakey = new int[750]; String fx = "R"; //反向R, L, U, D boolean isStared = false;//暂停字体 boolean isEnd = false;//结束 boolean flag = false; Timer timer = new Timer( speed,this); int foodx; int foody; Random rand = new Random(); public MPanel(){ initsnake(); //设置焦点为自己 this.setFocusable(true); //设置自己为键盘监听对象 this.addKeyListener(this); timer.start(); foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } public void initsnake() { len = 3; snakex[0] = 100; snakey[0] = 100; snakex[1] = 75; snakey[1] = 100; snakex[2] = 50; snakey[2] = 100; fx = "R"; score = 0; } public void paintComponent(Graphics g) { super.paintComponent(g); this.setBackground(Color.WHITE); title.paintIcon(this, g, 25, 11); g.fillRect(25,75 , 850, 600); g.drawString("长度:"+len, 750, 35); g.drawString("分数:"+score, 750, 50); //暂停语句 if(isStared == false) { g.setColor(Color.WHITE); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("Press Space to Start!!!", 225, 300); } //结束语句 if(!isEnd == false) { g.setColor(Color.RED); g.setFont(new Font("arial",Font.BOLD,40)); g.drawString("END: Press Space to Restart!!!", 175, 300); } //画蛇头 switch (fx) { case "R": right.paintIcon(this, g, snakex[0], snakey[0]); break; case "L": left.paintIcon(this, g, snakex[0], snakey[0]); break; case "U": up.paintIcon(this, g, snakex[0], snakey[0]); break; case "D": down.paintIcon(this, g, snakex[0], snakey[0]); break; } //食物 food.paintIcon(this, g, foodx, foody); //循环画出蛇身体 for(int i=1; i<len; i++) { body.paintIcon(this, g, snakex[i], snakey[i]); } } @Override public void keyTyped(KeyEvent e) { } //监听按下空格键 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if(keyCode == KeyEvent.VK_SPACE) { if(isEnd) {//重新开始 isEnd = !isEnd; initsnake(); }else { isStared = !isStared; } repaint(); }else if(keyCode == KeyEvent.VK_RIGHT) { fx = "R"; }else if(keyCode == KeyEvent.VK_LEFT) { fx = "L"; }else if(keyCode == KeyEvent.VK_UP) { fx = "U"; }else if(keyCode == KeyEvent.VK_DOWN) { fx = "D"; } } @Override public void keyReleased(KeyEvent e) { } //移动蛇 @Override public void actionPerformed(ActionEvent e) { //实现空格暂停 if(isStared && !isEnd) { //画蛇身体 for(int i=len-1; i>0; i--) { snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //画蛇头 //实现头的移动 switch (fx) { case "R": snakex[0] = snakex[0] + 25; if(snakex[0] >850) isEnd = !isEnd;//当蛇到边界时,重新开始 break; case "L": snakex[0] = snakex[0] - 25; if(snakex[0] <25) isEnd = !isEnd; break; case "U": snakey[0] = snakey[0] - 25; if(snakey[0] <75) isEnd = !isEnd; break; case "D": snakey[0] = snakey[0] + 25; if(snakey[0] >650) isEnd = !isEnd; break; } //蛇吃食物长大 if(snakex[0] == foodx && snakey[0] == foody) { len++; score +=10; speed -=30; foodx = 25 + 25*rand.nextInt(34); foody = 75 + 25*rand.nextInt(24); } //检测蛇是否重叠 for(int i=1; i<len; i++) { if(snakex[i] == snakex[0] && snakey[i] == snakey[0]) { isEnd = !isEnd; } } repaint(); } timer.start(); } }
求大神解决 我很少问人 一般都是百度搞定 这次是真的搞不定了
这是抛出的异常 Exception in thread "main" java.lang.IllegalArgumentException: input == null! at javax.imageio.ImageIO.read(ImageIO.java:1388) at GameUtil.GameUtil.getimage(GameUtil.java:28) at solar.SolarFrame.<init>(SolarFrame.java:11) at solar.SolarFrame.main(SolarFrame.java:22) sdcf 这是关键类 的代码 public class GameUtil { private GameUtil(){ }//工具类通常会将构造方法私有。 public static Image getimage(String path){ URL u = GameUtil.class.getClassLoader().getResource(path); BufferedImage img = null; try { img = ImageIO.read(u); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return img; } } 这是加载类的代码 package solar; import java.awt.Graphics; import java.awt.Image; import GameUtil.Constant; import GameUtil.GameUtil; import GameUtil.MyFrame; public class SolarFrame extends MyFrame{ Image bg = GameUtil.getimage("image/bg.jpg"); //Image sun1 = GameUtil.getimage("iamges/sun.jpg"); //star sun = new star("images/sun.jpg",Constant.GAME_HIGHT/2,Constant.GAME_WIDTH/2); public void paint(Graphics g){ //g.drawImage(sun1, 300, 300, null); //sun.draw(g); g.drawImage(bg, 0, 0,null); } public static void main(String[] args) { new SolarFrame().launchFrame(); } } 为什么会抛出input == null 我的图片在相应的文件夹里 E:\8eb6d704007793879b0b322e3194a7\eclipse工作空间\SolarSystem\src\images 剩下的我就真的不知道该怎么办了 大神们啊 谢谢啦 小弟快被搞疯了!!!!!!!!!!!
JVAV写贪吃蛇小游戏,用线程实现窗口重绘,然后用键盘指令改变小蛇的方向,请问怎么让小蛇只根据指令移动?
![图片说明](https://img-ask.csdn.net/upload/201906/05/1559710703_639058.png) 现在的程序能够实现通每隔200ms小蛇自动往前跑一格,通过键盘指令能够改变方向,但是我不想让它自动跑,只想实现给它指令它才移动,请问怎么实现? 这是蛇的活动类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Timer; /** * 这个类代表贪吃蛇的活动场所 * @author * @version */ public class Yard extends Frame { /* * 画图的线程 * */ Timer timer = new Timer(); PaintThread paintThread = new PaintThread(); private boolean gameOver = false; //游戏是否结束 /** * 行数 */ public static final int ROWS = 30; /* * 列数 * */ public static final int COLS = 30; /* * 活动区域大小 * */ public static final int BLOCK_SIZE = 15; //设置显示字属性 private Font fontGameOver = new Font("宋体", Font.BOLD, 50); //分数 private int score = 0; /* * 记录开始时候的时间 * */ private long beginTime=0; /* *实例化Snake和Egg的对象 * */ Snake s = new Snake(this); Egg e = new Egg(); /* * 抽象类 Image 是表示图形图像的所有类的超类。 * 必须以特定于平台的方式获取图像。 * */ Image offScreenImage = null; /* * 此函数的功能是:设置窗口的大小、位置、可见,以及点击事件和键盘事件,最后开启了绘图线程 * */ public void launch() { /* * 指定窗口的位置,窗口的左上角的位置为(90,10).是相对父窗口的相对位置 * */ this.setLocation(90, 10); /* * 设定窗口的大小 * 宽度width:COLS*BLOCK_SIZE * 高度hight:ROWS*BLOCK_SIZE * */ this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 为窗口添加监听器 * */ this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); /* * 将窗口设置可见 * */ this.setVisible(true); /* * 为窗口添加键盘事件 * */ this.addKeyListener(new KeyMonitor()); new Thread(paintThread).start(); } public static void main(String[] args) { Yard y=new Yard(); y.beginTime=System.currentTimeMillis(); y.launch(); } /* * 将变量gameOver设置为true,使得在paint()函数中将使得线程停止 * */ public void stop() { gameOver = true; } @Override public void paint(Graphics g) { /* * 获取此图形上下文的颜色 * */ Color c = g.getColor(); /* * 指定图形上下文的颜色 * */ g.setColor(Color.GRAY); /* * 用当前的颜色来填充指定的区域 * */ g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 再一次的指定颜色为:黑灰色???????为什么要再一次的设定??? * 原因在于:我们想将绘图的颜色与文字显示的不一样 * */ g.setColor(Color.DARK_GRAY); //画出横线 /* * drawLine(int x1, int y1, int x2, int y2) * 函数的功能为: * 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 * 通过下面的两个for循环就会在图形化对象上画出表格 * */ for(int i=1; i<ROWS; i++) { g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i); } for(int i=1; i<COLS; i++) { g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS); } g.setColor(Color.YELLOW);//设定颜色,为下面显示文字信息做准备 /* * drawString(String str, int x, int y) *使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。 * */ g.drawString("使用说明:使用方向键控制方向,F1--停止,F2--停止后恢复,F5--重新开始" , 10, 40); g.drawString("目前分数:" + score, 10, 60); g.drawString("加分规则:每吃一个加5分,加油!" , 10, 80); g.drawString("已经使用的时间:"+(System.currentTimeMillis()-beginTime)/1000 , 10, 100); /* * 检测游戏是否结束,当游戏结束时,则提示游戏“game over”,而且将界面恢复到初始界面的状态,且终止绘图线程 * */ if(gameOver) { g.setFont(fontGameOver); g.drawString("game over!", 90, 170); g.drawString("在玩一次,请按F5", 10, 250); g.drawString(" ", 200, 230);//???这个用意何在?? paintThread.pause(); } if(score>100) { g.drawString("好棒!!!", 90, 170); g.drawString("你已经超过"+score+",继续加油", 10, 230); } /* * 将图形界面设置为刚开始的颜色 * */ g.setColor(c); s.eat(e); e.draw(g); s.draw(g); } @Override public void update(Graphics g) { if(offScreenImage == null) { /* * public Image createImage(int width, * int height) * 创建一幅用于双缓冲的、可在屏幕外绘制的图像 * */ offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); } /* * getGraphics() *创建供绘制闭屏图像(off-screen image)使用的图形上下文。 * */ Graphics gOff = offScreenImage.getGraphics(); paint(gOff); /* * drawImage(Image img, int x, int y, ImageObserver observer) * 绘制指定图像中当前可用的图像。 * */ g.drawImage(offScreenImage, 0, 0, null); } private class PaintThread implements Runnable { private boolean running = true; private boolean pause = false; public void run() { while(running) {//线程将一直处于运行当中,只有在游戏结束的时候 if(pause) continue; else repaint();//如果组件是轻量级组件,则会尽快调用paint()方法或者是调用update() try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public void pause() { this.pause = true; } public void reStart() { this.pause = false; s = new Snake(Yard.this); gameOver = false; score=0; } public void gameOver() { running = false; } } /* * 此函数的功能为:检测我们是否按下F2,若按下,则重新启动线程,即重新开始游戏 * */ private class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F5) { paintThread.reStart();//重新开始游戏 } else if(key==KeyEvent.VK_F1){ paintThread.pause=true;//暂停 } else if(key==KeyEvent.VK_F2){ paintThread.pause=false;//从暂停中恢复 } s.keyPressed(e); } } /** * 拿到所得的分数 * @return 分数 */ public int getScore() { return score; } /** * 设置所得的分数 * @param score 分数 */ public void setScore(int score) { this.score = score; } } ``` 这是小蛇类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; /** * 代表蛇 * @author * */ public class Snake { /* * 头结点 * */ private Node head = null; /* * 尾结点 * */ private Node tail = null; /* * 大小 * */ private int size = 0; /* * 开始游戏时: * 初始位置:(20,30) * 初始运动方向:Dir.L * */ private Node n = new Node(20, 30, Dir.L); /* * Yard的对象属性; * */ private Yard y; /* * 构造函数 * */ public Snake(Yard y) { /* * 将初始结点给头结点和尾结点,size初始化为 1, * */ head = n; tail = n; size = 1; this.y = y; } /* * 节点类 * */ private class Node { int w = Yard.BLOCK_SIZE; int h = Yard.BLOCK_SIZE; int row , col; Dir dir = Dir.L; Node next = null; Node prev = null; Node(int row, int col, Dir dir) { this.row = row; this.col = col; this.dir = dir; } void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLACK); g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h); g.setColor(c); } } // 从尾加,代码与下面一个函数的代码功能相似,这里不再分析 public void addToTail() { Node node = null; switch(tail.dir) { case L : node = new Node(tail.row, tail.col + 1, tail.dir); break; case U : node = new Node(tail.row + 1, tail.col, tail.dir); break; case R : node = new Node(tail.row, tail.col - 1, tail.dir); break; case D : node = new Node(tail.row - 1, tail.col, tail.dir); break; } tail.next = node; node.prev = tail; tail = node; size ++; } // 从头加,下面的代码比较简单,相信大家应该都能理解 public void addToHead() { Node node = null; switch(head.dir) { case L : node = new Node(head.row, head.col - 1, head.dir); break; case U : node = new Node(head.row - 1, head.col, head.dir); break; case R : node = new Node(head.row, head.col + 1, head.dir); break; case D : node = new Node(head.row + 1, head.col, head.dir); break; } // node.next = head; // head.prev = node; // head = node; /* * 上面这种写法与下面这种写法一致,不过下面这种写法我更容易理解 * */ head.prev=node; node.next=head; head=node; size ++; } public void draw(Graphics g) { if(size <= 0) return; move(); for(Node n = head; n != null; n = n.next) { n.draw(g); } } /* * 移动过程所要做的操作:在运动方向增加一个节点,在尾部减去一个节点,并且检测是否已经死亡 * */ private void move() { addToHead(); deleteFromTail(); checkDead(); } private void checkDead() { if(head.row < 2 || head.col < 0 || head.row > Yard.ROWS || head.col > Yard.COLS) { y.stop(); } /* * 头节点与身体的某一个节点相撞,也标志着结束 * */ for(Node n = head.next; n != null; n = n.next) { if(head.row == n.row && head.col == n.col) { y.stop(); } } } /* * 删除尾节点 * */ private void deleteFromTail() { if(size == 0) return; tail = tail.prev; tail.next = null; } public void eat(Egg e) { /* * boolean intersects(Rectangle r) * 确定此 Rectangle 是否与指定的 Rectangle 相交。 * 若相交,表示我们吃到了一个点 ,则导致蛇的长度变长并且在出现一个点,并且加5分,否则什么也不做 * */ if(this.getRect().intersects(e.getRect())) { e.reAppear(); this.addToHead(); //吃了加5分 y.setScore(y.getScore() + 5); } } private Rectangle getRect() { /* * 构造了一个格子大小的区域 * */ return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE * head.row, head.w, head.h); } /* * 接收从键盘的按键事件,然后采取相应的解决方案 * */ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT : /* * 当按键为左的时候,只要前进方向不是右,即可转向 * */ if(head.dir != Dir.R) head.dir = Dir.L; break; case KeyEvent.VK_UP : /* * 当按键为"上",只要前进方向不是"下",就可以转向 * */ if(head.dir != Dir.D) head.dir = Dir.U; break; case KeyEvent.VK_RIGHT : /* * 当按键为"右"的时候,只要前进方向不是"左",就可以转向 * */ if(head.dir != Dir.L) head.dir = Dir.R; break; case KeyEvent.VK_DOWN : /* * 当按键为"下"的时候,只要前进方向不是"上",就可以转向 * */ if(head.dir != Dir.U) head.dir = Dir.D; break; } } } ``` 求大神解答 hen'ji
请问如何点击按钮就可以弹出图片?
``` import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.*; import java.awt.Image; //让GUI继承Icon可以画图 public class GUI implements Icon{ static JButton Button1 = new JButton("父亲"); static JButton Button2 = new JButton("母亲"); static JButton Button3 = new JButton("儿子"); static JButton Button4 = new JButton("女儿"); static JButton Button5 = new JButton("姐姐"); static JButton Button6 = new JButton("妹妹"); static JButton Button7 = new JButton("哥哥"); static JButton Button8 = new JButton("弟弟"); static JButton Button9 = new JButton("老婆"); static JButton Button10 = new JButton("删除"); static JButton Button11 = new JButton("清空"); static JButton Button12 = new JButton("等于"); static JTextField txt =new JTextField("",10); static String[] str = new String[15]; static int i = 0; //写死一个标签,用来存放图片,写了再说管这么多 static JLabel label; private ImageIcon father = new ImageIcon ("D:\\图片\\亲属计算器图片\\大耳朵图图\\爸爸.jpg"); // JDialog txt1 =new JDialog(); public static void main(String[] args) { JFrame frame = new JFrame("亲戚计算器"); /* final Box base = Box.createVerticalBox(); final Box box1 = Box.createHorizontalBox(); final Box box2 = Box.createHorizontalBox(); //在这里先导入图片 ImageIcon image_father = new ImageIcon("D:\\图片\\亲属计算器图片\\大耳朵图图\\爸爸.jpg"); image_father.setImage(image_father.getImage().getScaledInstance(100, 200, 70)); Button1.setIcon(image_father);*/ // box1.add(Button1); // base.add(box1); // frame.add(base); /* 思路,先添加一块区域,可以用来显示图片,再在此基础上添加响应事件 其实就是Label*/ frame.setBounds(600,260,1000,1000); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel outLabel = new JLabel(); //frame.add(father); JPanel panel = new JPanel(); frame.add(panel); panel.setLayout(null); placeComponents(panel); new GUI(panel); System.out.println(str[0]); //这里其实只监听了文本,并且只能够监听文本 MyActionListener1 myActionListener1 = new MyActionListener1(txt,outLabel); MyActionListener2 myActionListener2 = new MyActionListener2(txt); MyActionListener3 myActionListener3 = new MyActionListener3(txt); MyActionListener4 myActionListener4 = new MyActionListener4(txt); Button1.addActionListener(myActionListener1); Button2.addActionListener(myActionListener1); Button3.addActionListener(myActionListener1); Button4.addActionListener(myActionListener1); Button5.addActionListener(myActionListener1); Button6.addActionListener(myActionListener1); Button7.addActionListener(myActionListener1); Button8.addActionListener(myActionListener1); Button9.addActionListener(myActionListener1); Button10.addActionListener(myActionListener2); Button11.addActionListener(myActionListener3); Button12.addActionListener(myActionListener4); frame.setVisible(true); } private static void placeComponents(JPanel panel) { // TODO Auto-generated method stub } public GUI(JPanel panel) { txt.setBounds(10,10, 200, 36); panel.add(txt); Button1.setBounds(30, 150, 80, 50); panel.add(Button1); Button2.setBounds(110, 150, 80, 50); panel.add(Button2); Button3.setBounds(190, 150, 80, 50); panel.add(Button3); Button4.setBounds(30, 200, 80, 50); panel.add(Button4); Button5.setBounds(110, 200, 80, 50); panel.add(Button5); Button6.setBounds(190, 200, 80, 50); panel.add(Button6); Button7.setBounds(30, 250, 80, 50); panel.add(Button7); Button8.setBounds(110, 250, 80, 50); panel.add(Button8); Button9.setBounds(190, 250, 80, 50); panel.add(Button9); Button10.setBounds(400, 150, 80, 50); panel.add(Button10); Button11.setBounds(400, 200, 80, 50); panel.add(Button11); Button12.setBounds(400, 250, 80, 50); panel.add(Button12); //与文本类似,这里放了一个标签,可以用来准备显示图片 // Button1.setBounds(400, 150, 80, 50); // panel.add(Button10); } } /*class MyActionListener0 implements ActionListener{//按键后显示相应的图片 private JImageField imageField; }*/ class MyActionListener1 implements ActionListener{//按键后文本框显示,获取相应文本及图片 //即需要定义一个图片区域,并且需要判断这个文字对应的图片 //这才是关键的监听代码的区域 private JTextField textField; public MyActionListener1(JTextField txt, JLabel label) { super(); this.textField = txt; } //每按一次按钮,此方法都会自动调用一次 public void actionPerformed(ActionEvent e) {//名称按键 // TODO Auto-generated method stub textField.setText(textField.getText()+e.getActionCommand()+"的"); GUI.str[GUI.i] = e.getActionCommand().substring(0,2); GUI.i++; //System.out.println(Arrays.toString(GUI.str)); //System.out.println(textField.getText()+e.getActionCommand()+"的"); } } class MyActionListener2 implements ActionListener{//删除方法 private JTextField textField; public MyActionListener2(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { textField.setText(textField.getText().substring(0, textField.getText().length()-3)); GUI.str[GUI.i] = null; GUI.i--; } } class MyActionListener3 implements ActionListener{//清空按键 private JTextField textField; public MyActionListener3(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { textField.setText(textField.getText().substring(0, 0)); for (int i = 0; i <= GUI.i; i++) { GUI.str[i] = null; } GUI.i = 0; } } class MyActionListener4 implements ActionListener{//计算按键 private JTextField textField; public MyActionListener4(JTextField txt) { super(); this.textField = txt; } public void actionPerformed(ActionEvent e) { Jisuanqi jsp = new Jisuanqi(); textField.setText(jsp.jisaunmian(GUI.str, "y")); for (int i = 0; i <= GUI.i; i++) { GUI.str[i] = null; } GUI.i = 0; } } ``` 这是部分代码,运行不出来,因为少了其它的配合的类,主要是要在MyActionListener1中添加一些代码,使得点击Button1-9不仅可以弹出文字,还可以弹出图片。
本人写的贪吃蛇代码,求教大神哪里错了?
本人初学JAVA,写了一个简易的贪吃蛇,运行的时候有时候吃到豆子能变长,有时候吃豆子不能变长不知道为什么,代码如下 Snake类: ``` import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Random; import javax.swing.*; public class Snake extends JPanel implements KeyListener{ private int direction=South; ArrayList<Integer> Bufferbody=new ArrayList<Integer>(); ArrayList<Integer> body=new ArrayList<Integer>(); int foodX=300; int foodY=300; int headX=100; int headY=100; int souse=0; int O=0; public static final int South=0; public static final int North=1; public static final int East=2; public static final int West=3; Random rand=new Random(); private Image iBuffer; private Graphics gBuffer; public void setBufferbody() { Bufferbody.add(0,100); Bufferbody.add(1,100); } @Override public void paint(Graphics g) { // TODO Auto-generated method stub super.paint(g); setBackground(Color.gray); g.setColor(Color.BLUE); g.fillRect(600, 0, 100, 600); Font font=new Font("微软雅黑",Font.BOLD,30); g.setFont(font); g.setColor(Color.BLACK); g.drawString("分数", 612, 100); if(souse==0) g.drawString(""+souse, 630, 150); if(souse>0&&souse<=90) g.drawString(""+souse, 623, 150); if(souse>90) g.drawString(""+souse, 612, 150); g.fillRect(headX, headY,10 ,10 ); while(foodX==headX&&foodY==headY) { foodX=rand.nextInt(60)*10; foodY=rand.nextInt(56)*10; } g.setColor(Color.YELLOW); g.fillRect(foodX, foodY, 10, 10); if(O==0) { g.setColor(Color.red); g.drawString("按A开始游戏", 200, 300); } for(int i=0;i<body.size();i++) { Bufferbody.set(i+2,body.get(i)); } for(int i=0;i<body.size();i++) { body.set(i,Bufferbody.get(i)); } for(int i=0;i<body.size();i=i+2) { g.setColor(Color.green); g.fillRect(body.get(i), body.get(i+1), 10, 10); } if(O==-1) { g.setColor(Color.red); g.drawString("Game Over",200, 200); g.drawString("按R重新游戏", 200, 300); } } public void update(Graphics g) { if(iBuffer==null) { iBuffer=createImage(700,600); gBuffer=getGraphics(); } gBuffer.setColor(getBackground()); gBuffer.fillRect(0, 0, 700, 600); paint(gBuffer); g.drawImage(iBuffer, 0, 0, this); } public void move() { new Thread() { public void run() { while(true) { System.out.print(""); if(O==1) { switch(direction) { case South: Bufferbody.set(0,headX); Bufferbody.set(1,headY); headY=headY+10; repaint(); break; case North: Bufferbody.set(0,headX); Bufferbody.set(1,headY); headY=headY-10; repaint(); break; case East: Bufferbody.set(0,headX); Bufferbody.set(1,headY); headX=headX+10; repaint(); break; case West: Bufferbody.set(0,headX); Bufferbody.set(1,headY); headX=headX-10; repaint(); break; } if(headX==foodX&&headY==foodY) { Bufferbody.add(0); Bufferbody.add(0); body.add(Bufferbody.get(Bufferbody.size()-2)); body.add(Bufferbody.get(Bufferbody.size()-1)); souse=souse+10; repaint(); } if(headX<0||headY<0||headX==600||headY==560) { O=-1; repaint(); break; } for(int i=0;i<body.size();i=i+2) { if(headX==body.get(i)&&headY==body.get(i+1)) { O=-1; repaint(); break; } } } try { Thread.sleep(140); } catch (InterruptedException e) { // TODO: handle exception } } } }.start(); } @Override public void keyPressed(KeyEvent a) { // TODO Auto-generated method stub if(a.getKeyCode()==65&&O==0) { O=1; repaint(); } if(O==1) { switch(a.getKeyCode()) { case KeyEvent.VK_UP: if(direction==East||direction==West) direction=North; break; case KeyEvent.VK_RIGHT: if(direction==South||direction==North) direction=East; break; case KeyEvent.VK_DOWN: if(direction==East||direction==West) direction=South; break; case KeyEvent.VK_LEFT: if(direction==South||direction==North) direction=West; break; } } if(a.getKeyCode()==82&&O==-1) { direction=South; foodX=300; foodY=300; headX=100; headY=100; souse=0; Bufferbody.clear(); body.clear(); setBufferbody(); O=0; move(); repaint(); } if(a.getKeyCode()==32&&O==1) { O=0; repaint(); } if(a.getKeyCode()==KeyEvent.VK_ESCAPE) { System.exit(0); } } @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent arg0) { // TODO Auto-generated method stub } } ``` World类: import javax.swing.*; public class World extends JFrame{ public static void main(String[] args) { JFrame f=new JFrame(); Snake s=new Snake(); f.setSize(700,600); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(3); f.setTitle("Snake"); f.add(s); s.setBufferbody(); s.move(); f.addKeyListener(s); f.setVisible(true); } }
ServletOutputStream cannot be resolved to a type
在使用jsp生成web图片时遇到这个问题,这是源代码中的一条语句,源代码可以执行,可是一将源码放入eclipse就会出现这个错误 源码如下: [code="java"]<!-- Fig. 6.04_01: basic.jsp 功能: JSP 绘制文本和线段 --> <%@ page language="java" contentType="image/jpeg;charset=GB2312" import="java.awt.image.*" import="java.awt.*" import="javax.imageio.*" %> <% // 清空缓冲区 response.reset(); // 注意这里的MIME类型 response.setContentType("image/jpeg"); // 创建一个 640X480 的图像 int width = 640, height = 480; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 填充背景 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 绘制文本 g.setColor(Color.RED); // 绘制11条直线 for (int i = 1; i <= 11; i++) { g.drawLine(10, 10, 90, i * 10); } // 绘制1个三角形 g.drawLine(160, 10, 110, 110); g.drawLine(160, 10, 210, 110); g.drawLine(110, 110, 210, 110); // 绘制1个矩形 g.drawLine(230, 10, 230, 110); g.drawLine(230, 10, 330, 10); g.drawLine(330, 10, 330, 110); g.drawLine(230, 110, 330, 110); g.setFont(new Font("方正粗宋简体", Font.PLAIN, 25)); g.drawString("JSP Web图表的绘制", 45, 145); // 部署图形 g.dispose(); // 利用ImageIO类的write方法对图像进行编码 ServletOutputStream sos = response.getOutputStream();//出错行 ImageIO.write(image, "JPG", sos); sos.close(); %> [/code] [b]问题补充:[/b] 以上代码在保存为jsp文件 可以在tomcat环境中 正确显示 可是一旦放入eclipse环境中就会提示那个错误
键盘无法控制对象的移动
在做坦克大战的小程序,坦克无法被键盘控制,程序运行后,依然还是贴了第一张,想知道具体原因。 代码如下: TankJFrame类: ``` import java.awt.*; import javax.swing.*; /** * 坦克主体框架,继承JFrame类 * * **/ public class TankFrame extends JFrame{ private static final long serialVersionUID = 1L; //设置窗口的宽和高 public static int window_width = 1500; public static int window_hight = 1000; //新建tankPanel TanksPanel t_panel = new TanksPanel(); //启动框架 public void lunchFrame() { setTitle("坦克大战"); setSize(window_width, window_hight); setLocation(200, 10); //add各个组件 add(t_panel); //添加键盘控制 addKeyListener(t_panel.p_tanks.k_contral); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); //窗口大小不可变 setResizable(false); //启动线程 new Thread(t_panel).start(); } //主函数 public static void main(String args[]) { new TankFrame().lunchFrame(); } } ``` TankPanel类: ``` import java.awt.*; import javax.swing.*; /** * 坦克主面板函数,继承JPanel类 * **/ public class TanksPanel extends JPanel implements Runnable{ private static final long serialVersionUID = 1L; //新建玩家坦克 PlayerTanks p_tanks = new PlayerTanks(100, 100, false); //重载paintComponent方法 protected void paintComponent(Graphics g) { super.paintComponent(g); //绘制背景 g.fillRect(0, 0, TankFrame.window_width, TankFrame.window_hight); //绘制玩家坦克 p_tanks.drawTanks(); g.drawImage(p_tanks.getTankImage(), p_tanks.getLocal_x(), p_tanks.getLocal_y(), p_tanks.getTanks_width(), p_tanks.getTanks_hight(), this); p_tanks.move(); } @Override //实现Runnable接口抽象方法run public void run() { while(true) { this.repaint(); //实现线程,使坦克每隔100毫秒重新绘制一次 try { Thread.sleep(100); }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` Tanks类: ``` import java.awt.*; /** * 坦克抽象父类,定义敌方与玩家坦克的共有属性和抽象方法 * * **/ public abstract class Tanks { //坦克初始位置坐标,x值和y值 int local_x; int local_y; //坦克的大小,即贴图的宽高 int tanks_width = 300; int tanks_hight = 300; //坦克的速度 int speed = 100; //坦克的移动方向 Orientation oriTanks; //坦克炮塔的移动方向 Orientation oriTurret; //声明坦克贴图 Image tankImage; //判断坦克是否存活 boolean isAlive = true; //判断坦克是否为玩家坦克 boolean isEnemy = false; //将变量进行封装 public int getLocal_x() { return local_x; } public void setLocal_x(int local_x) { this.local_x = local_x; } public int getLocal_y() { return local_y; } public void setLocal_y(int local_y) { this.local_y = local_y; } public int getTanks_width() { return tanks_width; } public void setTanks_width(int tanks_width) { this.tanks_width = tanks_width; } public int getTanks_hight() { return tanks_hight; } public void setTanks_hight(int tanks_hight) { this.tanks_hight = tanks_hight; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public Orientation getOriTanks() { return oriTanks; } public void setOriTanks(Orientation oriTanks) { this.oriTanks = oriTanks; } public Orientation getOriTurret() { return oriTurret; } public void setOriTurret(Orientation oriTurret) { this.oriTurret = oriTurret; } public Image getTankImage() { return tankImage; } public void setTankImage(Image tankImage) { this.tankImage = tankImage; } public boolean isAlive() { return isAlive; } public void setAlive(boolean isAlive) { this.isAlive = isAlive; } public boolean isEnemy() { return isEnemy; } public void setEnemy(boolean isEnemy) { this.isEnemy = isEnemy; } //构造方法 public Tanks(int local_x, int local_y, boolean isEnemy) { super(); this.local_x = local_x; this.local_y = local_y; this.isEnemy = isEnemy; } //获取图片绘制坦克抽象函数 public abstract void drawTanks(); //移动函数 public abstract void move(); //获取当前位置,返回整张矩形(坦克) public abstract Rectangle getRect(); //获取下一个矩形的位置,返回整个下一个矩形 public abstract Rectangle getNextRect(); } ``` PlayerTanks类: ``` import java.awt.*; import java.awt.event.*; /** * 玩家坦克类,继承坦克父类Tanks * **/ public class PlayerTanks extends Tanks{ //坦克移动方向 Orientation oriTanks = Orientation.Stop; //坦克炮塔方向 Orientation oriTurret = Orientation.U; public KeyContral k_contral = new KeyContral(); //构造函数 public PlayerTanks(int local_x, int local_y, boolean isEnemy) { super(local_x, local_y, isEnemy); } @Override //绘制坦克函数 public void drawTanks() { switch(oriTurret) { //炮塔向上图片 case U: oriTurret = Orientation.U; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_shang.png")); break; //炮塔向左图片 case L: oriTurret = Orientation.L; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_zuo.png")); break; //炮塔向下图片 case D: oriTurret = Orientation.D; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_xia.png")); break; //炮塔向上图片 case R: oriTurret = Orientation.R; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_you.png")); break; default: setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_shang.png")); break; } } @Override //判断坦克是否越界 public void move() { //用户按“W”,坦克向上走时 if(oriTanks == Orientation.U) { //坐标减每一次移动,每一次都大于0(不越界) if(local_y - speed >= 0) //向上移动,使用方法,更加安全 setLocal_y(local_y -= speed); }else if(oriTanks == Orientation.L) {//用户按“A”, 坦克向左走 if(local_x - speed >= 0) setLocal_x(local_y -= speed); }else if(oriTanks == Orientation.D) {//用户按“S”, 坦克向下走 if(local_y + speed <= TankFrame.window_hight) setLocal_y(local_y += speed); }else if(oriTanks == Orientation.R) {//用户按“D”, 坦克向右走 if(local_x + speed <= TankFrame.window_width) setLocal_x(local_x += speed); }else {} } @Override public Rectangle getRect() { // TODO 自动生成的方法存根 return null; } @Override public Rectangle getNextRect() { // TODO 自动生成的方法存根 return null; } //内部类,继承KeyAdapter public class KeyContral extends KeyAdapter{ //重写KeyPressed函数来实现对键盘按压事件的收集,做出坦克的移动 public void KeyPressed(KeyEvent e) { super.keyPressed(e); //判断用户按下的按键 if(e.getKeyCode() == KeyEvent.VK_W) {//用户按“W”,坦克向上走 oriTanks = oriTurret = Orientation.U; }else if(e.getKeyCode() == KeyEvent.VK_A) {//用户按“A”, 坦克向左走 oriTanks = oriTurret = Orientation.D; }else if(e.getKeyCode() == KeyEvent.VK_S) {//用户按“S”,坦克向下走 oriTanks = oriTurret = Orientation.L; }else if(e.getKeyCode() == KeyEvent.VK_D) {//用户按“D”,坦克向右走 oriTanks = oriTurret = Orientation.R; }else {//用户按其他按键,坦克不移动 oriTanks = oriTurret = Orientation.Stop; } } //重写KeyReleased,判断用户松开KeyPressed定义的按键后,坦克停止移动 public void KeyReleased(KeyEvent e) { super.keyReleased(e); //判断用户释放的是否是所定义好的按键 if(e.getKeyCode() == KeyEvent.VK_W ||e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_D) { oriTanks = Orientation.Stop; } } } } ``` 枚举: ``` public enum Orientation { U, D, L, R, Stop; } ``` 运行结果: ![图片说明](https://img-ask.csdn.net/upload/201901/26/1548517947_104675.png)
现在的程序里五子棋下棋是点击方格然后棋子出现在左上角的交叉处,怎样修改能点击交叉处直接下棋子
package wuziqi; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class 五子棋 extends JFrame implements MouseListener,Runnable{ public static void main(String args[]){ 五子棋 ff = new 五子棋(); } int height = Toolkit.getDefaultToolkit().getScreenSize().height; int width = Toolkit.getDefaultToolkit().getScreenSize().width; BufferedImage bgImage = null;//缓存图片 int x = 0; int y = 0; int allChess [][] = new int [19][19];//设置棋盘大小 boolean isBlack = true; boolean canPlay = true; String message = "黑方先行"; int maxTime = 0; Thread t = new Thread(this);//创建一个线程 int blackTime = 0; int whiteTime = 0; String blackMessage = "无限制"; String whiteMessage = "无限制"; public 五子棋(){ this.setTitle("五子棋"); this.setSize(600,600);//设置窗体大小 this.setResizable(true);//窗体是否可改变大小 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击窗口的关闭按钮 this.setLocation((width - 500)/2, (height - 500)/2);//离显示屏上下,左右像素 this.addMouseListener(this);//处理鼠标事件 this.setVisible(true); //窗体可视 t.start();//开始线程 //t.suspend(); this.repaint(); try{ bgImage = ImageIO.read(new File("E:/image/bgImage.jpg")); } catch (IOException e){ e.printStackTrace();//运行时自动将io流异常初始化,并打印出程序的异常信息 } } public void paint(Graphics g){ BufferedImage bi = new BufferedImage(500,500,BufferedImage.TYPE_INT_ARGB); Graphics g2 = bi.createGraphics(); g2.drawImage(bgImage, 0,0, this);//信息参数 g2.setColor(Color.black); g2.setFont(new Font("黑体",Font.BOLD,25)); g2.drawString("游戏信息: " + message, 20,60); g2.setFont(new Font("宋体",Font.BOLD,20)); g2.setColor(Color.white); g2.fillRect(15, 460,185, 25); g2.fillRect(255, 460,185, 25); g2.setColor(Color.black ); g2.drawString("黑方时间:"+blackMessage, 20,480); g2.drawString("白方时间:"+whiteMessage, 260,480); g2.setColor(Color.yellow); g2.fill3DRect(390, 90, 90, 30,true);//x坐标,y坐标,长,宽,false凹 true凸 g2.fill3DRect(390, 140, 90, 30,true); g2.fill3DRect(390,190, 90, 30,true); g2.fill3DRect(390,240, 90, 30,true); g2.fill3DRect(390,290, 90, 30,true); g2.fill3DRect(390, 340, 90, 30,true); g2.fill3DRect(390, 395, 90, 30,true); g2.setColor(Color.red); g2.drawString("开始游戏", 394, 113);//框体中的内容,x坐标。y坐标 g2.drawString("游戏设置", 394, 163); g2.drawString("游戏说明", 394, 213); g2.drawString("暂停", 412,263); g2.drawString("继续", 412, 313); g2.drawString("认输", 412, 363); g2.drawString("退出", 412, 418); g2.setColor(Color.black); for(int i=0;i<19;i++){ g2.drawLine(10, 70+20*i, 370, 70+20*i); g2.drawLine(10+20*i, 70, 10+20*i, 430);//绘制棋盘,drawLine(x1,y1,x2,y2) } g2.fillOval(66, 126, 8, 8); g2.fillOval(306, 126, 8, 8); g2.fillOval(306, 366, 8, 8); g2.fillOval(66, 366, 8, 8); g2.fillOval(306, 246, 8, 8); g2.fillOval(186, 126, 8, 8); g2.fillOval(66, 246, 8, 8); g2.fillOval(186, 366, 8, 8); g2.fillOval(186, 246, 8, 8);//设置棋盘上的九个星 for(int i=0;i<19;i++){ for(int j=0;j<19;j++){ if(allChess[i][j] == 1){ int tempX = i*20+10; int tempY = j*20+70; g2.fillOval(tempX-8, tempY-8, 16, 16); } if(allChess[i][j] == 2){ int tempX = i*20+10; int tempY = j*20+70; g2.setColor(Color.white); g2.fillOval(tempX-8, tempY-8, 16, 16); g2.setColor(Color.black); g2.drawOval(tempX-8, tempY-8, 16, 16); } } } g.drawImage(bi, 0, 0, this); } public void mouseClicked (MouseEvent e){} public void mouseExited (MouseEvent e){} public void mouseEntered (MouseEvent e){} public void mouseReleased (MouseEvent e){} public void mousePressed (MouseEvent e){ //System.out.println("X坐标:"+e.getX()+" "+"Y坐标"+e.getY()); if(canPlay == true){ x = e.getX(); y = e.getY(); if(x >=10 && x<=370 && y>=70 && y<=430){ x = (x-10)/20; y = (y-70)/20; if(allChess[x][y] == 0){ if(isBlack == true){ allChess[x][y] = 1; isBlack = false; message = "轮到白方"; }else { allChess[x][y] = 2; isBlack = true; message = "轮到黑方"; } boolean winFlag = this.checkWin(); if (winFlag == true){ JOptionPane.showMessageDialog(this, "游戏结束!"+" "+(allChess[x][y]==1? "黑方" :"白方")+"获胜!"); canPlay = false; } }else { JOptionPane.showMessageDialog(this, "当前位置已经有棋子,请重新落子!"); } this.repaint(); } } if(e.getX()>=390 && e.getY()>=70 && e.getX()<=480 && e.getY()<=100){ int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?"); if (result == 0){ for (int i =0;i<19;i++){ for (int j =0;j<19;j++){ allChess[i][j] = 0; canPlay = true; } } //allChess = new int[19][19]; message = "黑方先行"; isBlack = true; blackTime = maxTime; whiteTime = maxTime; if(maxTime>0){ blackMessage = maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60); whiteMessage = maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60); t.resume(); }else{ blackMessage = "无限制"; whiteMessage = "无限制"; } this.repaint(); } } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=120 && e.getY()<=150){ String input = JOptionPane.showInputDialog("请输入游戏的最大时间(分钟),如果输入0,表示没有时间限制:"); try{ maxTime = Integer.parseInt(input)*60; if(maxTime<0){ JOptionPane.showMessageDialog(this, "请输入正确信息,不允许输入负数!"); } if(maxTime == 0){ int result = JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?"); if (result == 0){ for (int i =0;i<19;i++){ for (int j =0;j<19;j++){ allChess[i][j] = 0; } } //allChess = new int[19][19]; message = "黑方先行"; isBlack = true; blackTime = maxTime; whiteTime = maxTime; blackMessage = "无限制"; whiteMessage = "无限制"; this.repaint(); } } if(maxTime>0){ int result = JOptionPane.showConfirmDialog(this, "设置完成,是否重新开始游戏?"); if (result == 0){ for (int i =0;i<19;i++){ for (int j =0;j<19;j++){ allChess[i][j] = 0; } } //allChess = new int[19][19]; message = "黑方先行"; isBlack = true; blackTime = maxTime; whiteTime = maxTime; blackMessage = maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60); whiteMessage = maxTime/3600+":"+(maxTime/60-maxTime/3600*60)+":"+(maxTime-maxTime/60*60); t.resume(); this.repaint(); } } }catch (NumberFormatException e1){ JOptionPane.showMessageDialog(this, "请输入正确信息!"); } } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=170 && e.getY()<=200){ JOptionPane.showMessageDialog(this, "这是一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时游戏结束!"); } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=220 && e.getY()<=250){ JOptionPane.showMessageDialog(this, "游戏已暂停"); canPlay = false; } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=270 && e.getY()<=300){ JOptionPane.showMessageDialog(this, "游戏继续进行"); canPlay = true; } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=320 && e.getY()<=350){ int result = JOptionPane.showConfirmDialog(this, "是否确认认输?"); System.out.println(result); if(result == 0){ if(isBlack == true){ JOptionPane.showMessageDialog(this, "黑方已经认输,游戏结束!"); } else { JOptionPane.showMessageDialog(this, "白方已经认输,游戏结束!"); } canPlay = false; } } if(e.getX()>=390 && e.getX()<=480 && e.getY()>=420 && e.getY()<=450){ JOptionPane.showMessageDialog(this, "游戏结束"); System.exit(0); } } private boolean checkWin(){ boolean flag = false; int count = 1; int color = allChess[x][y]; /* int i = 1; while (color == allChess[x+i][y]){ count ++; i++; } i = 1; while (color == allChess[x-i][y]){ count ++; i++; } if(count >= 5){ flag = true; } int i2 = 1; int count2 = 1; while (color == allChess[x][y+i2]){ count2 ++; i2++; } i2 = 1; while (color == allChess[x][y-i2]){ count2 ++; i2++; } if(count2 >= 5){ flag = true; } int i3 =1; int count3 = 1; while (color == allChess[x+i3][y-i3]){ count3 ++; i3++; } i3 = 1; while (color == allChess[x-i3][y+i3]){ count3 ++; i3++; } if(count3 >= 5){ flag = true; } int i4 =1; int count4 = 1; while (color == allChess[x+i4][y+i4]){ count4 ++; i4++; } i4 = 1; while (color == allChess[x-i4][y-i4]){ count4 ++; i4++; } if(count4 >= 5){ flag = true; }*/ count =this.checkCount(1, 0, color); if(count >= 5){ flag = true; }else { count = this.checkCount(0, 1, color); if(count >= 5){ flag = true; }else { count = this.checkCount(1, -1, color); if(count >= 5){ flag = true; }else { count = this.checkCount(1, 1, color); if(count >= 5){ flag = true; } } } } return flag; } private int checkCount(int xChange , int yChange ,int color){ int count = 1; int tempX = xChange; int tempY = yChange; while (x + xChange >=0 && x+xChange<=18 && y+yChange>=0 && y+yChange<=18 && color == allChess[x+xChange][y+yChange]){ count ++; if(xChange != 0) xChange ++; if(yChange != 0){ if(yChange > 0) yChange ++; else { yChange --; } } } xChange = tempX; yChange = tempY; while (x - xChange >=0 && x-xChange<=18 && y-yChange>=0 && y-yChange<=18 && color == allChess[x-xChange][y-yChange]){ count ++; if(xChange != 0) xChange ++; if(yChange != 0){ if(yChange > 0) yChange ++; else { yChange --; } } } return count; } public void run(){ if (maxTime > 0){ while (true){ if (isBlack){ blackTime --; if (blackTime == 0){ JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!"); } }else{ whiteTime --; if (whiteTime == 0){ JOptionPane.showMessageDialog(this, "白方超时,游戏结束!"); } } blackMessage = blackTime/3600+":"+(blackTime/60-blackTime/3600*60)+":"+(blackTime-blackTime/60*60); whiteMessage = whiteTime/3600+":"+(whiteTime/60-whiteTime/3600*60)+":"+(whiteTime-whiteTime/60*60); this.repaint(); try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } } } } }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
新来个技术总监,禁止我们使用Lombok!
我有个学弟,在一家小型互联网公司做Java后端开发,最近他们公司新来了一个技术总监,这位技术总监对技术细节很看重,一来公司之后就推出了很多"政策",比如定义了很多开发规范、日志规范、甚至是要求大家统一使用某一款IDE。 但是这些都不是我这个学弟和我吐槽的点,他真正和我吐槽的是,他很不能理解,这位新来的技术总监竟然禁止公司内部所有开发使用Lombok。但是又没给出十分明确的,可以让人信服的理由。 于...
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
2020金三银四,一篇文章教你如何征服面试官,拿到offer
2020年,跳槽面试就靠它们了,现在每天刷题,看源码文档,最近看的这些题目还是有些难度,有一部分我都要好好想一想才能回答出来,或者回答不出来,总的来说知识宽度够了深度还跟不上。所以要重点突破下底层的东西。这篇文章我总结了很久,希望对正在准备面试的同仁们有点帮助。没错我就是传说中的面霸!! 一. 面试准备 首先,是笔试题,这点是初级程序员绕不过去的坎。 笔试题一般的公司都会出的,除非你是大牛,可以选...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问