java小程序之控制台字符动画的实现

 更新时间:2021年04月12日 09:43:36   作者:Tom带师  
这篇文章主要给大家介绍了java小程序之控制台字符动画实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

说在前面

大一软件工程在读,java萌新一只,第一次写博客,技术很菜勿喷。如有错误欢迎指出!
这个小程序是给朋友的生日礼物,耗时半天,实际写起来碰到的知识点和困难还挺多,故发出来分享一下。

程序效果



可设置画布尺寸,添加图形元件,设置元件坐标和效果。元件闪烁效果,横向滚动效果。

代码呈现

图形元件父类

public class Shape implements IShape{
	String shape[];//图形形状字符串
	String shape_flicker[];//闪烁形状字符串
	int height,width;//高、宽
	int x,y;//位置坐标
	String id;//元件id,用于制作动画效果时获取元件
	public Shape(int x,int y,String id) {//构造方法初始化
		this.x=x;this.y=y;this.id=id;
	}
	
	public Shape(String id) {
		this(0,0,id);
	}
}

图形绘画工具类

import java.util.HashMap;

public class Shapes {//存放图形元件
	int width,height;//画布大小
	public static String canvas[];//画布图像字符串
	HashMap<String, Shape> ShapeMap=new HashMap<String,Shape>();//图形元件容器,添加到画布的图形都会存放在这
	public Shapes(int width ,int height) {//初始化空白画布
		this.width=width;
		this.height=height;
		canvas=new String[height];
		for(int h=0;h<height;h++) {
			String line="";
			for(int w=0;w<width;w++){
				line+=" ";
			}
			canvas[h]=line;
		}
	}
	
	public void draw(Shape myShape) {//将元件添加到画布中
		int px,py;
		px=myShape.x;
		py=myShape.y;
		int count=0;
		if(myShape.height+py>height-1) {
			System.out.println("超出画布边界!!");
			return;
		}
		if(myShape.width+px>width-1) {
			System.out.println("超出画布边界!!");
			return;
		}
		ShapeMap.put(myShape.id,myShape);//将元件添加到容器中
		for(String line :myShape.shape) {
			
			char Line[]=canvas[py+count].toCharArray();
			for(int i=px;i<myShape.width+px;i++) {
				
				Line[i]=line.charAt(i-px);
			}
			canvas[py+count]=String.valueOf(Line);
			count++;
		}

	}
	
	public void drawCanvas() {//绘制画布
		System.out.print(" ");
		for(int i=0;i<width;i++) {
			System.out.print(i%10);
		}
		System.out.println();
		int count=0;
		for(String line: canvas) {
			System.out.println(count+line);
			count++;
		}
	}
}

动画类

import java.io.IOException;

public class Animation {//用于动画效果
	long timer;//计时器
	int rolled;//滚动计数器
	private Shapes shapes;//图形工具
	
	public Animation() {
		timer=0;
		rolled=0;
		init();
	}
	public void flicker(String id,int interval) {//闪烁效果,id为元件的id,interval是闪烁间隔
		
		Shape myShape=shapes.ShapeMap.get(id);
		String shape_flicker[]=myShape.shape.clone(); //闪烁图像
		for(int i=0;i<shape_flicker.length;i++) {
			shape_flicker[i]=shape_flicker[i].replaceAll("O","-");//将O替换为-实现闪烁效果
		}	
			myShape.shape_flicker=shape_flicker;
			//绘制图像
			if(timer%interval==0) {
				int px,py;
				px=myShape.x;
				py=myShape.y;
				int count=0;
				if((timer/interval)%2==0) {
					for(String line :myShape.shape_flicker) {
						
						char Line[]=Shapes.canvas[py+count].toCharArray();
						for(int i=px;i<myShape.width+px;i++) {
							
							Line[i]=line.charAt(i-px);
						}
						Shapes.canvas[py+count]=String.valueOf(Line);
						count++;
					}
					
				}else {
					
					for(String line :myShape.shape) {
						char Line[]=Shapes.canvas[py+count].toCharArray();
						for(int i=px;i<myShape.width+px;i++) {
							
							Line[i]=line.charAt(i-px);
						}
						Shapes.canvas[py+count]=String.valueOf(Line);
						count++;
					}
				}

				

			}
			
		
	}
	
	public void roll(String id,int from ,int to,int speed) {//滚动效果,id为元件id,from,to为起始和终止点,speed为滚动速度
		
		rolled+=speed;
		Shape myShape=shapes.ShapeMap.get(id);
		String shape_roll[]=myShape.shape.clone();
		myShape.x=from+rolled%(to-from);
		
		int px,py;
		px=myShape.x;
		py=myShape.y;
		int count=0;
		System.out.println("rolled:"+rolled+"px:"+px);
			for(String line :shape_roll) {
				
				char Line[]=Shapes.canvas[py+count].toCharArray();
				for(int i=from;i<to;i++) {
					if(i>=px&&i<=to&&i<px+line.length()) {
						Line[i]=line.charAt(i-px);
					}else {
						Line[i]=' ';

					
				}
				
				}
				Shapes.canvas[py+count]=String.valueOf(Line);
				count++;
			}
	}
	
	private void init() {//初始化画布,添加元件
		shapes=new Shapes(120,50);
		shapes.draw(new Shape_Text(5,10,"HB1"));
		shapes.draw(new Shape_Nineteen(52,21,"Nt1"));
		shapes.draw(new Shape_Cake(45,30,"Cake1"));
		shapes.draw(new Shape_Bubble(10,25,"BB1"));
		shapes.draw(new Shape_Bubble(90,25,"BB2"));
	}
	
	public void play(int sleep) throws  IOException, InterruptedException {//播放动画,sleep设置刷新间隔
		
		while(true) {
			if(timer>300) {
				timer=0;
			}
			cls();
			if(timer<100) {
				flicker("HB1",5);
			}else {
				roll("HB1",0,110,1);
			}
			
			
			flicker("Nt1",10);
			shapes.drawCanvas();
			timer++;
			Thread.sleep(sleep);
			System.out.println(timer);
		}
		

	}
	

	public static void cls() throws IOException, InterruptedException//清屏方法(ide中无效)
	{

		new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor(); // 清屏命令
	}
}

主类

import java.io.IOException;

public class Main {//启动动画
	public static void main(String args[]) throws InterruptedException, IOException {
		Animation animator=new Animation();
		
		animator.play(30);
	}
		
	
}

具体图形子类(Happy Birthday文字)

public class Shape_Text extends Shape{//继承图形父类
	
	String s[]= {//字符图像
		"==================================================================================================",
		"= O    O   OO    OOOO   OOOO  O    O       OOOOO  OOOOO OOOOOO OOOOOO O    O OOOOO    OO   O    O =",
		"= O    O  O  O  O    O O    O O    O       O    O   O   O    O   OO   O    O O    O  O  O  O    O =",	
		"= OOOOOO O    O O    O O    O O    O       O    O   O   OOOOOO   OO   OOOOOO O    O O    O O    O =",	
		"= O    O OOOOOO OOOOO  OOOOO   OOOO        OOOOO    O   O O      OO   O    O O    O OOOOOO  OOOO  =",	
		"= O    O O    O O      O         O         O    O   O   O  O     OO   O    O O    O O    O    O   =",	
		"= O    O O    O O      O         O         OOOOOO OOOOO O   O    OO   O    O OOOOO  O    O    O   =",
		"=================================================================================================="
	};
	
	public Shape_Text(int i, int j,String id) {
		super(i,j,id);
		this.shape=s;
		this.height=shape.length;
		this.width=shape[0].length();
	}
	
	public Shape_Text(String id) {
		this(0,0,id);
	}
}

总结

到此这篇关于java小程序之控制台字符动画实现的文章就介绍到这了,更多相关java控制台字符动画内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的拦截器、过滤器、监听器用法详解

    Java中的拦截器、过滤器、监听器用法详解

    这篇文章主要介绍了Java中的拦截器、过滤器、监听器用法,详细分析了Java拦截器、过滤器、监听器的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-05-05
  • Java中的Vector和Stack底层源码分析

    Java中的Vector和Stack底层源码分析

    这篇文章主要介绍了Java中的Vector和Stack底层源码分析,Stack继承了Vector,Vector底层还是一个List,也就是基于数组来实现的,所以ArrayList有的优点,比如获取元素的速度快,随机读,它都有,需要的朋友可以参考下
    2023-12-12
  • Double.parseDouble()与Double.valueOf()的区别及说明

    Double.parseDouble()与Double.valueOf()的区别及说明

    这篇文章主要介绍了Double.parseDouble()与Double.valueOf()的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Elasticsearch 在 Java 中的使用示例教程

    Elasticsearch 在 Java 中的使用示例教程

    本文介绍了如何在Java中使用Elasticsearch,涵盖了连接、基本CRUD 操作、复杂查询、索引管理和聚合操作等方面的内容,通过示例,开发者可以一步步地掌握如何在 Java 项目中集成 Elasticsearch,并利用其强大的搜索和分析功能来构建高效的应用程序,感兴趣的朋友一起看看吧
    2024-08-08
  • Spring解密之XML解析与Bean注册示例详解

    Spring解密之XML解析与Bean注册示例详解

    这篇文章主要给大家介绍了关于Spring解密之XML解析与Bean注册的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面小编来一起学习学习吧。
    2018-01-01
  • Springboot项目对数据库用户名密码实现加密过程解析

    Springboot项目对数据库用户名密码实现加密过程解析

    这篇文章主要介绍了Springboot项目对数据库用户名密码实现加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java AES加密解密的简单实现方法

    Java AES加密解密的简单实现方法

    下面小编就为大家带来一篇Java AES加密解密的简单实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringSecurity身份认证原理解析

    SpringSecurity身份认证原理解析

    这篇文章主要介绍了SpringSecurity身份认证原理解析,身份认证时用户名和密码被过滤器获取到,封装成 Authentication ,通常情况下是 UsernamePasswordAuthenticationToken 这个实现类,需要的朋友可以参考下
    2023-09-09
  • IDEA一键完成格式化、去除无用引用、编译的操作

    IDEA一键完成格式化、去除无用引用、编译的操作

    这篇文章主要介绍了IDEA一键完成格式化、去除无用引用、编译的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java 5亿整数大文件怎么排序

    Java 5亿整数大文件怎么排序

    这篇文章主要介绍了Java 5亿整数大文件怎么排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论