转载
版权声明:本文为零商博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42316621/article/details/100062631
————————————————
题目
有一只机械海龟,在屋里爬行。海龟拿了一只笔,这支笔或者朝上或者朝下。笔朝下时,海龟用笔画下自己的移动轨迹;笔朝上时,海龟在移动过程中什么也不画。
用一个50*50的数组floor,记录海龟绘制的图形。数组元素初始化为0。海龟爬行过程中,如果笔朝下,就把数组floor中对应于海龟位置的元素置1。
海龟从(0, 0)位置出发,开始时笔朝上。
海龟从一个装有命令的数组中读取各种命令。
当给出命令6(打印命令)后,数组中元素为1的位置全部用星号显示,元素为0的位置全部用空格显示。
分析
关键
switch语句的使用
方向的设置(8个方向),每一次只能移动到相邻的方向
move函数的设置:移动的条件:自身位置,要移动去的方向,移动的路程,移动的过程笔尖的状态
代码
#include<stdio.h>
void outprint(int map[][51]);
void move(int map[][51],int gostep,int write,int direct);
int x=0;
int y=0;//海龟初始位置为左上角
int main()
{
int i=0,j=0,k=0;
int record=1,write=1,gostep=1,direct=1,a=1;//gostep表示要走的步数,write用来标记笔尖的方向
int map[51][51]={0};//总地图
int command[100]={0};//指令
printf("a=%d gostep=%d direct=%d write=%d x=%d y=%d\n", a,gostep,direct,write,x,y);
printf(" a 的值代表的可执行操作\n");
printf("1:笔尖朝上,不记录移动痕迹\n");
printf("2:笔尖朝下,记录移动痕迹\n");
printf("3:笔尖向左转\n");
printf("4:笔尖向右--转\n");//改变方向
printf("5:开始移动gostep步\n");
printf("6:打印海龟踪迹\n");
printf("9:结束\n");
while(1){
printf("输入a=");
scanf("%d",&command[i]);
switch(command[i])
{
case 1:write=0;break;
case 2:write=1;break;
case 3:
direct--;
if(direct==0)
{
direct=8;
}break;
case 4:
direct++;
if(direct==9)
{
direct=1;
}break;
case 5:
printf("输入要走的步数:");
scanf("%d",&gostep);
move(map,gostep,write,direct);
break;
case 6:
outprint(map);
break;
case 9:
return 0;
}
}
}
void outprint(int map[][51])
{
int i,j;
for(i=0;i<50;i++)
{
for(j=0;j<50;j++)
{
if(map[i][j]==1)
{
printf("*");
}
if(map[i][j]==0)
{
printf(" ");
}
}
printf("\n");
}
}
void move(int map[][51],int gostep,int write,int direct)
{
int xmove,ymove,num,i,j;
switch(direct)//本题目作者将方向分成8个方向。
{
case 1:
xmove=1;
ymove=1;
break;
case 2:
xmove=0;
ymove=1;
break;
case 3:
xmove=-1;
ymove=1;
break;
case 4:
xmove=-1;
ymove=0;
break;
case 5:
xmove=-1;
ymove=-1;
break;
case 6:
xmove=0;
ymove=-1;
break;
case 7:
xmove=1;
ymove=-1;
break;
case 8:
xmove=1;
ymove=0;
break;
}
for(i=0;i<gostep;i++)
{
if(x<0||x>50||y<0||y>50)
{
printf("error die\n");
return;//void函数结束用return
}
map[y][x]+=write;//用来确定此刻是哪种状态,用不用记录踪迹
x+=xmove;
y+=ymove;//移动
}
}