贪吃蛇(Java实现)
程序效果:
代码:
//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实现)的更多相关文章
- 贪吃蛇 Java实现(一)
贪吃蛇 Java实现 1.面向对象思想 1.创建antition包它是包含sanke Ground Food类 2.创建Controller包controller类 3.创建Game包有game类 ...
- 贪吃蛇java版
主要的蛇的类 import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import ja ...
- 贪吃蛇的java代码分析(一)
自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...
- 贪吃蛇的java代码分析(二)
代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...
- 贪吃蛇的java代码分析(三)
代码剖析 在上一篇文章中,我们完成了贪吃蛇部分代码的构造.回头审视我们写的代码与思路,会发现我们遗漏了一个重要的地方,那就是:贪吃蛇的自身移动.想必大家都知道,贪吃蛇自身是会自己移动的,并且会跟随你的 ...
- 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟
简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...
- java贪吃蛇
这个贪吃蛇有很多功能没有实现,比如说穿墙(本来可以实现,但是穿墙后,就会出现坐标混乱,吃不到食物了),还有碰到自己的身体死亡的情况也没有实现,现在我知道如何判断是否碰到身体,但是,我不知道,如何处理碰 ...
- Java小游戏贪吃蛇
package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...
- 贪吃蛇C#和JAVA实现
using System; using System.Windows.Forms; using System.Drawing; class Window : Form { Point[] a = ]; ...
- java实现贪吃蛇游戏
最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...
随机推荐
- LinQ C#防注入式攻击实例代码
注入式攻击是Web开放项目中开发人员的第一时间要考虑的问题,下面就我的开发实例分享给大家,有用的的话就点个赞吧. 定義賬戶信息類 public class UserInfors { public st ...
- php调用COM组件
PHP 开启COM组件 1.先到PHP.INI中打开COM选项,com.allow_dcom = true 2.我这里的环境是PHP5.4.7,PHP 5.4.5后,com/dotnet 模块已经成了 ...
- 用eclipse做项目中常遇到的问题-如何创建并读取properties文件
在用eclipse做项目开发的时候我们常常会将一些重要的内容写在配置文件里面, 特别是连接数据库的url,username,password等信息,我们常常会新建一个properties文件将所有信息 ...
- 股指的趋势持续研究(Hurst指数)
只贴基本的适合小白的Matlab实现代码,深入的研究除了需要改进算法,我建议好好研究一下混沌与分形,不说让你抓住趋势,至少不会大亏,这个资金盈亏回调我以前研究过. function [line_H,R ...
- Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用
回到目录 官方的不一定是对的,机器最能证明一切 不知道从什么时候起,我们在写数据库连接,网络连接,文件操作时会习惯加上using,这种习惯被我们误称为一种模式,但事实上,一切事情都有因有果的,使用us ...
- 转载 【CSS进阶】伪元素的妙用--单标签之美
1.单个颜色实现按钮 hover .active 的明暗变化 请点击 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果 2.利用after伪类清除浮动 .clearfix:a ...
- easyui弹出层在最顶层显示跳出iframe框架通用javascript代码
有时候我们用easyui在后台框架中弹框的时候,总是显示在框架页面里面而不是整个系统框架的上面,看着有些不太乐意. dialog = function (opts) { var query = par ...
- js去掉字符串的空格
//去左空格; function ltrim(s){ return s.replace(/(^s*)/g, ""); } //去右空格; function rtrim(s){ re ...
- Blink, 通向哈里·波特的魔法世界
<哈里·波特>的故事里面,魔法界的新闻报纸都是动画的,配图带有动画效果.能够回放新闻的主要场景. 初次看到这个,感觉还挺新鲜的.不过现在,Blink 这样的 App 可以让这个魔法世界的幻 ...
- iOS之搜索框UISearchController的使用(iOS8.0以后替代UISearchBar+display)
在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISe ...