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; } } ``` ```
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 } } ```
飞机小游戏程序能执行,但是键盘监听按上下左右键没反应
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 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(); } } } } }
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
计算机网络的核心概念
这是《计算机网络》系列文章的第二篇文章 我们第一篇文章讲述了计算机网络的基本概念,互联网的基本名词,什么是协议以及几种接入网以及网络传输的物理媒体,那么本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。 网络核心 网络的核心是由因特网端系统和链路构成的网状网络,下面这幅图正确的表达了这一点 那么在不同的 ISP 和本地以及家庭网络是如何交换信息的呢?...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me a few
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
立即提问