贪吃蛇逻辑代码

package cd.itcast.snake;

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

import cn.itcast.util.FrameUtil;

public class SnakeGame {
    //宽度(列数)x
    public static final int WIDTH = 50;
    //高度(行数)y
    public static final int HEIGHT = 10;
    //地图
    private char[][] background = new char[HEIGHT][WIDTH];

    //初始化地图
    private void initBackground() {
        for(int rows = 0 ; rows < background.length ; rows++){
            for(int cols = 0 ; cols < background[rows].length ; cols++){
                if (rows==0||rows==(background.length-1)) {
                    background[rows][cols]=‘*‘;
                }else {
                    background[rows][cols]=‘ ‘;
                }
            }
        }
    }
    //显示地图的
        private void showBackground() {
            for(int rows = 0 ; rows < background.length ; rows++){
                for(int cols = 0 ; cols < background[rows].length ; cols++){
                    System.out.print(background[rows][cols]);
                }
                System.out.println();
            }
        }
    //使用集合保存蛇所有信息
    LinkedList<Point> snake = new LinkedList<Point>();
    //初始化蛇
    public void initsnake() {
        int x = WIDTH/2;
        int y = HEIGHT/2;
        snake.addFirst(new Point(x-1,y));
        snake.addFirst(new Point(x,y));
        snake.addFirst(new Point(x+1,y));
    }
    //显示蛇--》蛇的节点信息,反馈到地图上
    public void showSnake() {
        //画蛇身,因为取出了蛇身,所以从1开始
        for(int i=1; i<snake.size();i++){
            Point body = snake.get(i);
            background[body.y][body.x] = ‘#‘;
        }
        //画蛇头,注意和二维数组对应
        Point head = snake.getFirst();
        background[head.y][head.x] = ‘$‘;
    }
    //蛇移动:向上移动
    public static final int UP_DIRECTION = 1;
    public static final int DOWN_DIRECTION = -1;
    public static final int LEFT_DIRECTION = 2;
    public static final int RIGHT_DIRECTION = -2;
    //默认方向
    int currentDecration=-2;
    //蛇移动的方法
    public void move() {
        Point head = snake.getFirst();
        //根据当前方向移动
        switch (currentDecration) {
        case UP_DIRECTION:
            snake.addFirst(new Point(head.x, head.y-1));
            break;
        case DOWN_DIRECTION:
            snake.addFirst(new Point(head.x, head.y+1));
            break;
        case LEFT_DIRECTION:
            //穿越左边
            if(head.x==0){
                snake.addFirst(new Point(WIDTH-1, head.y));
            }else {
                snake.addFirst(new Point(head.x-1, head.y));
            }
            break;
        case RIGHT_DIRECTION:
            if(head.x==WIDTH-1){
                snake.addFirst(new Point(0, head.y));
            }else {
                snake.addFirst(new Point(head.x+1, head.y));
            }
            break;
        default:
            break;
        }
        //如果吃到了,就要创建新的食物;没吃到才删除
        if (snakeEat()) {
            createFood();
        }else {
            snake.removeLast();
        }

    }
    //改变方向的方法
    public void changeDirection(int newDirection) {
        if(newDirection + currentDecration!=0){
            this.currentDecration = newDirection;
        }
    }
    //食物
    Point food;
    //创建食物
    public void createFood() {
        Random random = new Random();
        while (true) {
            int x = random.nextInt(WIDTH);
            int y = random.nextInt(HEIGHT);
            if(background[y][x]!=‘*‘){
                food = new Point(x,y);
                break;
            }
        }
    }
    //显示食物
    public void showFood() {
        background[food.y][food.x] = ‘&‘;
    }
    //吃食物:在移动的时候调用,因为每走一步,都可能吃到;当吃到的时候,蛇尾不删除
    public boolean snakeEat() {
        Point head = snake.getFirst();
        if(head.equals(food)){
            return true;
        }
        return false;
    }
    //刷新
    public void refrash() {
        //清空全部信息
        initBackground();
        //把食物的最新信息反馈到地图上
        showFood();
        //把蛇的最新信息反馈到地图上
        showSnake();
        //显示当前地图的信息
        showBackground();
    }
    //游戏是否结束
    static boolean isGameOver = false;
    public void isGameOver() {
        Point head = snake.getFirst();
        //撞墙死
        if (background[head.y][head.x]==‘*‘) {
            isGameOver = true;
        }
        //咬死自己
        for(int i=1; i<snake.size(); i++){
            Point body = snake.get(i);
            if(head.equals(body)){
                isGameOver = true;
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        final SnakeGame snake = new SnakeGame();
        //初始化地图
        snake.initBackground();
        //初始化蛇
        snake.initsnake();
        //显示蛇
        snake.showSnake();
        //初始化食物
        snake.createFood();
        //显示食物
        snake.showFood();
        snake.showBackground();
        JFrame frame = new JFrame("方向盘");
        frame.add(new JButton("↑"),BorderLayout.NORTH);
        frame.add(new JButton("↓"),BorderLayout.SOUTH);
        frame.add(new JButton("←"),BorderLayout.WEST);
        frame.add(new JButton("→"),BorderLayout.EAST);
        JButton button = new JButton("点我控制方向");
        frame.add(button);
        FrameUtil.initFrame(frame, 300, 300);
        //添加事件监听器
        button.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int code = e.getKeyCode();
                switch (code) {
                    case KeyEvent.VK_UP:
                        snake.changeDirection(UP_DIRECTION);
                        break;
                    case KeyEvent.VK_DOWN:
                        snake.changeDirection(DOWN_DIRECTION);
                        break;
                    case KeyEvent.VK_LEFT:
                        snake.changeDirection(LEFT_DIRECTION);
                        break;
                    case KeyEvent.VK_RIGHT:
                        snake.changeDirection(RIGHT_DIRECTION);
                        break;
                    default:
                        break;
                }
                snake.move();
                snake.isGameOver();
                if(isGameOver){
                    System.err.println("游戏结束!!!");
                    System.exit(0);
                }
                snake.refrash();
            }
        });
    }
}
时间: 2024-12-30 21:10:13

贪吃蛇逻辑代码的相关文章

JavaScript与html5写的贪吃蛇完整代码

JavaScript与html5写的贪吃蛇完整代码 查看运行效果可访问http://www.codesocang.com/texiao/youxitexiao/2014/0402/7045.html# <!doctype html><html lang="en"><head><meta charset="utf-8"><title>js网页版的贪吃蛇游戏</title><style typ

python学习笔记05:贪吃蛇游戏代码

贪吃蛇游戏截图: 首先安装pygame,可以使用pip安装pygame: pip install pygame 运行以下代码即可: #!/usr/bin/env python import pygame,sys,time,random from pygame.locals import * # 定义颜色变量 redColour = pygame.Color(255,0,0) blackColour = pygame.Color(0,0,0) whiteColour = pygame.Color(

有没有人要贪吃蛇的代码,然而有....................

呵呵 博友们, 贪吃蛇代码.................... #include<iostream.h> #include<windows.h> #include<time.h> #include<stdlib.h> #include<conio.h> #define N 21 void gotoxy(int x,int y)//位置函数 { COORD pos; pos.X=2*x; pos.Y=y; SetConsoleCursorPos

无法运行的贪吃蛇游戏代码,求大神帮忙修改!

#include <iostream> #include <windows.h> #include <stdlib.h> #include <conio.h> #include <time.h> //使用当前时间做种子 enum dir {up,down,left,right}; //枚举类型enum dir //围墙 class Fence { public: void initFence(); void OutputF(); public:

C语言之贪吃蛇(ncurses)

声明: 以下内容可能会引起某些读者不适, 请小心阅读. 有些内容并没有详细介绍, 可能简单理解也是错误的, 但是这都是为了尽量简单. 前言: 代码是很久之前写的,属于边想边写的那种,很混乱. 推荐材料: NCURSES Programming HOWTO 贪吃蛇应该是我们这代人都玩过的游戏.而如果我们要写一个贪吃蛇最需要考虑的就是贪吃蛇是如何移动的.其实贪吃蛇的移动就是尾部的减少和头部的增加. 这篇文章: 介绍一些ncurses库的基础内容 贪吃蛇游戏的代码解释 介绍一些ncurses库的基础内

贪吃蛇设计报告

北京工业大学耿丹学院 C语言课程设计报告 课程设计名称:高级语言程序设计 专业班级:计算机科学与技术1 姓名:吴双 学号:09150809201 2016年4月24日 一 设计题目 ------------------------ 二 总体设计 ------------------------ 三 程序分析和主要知识点应用 ------------------------ 四 程序流程和原理分析 ------------------------ 五 自己修改后的程序同原程序的改进 -------

在ARM版上开发的贪吃蛇

本文主要为贪吃蛇部分代码的实现,开发板的按键以及触屏中断等,本文不做重点讲解 前一阵子学习了mini2440板的开发,并开发了一个简单贪吃蛇的游戏 游戏功能清单:1.游戏开始 2.游戏难度设置(简单,普通,困难) 3.游戏结束 4.蛇的正常运行路线(触碰障碍物或者蛇本身随即游戏结束,不能反方向行动) 5.通过内设时钟,产生随机种子,从而产生随机分布的"食物" 以下为代码解析部分: #include "snake_game.h" #include "adct

easyx图形库做贪吃蛇游戏

编程总是对着一个黑窗口,可以说是非常乏味了,于是喵喵就翻出来了以前用easyx图形库做图形界面的贪吃蛇游戏. 不过大家只是当做提高编程的乐趣来学习吧,想进一步做的话可以学习QT,还有其他的框架. 这是一个easyx图形库的学习教程,建议大家学完再看本文: https://www.easyx.cn/skills/List.aspx?id=7 首先看一下效果图: 实现的功能: 基本的吃食物长大,撞墙死亡,特殊食物,游戏暂停,重开游戏,记分数的功能. 游戏最高分的记录. 游戏关卡的选择. 加了游戏的音

GameBuilder开发游戏应用系列之100行代码实现贪吃蛇

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-801422234293697 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-801422234293697 微信扫描: 运行截图: 除了重力感应游戏,GameBuilder开发传统的游戏也毫不逊色,作为一个怀旧的人,总是对这类游戏情有独钟. 贪吃蛇主要靠一个[UICanvas]来实现,前面一片博客GameB