2 yxts122 YXTS122 于 2016.04.06 23:12 提问

有没有人帮我转换一下这代码???

好像听说goto gett;相当于while语句,能不能帮我转换一下下面的代码,看得不是很懂。。图片

6个回答

huangyue009
huangyue009   2016.04.07 09:00
已采纳

是跳转的意思,把gett;标签下面的代码收拢成一个函数 gotoMethod(),然后在goto的地方写上
gotoMethod();
break;
即可

YXTS122
YXTS122 可以把goto gett;改为return;吗
一年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.04.06 23:27

goto gett;在你的代码中相当于break不相当于while

YXTS122
YXTS122 goto gett;在这里应该是相当于return;吧?
一年多之前 回复
YXTS122
YXTS122 那下面那个gett:;这个是什么意思?
一年多之前 回复
YXTS122
YXTS122   2016.04.06 23:19

漏了这张没上传,补上。。。。。。图片

zr1076311296
zr1076311296   2016.04.06 23:25

goto和while没有必然关系吧,goto语句一般用于跳出很深的循环比较好,否则不建议使用。像你的代码里执行到goto语句时不执行goto后面的语句而跳转到gett标签处

zr1076311296
zr1076311296 回复YXTS122: 我意思是你有一个函数turn(getchar)是干什么的,你把代码弄成可复制粘贴的吧,这样好改一些,不用一行一行的再敲了
一年多之前 回复
YXTS122
YXTS122 goto gett;在这里好像是相当于return;吧?
一年多之前 回复
zr1076311296
zr1076311296 回复YXTS122: gett是一个标签,没有其他含义,你这不是深层循环,所以不需要使用goto语句,你可以把goto都改成break语句,但是你的gett:;之前的那个turn(getchar())是干嘛的,不是很清楚
一年多之前 回复
YXTS122
YXTS122 下面那个gett:;是什么意思呢?
一年多之前 回复
YXTS122
YXTS122 那你能帮我改下代码吗?改成看得懂的吗?
一年多之前 回复
cookie_fei
cookie_fei   2016.04.06 23:36

goto不是跳转的意思?

YXTS122
YXTS122   2016.04.19 21:32
 #include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int x,y,i,j;
char *head,*tail,*belly, map[12][30];
char left,right,front,back;
void start()
{
    for (i=0; i!=12; ++i)
    {
        for (j =0; j!=30; ++j)
    {
        if ((i == 0)||(i == 11) || (j == 0) || (j == 29))
                map[i][j] = '9';
           else
                 map[i][j] ='0';
    }
    }
     x=15;
     y = 6;
     head = &map[y][x];
     belly=&map[y][x-1];
     tail=&map[y][x-2];
     *head ='1';
     *belly='3';
     *tail='5';
     front='6';
     back='4';
     left='2';
     right='8';
}
void draw()
{
    for (i=0; i!=12;++i)
   {
    for (j=0; j!=30; ++j)
    {
        switch(map[i][j])
        {
           case '0':printf(" ");break;
           case '9':printf("#");break;
           case '1':printf("O");break;
           case '2':printf(" ");break;
           case '3':printf("=");break;
           case '5':printf("~");break;
           }
    }
      printf("\n");
   }
}
void turn(char direction)
{
    switch (direction)
   {
    case '2':--y;break;
    case '8':++y;break;
    case '4':--x;break;
    case '6':++x;break;
    }
}
void getturn()
{
    char t;
    while (kbhit())
    {
        t=getch();
        if (t==left)
        {
            turn(t);
            left=back;
            back=right;
            right=front;
            front=t;//front=left;不能这样写
            return;
       }
       else if (t==right)
    {
        turn(t);
        right=back;
        back=left;
        left=front;
        front=t;
         return;
    }
   }
   turn(front);
   return;
}
void move()
{
    *tail='2';
    tail=belly;
    *tail='5';
    belly=head;
    *belly='3';
/*  *head ='2';//该位置原来打印'o',现改为打印成' '*/
    head = &map[y][x];//改变指针指向
    *head='1';
}
int main()
{
    start();
    draw();
    while (1)
   {
    usleep(10000000/4);
    getturn();
    move();
    clrscr();
    draw();
    }
    return 0;
}
 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define H 16
// 高度high
#define W 24
// 宽度weight
#define N 4
// 难度,步时为(1/N)s
#define UP '2'
#define DOWN '5'
#define LEFT '4'
#define RIGHT '6'
// 自定义方向键…
void move();
void start();
void draw();
void getturn();
void getrand(int &a, int &b);
void turn(char direction);
int judge();
void getfood();
void getrock();
void over();
// 好多自定义函数…
int x, y;
// 蛇头坐标…
// x横坐标即列数,y纵坐标即行数…
int l = 0;// 蛇肚子长
int n, i, j, jg;
int x1, y1;
// 食物和石头的坐标…
char *head, *tail, *tt;
// 指向头尾,tt是临时的尾巴…
char map[H][W];
// 用二维数组存全图…
char *belly[H * W], *food, *rock;// 肚子食物和石头…
char left, right, front, back;
// 本人用的是前后左右移动…
int main()
{
start();
}

void start()// 开始…
{
for (i = 0; i != H; ++i)
for (j = 0; j != W; ++j)
{
if ((i == 0) || (i == H - 1) || (j == 0) || (j == W - 1))
map[i][j] = '9';
else
map[i][j] = '0';
}
x = W / 2, y = H / 2, l = 0;
head = &map[y][x + 1];
belly[l] = &map[y][x];
tail = &map[y][x - 1];
*head = '1';
*belly[0] = '2';
*tail = '3';
left = UP, right = DOWN;
front = RIGHT, back = LEFT;
turn(front);
getfood();
draw();
// 前面都是初始化,现在才开始…
do
{
usleep(10000000 / N);
// 步时为(1/N)s
getturn();
// 读取拐弯方向…
move();// 移动…
jg = judge();
// 判断头移到那了…
clrscr();// 清屏…
draw();// 重绘…
}
while (jg);// v1.2改,用返回值判断游戏是否结束…
clrscr();
return;// 游戏结束就返回,这句有没有都无所谓…
}

void getturn()
{
char t;
while (kbhit())// 判断有无输入值…
{
t = getch();// 有则捕获…
if (t == left)
// 判断方向并拐弯…
{
turn(left);
left = back;
back = right;
right = front;
front = t;
goto gett;
}
else if (t == right)
{
turn(right);
right = back;
back = left;
left = front;
front = t;
goto gett;
}
}
turn(front);
gett:;
while (kbhit())
t = getch();
// 把多输入的吃掉…
}

void getfood()// 来个吃的…
{
getrand(x1, y1);
// 食物要落在空地上…
food = &map[y1][x1];
*food = '4';
// 移指针并赋值…
getrock();
// 顺便来个石头…
// 不喜欢可以去掉…
}

void getrock()
{
getrand(x1, y1);
rock = &map[y1][x1];
// 要是正好石头就在面前只能说是运气不好了……
*rock = '8';
}

void getrand(int &a, int &b)
{
do
{
a = random() % (W - 2) + 1;
b = random() % (H - 2) + 1;
}
while (map[b][a] != '0');
}

void turn(char direction)
// 转向,想不到更好的单词了,直走也算turn…
{
switch (direction)
// 蛇头坐标先走…
{
case UP:
--y;
break;
case DOWN:
++y;
break;
case LEFT:
--x;
break;
case RIGHT:
++x;
break;
}

}

void move()
// 蛇肚子走…
{
tt = belly[l];
// 先临时的尾巴走…
for (i = l; i != 0; --i)// 挪动…
belly[i] = belly[i - 1];
belly[0] = head;
head = &map[y][x];
// 蛇肚子先走才走蛇头…
*belly[0] = '2';
// 蛇肚子2了……
}

int judge()
{
switch (*head)
{
case '2':;
case '8':;
case '9':
over();
return 0;// v1.2改…
// 咬肚子或撞墙死…
// 咬尾巴不算,尾巴马上走了…
break;
case '4':
getfood();
// 吃了还有…
++l;
belly[l] = tt;
// 伸长,真的尾巴就不用动了…
*head = '1';
// 蛇头跟上…
break;
case '0':
*tail = '0';
case '3':
*head = '1';
tail = tt;
*tail = '3';
// 没东西就让真尾巴也跟上…
//v1.1改,解决咬尾巴bug…
break;
}
return 1;
}

void draw()
{
for (i = 0; i != H; ++i)
{
for (j = 0; j != W; ++j)
switch (map[i][j])
{
case '0':
printf("  ");
break;
case '9':
printf("##");
break;
case '8':
printf("¤¤");
break;
// 石头…
case '1':
printf("@@");
break;
case '2':
printf("OO");
break;
case '3':
printf("oo");
break;
case '4':
printf("♥♥");
break;
}
printf("\n");
}
}

void over()
// game over!!!
{
printf("\tGame over!!!\n");
printf("\t\tAgain?\n");
getch();
// 输入任意字符继续…
clrscr();
}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!