海龟作图(头歌java训练题)
任务要求
设想有一只机械海龟,它在JAVA语言的控制下在屋里四处爬行。海龟拿了一支笔,这只笔或朝上或朝下,当笔朝下时,海龟用笔画下自己的轨迹,当笔朝上时,海龟在移动过程中什么也不画。 使用一个nxn的数组表示屋里n行n列的点,坐标(1,1)表示坐上角,(n,n)表示右下角。数组元素初始化为0,表示海龟没有画下任何内容。从一个装有命令的数组中读取各种命令。不管是笔朝上还是笔朝下,都要跟踪海龟的当前位置。假定海龟总是从地板的左上角,坐标为(1,1),初始方向向右出发,并且开始时笔是朝上的(注意:当笔尖朝下的指令发出后,海龟的标记轨迹不包括当前所在位置的单元格)。程序必须处理的一组命令如下:
| 指令 | 含义 |
|---|---|
| 1 | 笔朝上 |
| 2 | 笔朝下 |
| 3 | 右转弯 |
| 4 | 左转弯 |
| 5 10 | 向前走10格(或其他的格数,不包括当前格) |
| 6 | 打印nxn的数组 |
| 9 | 数据结束(标记) |
输入格式:
程序的输入包括若干行,第一行输入一个正整数n(n>1),规定矩阵的大小为nxn。接下来每行表示一个命令,当命令代号为5时,其后跟着一个整数,二者之间以空格分开。程序以数字9作为结束标记。
输入样例:
11 2 5 10 3 1 5 2 2 3 5 10 6 9
输出格式
程序的输出是一个nxn的点阵,表示程序结束后,乌龟走过的痕迹。其中乌龟未画下轨迹的地方用空格和减号(‘ -’)表示,乌龟画下痕迹的位置用空格和星号(‘ *’)表示。
输出样例
Main.java
package turple;
import java.util.Scanner;
//import java.util.*;
import turple.Turtle;
public class Main {
public static void main(String[] args) {
/*
题目要求:1、请尽可能使用面向对象的程序设计思路
2、题目已经建好Turtle.java类文件,在左上角 “代码文件” 目录下。
请在turtle.java文件中编写相应属性以及方法。
*/
Turtle tr = new Turtle();
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
tr.n = sc.nextInt();
tr.pen = 0; //start 0
tr.direct = 1; //start right
tr.x = 0;
tr.y = 0;
int[][] turtle = tr.init();
String str;
do
{
str = sc.next();
if(str.charAt(0) == '5')
{
str = sc.next();
//System.out.println(str);
int a = Integer.parseInt(str);
if(tr.pen == 1)
tr.paint(turtle,a);
tr.update(a);
}
else
{
int sym = Integer.parseInt(str);
switch(sym)
{
case 1:
tr.pen = 0;
break;
case 2:
tr.pen = 1;
break;
case 3:
tr.rect(1);
break;
case 4:
tr.rect(-1);
break;
case 6:
for(int i=0;i<tr.n;i++)
{
for(int j=0;j<tr.n;j++)
{
if(turtle[i][j] == 0)
System.out.print(" -");
else
System.out.print(" *");
}
System.out.println();
}
break;
case 9:break;
default:break;
}
}
//System.out.println(tr.x+" "+tr.y);
}
while(str.charAt(0) != '9');
}
}
Turtle.java
package turple;
//import java.util.ArrayList;
//import java.math.*;
public class Turtle {
/*
注意:本文件作为海归作图的类文件,用于设置Turtle类属性(包括位置坐标、抬笔/放笔、当前方向等)以及相应方法。
*/
public int n;
public int direct; //right 1 down 2 left 3 up 4
public int pen;
public int x;
public int y;
public void update(int len)
{
int a;
if(direct == 1)
{
if(y+len > n-1)
a = n-1-y;
else
a = len;
y += a;
}
else if(direct == 2)
{
if(x+len > n-1)
a = n-1-x;
else
a = len;
x += a;
}
else if(direct == 3)
{
if(y-len < 0)
a = y;
else
a = len;
y -= a;
}
else
{
if(x-len < 0)
a = x;
else
a = len;
x -= a;
}
}
public void paint(int[][] arr,int len)
{
int a;
if(direct == 1)
{
if(y+1 > n-1)
a = y;
else if(y+len > n-1)
a = n;
else
a = y+len+1;
for(int i=y+1;i<a;i++)
arr[x][i] = 1;
}
else if(direct == 2)
{
if(x+1 > n-1)
a = x;
else if(x+len > n-1)
a = n;
else
a = x+len+1;
for(int i=x+1;i<a;i++)
arr[i][y] = 1;
}
else if(direct == 3)
{
if(y-1 < 0)
a = 0;
else if(y-len < 0)
a = -1;
else
a = y-len-1;
for(int i=y-1;i>a;i--)
arr[x][i] = 1;
}
else
{
if(x-1 < 0)
a = 0;
else if(x-len < 0)
a = -1;
else
a = x-len-1;
for(int i=x-1;i>a;i--)
arr[i][y] = 1;
}
}
public int[][] init()
{
int[][] matrix = new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
matrix[i][j] = 0;
return matrix;
}
public void rect(int no) //update direction
{
if(no == 1 && direct != 4)
direct += 1;
else if(no == 1 && direct == 4)
direct = 1;
else if(no == -1 && direct != 1)
direct -= 1;
else
direct = 4;
}
}
运行结果
10 2 5 1 6 - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 5 1 6 - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 5 3 6 - * - * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 5 2 6 - * - * * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 9

浙公网安备 33010602011771号