贪吃蛇java版
主要的蛇的类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.Random; public class Snake { private Node head = null;
private Node tail = null;
int size = 0;
private boolean live = true; /**
* 判断蛇是否活着
* @return true则活着 false则死亡
*/
public boolean isLive() {
return live;
}
/**
* 设置蛇的生死
* @param live true则活着 false则死亡
*/
void setLive(boolean live){
this.live = live;
} private Yard y; Node n = new Node(15, 15, Dir.L);
/**
* 构造方法
* @param y
*/
public Snake(Yard y){
this.y = y;
head = n;
tail = n;
size++;
} /**
* 将一个结点添加到蛇的链表中
*/
void addToTail(){
Node node = null;
switch (tail.dir) {
case L:
node = new Node(tail.row, tail.col+1, tail.dir);
break;
case U:
node = new Node(tail.row+1, tail.col, tail.dir);
break;
case R:
node = new Node(tail.row, tail.col-1, tail.dir);
break;
case D:
node = new Node(tail.row-1, tail.col, tail.dir);
break;
}
tail.next = node;
node.prev = tail;
tail = node;
size++;
} /**
* 将一个结点从蛇的尾巴处删除
*/
void deleteFromTail(){
if(size == 0) return;
tail = tail.prev;
tail.next = null;
size--;
} /**
* 设置使蛇的位置向前移动一步
*/
void move(){
addToHead();
deleteFromTail();
checkDead();
}
/**
* 蛇的重画方法
* @param g
*/
void draw(Graphics g){
if(!isLive() || size == 0) {
return;
}
move();
for(Node node = head ; node != null ; node = node.next){
node.draw(g);
} }
/**
* 将一个结点加到蛇链表的头部
*/
void addToHead(){
Node node = null;
switch (head.dir) {
case L:
node = new Node(head.row, head.col-1, head.dir);
break;
case U:
node = new Node(head.row-1, head.col, head.dir);
break;
case R:
node = new Node(head.row, head.col+1, head.dir);
break;
case D:
node = new Node(head.row+1, head.col, head.dir);
break;
}
node.next = head;
head.prev = node ;
head = node ;
size++;
} /**
* 保存蛇单个结点信息的类
*/
private class Node{
int w = Yard.BLOCK_SIZE;
int h = Yard.BLOCK_SIZE;
Dir dir = Dir.L;
int row,col; Node next = null;
Node prev = null; public Node(int row,int col,Dir dir){
this.row = row;
this.col = col;
this.dir = dir;
}
//蛇单个节点的画法
public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.BLACK);
g.fillRect(col*Yard.BLOCK_SIZE, row*Yard.BLOCK_SIZE, w, h);
g.setColor(c);
} }
/**
* 键盘监听
* @param e
*/
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
if(head.dir != Dir.R) head.dir = Dir.L;
break;
case KeyEvent.VK_UP:
if(head.dir != Dir.D) head.dir = Dir.U;
break;
case KeyEvent.VK_RIGHT:
if(head.dir != Dir.L) head.dir = Dir.R;
break;
case KeyEvent.VK_DOWN:
if(head.dir != Dir.U) head.dir = Dir.D;
break;
case KeyEvent.VK_F2:
if(!this.isLive()){
y.snake = new Snake(y);
}
break;
}
} /**
* 吃食物
* @param f
*/
public void eatFood(Food f){
if(this.getRect().intersects(f.getRect())){
f.setPos();
y.setScore();
this.addToTail();
}
} /**
* 通过检测来设置蛇的生死
*/
public void checkDead(){
if(head.col < 0 || head.col > Yard.COLS || head.row < 3 || head.row > Yard.ROWS-1){
setLive(false);
}
if(size >= 4){
for(Node node = head.next;node != null ; node = node.next){
if(head.row == node.row && head.col == node.col){
setLive(false);
}
}
}
} public Rectangle getRect(){
return new Rectangle(head.col*Yard.BLOCK_SIZE,head.row*Yard.BLOCK_SIZE,Yard.BLOCK_SIZE,Yard.BLOCK_SIZE);
}
}
吃的食物的类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random; public class Food {
int row,col;
int h = Yard.BLOCK_SIZE;
int w = Yard.BLOCK_SIZE;
private static Random rd = new Random();
int step = 0; public Food(int row ,int col) {
this.row = row;
this.col = col;
} public void draw(Graphics g){
Color c = g.getColor();
if(step == 0){
g.setColor(Color.RED);
step++;
}else if(step == 1){
g.setColor(Color.green);
step++;
}else {
g.setColor(Color.WHITE);
step = 0;
} g.fillOval(col*Yard.BLOCK_SIZE, row*Yard.BLOCK_SIZE, w, h);
g.setColor(c);
} public Rectangle getRect(){
return new Rectangle(col*Yard.BLOCK_SIZE, row*Yard.BLOCK_SIZE, w, h);
} void setPos(){
this.row = rd.nextInt(Yard.ROWS-3)+3;
this.col = rd.nextInt(Yard.COLS);
}
}
方向的枚举
public enum Dir {
L,U,R,D
}
主界面的类
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; class Yard extends Frame{ PaintThread pt = null;
/**
* 速度 设置数字越大 越慢
*/
public static final int SPEED = 4;
/**
* 行数
*/
public static final int ROWS = 30;
/**
* 列数
*/
public static final int COLS = 30;
/**
* 行列的宽度
*/
public static final int BLOCK_SIZE = 15; /**
* 在游戏窗口中加入一条蛇
*/
public Snake snake = new Snake(this); /**
* 在游戏窗口中加入一个食物
*/
public Food food = new Food(10,10); private Font font = new Font("宋体", Font.BOLD,30 ); private Image offScreenImage = null; //分数
private int score = 0; public int getScore() {
return score;
} public void setScore() {
this.score += 5;
} /**
* 窗口构建函数
*/
public void launch(){ pt = new PaintThread();
this.setLocation(200, 200);
this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);
this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
System.exit(0);
} }); this.setVisible(true);
this.addKeyListener(new KeyMonitor());
this.setResizable(false);
//开始重画线程
new Thread(pt).start(); } /**
* 主方法
* @param args
*/
public static void main(String[] args){
new Yard().launch();
} /**
* 重写的paint方法 用来画出各个元素
*/
@Override
public void paint(Graphics g) { Color c = g.getColor();
g.setColor(Color.GRAY);
g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);
g.setColor(Color.DARK_GRAY); //画出横线
for(int i=1; i<ROWS; i++) {
g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i);
}
for(int i=1; i<COLS; i++) {
g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);
} snake.eatFood(food);
g.setColor(Color.YELLOW);
g.drawString("score :" + score, 10, 50);
food.draw(g); if(snake.isLive()) {
snake.draw(g);
}else{
g.setColor(Color.YELLOW);
g.setFont(font);
g.drawString("Game Over!", 125, 225);
}
g.setColor(c); } /**
* 重写的update用来防止屏幕闪烁
*/
@Override
public void update(Graphics g) { if(offScreenImage == null){
offScreenImage = this.createImage(COLS*BLOCK_SIZE, ROWS*BLOCK_SIZE);
}
Graphics graphics = offScreenImage.getGraphics();
paint(graphics); g.drawImage(offScreenImage, 0, 0, null);
} /**
* 重画线程
*/
private class PaintThread implements Runnable{
private boolean flag = true; private boolean pause = false;
@Override
public void run() {
while(flag){
if(!pause)
repaint();
try {
Thread.sleep(25*SPEED);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void stopPaintThread(){
flag = !flag;
} public void pausePaintThread(){
pause = !pause;
}
} /**
* 键盘监听类
*/
private class KeyMonitor extends KeyAdapter{ @Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_SPACE){
pt.pausePaintThread();
}
snake.keyPressed(e);
} }
}
贪吃蛇java版的更多相关文章
- 原生js写的贪吃蛇网页版游戏特效
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <bo ...
- c/c++ 贪吃蛇控制台版
贪吃蛇控制台版(操作系统win7 64位:编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过) 运行效果: #include <iomanip> #include < ...
- 贪吃蛇 Java实现(一)
贪吃蛇 Java实现 1.面向对象思想 1.创建antition包它是包含sanke Ground Food类 2.创建Controller包controller类 3.创建Game包有game类 ...
- js贪吃蛇-简单版
分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- 如何用python制作贪吃蛇以及AI版贪吃蛇
用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- C语言 贪吃蛇
贪吃蛇(单人版): 本人先来介绍一个函数 -- bioskey函数: int bioskey (int cmd) 参数 (cmd) 基本功能 0 返回下一个从键盘键入的值(若不键入任何值,则将等下一个 ...
- 原生JavaScript贪吃蛇
在实例开发过程中还是能认识到很多不足的,并且加强了一些基础. 简单写一下制作过程: 1.创建画布 2.创建蛇和老鼠 坐标不能重叠 3.让蛇移动起来 4.添加死亡方法 5.添加转点坐标和方向 6.添加吃 ...
- 原生Js贪吃蛇游戏实战开发笔记
前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
随机推荐
- C++ 智能指针一
/* 智能指针shared_ptr */ #include <iostream> #include <string> #include <memory> //智能指 ...
- 纯CSS3冒泡动画按钮实现教程
这款CSS3动画按钮非常的有创意,鼠标在滑过按钮时并不像其他按钮那样仅仅改变按钮的背景颜色,而是出现很酷的冒泡动画.这么惊艳的CSS3动画按钮,这篇文章主要将按钮实现的过程和代码分享给大家,希望能给在 ...
- java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换
概述 信息安全基本概念: DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换) DH 是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一 ...
- duilib进阶教程 -- 在duilib中使用MFC (2)
好人做到底,送佛送到西.虽然上一篇教程已经说得很详细了,但Alberl还是再举一个例子.上一篇教程的主窗口是MFC的,所以这篇教程把主窗口换成duilib的~O(∩_∩)O~ 1.我们利用<20 ...
- php文件缓存方法总结
为大家分享很全的php文件缓存,供大家参考,具体内容如下 <?php class cache { private static $_instance = null; protected ...
- gdb 脚本调试
在使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这个时候就应该想起来用gdb命令脚本了,它能够很好的完成这些工作.以设置多个断点为例,我写的命令脚本为- ...
- C#基础系列——语法
1.C#是这样开始的: 函数入口:static void Main(String [] args){} 2.Hello World 例子 using system;--------导入命名空间,里 ...
- 【代码审计】YzmCMS_PHP_v3.6 代码执行漏洞分析
0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...
- 解决UEFI启动模式下无法使用U盘启动WIN7安装界面
问题场景 现在很多人都习惯使用U盘进行安装系统,主要是快捷方便.本文主要是讲解一下U盘在UEFI模式下无法启动Windows7安装界面的问题,可能很多人会说使用PE系统进行安装,但是因为我的主板只有独 ...
- 10.17正式开发stark项目(二)
2018-10-17 11:09:48 orm补充参考连接: https://www.cnblogs.com/yuanchenqi/articles/8963244.html model 进阶 参考连 ...