- <div class="blockcode"><blockquote>/**
- * 自定义一个数x,打印出一个2x+1的区域,
- *自定义两个字符,通过字符差异显示出心形。
- *作用:1、可以打印空心心形
- * 2、打印实心心形
- * 3、自定义不同字符,达到不同的显示效果
- * 修改记录:
- * 1、最初只是测试做一个空心菱形,菱形上下对称,所以一开始要输入一个奇数。
- * 2、做完之后发现要是把菱形上半部分复制,下半部分放大,就是个心形了,于是改成做一个心形。
- * 3、菱形直接复制和放大后的心形,棱角太分明,于是把心形上部和两边修了一下,比较圆润。
- * 4、此时发现如果输入数字小于7,形状不能体现,所以改成要大于6.
- * 5、加入自定义字符功能
- * 6、发现不能输入空格,于是只好用1和2来代替一个空格和两个空格
- *
- */
- import java.util.Scanner;
- public class Heart2
- {
- public static void main(String [] args)
- {
- Scanner input=new Scanner(System.in);
- int num;
- System.out.println("请输入一个大于6的奇数");//宽度的一半,大于6是为了显示好看
- num=input.nextInt();
- while(num<6||num%2==0){
- System.out.println("请输入一个大于6的奇数");
- num=input.nextInt();
- }
- System.out.println("请输入一个字符或汉字");//自定义字符,不能定义空格,所以用1、2替代
- String str1=input.next();
- if(str1.equals("1")){
- str1=" ";
- }
- if(str1.equals("2")){
- str1=" ";
- }
- System.out.println("请输入一个字符或汉字");
- String str2=input.next();
- if(str2.equals("1")){
- str2=" ";
- }
- if(str2.equals("2")){
- str2=" ";
- }
- for(int x=(num+1)/2,y=0;x>1&&y<(num+1)/2;x--,y++){//上半部分,
- if(y==0||y==1){//第一行要全部打出,第二行为了避免棱角分明,所以也全部打印
- print(2*num+1,str1);//调用静态方法
- System.out.println();
- }
- if(y>1){
- print(x,str1);
- print(2*y-1,str2);
- print(x,str1);
- print(x+1,str1);//这部分可以合并,但是是从两个菱形的上半部演化而来,保留比较好理解
- print(2*y-1,str2);
- print(x,str1);
- System.out.println();
- }
- }
- for(int x=2,y=num-1;x<=num+1&&y>=0;x++,y--){//下半部分
- if(x==2){//初始值为2,是因为两边也要削平,避免棱角
- print(x,str1);
- print(y-2,str2);
- print(3,str1);
- print(y-2,str2);
- print(x,str1);
- System.out.println();
- }
- if(x>2&&y>0){
- print(x,str1);
- print(2*y-1,str2);
- print(x,str1);
- System.out.println();
- }
- if(y==0){//最后全打印
- print(2*num+1,str1);
- System.out.println();
- }
- }
- input.close();
- }
- //有参无返回的静态方法,打印x个字符串str
- static void print(int x,String str){
- for(int i=0;i<x;i++){
- System.out.print(str);
- }
- }
- }
复制代码
刚学完面向对象部分,很多还不太理解。多多交流。 |
|