程序效果:

代码:

//Snake.java  1 package snake;

 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Random;
 class go implements Runnable {
     Snake s;
     Random random;
     int foodX = 15, foodY = 15;
 int N;
     go(Snake snake) {
         s = snake;
         random = new Random();
         N=s.N;
     }
     Point getFood() {
         Point p = new Point();
         Iterator<Point> it = s.list.iterator();
         Point temp = it.next();
         boolean isFoodinBody = true;
         while (isFoodinBody) {
             foodX = Math.abs(random.nextInt()) % N;
             foodY = Math.abs(random.nextInt()) % N;
             isFoodinBody = false;
             while (it.hasNext()) {
                 temp = (Point) it.next();
                 if (foodX == temp.x && temp.y == foodY) {
                     isFoodinBody = true;
                     break;
                 }
             }
         }
         return p;
     }
     public void run() {
         while (true) {
             Point first = s.list.getFirst();
             int x = first.x, y = first.y;
             int gotfood = 0;
             if (foodX == x && foodY == y) {
                 if (!s.isDead) {
                     s.SCORE += 100;
                     s.scoreField.setText("SCORE:  "+new Integer(s.SCORE).toString());
                     s.list.add(s.list.getLast());
                 }
                 gotfood = 1;
                 foodX = Math.abs(random.nextInt()) % N;
                 foodY = Math.abs(random.nextInt()) % N;
                 s.bs[foodX][foodY].setBackground(Color.PINK);

             }
             Iterator<Point> it = s.list.iterator();
             Point temp = it.next();
             while (it.hasNext()) {
                 temp = (Point) it.next();
                 if (temp.x == x && temp.y == y) {

                     s.gameOver();

                 }
                 if (gotfood == 1 && foodX == temp.x && temp.y == foodY) {
                     Point food = getFood();
                     foodX = food.x;
                     foodY = food.y;
                     s.bs[foodX][foodY].setBackground(Color.PINK);
                     gotfood=0;
                 }
             }
             switch (s.dir) {
                 case 2 :
                     y =( (y - 1)+N )% N;
                     /*if (y == -1)
                         y = 29;*/
                     break;
                 case 0 :
                     y = (y + 1) % N;
                     break;
                 case 3 :
                     x = ((x - 1)+N) % N;
                     /*if (x == -1)
                         x = 29;*/
                     break;
                 case 1 :
                     x = (x + 1) % N;
                     break;
             }
             Point head = new Point(x, y);
             s.bs[x][y].setBackground(Color.LIGHT_GRAY);

             s.list.addFirst(head);
             Point lastP = s.list.removeLast();
             s.bs[lastP.x][lastP.y].setBackground(Color.GRAY);
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }

             /*
              * for (int i = 0; i <= list.size() - 1; i++) { System.out.print(
              * "(" + list.get(i).x + "," + list.get(i).y + ")  ");
              *
              * }
              */
             // System.out.println();

         }
     }
 }
 public class Snake extends JFrame {
     private static final long serialVersionUID = -6494984874207734357L;
     int N = 30;
     int dir = 0;// 0 右 1下 2左 3上
     int SCORE = 0;
     int a=0,b=0,c=0;
     boolean isDead = false;
     JButton[][] bs = new JButton[N][N];
     JPanel panel,scorePanel;
     JTextField scoreField,bestScoreField;
     LinkedList<Point> list;
     Snake() {
         super("Snake");
         Container container = getContentPane();
         container.setLayout(new BorderLayout());
         scorePanel = new JPanel();
         scorePanel .setLayout(new BorderLayout());
         scoreField = new JTextField(20);
         bestScoreField= new JTextField(50);
         bestScoreField.setText(getBestScores());
         bestScoreField.setEditable(false);
         scoreField.setText("SCORE:  "+new Integer(SCORE).toString());
         scoreField.setEditable(false);
         scorePanel.add(scoreField,BorderLayout.WEST);
         scorePanel.add(bestScoreField,BorderLayout.EAST);
         container.add(scorePanel, BorderLayout.NORTH);
         panel = new JPanel();
         panel.setLayout(new GridLayout(N, N));

         for (int i = 0; i <= N - 1; i++) {
             for (int j = 0; j <= N - 1; j++) {
                 bs[i][j] = new JButton();
                 bs[i][j].setBackground(Color.GRAY);
                 panel.add(bs[i][j]);
             }
         }

         container.add(panel, BorderLayout.CENTER);
         list = new LinkedList<Point>();

         list.add(new Point(15, 15));
         list.add(new Point(15, 14));
         list.add(new Point(15, 13));
         list.add(new Point(15, 12));
         list.add(new Point(15, 11));
         for (int i = 0; i <= list.size() - 1; i++) {
             bs[list.get(i).x][list.get(i).y].setBackground(Color.LIGHT_GRAY);
         }
         /*for (int i = 0; i <= list.size() - 1; i++) {
             System.out.print("(" + list.get(i).x + "," + list.get(i).y + ")  ");

         }*/
         /*System.out.println();*/

         this.addKeyListener(new KeyAdapter() {
             public void keyPressed(KeyEvent e) {
                 int c = e.getKeyCode();
                 //System.out.print(c);
                 int dir1 = dir;
                 switch (c) {
                     case KeyEvent.VK_LEFT :
                         dir1 = 2;
                         break;
                     case KeyEvent.VK_RIGHT :
                         dir1 = 0;
                         break;
                     case KeyEvent.VK_UP :
                         dir1 = 3;
                         break;
                     case KeyEvent.VK_DOWN :
                         dir1 = 1;
                         break;
                     default :
                         System.out.print("hey");
                         break;
                 }
                 if (!(dir1 - dir == -2 | dir1 - dir == 2))
                     dir = dir1;
             }
         });
         this.setFocusable(true);
         setLocation(200, 10);
         setSize(800, 700);
         setVisible(true);
     }
     String getBestScores() {

         BufferedReader reader=null;
         try {
             reader=new BufferedReader(new FileReader("score.txt"));
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         }

         try {
         a=Integer.parseInt(reader.readLine());
         b=Integer.parseInt(reader.readLine());
         c=Integer.parseInt(reader.readLine());
         } catch (NumberFormatException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }
         String bestS=new String("Best Score: "+new Integer(a).toString()+"   "+new Integer(b).toString()+"   "+new Integer(c).toString());
         return bestS;
     }
 int gameOver(){
     isDead = true;
     JOptionPane.showMessageDialog(null, "你死了~~~.", "GAME OVER",
             JOptionPane.PLAIN_MESSAGE);
     if(SCORE>a){c=b;b=a;a=SCORE;save();System.exit(0);}
     if(SCORE>b){c=b;b=SCORE;save();System.exit(0);}
     if(SCORE>c){c=SCORE;save();System.exit(0);}
     System.exit(0);
     return 0;
 }
 int save(){

     BufferedWriter writer=null;
         try {
             writer=new BufferedWriter(new FileWriter("score.txt"));
         } catch (IOException e) {
             e.printStackTrace();
         }
     String d=new Integer(a).toString(),e=new Integer(b).toString(),f=new Integer(c).toString();
     try {
         writer.write(d);
         writer.newLine();
         writer.write(e);
         writer.newLine();
         writer.write(f);
         writer.flush();
         writer.close();
         } catch (NumberFormatException ev) {
         ev.printStackTrace();
     } catch (IOException ev) {
         ev.printStackTrace();
     }
     return 0;
 }
     public static void main(String[] args) {
         Snake snake = new Snake();
         snake.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         Thread thread = new Thread(new go(snake));
         thread.start();
     }

 }

程序写于大三上学期。

2016.4.12更新博客。

END

贪吃蛇(Java实现)的更多相关文章

  1. 贪吃蛇 Java实现(一)

    贪吃蛇  Java实现 1.面向对象思想 1.创建antition包它是包含sanke  Ground Food类 2.创建Controller包controller类 3.创建Game包有game类 ...

  2. 贪吃蛇java版

    主要的蛇的类 import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import ja ...

  3. 贪吃蛇的java代码分析(一)

    自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...

  4. 贪吃蛇的java代码分析(二)

    代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...

  5. 贪吃蛇的java代码分析(三)

    代码剖析 在上一篇文章中,我们完成了贪吃蛇部分代码的构造.回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动.想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的 ...

  6. 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟

    简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...

  7. java贪吃蛇

    这个贪吃蛇有很多功能没有实现,比如说穿墙(本来可以实现,但是穿墙后,就会出现坐标混乱,吃不到食物了),还有碰到自己的身体死亡的情况也没有实现,现在我知道如何判断是否碰到身体,但是,我不知道,如何处理碰 ...

  8. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  9. 贪吃蛇C#和JAVA实现

    using System; using System.Windows.Forms; using System.Drawing; class Window : Form { Point[] a = ]; ...

  10. java实现贪吃蛇游戏

    最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...

随机推荐

  1. 纪念品分组 2007年NOIP全国联赛普及组

    题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格 ...

  2. PHP正则表达式

    1.PHP中两个常用的正则函数 a.preg_match 正则函数,以perl语言为基础 语法:preg_match( mode,string subject,array matches) 说明:mo ...

  3. php 实现设计模式之 建造者模式

    <?php /** * 建造者模式 * ------------- * 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. * 类型:创建类模式 * 四个要素: * ...

  4. android视频播放器

    RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetworks公司提交的 ...

  5. Atitit.异常处理 嵌套  冗长的解决方案

    Atitit.异常处理 嵌套  冗长的解决方案 1. 异常处理的需要改进的地方1 2. +异常设计的初衷是, 在程序中出现错误时, 由程序自己处理错误, 尽量不要以exit(0)这种粗暴的方式中止程序 ...

  6. hadoop 集群的配置

    在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...

  7. angular使用post、get向后台传参的问题

    一.问题的来源 我们都知道向后台传参可以使用get.put,其形式就类似于name=jyy&id=001.但是在ng中我却发现使用$http post进行异步传输的过程中后台是接收不到数据的. ...

  8. react引用ant的table组件

    import React from 'react';import '../../css/uicss/UI.css';import 'antd/lib/style/index.less';import ...

  9. Microsoft Dynamics CRM 分销行业解决方案

    Microsoft Dynamics CRM 分销行业解决方案 方案亮点 360度动态渠道信息管理 充分的客户细分 全面的业务代表考核指标 业务代表管理和能力建设 业务代表过程管理 业务代表费用管理 ...

  10. 从FineReport看开放式引擎API

    对于一款软件或产品,尤其是一些企业级应用的IT软件,是不可能满足所有需求的.尤其是针对业务化的产品需求,某些个性化的需求就要进行二次开发.二次开发需要API接口,无论是什么样的开发,开发人员都需要对开 ...