
任務目的
0.培養(yǎng)編程思維,提高分析問題能力
1.掌握二維數組
2.掌握循環(huán),分支條件的用法
3.類的抽象
任務描述
設想有一只機械海龜,它在程序的控制下在屋里四處爬行。海龜拿了一支筆,這只筆或朝
上或朝下,當筆朝下時,海龜用筆畫下自己的移動軌跡,當筆朝上時,海龜在移動過程中什么也不畫。
使用一個50x50的數組,并把數組初始化為0。從一個裝有命令的數組中讀取各種命令。不
管是筆朝上還是筆朝下,都要跟蹤海龜的當前位置。假定海龜總是從地板上(0,0)出發(fā)
,并且開始時筆是朝上的。程序必須處理的一組命令如下:
命令 含義
1 筆朝上
2 筆朝下
3 右轉彎
4 左轉彎
5,10 向前走10格(或其他的格數)
6 打印50x50的數組
9 數據結束(標記)
假設海龜現在處于靠近地板中心的某個位置,下面的“程序”繪制并打印出了一個12*12的方框。
2
5,12
3
5,12
3
5,12
3
5,12
1
6
9
在海龜爬行過程中,如果筆朝下,把數組floor中對應于海龜所處位置的元素置1。當給出命令6(打印)后,在數組中元素為1的位置全部用#號顯示,元素為0的位置全部用*號顯示。
編寫一個可以處理上述海龜命令的程序。
編寫一些其他的海龜命令,用自己編寫的海龜命令處理程序解析,畫出有趣的形狀,比如一個“日”字。
實例
上面的海龜命令,經過我們編寫的程序解析后,會打印出下面的圖形

任務注意事項
請注意代碼風格的整齊、優(yōu)雅
代碼中含有必要的注釋
學習參考資料
百度以下知識點:
二維數組
字符串的split方法
思路提示
1.可以先用面向過程的思路來完成;
2.最好采用面向對象的方式來實現:
仔細分析需求,考慮海龜類應該有哪些屬性(坐標,頭朝向,筆朝向),思考這些屬性都應該定義成什么基本數據類型?
地圖Graph類該如何設計,設計哪些屬性,海龜對象是否應該成為其的一個屬性?
第一個類
package info.songbo;
/**
* Created by Administrator on 2017/10/21.
*/
public class Graph
{
private int[][] array = new int[50][50];//地圖數組
private Turtle turtle = new Turtle();
private String[] commands = new String[]{"2","5,12","3","5,12","3","5,12","3","5,12","1" ,"6","9"};//海龜命令數組
//解析海龜命令
public void parseCmd()
{
for(int i = 0; i < commands.length; i++)
{
String[] strCmd = commands[i].split(",");//5號命令特殊
switch (strCmd[0])
{
case "1":
{
turtle.setbIsPenUp(true);
break;
}
case "2":
{
turtle.setbIsPenUp(false);
break;
}
case "3":
{
turtle.turnRight();
break;
}
case "4":
{
turtle.turnLeft();
break;
}
case "5":
{
int nStep = Integer.parseInt(strCmd[1]);
int xPos = turtle.getX();
int yPos = turtle.getY();
switch (turtle.getDirection())
{
case 0://向右走
{
for(int x = 0; x < nStep; x++)
{
if(xPos < 50)//限制海龜不要出右邊界
{
if(!turtle.isbIsPenUp())//如果筆朝下
{
array[yPos][xPos++] = 1;//海龜在地圖中位置的值0變?yōu)?,同時海龜的x坐標加1,同時注意二維數組維度代入
}
}
else//出界跳出循環(huán)
{
break;
}
}
turtle.setX(--xPos);//存儲本次海龜移動后的位置
break;
}
case 1://向下走,與向右走類似
{
for(int y = 0; y < nStep; y++)
{
if(yPos < 50)
{
if(!turtle.isbIsPenUp())
{
array[yPos++][xPos] = 1;
}
}
else
{
// yPos--;
break;
}
}
turtle.setY(--yPos);
break;
}
case 2://向左走,與向右走類似
{
for(int x = 0; x < nStep; x++)
{
if(xPos > -1)
{
if(!turtle.isbIsPenUp())
{
array[yPos][xPos--] = 1;
}
}
else
{
//xPos++;
break;
}
}
turtle.setX(++xPos);
break;
}
case 3://向上走,與向右走類似
{
for(int y = 0; y < nStep; y++)
{
if(yPos > -1)
{
if(!turtle.isbIsPenUp())
{
array[yPos--][xPos] = 1;
}
}
else
{
// yPos++;
break;
}
}
turtle.setY(++yPos);
break;
}
default:
break;
}
break;
}
case "6":
{
this.print();
break;
}
case "9":
{
break;
}
default:
{
break;
}
}
}
}
//打印二維數組
public void print()
{
for(int i=0; i<50; i++)
{
for(int j=0; j<50; j++)
{
if(array[i][j]==0)
System.out.print(" * ");
else
System.out.print(" # ");
}
System.out.println();
}
}
}
第二個類
package info.songbo;
//海龜作圖問題
//
// 使用一個50*50的數組,并把數組初始化為0。從一個安裝有命令的數組中讀取各種命令。
// 不管筆朝上還是朝下,都要跟蹤海龜的當前位置。假定海龜總是從地板上(0,0)出發(fā),并且開始時筆是朝上的。程序必須處理的一組命令如下:
//
// 命令 含義
//
// 1 筆朝上
//
// 2 筆朝下
//
// 3 右轉彎
//
// 4 作轉彎
//
// 5,10 向前走10格
//
// 6 打印50*50的數組
//
// 9 數組結束(標記)
//
// 假設海龜現在處于靠近地板中心的某個位置,下面的“程序”繪制并打印出了一個12*12的方框。
//
// 2 5,12 3 5,12 3 5,12
//
// 3 5,12 1 6 9
//
// 在海龜爬行過程中,如果筆朝下,把數組floor中對應于海龜所處位置的元素置1。當給出命令6(打?。┖?,
// 在數組中元素為1的位置全部用星號顯示,元素為0的位置全部用空格顯示。
// 編寫一個c語言程序,畫出有趣的形狀。在世這加入其他命令來增強海龜作圖語言的功能。
public class Main {
public static void main(String[] args) {
// write your code here
Graph graph = new Graph();
graph.parseCmd();
}
}
第三個類
package info.songbo;
/**
* Created by Administrator on 2017/10/21.
*/
public class Turtle
{
private int x;//海龜在地圖中的x坐標
private int y;//海龜在地圖中的y坐標
private int direction;//海龜頭朝向:0右,1下,2左,3上
private boolean bIsPenUp;//海龜筆是否朝上,true朝上,false朝下
public void turnRight()
{
direction++;
if(direction == 4)
{
direction = 0;
}
}
public void turnLeft()
{
direction--;
if(direction == -1)
{
direction = 3;
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
public boolean isbIsPenUp() {
return bIsPenUp;
}
public void setbIsPenUp(boolean bIsPenUp) {
this.bIsPenUp = bIsPenUp;
}
}