贪吃蛇(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[] ...
随机推荐
- 【笔记】Asp.Net WebApi对js POST带参数跨域请求的支持方案
先说下需求:在原来的WebApi项目中增加对js跨域的请求支持,请求方式:以POST为主,webapi路由规则根据原项目需求修改如下: public static void Register(Http ...
- T- SQL性能优化详解
摘自:http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册 ...
- hammer用法 jquery.hammer.js
jquery.hammer.js使用时要先引入hammer.min.js 下面代码是滑动效果: $("#nav").hammer().bind('swiperight', fu ...
- System.Diagnostics.Process.Start的妙用
我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...
- Java时间和时间戳的相互转换
时间转换为时间戳: /* * 将时间转换为时间戳 */ public static String dateToStamp(String s) throws ParseException{ String ...
- sqlserver附加 mdf、ldf的方法(手记)
exec sp_attach_db 'bookstore','E:\homework\bookstore_Data.MDF','E:\homework\bookstore_Log.LDF' EXEC ...
- 基于小脚丫DDS 调频 调幅 调相 切换波形 AD5601输出模拟波形
先讲讲里面的矩阵键盘,矩阵键盘列有下拉电阻,默认全为0000,默认行输入为1111,当有按键按下的时候,列输入会被拉高,这时控制行的输出做行扫描,电子琴用key_flag_r0电平作为使能,这里用ke ...
- 从零开始学Python第七周:面向对象进阶(需修改)
一,类的属性 (1)示例 通过属性获取已经创建对象的个数 class Plane: pCount = 0 #类属性 def __init__(self,name,category): self.nam ...
- .net开发过程中Bin目录下面几种文件格式的解释
在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..vshost.exe.config 项目发布的时候,往 ...
- S1java基础学习笔记
第一章 Java基础 程序目标:减轻现实生活中一类人的工作量,提高工作效率. 学员最终可以书写系统: 超市管理系统,POS机系统等 入库单 销售单 01.课程重点 五大重点: 01.分支(选择)结构 ...