java吧 关注:1,271,318贴子:12,778,139
  • 7回复贴,共1

【初学者】想学java,在网上找了一个贪吃蛇,看不太懂,求注释

只看楼主收藏回复

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class KeyBoard extends JFrame{
private int direction = 0;
private int judge = 0;
private Panel panel = new Panel();
private RectLabel label[] = new RectLabel[1200];
private HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
private ArrayList<RectLabel> list = new ArrayList<RectLabel>();
private Point[] point = new Point[1200];
private int targetX = 0;
private int targetY = 0;
private static int goal = 3;
private int speed;
private RectLabel targetLabel = new RectLabel();
private static KeyBoard frame = new KeyBoard();
public static void main(String[] args){
frame.setVisible(true);
}
public KeyBoard(){
super();
addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent arg0) {
map.put(KeyEvent.VK_RIGHT, KeyEvent.VK_LEFT);
map.put(KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT);
map.put(KeyEvent.VK_UP, KeyEvent.VK_DOWN);
map.put(KeyEvent.VK_DOWN, KeyEvent.VK_UP);
map.put(0, 0);
map.put(KeyEvent.VK_G, 0);
Random ra = new Random();
targetX = ra.nextInt(30)*10 + 50;
targetY = ra.nextInt(20)*10 + 50;
targetLabel.setLocation(targetX, targetY);
}
});
setBackground(Color.gray);
setLayout(null);
setBounds(400,200,400,300);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == map.get(direction)){
return;
}else
direction = e.getKeyCode();
}
});
for(int i=1; i<goal; i++){
label[i] = new RectLabel();
label[i].setBounds(-10,-10, 10, 10);
list.add(label[i]);
}
panel.setBounds(-10, -10, 10, 10);
panel.addComponentListener(new ComponentAdapter() {
@Override
public void componentMoved(ComponentEvent arg0) {
point[0] = panel.getLocation();
if(Math.abs(point[0].x-targetX)<5&&Math.abs(point[0].y-targetY)<5){
Random ra = new Random();
targetX = ra.nextInt(30)*10 + 50;
targetY = ra.nextInt(20)*10 + 50;
while(true){
for(int i=1; i<goal-1; i++){
Point p = label[i].getLocation();
if((p.x==targetX)&&(p.y==targetY)){
break;
}else{
judge ++;
}
}
if(judge==goal-2){
break;
}else{
judge=0;
targetX = ra.nextInt(30)*10 + 50;
targetY = ra.nextInt(20)*10 + 50;
}
}
targetLabel.setLocation(targetX, targetY);
label[goal] = new RectLabel();
label[goal].setBounds(-10, -10, 10, 10);
point[goal-1] = new Point();
list.add(label[goal]);
goal++;
}
for(int i=1; i<list.size(); i++){
point[i] = label[i].getLocation();
label[i].setLocation(point[i-1]);
frame.add(label[i]);
}
label[list.size()].setLocation(point[list.size()-1]);
frame.add(label[list.size()]);
for(int i=3; i<list.size(); i++){
if(Math.abs(label[1].getLocation().x-label[i].getLocation().x)<=1&&
Math.abs(label[1].getLocation().y-label[i].getLocation().y)<=1){
direction = KeyEvent.VK_G;
}
}
}
});
targetLabel.setBounds(200, 100,10,10);
add(targetLabel);
add(panel);
}
class Panel extends JPanel implements Runnable{
private int flag = 0;
private int x = 0;
private int y = 0;
public Panel(){
setPreferredSize(new Dimension(10, 10));
new Thread(this).start();
}
@Override
public void run() {
while(true){
if(direction == KeyEvent.VK_RIGHT){
if(x<=this.getParent().getWidth()-10){
x+=10;
setLocation(x,y);
}else{
direction = KeyEvent.VK_G;
}
}
if(direction == KeyEvent.VK_G){
JOptionPane.showMessageDialog(null, "您得了"+(goal-3)+"分,"+"欢迎再次光临!");
System.exit(0);
setLocation(-10,-10);
}
if(direction == KeyEvent.VK_LEFT){
if(x>=0){
x-=10;
setLocation(x,y);
}else{
direction = KeyEvent.VK_G;
}
}
if(direction == KeyEvent.VK_DOWN){
if(y<=this.getParent().getHeight()-10){
y+=10;
setLocation(x,y);
}else{
direction = KeyEvent.VK_G;
}
}
if(direction == KeyEvent.VK_UP){
if(y>=0){
y-=10;
setLocation(x,y);
}else{
direction = KeyEvent.VK_G;
}
}
try{
if(goal<30){
speed = goal;
}else{
speed = 60;
}
Thread.sleep(400 - speed*10);
}catch(InterruptedException e){
e.printStackTrace();
}
repaint();
}
}
}
class RectLabel extends JLabel{
private int r = 5;// 小球半径
private int width = r * 2;// 球宽度
private int height = r * 2;// 球高度
private Color ballColor = Color.BLUE;// 默认颜色
public RectLabel() {
setPreferredSize(new Dimension(width, height));// 初始化大小
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(ballColor);// 设置默认颜色
g.fillRect(0, 0, width, height);// 在标签上绘制球体
}
}
}
求大神帮帮忙,注释一下每个地方的功能,例如蛇的移动,吃果子自身增长各在哪???


IP属地:安徽1楼2015-09-23 18:33回复
    哪位大神那么空闲当你的老师


    IP属地:广东来自Android客户端2楼2015-09-23 18:41
    收起回复
      2025-07-27 12:33:35
      广告
      不感兴趣
      开通SVIP免广告
      想学,一步步来。
         --来自朱雀星林王"(ºДº*)老夫修道两千余年,从未见过如此厚颜无耻之人


      IP属地:浙江来自Android客户端3楼2015-09-23 18:52
      回复
        太长不看


        来自iPhone客户端4楼2015-09-27 22:40
        回复
          你学多久了,我这学了一个多月的都看蒙了!


          来自Android客户端5楼2015-09-27 22:57
          回复