java多线程小游戏_java控制台贪吃蛇小游戏(多线程版)
多线程版贪吃蛇 游戏说明: 本游戏运行在控制台中,直接运行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控制台贪吃蛇小游戏(多线程版)相关推荐
- 【C++】经典项目控制台贪吃蛇小游戏详细教程
[小游戏]贪吃蛇GreedySnake 本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏 项目github地址:游戏源码链接 游戏下载:GreedySnake 本人属初学者,水平所限,难免 ...
- python贪吃蛇小游戏_python开发贪吃蛇小游戏
3.概要设计 3.1 程序功能模块 由设计应解决的问题可知,本次的设计是使用用方向键来实现一个简易的贪吃蛇小游戏的程序,具体的功能模块如图3-1所示. 图3-1 程序功能模块 Fig.3-1 prog ...
- 怎么用php做小游戏_php实现贪吃蛇小游戏
贪吃蛇游戏是经典手机游戏,既简单又耐玩.通过控制蛇头方向吃蛋,使得蛇变长,从而获得积分.在诺基亚时代,风靡整个手机界,今天我们来看看另类的,如何使用php来实现贪吃蛇小游戏 废话不多说,代码奉上: c ...
- 贪吃蛇java 暂停_Java实现贪吃蛇小游戏
三月份的时候用Java写了一个贪吃蛇的小游戏,写完的时候颇有成就感,现在在这里做一下总结. 先把需要用到的图片资源放在这里,分别为上.下.左.右方向的蛇头,蛇身,食物,标题,可以通过右击另存为的方式下 ...
- [娱乐]一款浅陋的C++控制台贪吃蛇小游戏
因为时间有限,没能尽可能完善这一款贪吃蛇,不过能做出来还是很有意思的 1 #include<bits/stdc++.h> 2 #include<windows.h> 3 #in ...
- C++控制台贪吃蛇小游戏详细教程
游戏截图 开始动画: 游戏过程: 游戏架构设计 该游戏的玩法简单,玩家通过键盘方向键控制蛇上下左右移动,吃到食物得分并增长,碰到墙或者自己的身体则死亡,游戏结束. 整个游戏其实就是一 ...
- python贪吃蛇小游戏代码_python 贪吃蛇小游戏代码
#!/usr/bin/python # -*- coding: UTF-8 -*- #作者:黄哥 #链接:https://www.zhihu.com/question/55873159/answer/ ...
- java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载
[实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...
- 再来一次的C语言贪吃蛇小游戏(三)
8.游戏的不同界面 为了便于实现主要功能,之前我们所有的状态控制都是放在游戏中,但实际上我们应该把这些状态控制抽离出来,通过菜单来控制,以便在不同游戏界面间切换. 菜单界面 游戏界面 排行榜 游戏结束 ...
- 六一礼物之贪吃蛇小游戏送给大家
今天是儿童节,思绪突然一下拉回到小时候,几块钱一个的游戏机不知道大家还记得不,里面有个记忆犹新的经典游戏--贪吃蛇,这真是在那个年代少有的,而且是你不死可以一直玩的游戏(haha). 本文就带 ...
最新文章
- 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托
- 搜索引擎设计实用教程(3)-以百度为例 之三:对百度分词算法的进一步分析
- Py之tornado:tornado库的简介、安装、使用方法之详细攻略
- 调制优缺点_钓鱼,何时用搓饵、何时用拉饵?及对应的优缺点分析
- Vector Enumeration
- java指定长度数组长度_Java声明数组时不能指定其长度
- Python--三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数...
- memory java heap_java.lang.OutOfMemoryError: Java heap space解决方法
- elementui的css文件没有引入_为什么每个React组件都需要引入React?
- 搭建DNS服务,正向解析域名
- POJ 2773 Happy 2006 (容斥原理)
- Linux操作系统常用基本命令
- php 带参页面跳转页面,跳转页面带参数_如何带参数跳转php界面
- 浅析大数据前景及就业方向
- 鸿蒙EMUI10升级体验,华为P30升级EMUI10,体验如何?我给大家说一说!
- c语言 青蛙上台阶问题
- PL/SQL计算质数
- 任何产品需求,挖到最后都是人性
- 岁末忆今朝,辞旧话新潮——心灵与技术的聚合
- excel分类汇总多个工作表