这是一款经典小游戏,贪吃蛇,玩家操控小蛇从小吃到大,全方面的代码解析,适合新手第一款的项目实战
⭐本项目演示地址⭐
⭐资源图片源代码私信博主⭐
源代码如下:
苹果类
import java.awt.*;
import java.util.Random;
/**
* 小蛇吃的苹果
*/
public class Apple {
private static Color APPLE_COLOR=Color.RED;//苹果的颜色
private int rows,cols;//出现的位置
private int w=Ground.BOX_SIZE;
private int h=Ground.BOX_SIZE;
private Random random=new Random();
public Apple(){
this.rows=random.nextInt(Ground.ROWS-5)+5;
this.cols=random.nextInt(Ground.COLS-5)+5;
}
/**
* 画苹果
* @param g
*/
public void drawApple(Graphics g){
Color color = g.getColor();
g.setColor(APPLE_COLOR);
g.fillOval(rows*Ground.BOX_SIZE,cols*Ground.BOX_SIZE,w,h);
g.setColor(color);
}
/**
* 获取碰撞检测点
* @return
*/
public Rectangle getRectangle(){
return new Rectangle(rows*Ground.BOX_SIZE,cols*Ground.BOX_SIZE,w,h);
}
/**
* 更新苹果的位置
*/
public void updateAppleLocation(){
this.rows=random.nextInt(Ground.ROWS-5)+5;
this.cols=random.nextInt(Ground.COLS-5)+5;
}
}
草地类
import java.awt.*;
import java.awt.event.*;
/**
* 草地类
*/
public class Ground extends Frame{
public static final int ROWS=50;//草地行数
public static final int COLS=50;//草地列数
public static final int BOX_SIZE=15;//每个小格的大小
private static final Color GROUND_COLOR=Color.BLACK;//草地的颜色
private int score=0;//初始分数
private boolean isOver=false;
private PaintThread paintThread=new PaintThread();
private Snake snake=new Snake(this);
private Apple apple=new Apple();
/**
* 运行草地
*/
public void execute(){
setSize(COLS*BOX_SIZE,ROWS*BOX_SIZE);
setLocation(200,200);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
});
addKeyListener(new MyKeyListener());
setVisible(true);
new Thread(paintThread).start();
}
/**
* 画出草地
* @param g
*/
@Override
public void paint(Graphics g) {
Color color = g.getColor();
g.setColor(GROUND_COLOR);
g.fillRect(0,0,COLS*BOX_SIZE,ROWS*BOX_SIZE);
//画出横线
g.setColor(Color.black);
for(int i=1;i<ROWS;i++){
g.drawLine(0,i*BOX_SIZE,COLS*BOX_SIZE,i*BOX_SIZE);
}
for(int i=1;i<COLS;i++){
g.drawLine(i*BOX_SIZE,0,BOX_SIZE*i,ROWS*BOX_SIZE);
}
//画蛇
snake.drawSnake(g);
//画苹果
apple.drawApple(g);
//吃苹果
snake.eatApple(apple);
//分值
g.setColor(Color.white);
g.drawString("当前分数:"+score+" 分",30,60);
if(isOver){
g.setFont(new Font("宋体",Font.BOLD,30));
g.setColor(Color.YELLOW);
g.drawString("游戏结束 ! \n 按F2重玩",200,300);
}
g.setColor(color);
}
/**游戏结束*/
public void stop(){
isOver=true;
paintThread.setOff();
}
/**
* 重画草地的线程
*/
private class PaintThread implements Runnable{
private boolean flag=true;
@Override
public void run() {
try {
while (flag){
Thread.sleep(100);
repaint();
}
}catch (Exception e){
System.out.println("【重画线程异常】");
e.printStackTrace();
}
}
public void setOff(){
this.flag=false;
}
public void setOn(){
this.flag=true;
}
}
/**
* 键盘事件
*/
private class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
snake.changeSnake(e);
if(isOver){
if(KeyEvent.VK_F2==e.getKeyCode())
restart();
}
}
}
/**
* 重新开始
*/
private void restart() {
isOver=false;
snake=new Snake(this);
paintThread.setOn();
new Thread(paintThread).start();
}
/**
* 双缓冲技术
*/
Image offScreenImage = null;
public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(COLS*BOX_SIZE,ROWS*BOX_SIZE);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0,COLS*BOX_SIZE,ROWS*BOX_SIZE);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public int getScore(){
return score;
}
public void setScore(int score){
this.score=score;
}
public static void main(String[] args){
new Ground().execute();
}
}
链表类
public class LinkNode {
private Node head;
private Node tail;
private int size;
public LinkNode(){
Node node=new Node();
head=node;
tail=node;
size=1;
}
/**
* 在链表的尾部添加一个节点
* @param node
*/
public void addToTail(Node node){
tail.setNext(node);
tail=node;
size++;
}
/**
* 添加到链表的头部
* @param node
*/
public void addToHead(Node node){
node.setNext(head);
head=node;
size++;
}
/**
* 遍历链表的数据项
* @return
*/
public void printLinkDatas(){
for(Node h=head;h!=null;h=h.getNext()){
System.out.print(h.getData()+"\t");
}
}
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}
public Node getTail() {
return tail;
}
public void setTail(Node tail) {
this.tail = tail;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "LinkNode{" +
"head=" + head +
", tail=" + tail +
", size=" + size +
'}';
}
}
创建链表类
public class TestCreateLinkNode {
/**
* 创建链表
* @param args
*/
public static void main(String[] args){
LinkNode linkNode = new LinkNode();
Node node=new Node();
Node node1=new Node();
Node node2=new Node();
Node node3=new Node();
node.setData(100);
node1.setData(45);
node2.setData(78);
node3.setData(23);
linkNode.addToTail(node);
linkNode.addToTail(node1);
linkNode.addToTail(node2);
linkNode.addToHead(node3);
linkNode.printLinkDatas();
}
}
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习