免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4594 | 回复: 1
打印 上一主题 下一主题

swing练习系列1 -- Snake贪吃蛇(源代码) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-18 15:20 |只看该作者 |倒序浏览
最近想学习学习JAVA,把一些练习内容贴出来,大家分享一下。

下面这个代码,比较粗糙。有兴趣的可以copy & paste 测试下。Thanks for any comment.


  1. package com.ftinternet;

  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.FlowLayout;
  5. import java.awt.GridLayout;
  6. import java.awt.event.KeyAdapter;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.MouseAdapter;
  9. import java.awt.event.MouseEvent;
  10. import java.util.HashMap;
  11. import java.util.LinkedList;
  12. import java.util.Random;
  13. import java.util.Timer;
  14. import java.util.TimerTask;

  15. import javax.swing.JButton;
  16. import javax.swing.JComboBox;
  17. import javax.swing.JFrame;
  18. import javax.swing.JLabel;
  19. import javax.swing.JPanel;

  20. class SnakePoint extends JButton {
  21.         private static final long serialVersionUID = 1L;
  22.         public final static int SOBJECT_NORMAL         = 0;
  23.         public final static int SOBJECT_GIFT         = 1;
  24.        
  25.         private int XPoint = -1;
  26.         private int YPoint = -1;
  27.         private int ObjectType = SOBJECT_NORMAL;
  28.        
  29.         public SnakePoint(int XPoint, int YPoint) {
  30.                 this.XPoint = XPoint;
  31.                 this.YPoint = YPoint;
  32.                 setText("  ");
  33.                 reset();
  34.         }
  35.        
  36.         public void reset() {
  37.                 setBackground(Color.lightGray);
  38.                 ObjectType = SOBJECT_NORMAL;
  39.         }
  40.        
  41.         public void SetPointType(int aPointType) {
  42.                 ObjectType = aPointType;
  43.                
  44.                 switch(ObjectType) {
  45.                 case SOBJECT_GIFT:
  46.                         setBackground(Color.green);
  47.                 }
  48.         }
  49.        
  50.         public int GetPointType() {
  51.                 return ObjectType;
  52.         }
  53.        
  54.         public void SetIsSnakeBody(boolean IsBody) {
  55.                 if (IsBody)
  56.                         setBackground(Color.red);
  57.                 else
  58.                         setBackground(Color.lightGray);
  59.         }
  60.        
  61.         public int GetXPoint() { return XPoint; }
  62.         public int GetYPoint() { return YPoint; }
  63. }

  64. public class Snake extends JFrame {
  65.         private static final long serialVersionUID = -7042297423926026518L;
  66.         private int SnakeMaxLength        = 10;
  67.         private int SnakeMapWidth        = 30;
  68.         private int SnakeMapHeight        = 30;
  69.        
  70.         JPanel pnlControl = new JPanel();
  71.         JPanel pnlView = new JPanel();
  72.         JLabel lbScore = new JLabel("0");
  73.         JComboBox cbxGameSpeedLvl = new JComboBox(new String[] {"Easy", "Normal", "Hard"});
  74.        
  75.         private HashMap<String, SnakePoint> SnakeMap = new HashMap<String, SnakePoint>();
  76.         LinkedList<SnakePoint> SnakeBody = new LinkedList<SnakePoint>();
  77.         private boolean GameActive = false;
  78.         private final Timer timer = new Timer();

  79.         private final static int MOVE_STAY         = -1;
  80.         private final static int MOVE_EAST         = 0;
  81.         private final static int MOVE_SOUTH         = 1;
  82.         private final static int MOVE_WEST         = 2;
  83.         private final static int MOVE_NORTH         = 3;
  84.        
  85.         private int MoveDirection = MOVE_STAY;
  86.         private int NextDirection = MOVE_STAY;
  87.        
  88.         private String GetSnakePointCode(int XPoint, int YPoint) {
  89.                 return "" + XPoint + "-" + YPoint;
  90.         }
  91.        
  92.         private String GetSnakePointCode(int Index) {
  93.                 return GetSnakePointCode(Index % SnakeMapWidth, Index / SnakeMapWidth);
  94.         }

  95.         private SnakePoint GetSnakePoint(int XPoint, int YPoint) {
  96.                 return (SnakePoint) SnakeMap.get(GetSnakePointCode(XPoint, YPoint));
  97.         }

  98.         private SnakePoint GetSnakePoint(int Index) {
  99.                 return (SnakePoint) SnakeMap.get(GetSnakePointCode(Index));
  100.         }

  101.         public Snake(int aWidth, int aHeight, int aMaxLength) {
  102.                 setDefaultCloseOperation(EXIT_ON_CLOSE);
  103.                 setTitle("Snake 1.0");
  104.                
  105.                 SnakeMapWidth = aWidth > 10 ? aWidth : 10;
  106.                 SnakeMapHeight = aHeight > 10 ? aHeight : 10;
  107.                 SnakeMaxLength = aMaxLength;
  108.                
  109.                 getContentPane().add(pnlControl, BorderLayout.NORTH);
  110.                 pnlControl.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 2));
  111.                
  112.                 pnlControl.add(lbScore);
  113.                 JButton bRestart = new JButton("Start");
  114.                 pnlControl.add(bRestart);
  115.                 bRestart.addMouseListener(new MouseAdapter() {
  116.                         public void mouseClicked(MouseEvent ae) {
  117.                                 InitGame();
  118.                         }
  119.                         });

  120.                 JButton bPause = new JButton("Pause");
  121.                 pnlControl.add(bPause);
  122.                 bPause.addMouseListener(new MouseAdapter() {
  123.                         public void mouseClicked(MouseEvent ae) {
  124.                                 if (SnakeBody.size() < 1) return;
  125.                                 GameActive = !GameActive;
  126.                                 GetSnakePoint(0).grabFocus();
  127.                                
  128.                                 JButton mbSender = (JButton) ae.getSource();
  129.                                 if (GameActive)
  130.                                         mbSender.setText("Pause");
  131.                                 else
  132.                                         mbSender.setText("Continue");
  133.                         }
  134.                         });
  135.                
  136.                 pnlControl.add(new JLabel("Move Speed:"));
  137.                 pnlControl.add(cbxGameSpeedLvl);
  138.                 cbxGameSpeedLvl.setSelectedIndex(1);

  139.                 getContentPane().add(pnlView, BorderLayout.CENTER);
  140.                 pnlView.setLayout(new GridLayout(SnakeMapHeight, SnakeMapWidth));
  141.                 for (int h = 0; h < SnakeMapHeight; h++)
  142.                         for (int w = 0; w < SnakeMapWidth; w++)
  143.                         {
  144.                                 SnakePoint aPoint = new SnakePoint(w, h);
  145.                                 pnlView.add(aPoint);
  146.                                 SnakeMap.put(GetSnakePointCode(w, h), aPoint);
  147.                                 aPoint.addKeyListener(new KeyAdapter() {
  148.                                         public void keyPressed(KeyEvent e) {
  149.                                                 switch (e.getKeyCode())
  150.                                                 {
  151.                                                 case KeyEvent.VK_W:
  152.                                                 case KeyEvent.VK_UP:
  153.                                                         SetMoveDirection(MOVE_NORTH);
  154.                                                         break;
  155.                                                 case KeyEvent.VK_S:
  156.                                                 case KeyEvent.VK_DOWN:
  157.                                                         SetMoveDirection(MOVE_SOUTH);
  158.                                                         break;
  159.                                                 case KeyEvent.VK_A:
  160.                                                 case KeyEvent.VK_LEFT:
  161.                                                         SetMoveDirection(MOVE_WEST);
  162.                                                         break;
  163.                                                 case KeyEvent.VK_D:
  164.                                                 case KeyEvent.VK_RIGHT:
  165.                                                         SetMoveDirection(MOVE_EAST);
  166.                                                         break;
  167.                                                 }
  168.                                         }
  169.                                 });
  170.                         }
  171.                 timer.schedule(new TimerTask() {
  172.                         public void run() {
  173.                                 if (!GameActive) return;
  174.                                 UpdateSnake();
  175.                         }
  176.                 }, 0, 50);
  177.                 pack();
  178.         }

  179.         private void GameOver(boolean Active)
  180.         {
  181.                 GameActive = false;
  182.         }
  183.        
  184.         protected void InitGame() {
  185.                 SnakeBody.clear();
  186.                
  187.                 for (int i = 0; i < SnakeMapWidth * SnakeMapHeight; i++)
  188.                         GetSnakePoint(i).reset();

  189.                 SnakeBody.add(GetSnakePoint(SnakeMapWidth / 2, SnakeMapHeight / 2));
  190.                 SnakeBody.add(GetSnakePoint(SnakeMapWidth / 2 - 1, SnakeMapHeight / 2));
  191.                 SnakeBody.add(GetSnakePoint(SnakeMapWidth / 2 - 2, SnakeMapHeight / 2));
  192.                
  193.                 RefreshSnake();
  194.                 CreateGift();
  195.                 lbScore.setText("0");
  196.                 GetSnakePoint(0).grabFocus();

  197.                 GameActive = true;
  198.         }
  199.        
  200.         protected void UpdateScore(int aIncrement) {
  201.                 lbScore.setText("" + (Integer.parseInt(lbScore.getText()) + aIncrement));
  202.                
  203.         }

  204.         protected synchronized void RefreshSnake() {
  205.                 for (int i = 0; i < SnakeBody.size(); i++)
  206.                         ((SnakePoint) SnakeBody.get(i)).SetIsSnakeBody(true);
  207.         }
  208.        
  209.         protected synchronized void SetMoveDirection(int aDirection)
  210.         {
  211.                 if (Math.abs(aDirection - MoveDirection) == 2) return;
  212.                 NextDirection = aDirection;
  213.         }
  214.        
  215.         protected void CreateGift() {
  216.                 SnakePoint aGift = null;
  217.                 Random rand = new Random();

  218.                 while (aGift == null) {
  219.                         aGift = GetSnakePoint(rand.nextInt(SnakeMapWidth * SnakeMapHeight));
  220.                         if (SnakeBody.indexOf(aGift) >= 0) aGift = null;
  221.                 }
  222.                 aGift.SetPointType(SnakePoint.SOBJECT_GIFT);
  223.         }
  224.        
  225.         private int RunTimeClock = 0;
  226.         protected boolean CheckSpeedLvl() {
  227.                 if (++RunTimeClock > cbxGameSpeedLvl.getItemCount() - cbxGameSpeedLvl.getSelectedIndex() - 1) {
  228.                         RunTimeClock = 0;
  229.                         return true;
  230.                 }
  231.                 return false;
  232.         }
  233.         protected synchronized void UpdateSnake() {
  234.                 if (!GameActive || !CheckSpeedLvl()) return;
  235.                
  236.                 SnakePoint SnakeHead = (SnakePoint) SnakeBody.get(0);
  237.                 int nXPoint = SnakeHead.GetXPoint();
  238.                 int nYPoint = SnakeHead.GetYPoint();
  239.                
  240.                 if (NextDirection != MoveDirection) MoveDirection = NextDirection;

  241.                 switch(MoveDirection)
  242.                 {
  243.                 case MOVE_EAST:
  244.                         nXPoint = nXPoint == SnakeMapWidth - 1 ? 0 : nXPoint + 1;
  245.                         break;
  246.                 case MOVE_SOUTH:
  247.                         nYPoint = nYPoint == SnakeMapHeight - 1 ? 0 : nYPoint + 1;
  248.                         break;
  249.                 case MOVE_WEST:
  250.                         nXPoint = nXPoint == 0 ? SnakeMapWidth - 1 : nXPoint - 1;
  251.                         break;
  252.                 case MOVE_NORTH:
  253.                         nYPoint = nYPoint == 0 ? SnakeMapHeight - 1 : nYPoint - 1;
  254.                         break;
  255.                 default:
  256.                                 return;
  257.                 }
  258.                 SnakeHead = GetSnakePoint(nXPoint, nYPoint);
  259.                
  260.                 if (SnakeBody.indexOf(SnakeHead) > 1) {
  261.                         GameOver(false);
  262.                         return;
  263.                 }
  264.                
  265.                 SnakeBody.addFirst(SnakeHead);
  266.                 if (SnakeHead.GetPointType() == SnakePoint.SOBJECT_GIFT) {
  267.                         UpdateScore(10);
  268.                         SnakeHead.SetPointType(SnakePoint.SOBJECT_NORMAL);
  269.                         CreateGift();
  270.                         if (SnakeBody.size() >= SnakeMaxLength)
  271.                                 ((SnakePoint) SnakeBody.removeLast()).SetIsSnakeBody(false);
  272.                 }
  273.                 else
  274.                         ((SnakePoint) SnakeBody.removeLast()).SetIsSnakeBody(false);
  275.                
  276.                 RefreshSnake();
  277.         }
  278.         public static void main(String[] args) {
  279.                 Snake aGame = new Snake(20, 20, 50);
  280.                 aGame.setVisible(true);
  281.         }

  282. }

复制代码

论坛徽章:
1
天秤座
日期:2013-11-07 18:39:20
2 [报告]
发表于 2007-07-18 15:27 |只看该作者
不错,我喜欢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP