设为首页收藏本站

仙剑之十里坡

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2707|回复: 5
打印 上一主题 下一主题

java_swing贪吃蛇教程[下]

 关闭 [复制链接]

28

主题

11

听众

5325

积分

管理员

昨日黄昏

管理员

  • TA的每日心情

    2010-9-25 00:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    精华
    5
    积分
    5325
    历练
    10
    声望
    119
    人气
    141

    润泽万物 匠心独运

    单身中……
    帮我摆脱单身吧
    跳转到指定楼层
    1
    发表于 2011-5-17 17:03:31 |只看该作者 |倒序浏览


    关于java Swing的基本开发教程,以贪吃蛇游戏为实例,但本教程并不是0基础教程,需要有一定的java基础才可以明白。


    最终完成的 三个类
    snackMain.class



    package snack;
    import javax.swing.*;
    public class snackMain extends JFrame{
    public snackMain() {
      snackWin win = new snackWin();
      add(win);
      setTitle("贪吃蛇1.0v---七夕小雨作品");
      setSize(435,390);
      setLocation(200, 200);
      setVisible(true);
    }
    public static void main(String[] args) {
      new snackMain();
    }
    }





    snackWin.class




    package snack;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    public class snackWin extends JPanel implements ActionListener,KeyListener,Runnable{
    JButton newGame,stopGame;
    int fenShu=0,Speed=0;
    boolean start = false;
    Random r = new Random();
    int rx = 0,ry=0;
    List<snackAct> list = new ArrayList<snackAct>();
    int temp =0,tempeat1=0,tempeat2=0;
    JDialog dialog = new JDialog();
    JLabel label = new JLabel("你挂了你的分数是"+fenShu);
    JButton ok = new JButton("好吧= .=");
    Thread nThread;
    public snackWin() {
      newGame = new JButton("开始");
      stopGame =new JButton("退出");
      this.setLayout(new FlowLayout(FlowLayout.LEFT));
      newGame.addActionListener(this);
      stopGame.addActionListener(this);
      this.addKeyListener(this);
      this.add(newGame);
      this.add(stopGame);
      ok.addActionListener(this);
      dialog.setLayout(new GridLayout(2,1));
      dialog.add(label);
      dialog.add(ok);
      dialog.setSize(200,200);
      dialog.setLocation(200, 200);
      dialog.setVisible(false);
    }
    public void paintComponent(Graphics g){
      super.paintComponent(g);
      g.drawRect(10, 40, 400, 300);
      g.drawString("分数:"+fenShu, 150, 20);
      g.drawString("速度:"+Speed, 150, 35);
      g.setColor(new Color(0,255,0));
      if (start) {
       g.fillRect(10+rx*10, 40+ry*10, 10, 10);
       g.setColor(new Color(255,0,0));
       for (int i = 0; i < list.size(); i++) {
        g.fillRect(10+list.get(i).getX()*10, 40+list.get(i).getY()*10, 10, 10);
       }
      }
    }
    public void actionPerformed(ActionEvent e) {
      if (e.getSource()==newGame) {
       newGame.setEnabled(false);
       start = true;
       rx = r.nextInt(40);ry = r.nextInt(30);
       snackAct tempAct = new snackAct();
       tempAct.setX(20);
       tempAct.setY(15);
       list.add(tempAct);
       requestFocus(true);
       nThread = new Thread(this);
       nThread.start();
       repaint();
      }
      if (e.getSource()==stopGame) {
       System.exit(0);
      }
      if (e.getSource()==ok) {
       list.clear();
       fenShu = 0;
       Speed = 0;
       start = false;
       newGame.setEnabled(true);
       dialog.setVisible(false);
       repaint();
      }
    }
    private void eat() {
      if (rx==list.get(0).getX()&&ry==list.get(0).getY()) {
       rx = r.nextInt(40);ry = r.nextInt(30);
       snackAct tempAct = new snackAct();
       tempAct.setX(list.get(list.size()-1).getX());
       tempAct.setY(list.get(list.size()-1).getY());
       list.add(tempAct);
       fenShu +=100 +10*Speed;
       tempeat1 +=1;
       if (tempeat1-tempeat2>=10) {
        tempeat2 =tempeat1;
        if (Speed <=9) {
         Speed+=1;
        }
       }
      }
    }
    public void otherMove(){
      snackAct tempAct = new snackAct();
      for (int i = 0; i < list.size(); i++) {
       if (i==1) {
        list.get(i).setX(list.get(0).getX());
        list.get(i).setY(list.get(0).getY());
       }else if (i>1) {
        tempAct = list.get(i-1);
        list.set(i-1, list.get(i));
        list.set(i, tempAct);
       }
      }
    }
    public void move(int x,int y){
      if (minYes(x, y)) {
       otherMove();
       list.get(0).setX(list.get(0).getX()+x);
       list.get(0).setY(list.get(0).getY()+y);
       eat();
       repaint();
      }else {//死亡方法
       nThread = null;
       label.setText("你挂了你的分数是"+fenShu);
       dialog.setVisible(true);
      }
    }
    public boolean minYes(int x,int y){
      if (!maxYes(list.get(0).getX()+x, list.get(0).getY()+y)) {
       return false;
      }
      return true;
    }
    public boolean maxYes(int x,int y){
      if (x<0||x>=40||y<0||y>=30) {
       return false;
      }
      for (int i = 0; i < list.size(); i++) {
       if (i>1&&list.get(0).getX()==list.get(i).getX()&&list.get(0).getY()==list.get(i).getY()) {
        return false;
       }
      }
      return true;
    }
    public void keyPressed(KeyEvent e) {
      if (start) {
       switch (e.getKeyCode()) {
       case KeyEvent.VK_UP:
        move(0, -1);
        temp =1;
        break;
       case KeyEvent.VK_DOWN:
        move(0, 1);
        temp =2;
        break;
       case KeyEvent.VK_LEFT:
        move(-1, 0);
        temp =3;
        break;
       case KeyEvent.VK_RIGHT:
        move(1, 0);
        temp =4;
        break;
       default:
        break;
       }
      }
    }
    public void keyReleased(KeyEvent arg0) {}
    public void keyTyped(KeyEvent arg0) {}
    public void run() {
      while (start) {
       switch (temp) {
       case 1:
        move(0, -1);
        break;
       case 2:
        move(0, 1);
        break;
       case 3:
        move(-1, 0);
        break;
       case 4:
        move(1, 0);
        break;
       default:
        move(1, 0);
        break;
       }
       fenShu +=10*Speed;
       repaint();
       try {
        Thread.sleep(500-(50*Speed));
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
      }
    }
    }

    snackAct.class
    package snack;
    public class snackAct {
    private int x;
    private int y;
    public int getX() {
      return x;
    }
    public void setX(int x) {
      this.x = x;
    }
    public int getY() {
      return y;
    }
    public void setY(int y) {
      this.y = y;
    }
    }
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    转播转播0 分享淘帖0 分享分享0 收藏收藏0

    9

    主题

    4

    听众

    1191

    积分

    版主

    版主

  • TA的每日心情
    慵懒
    2021-9-20 17:34
  • 签到天数: 375 天

    [LV.9]以坛为家II

    精华
    0
    积分
    1191
    历练
    2
    声望
    12
    人气
    935
    单身中……
    帮我摆脱单身吧
    2
    发表于 2011-5-17 17:24:58 |只看该作者
    有木有CSS教程神马的
    回复

    使用道具 举报

    489

    主题

    2

    听众

    5468

    积分

    名扬四海

    会员等级: 7

  • TA的每日心情

    1 小时前
  • 签到天数: 1855 天

    [LV.Master]伴坛终老

    精华
    0
    积分
    5468
    历练
    0
    声望
    246
    人气
    69

    黑色羽翼 神仙眷侣 转帖之王

    最爱菱纱
    幸福:65℃
    3
    发表于 2011-5-17 18:22:58 |只看该作者
    不知道神马玩意.........
    回复

    使用道具 举报

    143

    主题

    5

    听众

    1348

    积分

    仗剑行侠

    会员等级: 5

  • TA的每日心情
    擦汗
    2013-12-27 20:48
  • 签到天数: 60 天

    [LV.6]常住仙友II

    精华
    0
    积分
    1348
    历练
    0
    声望
    2
    人气
    178
    单身中……
    帮我摆脱单身吧
    4
    发表于 2011-5-17 18:46:09 |只看该作者
    小雨哥做贪吃蛇。。。
    新书《追梦进行曲》妄支持~http://book.hjsm.tom.com/116592/index.html
    回复

    使用道具 举报

    846

    主题

    7

    听众

    1万

    积分

    御剑江湖

    秘密

    会员等级: 8

  • TA的每日心情
    无聊
    1 小时前
  • 签到天数: 3008 天

    [LV.Master]伴坛终老

    精华
    0
    积分
    13317
    历练
    0
    声望
    431
    人气
    294

    转帖之王 匠心独运

    单身中……
    帮我摆脱单身吧
    5
    发表于 2011-5-17 21:30:39 |只看该作者
    话说JAVA 对我手机一点用处没有- =
    回复

    使用道具 举报

    0

    主题

    1

    听众

    15

    积分

    初涉江湖

    会员等级: 1

    该用户从未签到

    精华
    0
    积分
    15
    历练
    0
    声望
    1
    人气
    6
    单身中……
    帮我摆脱单身吧
    6
    发表于 2011-5-22 10:38:25 |只看该作者
    路过看看先留下记号的啊,以后有时间再来看的啊……
    www.baidumama.org
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    手机版|Archiver|仙剑之十里坡 ( 苏ICP备11022766号 )  

    GMT+8, 2024-11-23 16:43 , Processed in 0.326866 second(s), 60 queries .

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回顶部