Java的控制台小游戏(贪吃蛇)
几年前花了一整天的时间在宿舍去研究一个贪吃蛇
无聊的话可以看一下,对于那些刚刚接触不久的小伙伴可以看一下,研究研究思路,话不多说,干 @!
玩法(w上)(s下)(a左)(d右):输入还不够喔,每次输入一个按键需要按(回车)才生效,
思路的话可以大概讲一下,
1、定义一个二维数组模拟地图、数组外围使用■填充围墙、内部元素填充一个空格、蛇头填充●、蛇实体填充□、食物用○填充
2、创建一个蛇的集合,集合保存俩个数字,代表x和y坐标(蛇当前的坐标)
3、创建线程、死循环、创建上下左右方法控制台输入后改变线程调用方法(调用的方法是修改保存蛇集合的方法)
4、好了,话不多是说(其实我也忘得差不多了)直接上图上源代码:

import java.util.*;/*** Lijie* 只需要导入util.*包*/
public class tcs {// 初始化地图public static String[][] aa = new String[24][30];// 线程休息时间,太快了就会实现无线输出,蛇吃东西越长就会越快public static int seet = 100;// 记录蛇的集合 关键,用他加上,号隔开,俩个数字,x和y坐标public static LinkedList dd = new LinkedList();// 定一个用有的变量接受wsad的上下移动端的操作public static String nana = "";// ****************************************************public static void main(String[] args) {tcs a = new tcs();a.load();}// 默认加载事件public void load() {Info(); //添加地图方法addList(); //加载蛇的默认位置print(); //输出地图加上蛇身的方法Random(); //随机生成贪吃蛇的食物Random(); //调用几次在场上就会有几个食物Random();startUp(); //启动线程,开启}// 创建启动贪吃蛇移动线程public void startUp() {Thread sd = new Thread(new move(), "杰");sd.start();while (true) {Scanner input = new Scanner(System.in);nana = input.next();// 如果输入较多就提取第一个if (nana.length() >= 2) {nana = nana.substring(0, 1);}}}// 实现线程移动类public class move implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {if (nana.equals("w")) {w();} else if (nana.equals("s")) {s();} else if (nana.equals("a")) {a();} else if (nana.equals("d")) {d();} else {// 暂停线程Thread.yield();}try {// 最低速度80if (seet < 80) {seet = 80;}Thread.sleep(seet);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}// ******************************************************// 蛇身的x坐标public int X(int x) {return Integer.parseInt(dd.get(x).split(",")[0]);}// 蛇身的y坐标public int Y(int y) {return Integer.parseInt(dd.get(y).split(",")[1]);}/*** 添加地图方法*/public void Info() {for (int i = 0; i < 24; i++) {for (int j = 0; j < 30; j++) {if (i == 0) {aa[i][j] = "■";}if (i == 23) {aa[i][j] = "■";} else {if (j == 0 || j == 29) {aa[i][j] = "■";} else {if (i == 0) {} else {aa[i][j] = " ";}}}}}// 在此之前都是默认地图******************************}// 加载蛇身,保存在LinkedLis集合类,,这个集合增删改方便public void addList() {dd.add("16,14");dd.add("16,15");dd.add("16,16");dd.add("16,17");}/*** 控制台输出方法 ,输出集合,集合内包括蛇和地图* 控制集合操作蛇 把集合中的第一个变成蛇头后面的变成蛇尾*/public void print() {// 修改添加蛇,配合LinkedListfor (int i = 0; i < dd.size(); i++) {int x = X(i);int y = Y(i);if (i == 0) {aa[x][y] = "●"; // 蛇头●continue;}aa[x][y] = "□";// 身体□}for (int i = 0; i < 24; i++) {for (int j = 0; j < 30; j++) {System.out.print(aa[i][j] + " ");}System.out.println();}}// 随机添加吃的public void Random() {int ii = (int) (Math.round(Math.random() * 20 + 2));int jj = (int) (Math.round(Math.random() * 26 + 2));if (ii == 0 || jj == 0 || ii == 23 || jj == 28) {Random();} else {for (int i = 0; i < dd.size(); i++) {int x = X(i);int y = Y(i);if (x == ii && jj == y) {Random();} else {aa[ii][jj] = "○";}}}}// 上移动方法public void w() {// 添加蛇头移除蛇尾,实现移动dd.addFirst(X(0) - 1 + "," + Y(0));ss();// 判断是否撞到围墙或者你自己的身体if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物dd.addFirst(X(0) - 1 + "," + Y(0));Random();seet -= 15;}Remove();}// 下移动方法public void s() {// 添加蛇头移除蛇尾,实现移动dd.addFirst(X(0) + 1 + "," + Y(0));ss();// 判断是否撞到围墙或者你自己的身体if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物dd.addFirst(X(0) + 1 + "," + Y(0));Random();seet -= 15;}Remove();}// 左移动方法public void a() {// 添加蛇头移除蛇尾,实现移动dd.addFirst(X(0) + "," + (Y(0) - 1));ss();// 判断是否撞到围墙或者你自己的身体if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物dd.addFirst(X(0) + "," + (Y(0) - 1));Random();seet -= 15;}Remove();}// 右移动方法public void d() {// 添加蛇头移除蛇尾,实现移动dd.addFirst(X(0) + "," + (Y(0) + 1));ss();// 判断是否撞到围墙或者你自己的身体if (aa[X(0)][Y(0)].equals("○")) {// 判断有没有吃到食物dd.addFirst(X(0) + "," + (Y(0) + 1));Random();seet -= 15;}Remove();}// 判断是否撞到围墙或者你自己的身体public void ss() {if (aa[X(0)][Y(0)].equals("■")) {System.out.println("凉凉");System.exit(0);}if (aa[X(0)][Y(0)].equals("□")) {System.out.println("凉凉");System.exit(0);}}// 移除蛇身和蛇尾方法public void Remove() {// 移除蛇,aa的蛇尾最后一个变成" ",aa[X(dd.size() - 1)][Y(dd.size() - 1)] = " ";// 移除最后一个dd.removeLast();// 打印蛇和地图print();}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
