Logo Hardware.com.br
Felipe Souto Campelo
Felipe Souto... Novo Membro Registrado
10 Mensagens 0 Curtidas

Transformação Basic para C.

#1 Por Felipe Souto... 26/07/2017 - 01:39
Pessoal, meu professor super louco nunca ensinou basic e passou um exercício macabro pra minha turma. Não estou conseguindo resolver o exercício mas me parece não ser tão complicado pra quem sabe o básico de basic. Então lá vai:

TRANSFORMAR O CÓDIGO EM LINGUAGEM C:

0010 REM - HUNT THE WUMPUS

0015 REM - BY GREGORY YOB, 1972

0016 REM - MODIFIED BY DR. BECO 2017 (GWBASIC)

0017 DEFINT A-Z : RANDOMIZE TIMER

0018 DIM S(20, 3) : DIM L(6) : DIM M(6) : DIM P(5)

0020 PRINT "INSTRUCTIONS (Y-N)";

0030 INPUT I$

0040 IF I$ = "N" THEN 60

0045 IF I$ <> "Y" THEN 20

0050 GOSUB 1000

0060 REM - SET UP CAVE (DODECAHEDRAL NODE LIST)

0070 REM DIM S(20, 3)

0080 FOR J = 1 TO 20

0090 FOR K = 1 TO 3

0100 READ S(J, K)

0110 NEXT K

0120 NEXT J

0130 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6

0140 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11

0150 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16

0160 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19

0170 DEF FNA(X) = INT(X*RND)+1

0200 REM - LOCATE L ARRAY ITEMS

0210 REM - 1-YOU, 2-WUMPUS, 3&4-PITS, 5&6-BATS

0220 REM DIM L(6)

0230 REM DIM M(6)

0240 FOR J = 1 TO 6

0250 L(J) = FNA(20)

0260 M(J) = L(J)

0270 NEXT J

0280 REM - CHECK FOR CROSSOVERS (IE L(1)=L(2),ETC)

0290 FOR J=1 TO 6

0300 FOR K = J TO 6

0310 IF J = K THEN 330

0320 IF L(J) = L(K) THEN 240

0330 NEXT K

0340 NEXT J

0350 REM - SET # ARROWS

0360 A = 5

0365 L = L(1)

0370 REM - RUN THE GAME

0375 PRINT "HUNT THE WUMPUS"

0380 REM - HAZARD WARNINGS & LOCATION

0390 GOSUB 2000

0400 REM - MOVE OR SHOOT

0410 GOSUB 2500

0420 ON O GOTO 440, 480

0430 REM - SHOOT

0440 GOSUB 3000

0450 IF F = 0 THEN 390

0460 GOTO 500

0470 REM - MOVE

0480 GOSUB 4000

0490 IF F = 0 THEN 390

0500 IF F > 0 THEN 550

0510 REM - LOSE

0520 PRINT "HA HA HA - YOU LOSE!"

0530 GOTO 560

0540 REM - WIN

0550 PRINT "HEE HEE HEE - THE WUMPUS'LL GETCHA NEXT TIME!!"

0560 FOR J = 1 TO 6

0570 L(J) = M(J)

0580 NEXT J

0582 PRINT "PLAY AGAIN (Y-N)";

0585 INPUT I$

0587 IF I$ = "N" THEN 5000

0588 IF I$ <> "Y" THEN 582

0590 PRINT "SAME SET-UP (Y-N)";

0600 INPUT I$

0610 IF I$ = "N" THEN 240

0615 IF I$ <> "Y" THEN 600

0620 GOTO 360

1000 REM - INSTRUCTIONS

1010 PRINT "WELCOME TO 'HUNT THE WUMPUS'"

1020 PRINT " THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM"

1030 PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A"

1040 PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW"

1050 PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)"

1060 PRINT

1070 PRINT " HAZARDS:"

1080 PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM"

1090 PRINT " IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)"

1100 PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU"

1110 PRINT " GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER"

1120 PRINT " ROOM AT RANDOM. (WHICH MIGHT BE TROUBLESOME)"

1130 PRINT

1140 PRINT " WUMPUS:"

1150 PRINT " THE WUMPUS IS NOT BOTHERED BY THE HAZARDS (HE HAS SUCKER"

1160 PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT). USUALLY"

1170 PRINT " HE IS ASLEEP. TWO THINGS WAKE HIM UP: YOUR ENTERING"

1180 PRINT " HIS ROOM OR YOUR SHOOTING AN ARROW."

1190 PRINT " IF THE WUMPUS WAKES, HE MOVES (P=.75) ONE ROOM"

1200 PRINT " OR STAYS STILL (P=.25). AFTER THAT, IF HE IS WHERE YOU"

1210 PRINT " ARE, HE EATS YOU UP (& YOU LOSE!)"

1220 PRINT "PRESS ENTER"; : INPUT Z$

1230 PRINT " YOU:"

1240 PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW"

1250 PRINT " MOVING: YOU CAN GO ONE ROOM (THRU ONE TUNNEL)"

1260 PRINT " ARROWS: YOU HAVE 5 ARROWS. YOU LOSE WHEN YOU RUN OUT."

1270 PRINT " EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING"

1280 PRINT " THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO."

1290 PRINT " IF THE ARROW CAN'T GO THAT WAY (IE NO TUNNEL) IT MOVES"

1300 PRINT " AT RAMDOM TO THE NEXT ROOM."

1310 PRINT " IF THE ARROW HITS THE WUMPUS, YOU WIN."

1320 PRINT " IF THE ARROW HITS YOU, YOU LOSE."

1330 PRINT

1340 PRINT " WARNINGS:"

1350 PRINT " WHEN YOU ARE ONE ROOM AWAY FROM WUMPUS OR HAZARD,"

1360 PRINT " THE COMPUTER SAYS:"

1370 PRINT " WUMPUS- 'I SMELL A WUMPUS'"

1380 PRINT " BAT - 'BATS NEARBY'"

1390 PRINT " PIT - 'I FEEL A DRAFT'"

1400 PRINT "PRESS ENTER"; : INPUT Z$

1410 RETURN

2000 REM - PRINT LOCATION & HAZARD WARNINGS

2010 PRINT

2020 FOR J = 2 TO 6

2030 FOR K = 1 TO 3

2040 IF S(L(1), K) <> L(J) THEN 2110

2050 ON J - 1 GOTO 2060, 2080, 2080, 2100, 2100

2060 PRINT "I SMELL A WUMPUS!"

2070 GOTO 2110

2080 PRINT "I FEEL A DRAFT"

2090 GOTO 2110

2100 PRINT "BATS NEARBY!"

2110 NEXT K

2120 NEXT J

2130 PRINT "YOU ARE IN ROOM "; L(1)

2140 PRINT "TUNNELS LEAD TO "; S(L, 1); S(L, 2); S(L, 3)

2150 PRINT

2160 RETURN

2500 REM - CHOOSE OPTION

2510 PRINT "SHOOT OR MOVE (S-M)";

2520 INPUT I$

2530 IF I$ <> "S" THEN 2560

2540 O = 1

2550 RETURN

2560 IF I$ <> "M" THEN 2510

2570 O = 2

2580 RETURN

3000 REM - ARROW ROUTINE

3010 F = 0

3020 REM - PATH OF ARROW

3030 REM DIM P(5)

3040 PRINT "NO. OF ROOMS(1-5)";

3050 INPUT J9

3060 IF J9 < 1 OR J9 > 5 THEN 3040

3070 FOR K = 1 TO J9

3080 PRINT "ROOM #";

3090 INPUT P(K)

3095 IF K <= 2 THEN 3115

3100 IF P(K) <> P(K - 2) THEN 3115

3105 PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM"

3110 GOTO 3080

3115 NEXT K

3120 REM - SHOOT ARROW

3130 L = L(1)

3140 FOR K = 1 TO J9

3150 FOR K1 = 1 TO 3

3160 IF S(L, K1) = P(K) THEN 3295

3170 NEXT K1

3180 REM - NO TUNNEL FOR ARROW

3190 L = S(L, FNA(3))

3200 GOTO 3300

3210 NEXT K

3220 PRINT "MISSED"

3225 L = L(1)

3230 REM - MOVE WUMPUS

3240 GOSUB 3370

3250 REM - AMMO CHECK

3255 A = A - 1

3260 IF A > 0 THEN 3280

3270 F = -1

3280 RETURN

3290 REM - SEE IF ARROW IS AT L(1) OR L(1)

3295 L = P(K)

3300 IF L <> L(2) THEN 3340

3310 PRINT "AHA! YOU GOT THE WUMPUS!"

3320 F = 1

3330 RETURN

3340 IF L <> L(1) THEN 3210

3350 PRINT "OUCH! ARROW GOT YOU!"

3360 GOTO 3270

3370 REM - MOVE WUMPUS ROUTINE

3380 K = FNA(4)

3390 IF K = 4 THEN 3410

3400 L(2) = S(L(2), K)

3410 IF L(2) <> L THEN 3440

3420 PRINT "TSK TSK TSK- WUMPUS GOT YOU!"

3430 F = -1

3440 RETURN

4000 REM - MOVE ROUTINE

4010 F = 0

4020 PRINT "WHERE TO";

4030 INPUT L

4040 IF L < 1 OR L > 20 THEN 4020

4050 FOR K = 1 TO 3

4060 REM - CHECK IF LEGAL MOVE

4070 IF S(L(1), K) = L THEN 4130

4080 NEXT K

4090 IF L = L(1) THEN 4130

4100 PRINT "NOT POSSIBLE -";

4110 GOTO 4020

4120 REM - CHECK FOR HAZARDS

4130 L(1) = L

4140 REM - WUMPUS

4150 IF L <> L(2) THEN 4220

4160 PRINT "... OOPS! BUMPED A WUMPUS!"

4170 REM - MOVE WUMPUS

4180 GOSUB 3380

4190 IF F = 0 THEN 4220

4200 RETURN

4210 REM - PIT

4220 IF L <> L(3) AND L <> L(4) THEN 4270

4230 PRINT "YYYIIIIEEEE . . . FELL IN PIT"

4240 F = -1

4250 RETURN

4260 REM - BATS

4270 IF L <> L(5) AND L <> L(6) THEN 4310

4280 PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!"

4290 L = FNA(20)

4300 GOTO 4130

4310 RETURN

5000 END

OBSERVAÇÃO:
SEGUIR A TABELA:

BASIC | C | NOTA
----------------------|-------------------|----------------------------------------------------
REM ... | /* ... */ ou // | Comentários (de linha)
DEFINT ... | int ... | Declara variáveis como inteiras
RANDOMIZE | srand() | Inicializa a semente aleatória (opcional: time)
RND | rand() | Sorteia um número aleatório
PRINT "MENSAGEM" | printf("msg\n") | Imprime com mudança de linha
PRINT "MENSAGEM"; | printf("msg") | Imprime sem mudança de linha
INPUT ... | scanf(...) | Faz entrada de dados
IF ... THEN ... ELSE | if...else | Decisão (em BASIC o goto pode ser omitido)
DIM | v[] | Declara variável V como vetor de N dimensões
INT(...) | round() ou (int) | Arredonda valor para inteiro próximo. (O cast (int) trunca)
FOR ... TO ... STEP | for... | Laço for()
NEXT | N/A | Indica o fechamento do laço. Em C seria a chave }
READ / DATA | N/A | Sem equivalente. O READ lê cada item do DATA
DEF FN | int fn(); | Define uma função (protótipo, corpo e retorno)
GOTO | goto | Pula para uma dada linha (não deve ser usado em C)
ON V GOTO LINHAS | switch (?) | Pula para a linha na posição V da lista de LINHAS
GOSUB LINHA | func() | Função: marca posição atual e pula para LINHA
RETURN | return | Retorna para a posição após o último GOSUB
ON V GOSUB LINHAS | switch + func() | Pula para função V da lista de LINHAS
V(...) | v[] (tipo vetor) | Uma variável tipo vetor
V% | v (tipo int) | Uma variável tipo inteiro
V$ | v (parece char *) | Uma variável string (sem equivalente em C)
= | = ou == | Atribuição ou comparação (igualdade)
: | ; | Fim de comando (opcional em BASIC)
<> | != | Comparação (diferente)

Meu código por enquanto está assim:

1 /* Hunt the wumpus
2 * By Gregory Yob, 1972
3 *
4 * Modified by Dr. Beco 2017(GWBASIC)
5 */
6
7 [HASHTAG]#include[/HASHTAG]
8 [HASHTAG]#include[/HASHTAG]
9
10 int main(void)
11 {
12 srand(time(NULL));
13
14 int a,z;
15 int s[20][3], l[6], m[6], p[5];
16
17 printf("INSTRUCTIONS (Y-N)");
18 scanf("%s", &i);
19
20 if(i=='n')

(SEI QUE ESTÁ COM ERROS). Me ajudem pfv! é para quinta, quem não fizer reprova.
faguirre
faguirre Super Zumbi Registrado
4.2K Mensagens 1.5K Curtidas
#5 Por faguirre
27/07/2017 - 09:26
Dica: rode o programa e veja como ele funciona (pesquise sobre como rodar programa basic). Entenda a lógica que o programa utiliza para funcionar, escreve em papel mesmo todos os ifs, laços, etc.

Agora você terá uma boa base de escrever seu código em C que faça a mesma coisa, utilizando a mesma lógica empregada por quem escreveu esse código em basic.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal