多线程版贪吃蛇 游戏说明: 本游戏运行在控制台中,直接运行SnakeTest.java文件,就能在控制台看到游戏画面,每按一个方向再按回车键就能控制蛇移动的方向

a:向左移动

d:向右移动

s:向下移动

w:向上移动

其他字母键:暂停

源代码:

Snake.java

import java.util.LinkedList;

import java.util.Random;

import java.util.Scanner;

/**

* 多线程版本

* @author lfd

*有bug,不完美,比如蛇向左移动时,你让他向右移动,此时会暂停

*界面刚出来时食物的位置跟你按方向键开始玩时的位置不一样

*/

public class Snake {

private String[][] position = new String[24][30];//游戏界面的的大小

private LinkedList snake = new LinkedList();

private Snake.MoveThread moveThread;

private static final int foodNum = 10;//默认初始化的食物数量

private int speed = 600;//刚开始的移动速度

private static final int increaseSpeed = 15; //每吃一个食物增加的速度

public Snake() {

initWall();

initSnake();

initFood(foodNum);

print();

}

public void move() {

while(true) {

Scanner sc = new Scanner(System.in);

String operation = sc.next();//接收用户的输入

if(operation.length()>=2) {

operation = operation.substring(0,1);

}

if(moveThread == null) {

moveThread = new Snake().new MoveThread(operation);//创建一个线程

new Thread(moveThread).start();//启动线程

}else {

moveThread.operation = operation;//改变蛇之前的运动状态

}

}

}

//向上移动

public void moveUp() {

if((getX(0)-1 +","+ getY(0)).equals(snake.get(1))) {//判断蛇头的方向是否是朝着自己身体的方向

return;

}

if(position[getX(0)-1][getY(0)].equals("■")) {//判断是不是撞墙

System.out.println("你死了");

System.exit(0);

}

if(position[getX(0)-1][getY(0)].equals("●")) {//判断有没有吃到食物

snake.addFirst(getX(0)-1+","+getY(0));

speed = speed - Snake.increaseSpeed;//吃到一个食物,移动速度加快一些

}else {

//没有吃到食物也没有撞墙

snake.addFirst(getX(0)-1+","+getY(0));//添加蛇头

position[getX(snake.size()-1)][getY(snake.size()-1)] = " ";//移除蛇尾

snake.removeLast();

}

}

//向下移动

public void moveDown() {

if((getX(0)+1 +","+ getY(0)).equals(snake.get(1))) {

return;

}

if(position[getX(0)+1][getY(0)].equals("■")) {

System.out.println("你死了");

System.exit(0);

}

if(position[getX(0)+1][getY(0)].equals("●")) {

snake.addFirst(getX(0)+1+","+getY(0));

speed = speed - Snake.increaseSpeed;

}else {

snake.addFirst(getX(0)+1+","+getY(0));

position[getX(snake.size()-1)][getY(snake.size()-1)] = " ";

snake.removeLast();

}

}

//向右移动

public void moveRight() {

if((getX(0)+ ","+ (getY(0)+1)).equals(snake.get(1))) {

return;

}

if(position[getX(0)][getY(0)+1].equals("■")) {

System.out.println("你死了");

System.exit(0);

}

if(position[getX(0)][getY(0)+1].equals("●")) {

snake.addFirst(getX(0)+","+(getY(0)+1));

speed = speed - Snake.increaseSpeed;

}else {

snake.addFirst(getX(0)+","+(getY(0)+1));

position[getX(snake.size()-1)][getY(snake.size()-1)] = " ";

snake.removeLast();

}

}

//向左移动

public void moveLeft() {

if((getX(0)+","+ (getY(0)-1)).equals(snake.get(1))) {

return;

}

if(position[getX(0)][getY(0)-1].equals("■")) {

System.out.println("你死了");

System.exit(0);

}

if(position[getX(0)][getY(0)-1].equals("●")) {

snake.addFirst(getX(0)+","+(getY(0)-1));

speed = speed - Snake.increaseSpeed;

}else {

snake.addFirst(getX(0)+","+(getY(0)-1));

position[getX(snake.size()-1)][getY(snake.size()-1)] = " ";

snake.removeLast();

}

}

//得到某节蛇身的x坐标

public int getX(int index) {

return Integer.parseInt(snake.get(index).split(",")[0]);

}

//得到某节蛇身的y坐标

public int getY(int index) {

return Integer.parseInt(snake.get(index).split(",")[1]);

}

public void print() {

for(int i=0;i

int x = getX(i);

int y = getY(i);

if(i==0) {

position[x][y] = "□"; //蛇头是□

continue;

}

position[x][y] = "■";//身体是■

}

for(int i = 0;i

System.out.println();

for(int j=0;j

System.out.print(position[i][j]+" ");

}

}

}

//初始化墙

public void initWall() {

for(int i = 0;i

for(int j=0;j

position[i][j] = " ";

}

}

//初始化第一列和最后一列

for(int i=0;i

position[i][0] = "■";

position[i][position[0].length-1] = "■";

}

//初始化第一行和最后一行

for(int i=0;i

position[0][i] = "■";

position[position.length-1][i] = "■";

}

//在界面中产生一道墙

for(int i=0;i

position[(position.length/4)+i][position[0].length/4] = "■";

}

}

//初始化蛇的位置

public void initSnake() {

snake.add(position.length/2 + "," + (position[0].length/2));

snake.add(position.length/2 + "," + (position[0].length/2+1));

snake.add(position.length/2 + "," + (position[0].length/2+2));

snake.add(position.length/2 + "," + (position[0].length/2+3));

}

/**

* 初始化食物数量

* @param number 食物数量

*/

public void initFood(int number) {

int flag = 0;

while(flag != number) {

int x = new Random().nextInt(position.length-1) + 1;

int y = new Random().nextInt(position[0].length-1) + 1;

if(position[x][y] == " ") {

position[x][y] = "●";

flag++;

}else {

continue;

}

}

}

//每次移动后都判断食物的数量是否减少了1个,如果是,重新产生一个

public void judgeFoodNum() {

int foodNum = 0;

for(int i = 1;i

for(int j=1;j

if(position[i][j].equals("●")) {

foodNum++;

}

}

}

if(foodNum == Snake.foodNum-1) {

initFood(1);//产生一个食物

}

}

//实现自动移动的线程类

class MoveThread implements Runnable{

private String operation;//用户的操作

public MoveThread(String operation) {

this.operation = operation;

}

@Override

public void run() {

while(true) {

if(operation.equals("w")) {//若用户输入的是w,向上移动

moveUp();

}else if(operation.equals("s")) {//若用户输入的是s,向下移动

moveDown();

}else if(operation.equals("a")) {//若用户输入的是a,向左移动

moveLeft();

}else if(operation.equals("d")) {//若用户输入的是d,向上移动

moveRight();

}else{

Thread.yield();//输入除asdw之外的其他字母,暂停移动

}

judgeFoodNum();//每次移动后都判断食物的数量是否减少了1个,如果是,重新产生一个

print();//每次移动后都重新打印界面

try {

Thread.sleep(speed);//每次移动后让线程睡眠一段时间

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

}

}

}

}SnakeTest.java

public class SnakeTest {

public static void main(String[] args) {

Snake snake = new Snake();

snake.move();

}

}

java多线程小游戏_java控制台贪吃蛇小游戏(多线程版)相关推荐

  1. 【C++】经典项目控制台贪吃蛇小游戏详细教程

    [小游戏]贪吃蛇GreedySnake 本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏 项目github地址:游戏源码链接 游戏下载:GreedySnake 本人属初学者,水平所限,难免 ...

  2. python贪吃蛇小游戏_python开发贪吃蛇小游戏

    3.概要设计 3.1 程序功能模块 由设计应解决的问题可知,本次的设计是使用用方向键来实现一个简易的贪吃蛇小游戏的程序,具体的功能模块如图3-1所示. 图3-1 程序功能模块 Fig.3-1 prog ...

  3. 怎么用php做小游戏_php实现贪吃蛇小游戏

    贪吃蛇游戏是经典手机游戏,既简单又耐玩.通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分.在诺基亚时代,风靡整个手机界,今天我们来看看另类的,如何使用php来实现贪吃蛇小游戏 废话不多说,代码奉上: c ...

  4. 贪吃蛇java 暂停_Java实现贪吃蛇小游戏

    三月份的时候用Java写了一个贪吃蛇的小游戏,写完的时候颇有成就感,现在在这里做一下总结. 先把需要用到的图片资源放在这里,分别为上.下.左.右方向的蛇头,蛇身,食物,标题,可以通过右击另存为的方式下 ...

  5. [娱乐]一款浅陋的C++控制台贪吃蛇小游戏

    因为时间有限,没能尽可能完善这一款贪吃蛇,不过能做出来还是很有意思的 1 #include<bits/stdc++.h> 2 #include<windows.h> 3 #in ...

  6. C++控制台贪吃蛇小游戏详细教程

    游戏截图     开始动画:    游戏过程:  游戏架构设计 该游戏的玩法简单,玩家通过键盘方向键控制蛇上下左右移动,吃到食物得分并增长,碰到墙或者自己的身体则死亡,游戏结束.  整个游戏其实就是一 ...

  7. python贪吃蛇小游戏代码_python 贪吃蛇小游戏代码

    #!/usr/bin/python # -*- coding: UTF-8 -*- #作者:黄哥 #链接:https://www.zhihu.com/question/55873159/answer/ ...

  8. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  9. 再来一次的C语言贪吃蛇小游戏(三)

    8.游戏的不同界面 为了便于实现主要功能,之前我们所有的状态控制都是放在游戏中,但实际上我们应该把这些状态控制抽离出来,通过菜单来控制,以便在不同游戏界面间切换. 菜单界面 游戏界面 排行榜 游戏结束 ...

  10. 六一礼物之贪吃蛇小游戏送给大家

      今天是儿童节,思绪突然一下拉回到小时候,几块钱一个的游戏机不知道大家还记得不,里面有个记忆犹新的经典游戏--贪吃蛇,这真是在那个年代少有的,而且是你不死可以一直玩的游戏(haha).   本文就带 ...

最新文章

  1. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托
  2. 搜索引擎设计实用教程(3)-以百度为例 之三:对百度分词算法的进一步分析
  3. Py之tornado:tornado库的简介、安装、使用方法之详细攻略
  4. 调制优缺点_钓鱼,何时用搓饵、何时用拉饵?及对应的优缺点分析
  5. Vector Enumeration
  6. java指定长度数组长度_Java声明数组时不能指定其长度
  7. Python--三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数...
  8. memory java heap_java.lang.OutOfMemoryError: Java heap space解决方法
  9. elementui的css文件没有引入_为什么每个React组件都需要引入React?
  10. 搭建DNS服务,正向解析域名
  11. POJ 2773 Happy 2006 (容斥原理)
  12. Linux操作系统常用基本命令
  13. php 带参页面跳转页面,跳转页面带参数_如何带参数跳转php界面
  14. 浅析大数据前景及就业方向
  15. 鸿蒙EMUI10升级体验,华为P30升级EMUI10,体验如何?我给大家说一说!
  16. c语言 青蛙上台阶问题
  17. PL/SQL计算质数
  18. 任何产品需求,挖到最后都是人性
  19. 岁末忆今朝,辞旧话新潮——心灵与技术的聚合
  20. excel分类汇总多个工作表

热门文章

  1. 计算机基础第五章知识,计算机基础第5次作业-第五章-Powerpoint知识题
  2. 查看Linux内核版本命令
  3. 【洛谷】 3264 [JLOI2015] 管道连接
  4. 科学计算matlab尔雅答案,科学计算与MATLAB语言2019尔雅答案
  5. 兄dei,你的代码死循环了吗?
  6. python使用临时文件
  7. java安全证书配置
  8. 一个简单的完全信息动态博弈的解答
  9. SharedCache-共享缓存概况和初步运用实例(1)
  10. 如何在github用git Pages上传自己在本地做的项目?