Java 开发简单的贪吃蛇游戏

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        game.start();
    }

}
public class Node {

    private int x ;
    private int y ;

    public Node(){}

    public Node(int x , int y){
        this.x = x ;
        this.y = y ;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    @Override
    public int hashCode() {
        /*final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;*/
        return x;
    }

    @Override
    public boolean equals(Object obj) {
    /*    if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Node other = (Node) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;*/

        if (null == obj) {
            return false;
        }

        if (this == obj) {
            return true;
        }

        if (obj instanceof Node) {
            Node n = (Node) obj;
            if (this.x == n.x && this.y == n.y) {
                return true;
            }
        }

        return false;
    }

    @Override
    public String toString() {
        return "Node [x=" + x + ", y=" + y + "]";
    }

}
import java.util.LinkedList;

public class Snake {
    //存放节点的链表, 也就是蛇身
    private LinkedList<Node> nodes = new LinkedList<Node>();

    //申明一个foods(食物)对象
    InitPanel food;
    //定义方向

    public static final int UP = -10;
    public static final int DOWN = 10;
    public static final int LEFT = -1;
    public static final int RIGHT =1;

    //定义蛇初始的方向
    private int direction;

    /**
     *创建Snake 初始化时的对象
     */
    public Snake(){
        nodes.add(new Node(3,9));
        nodes.add(new Node(4,9));
        nodes.add(new Node(4,10));
        nodes.add(new Node(5,10));

        //蛇头的方向
        this.direction = UP;
    }

    public Snake(LinkedList<Node> nodes){
        //清空链表中的所有节点
        this.nodes.clear();
        //添加所有的节点
        this.nodes.addAll(nodes);

    }

    /**
     *移动
     */
    private void step(){
        //先获取头节点, 也就是蛇头
        Node top = this.nodes.getFirst();

        //移动后的坐标

        int x =top.getX()+ this.direction/10;
        int y =top.getY()+this.direction%10;

        //新蛇头的坐标
        Node t = new Node(x,y);

        //添加蛇头
        nodes.addFirst(t);

        //删除蛇尾巴
        if(food.getFood().contains(nodes.getFirst())){
            food.Meet();
        }else{
            nodes.removeLast();
        }

    }

    /**
     *移动
     */
    public void step(int direction,InitPanel sp){
        if(this.direction + direction == 0){
            throw new RuntimeException("方向走反");
        }
        this.direction = direction;
        this.food = sp ;
        step();
    }

    /**
     *判断节点是否都在蛇身上
     */
    public boolean containNode(Node node){
        return nodes.contains(node);
    }

    /**
     *得到所有的节点对象
     */
    public LinkedList<Node> getNodes(){
        return nodes;
    }

}
import java.util.HashSet;
import java.util.Random;

public class InitPanel {
    public int rows = 10;
    public int cols = 30;

    private Snake snake;

    private HashSet<Node> foods = new HashSet<Node>();

    Random random;
    /**
     *界面构造器
     */
    public InitPanel(){
        //创建出蛇对象
        snake = new Snake();
        //创建出食物对象
        this.initFoods(5);
    }
    //返回蛇身
    public Snake getSnake(){
        return snake;
    }
    /**
     * 实例化食物对象
     */
    public void initFoods(int i){
        random = new Random();
        while(true){
            //食物不能出现的位置,不能在边界上 ,也不能在边界外
            int x = random.nextInt(rows-2)+1;
            int y = random.nextInt(cols-2)+1;
            Node food = new Node(x,y);
            //食物还不能在蛇身上
            if(snake.containNode(food)){
                continue;
            }
            //食物与食物之间出现在界面上的时候还不能再同一个位置
            if(foods.contains(food)){
                continue;
            }

            //添加食物在食物链表中
            foods.add(food);

            //如果生成的食物数量达到i,则退出循环
            if(foods.size()==i){
                break;
            }
        }
    }

    //产生界面
    public void print(){
        for(int i = 0 ; i < rows ; i ++){

            for(int j = 0 ; j < cols  ; j ++){

                if(i == 0 || i == rows - 1){
                    System.out.print("-");
                }else if(j == 0 || j == cols - 1 ){
                    System.out.print("|");
                }else if(snake.containNode(new Node(i,j))){
                    System.out.print("*");
                }else if(foods.contains(new Node(i,j))){
                    System.out.print("o");
                }else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

    //返回食物的所有节点
    public HashSet<Node> getFood(){
        return foods;
    }

    //当蛇吃到食物的时候,该食物就应该消失
    public HashSet<Node> Meet(){
        foods.remove(snake.getNodes().getFirst());
        return foods;
    }

}
import java.util.Scanner;

public class Game {

    //游戏开始
    public void start(){
        InitPanel sp = new InitPanel();
        Snake snake = sp.getSnake();

        Scanner input = new Scanner(System.in);
        while(true){
            sp.print();
            System.out.println("dir:");

            String str =input.nextLine();
            switch (str) {
            case "w":
                snake.step(Snake.UP,sp);
                break;
            case "s":
                snake.step(Snake.DOWN,sp);
                break;
            case "a":
                snake.step(Snake.LEFT,sp);
                break;
            case "d":
                snake.step(Snake.RIGHT,sp);
                break;
            case "q":
                System.out.println("结束了游戏   拜拜");
                System.exit(0);
                break;

            default:
                break;
            }
        }
    }

}

贪吃蛇其实可以看成由一节节的节点组成的一个链表的集合
时间: 2024-08-09 19:32:15

Java 开发简单的贪吃蛇游戏的相关文章

Java控制台下的贪吃蛇游戏

实现贪吃蛇游戏的思路:   class Node(i,j)  //表示坐标 class Worm(List<Node> nodes)        //   行数:10行//用LinkedList存储蛇的坐标点.当前进是用addFirst(Node node)方法添加一个一个坐标点(可以通过getFirst()得到上一个坐标-1得出):然后再删除尾节点.如果碰到食物则不删除尾节点. // 列数:32列 step()//往前走一步 step(int dir)//根据方向往前走一步 class W

做一个简单的贪吃蛇游戏

这是一个贪吃蛇游戏,你可以忽略他的外表,好了,先上html代码 <style type="text/css"> * {margin: 0;padding: 0;} #container {width: 1000px;height: 550px;border: 1px solid #000;margin: 0 auto;} #container #ground {width: 1000px;height: 500px;background-color:#eeeeee;posi

菜鸟学C++:做一个最最简单的贪吃蛇游戏

#include<iostream> #include<windows.h> #include<time.h> #include<conio.h> #define HEIGHT 20 #define WIDTH 20 using namespace std; void setMap(char maps[HEIGHT][WIDTH]) { int i,j; for(i=0;i<=WIDTH-1;i++) { maps[0][i]='-'; maps[HE

使用Love2D引擎开发贪吃蛇游戏

今天来介绍博主最近捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章当中我们将会涉及到贪吃蛇的基本算法.Lua语言编程等基本的内容,希望能够对大家开发类似的游戏提供借鉴和思考,文章中如有不足之处,还希望大家能够谅解,因为博主的游戏开发基本就是这样慢慢摸索着学习,所以难免会有不足的地方. 游戏算法 我们首先来看看贪吃蛇是怎么移动的? 通过这四张图的演示,我们可以发现这样一个规律: 蛇的移动其实是将蛇

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

结对-开发贪吃蛇游戏-开发环境搭建过程

项目:贪吃蛇游戏开发 环境搭建: Mac下: 1)官网下载jkd1.8版本. 2)下载IDE--eclipse或Myeclipse win下: 1)官网下载JDK,找到符合自己电脑的版本,下载的本地 2)下载IDE--eclipse或Myeclipse 3)配置环境变量: i.计算机->属性->高级系统设置 ii.单击高级系统设置->环境变量在系统变量里面分别设置JAVA_HOME.CLASSPATH和Path iii.在系统变量里找变量名JAVA_HOME,如果没有就点击新建.输入变量

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏 页面结构 简单的21x21的方块,页面结构 id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div的类名为blank,如果这一个方格表示“贪吃蛇”的“食物”,div的类名为food,如果这一个方格表示“蛇”,div的类名为snake. CSS JS 然后我们思考下一个贪吃蛇游戏需要那些参数, 首先,界面中可见的元素无非就是空方格,

qtday03 简单版的贪吃蛇游戏

//snakegame.h #ifndef SNAKEGAME_H #define SNAKEGAME_H #include<QList> #include<QtWidgets/QLabel> #include<QtWidgets/QDialog> #include<QKeyEvent> #include<QTimer> /*枚举,表示方向*/ enum Direction{D_UP,D_DOWN,D_LEFT,D_RIGHT}; class S