Java控制台下的贪吃蛇游戏

实现贪吃蛇游戏的思路:  

class Node(i,j)  //表示坐标

class Worm(List<Node> nodes)        //   行数:10行//用LinkedList存储蛇的坐标点。当前进是用addFirst(Node node)方法添加一个一个坐标点(可以通过getFirst()得到上一个坐标-1得出);然后再删除尾节点。如果碰到食物则不删除尾节点。

// 列数:32列

step()//往前走一步

step(int dir)//根据方向往前走一步

class WormPanel  //画板

---HashSet存储食物 //当随机获得食物坐标点的位置时判断它的坐标点是否与蛇身的坐标点重复(如果重复则继续获取随机数,知道不重复位置)。

内部类--Worm(LinkedList)

i j

j                                   UP -1 0

01234567890123456789012345678901  DOWN  1 0

i 0--------------------------------  LEFT  0-1

1|                 O            | RIGHT  0 1

2|        ^                     |    2,9

3|      <-#->                   |3,8 3,9 3,10

4|        #                     |    4,9

5|        ###                   |    5,9 5,10 5,11

6|          #         O       O |             6,11

7|          #                   |             7,11

8|                              |  nodes.remove(nodes.size()-1)

9--------------------------------

import java.util.Scanner;
class WormDemo
{
	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		WormPanel  wormPanel = new WormPanel();
        WormPanel.Worm  worm =wormPanel.getWorm();

		while(true)
		{
			wormPanel.print();
			String dir = sc.nextLine();//u、d、l、r代表上下左右方向
			if("u".equalsIgnoreCase(dir))
				worm.step(WormPanel.Worm.UP);
		    else if("d".equalsIgnoreCase(dir))
				worm.step(WormPanel.Worm.DOWN);
			else if("l".equalsIgnoreCase(dir))
				worm.step(WormPanel.Worm.LEFT);
            else if("r".equalsIgnoreCase(dir))
				worm.step(WormPanel.Worm.RIGHT);
			else if("q".equalsIgnoreCase(dir))
			{
				System.out.println("bye ^_^");
			    break;
			}
			else
				worm.step();
		}

	}
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
<pre name="code" class="java">package snakeGame;
import java.util.*;
class WormPanel
{
	//蛇
	private Worm worm;

	//行数
	private int rows = 10;

	//列数
	private int cols = 32;

	//食物
	private HashSet<Node> foods = new HashSet<Node>();

	public WormPanel(){
	    worm = new Worm();
		initFoods(6);
	}

	public Worm getWorm()
	{
		return this.worm;
	}
	//打印功能
	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(worm.contains(i,j))
					System.out.print("#");
				else if(foods.contains(new Node(i,j)))
					System.out.print("0");
				else
					System.out.print(" ");
			}
			System.out.println();
		}
	}

	//随机生成食物
	public void initFoods(int num)
	{
		Random random = new Random();
		while(true)
		{
			int i = random.nextInt(rows-2)+1;
			int j = random.nextInt(cols-2)+1;

			//先判断是否是构成蛇的坐标
			if(worm.contains(i,j))
			{
				continue;
			}
            foods.add(new Node(i,j));//不会添加重复坐标

            if(foods.size()==num)
		         break;
		}
	}
	public class Worm
	{
		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 LinkedList<Node> nodes = new LinkedList<Node>();
		private int direction;

		public Worm()
		{
		   nodes.add(new Node(3,9));
		   nodes.add(new Node(4,9));
		   nodes.add(new Node(5,9));
		   nodes.add(new Node(5,10));
		   nodes.add(new Node(5,11));
		   nodes.add(new Node(6,11));
		   nodes.add(new Node(7,11));
		   this.direction = RIGHT;
		}

		public void step()
		{
		   //得到第一个#号对应的坐标
		   Node head = nodes.getFirst();
           //计算新的节点的坐标
		   int i = head.getI()+direction/10;
		   int j = head.getJ()+direction%10;

           head = new Node(i,j);
           //在蛇的头部加入一个节点
		   nodes.addFirst(head);
           //判断是否遇到一个食物
		   if(foods.remove(head))
			{
			   return;
		    }
           //删除尾部节点
			nodes.removeLast();
		}

		public void step(int direction)
		{
		   if(this.direction+direction==0)
			   throw new RuntimeException("不允许掉头");
		   this.direction = direction;
		   step();
		}

		//判断是否包含某个坐标的方法
		public boolean contains(int i,int j)
		{
           return nodes.contains(new Node(i,j));
		}
	}

}

package snakeGame;

class Node
{
	private int i;
	private int j;

	public Node(){}

	public Node(int i,int j)
	{
		this.i = i;
		this.j = j;
	}

	public void setI(int i)
	{
		this.i = i;
	}
	public void setJ(int j)
	{
		this.j = j;
	}
	public int getI()
	{
		return this.i;
	}
	public int getJ()
	{
		return this.j;
	}

	public String toString()
	{
		return i+","+j;
	}

	public int hashCode()
	{
		return (i<<16)|j;
	}

	public boolean equals(Object obj)
	{
		if(obj==null)
			return false;
		if(this==obj)
			return true;
		if(obj instanceof Node)
		{
			Node node = (Node)obj;
			return this.i==node.i && this.j==node.j;
		}
		return false;
	}

}

注释:

public void step()
		{
		   //得到第一个#号对应的坐标
		   Node head = nodes.getFirst();
           //计算新的节点的坐标
		   int i = head.getI()+direction/10;
		   int j = head.getJ()+direction%10;

           head = new Node(i,j);
           //在蛇的头部加入一个节点
		   nodes.addFirst(head);
           //判断是否遇到一个食物
		   if(foods.remove(head))
			{
			   return;
		    }
           //删除尾部节点
			nodes.removeLast();
		}
	//随机生成食物
	public void initFoods(int num)
	{
		Random random = new Random();
		while(true)
		{
			int i = random.nextInt(rows-2)+1;
			int j = random.nextInt(cols-2)+1;

			//先判断是否是构成蛇的坐标
			if(worm.contains(i,j))
			{
				continue;
			}
            foods.add(new Node(i,j));//不会添加重复坐标

            if(foods.size()==num)
		         break;
		}
	}

以上两段代码中的foods.remove()方法需要重写hashCode()和equals()方法。比较的是他们的坐标值。将他们相同的坐标删除。

时间: 2024-10-05 09:58:57

Java控制台下的贪吃蛇游戏的相关文章

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() { ret

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

贪吃蛇游戏程序设计

一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更

用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这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

贪吃蛇游戏

学习C语言也差不多学完了想做一个游戏,而贪吃蛇和俄罗斯方块都是非常经典的游戏,在网上也找到了许多相关的参考资料,便动手做了,这个游戏室控制台版的 游戏流程图 函数模块 函数名 函数功能 CursorPosition 光标定位函数 CreateSnake 蛇初始化函数 ShowWall 显示墙体 UpdateSnake 更新界面上的蛇体.分数.等级.食物 CollisionDetection 判断蛇是否咬到自己 RandFood 随机产生食物 Move 控制方向 程序代码 #include <st

基于控制台实现贪吃蛇游戏

1).引言 学习编程,我个人觉得最好的办法就是根据自己的水平不断的给自己设定一个小目标.而这个小目标就是一个有意思的项目,通过完成这个项目,对自己的成果(也包括失败的)进行分析总结,从中提炼出对应的技术并分享出来,不断的往复,如此,为的就是让我们永远保持编写程序的兴趣和热情,完了,还提高我们的技术.而本文就是总结自己的一个小目标(基于控制台实现的贪吃蛇游戏而写的总结) 2).技术实现 大家小时候一定玩过贪吃蛇的游戏.贪吃蛇游戏的控制过程其实也不复杂.简单的可以概括为以下4个部分. 1.1  .组