diff --git a/1994/dodsond2/.gitignore b/1994/dodsond2/.gitignore index e2294cd67..bfe05b95b 100644 --- a/1994/dodsond2/.gitignore +++ b/1994/dodsond2/.gitignore @@ -1,3 +1,4 @@ dodsond2 +dodsond2.alt dodsond2.orig prog.orig diff --git a/1994/dodsond2/Makefile b/1994/dodsond2/Makefile index a2cafafad..eee378068 100644 --- a/1994/dodsond2/Makefile +++ b/1994/dodsond2/Makefile @@ -39,7 +39,7 @@ include ../../var.mk # Common C compiler warnings to silence # CSILENCE= -Wno-error -Wno-implicit-function-declaration -Wno-return-type \ - -Wno-deprecated-non-prototype -Wno-strict-prototypes + -Wno-deprecated-non-prototype -Wno-strict-prototypes -Wno-implicit-int # Common C compiler warning flags # @@ -58,7 +58,7 @@ ARCH= # Defines that are needed to compile # -CDEFINE= +CDEFINE= -DW=3 # Include files that are needed to compile # @@ -114,8 +114,8 @@ OBJ= ${PROG}.o DATA= TARGET= ${PROG} # -ALT_OBJ= -ALT_TARGET= +ALT_OBJ= ${PROG}.alt.o +ALT_TARGET= ${PROG}.alt ################# @@ -138,6 +138,9 @@ ${PROG}: ${PROG}.c alt: data ${ALT_TARGET} @${TRUE} +${PROG}.alt: ${PROG}.alt.c + ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} + # data files # data: ${DATA} diff --git a/1994/dodsond2/README.md b/1994/dodsond2/README.md index d05ccfcc2..d41688329 100644 --- a/1994/dodsond2/README.md +++ b/1994/dodsond2/README.md @@ -5,12 +5,53 @@ make all ``` +There is an [alternate version](#alternate-code) that allows you to cheat, +giving you a configurable amount of arrows at the start of the game. + + +### Bugs and (Mis)features: + +The current status of this entry is: + +``` +STATUS: INABIAF - please **DO NOT** fix +STATUS: known bug - please help us fix +``` + +For more detailed information see [1994 dodsond2 in bugs.md](/bugs.md#1994-dodsond2). + + ## To use: ```sh ./dodsond2 ``` +## Alternate code: + +This version allows you to choose how many arrows to start with, instead of the +default 0. If one tried specifying a value < 0 it will set it to 0. + +### Alternate build: + + +```sh +make alt +``` + +The default number of arrows in this version is 3 but if you want to change it, +say to 5, try: + +```sh +make clobber CDEFINE="-DW=5" alt +``` + +### Alternate use: + +```sh +./dodsond2.alt +``` + ## Judges' remarks: @@ -50,19 +91,19 @@ style hack, the [dodsond2.c](dodsond2.c) is further obfuscated. ## Author's remarks: Go searching for the Wumpus in the Caverns of Doom! But be careful... -There are pits and bats waiting to seal your fate, as well as a\ -stealthy robber lurking in the shadows. Move through the rooms by\ -typing the number of the adjacent room you wish to visit. You can\ -feel a breeze if there is a pit in an adjacent room. A rustling sound\ -will tell you that bats are nearby. The scent of the evil Wumpus can\ +There are pits and bats waiting to seal your fate, as well as a +stealthy robber lurking in the shadows. Move through the rooms by +typing the number of the adjacent room you wish to visit. You can +feel a breeze if there is a pit in an adjacent room. A rustling sound +will tell you that bats are nearby. The scent of the evil Wumpus can be detected from 2 rooms away. -To win, you must find one or more arrows, determine where the Wumpus\ -is, and shoot him, all without falling into a pit or becoming the\ -next meal for the Wumpus. To shoot an arrow, type `s`. Then give a\ -list of the rooms you want to shoot into. The rooms must be\ -connected in the order you list them, or else the arrow may bounce\ -back and hit you. An arrow can go through as many as four rooms.\ +To win, you must find one or more arrows, determine where the Wumpus +is, and shoot him, all without falling into a pit or becoming the +next meal for the Wumpus. To shoot an arrow, type `s`. Then give a +list of the rooms you want to shoot into. The rooms must be +connected in the order you list them, or else the arrow may bounce +back and hit you. An arrow can go through as many as four rooms. But beware that shooting an arrow and missing the Wumpus may awaken him. diff --git a/1994/dodsond2/dodsond2.alt.c b/1994/dodsond2/dodsond2.alt.c new file mode 100644 index 000000000..31823b3fd --- /dev/null +++ b/1994/dodsond2/dodsond2.alt.c @@ -0,0 +1,55 @@ +#include +#include +#define A { E"Your score is %d\n",j);exit(0);} +#define B(x,y) K(x0?W:0,j=(W>0?W:0)*20,k,l=0; +main(){m();n();A;}m(){G o;srandom(getpid());do{I(o=0; +od)w(J(o,x),d+1);}G r(x)G x;{G y,t=0,u; +F(e[x]){u=3;(e[x])--;do{y=D;K(t++>1000)H(0);K(t%100==0)u--;} +F((y==x)||(e[y]<=0)||(y==J(x,2))||(y==J(x,1))||(e[y]=3+(W>0?W:0)){E"You catch the robber and recover all %d arrows!\n",(W>0?W:0)+3); +i=(W>0?W:0)+3;j+=200;k=-1;}L{E"The robber scurries away\n");do{k=D;} +F((c[k])||(d[k])||(b[k]==0)||(k==r));}}K(c[r]){c[r]=0;c[D]=1;r=D; +E"The bats pick you up and drop you in room %d\n",r);j-=10;}L{ +K(b[r]<3)E"You smell a wumpus\n"); +K(d[J(r,0)]||d[J(r,1)]||d[J(r,2)])E"You feel a breeze\n"); +K(c[J(r,0)]||c[J(r,1)]||c[J(r,2)])E"You hear a rustling sound\n"); +E"Passageways to room %d, %d, and %d\n",J(r,0),J(r,1),J(r,2)); +K(!g[r]){j+=10;g[r]=1;}do{v=P;K(v=='s')q(r);K(v=='l')break; +K(v=='i')E"You have %d arrow%c\n",i,i-1?'s':' ');K(v=='q')A;} +F(!M(v));K(M(v)){n=v-'0';v=P;K(M(v))n=n*10+v-'0'; +K((J(r,0)==n)||(J(r,1)==n)||(J(r,2)==n))r=n;}}}}q(r)G r;{G z,n; +char v;K(i==0){E"You have no arrows\n");H;}i--; +E"Shoot into which rooms? ");I(z=0;z<4;z++){j-=20*z;do{v=P; +K((v=='\n')&&(i>0)){j-=50;E"You have %d arrow%c\n",i,i-1?'s':' ');H;}else K(i==0)H;}F(!M(v)); +n=v-'0';v=P;K(M(v))n=10*n+v-'0';K((J(r,0)==n)||(J(r,1)==n)||(J(r,2) +==n)){r=n;K(b[r]==0){E"You have killed the Wumpus!\n");j+=500+i*100; +A;}}L K(random()%3==1){E"The arrow bounces back and kills you\n"); +j-=100;A;}L{I(n=0;n0)){j-=50;E"You have %d arrows\n",i);H;}}F(!M(v)); +K((v=='\n')&&(i>0)){j-=50;E"You have %d arrow%c\n",i,i-1?'s':' ');H;}else K(i==0)H;}F(!M(v)); n=v-'0';v=P;K(M(v))n=10*n+v-'0';K((J(r,0)==n)||(J(r,1)==n)||(J(r,2) ==n)){r=n;K(b[r]==0){E"You have killed the Wumpus!\n");j+=500+i*100; A;}}L K(random()%3==1){E"The arrow bounces back and kills you\n"); diff --git a/1994/dodsond2/dodsond2.gz b/1994/dodsond2/dodsond2.gz old mode 100755 new mode 100644 diff --git a/bugs.md b/bugs.md index a86373856..2141d7292 100644 --- a/bugs.md +++ b/bugs.md @@ -1114,6 +1114,42 @@ not `d-46`. # 1994 +## 1994 dodsond2 + +### STATUS: INABIAF - please **DO NOT** fix +### Source code: [1994/dodsond2/dodsond2.c](1994/dodsond2/dodsond2.c) +### Information: [1994/dodsond2/README.md](1994/dodsond2/README.md) + +When you initiate shooting via the `s` command you immediately lose an arrow +_before you choose where to shoot_. + +When you shoot it will move you to that room so if you end up shooting into a +pit room you will end up dying even though you didn't explicitly move there. + +### STATUS: known bug - please help us fix + +A (mis)feature is that one must have had all arrows stolen in order to recover +all the arrows from the robber. This means that if you end up shooting an arrow +you can never recover all the arrows from the robber because the count of arrows +stolen can never be high enough. There are a number of ways this might be fixed, +some of which Cody notes: + +- If you have zero arrows and you come across the robber you could give them all +back. This is not correct though because if you never had that many arrows you +would end up getting arrows back that you never had in the first place. +- A new variable, an `int`, could be added that keeps track of the number of +arrows you have fired and then if you come across the robber and they took the +number of arrows with the difference of the number fired then you would give +back how many (the difference) the robber stole rather than all the arrows. This +would be the right approach but there are certainly other ways to go about it. + +A tip is that the number of arrows stolen is `l` and the number of arrows you +have is `i`. For the alt version that Cody added the starting number of arrows +is in the constant `W`, defaulting to 3. + +You are welcome to try and fix this (mis)feature. + + ## 1994 ldb ### STATUS: INABIAF - please **DO NOT** fix diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 75abff458..606792f14 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -1732,6 +1732,30 @@ NOTE: the `N1` and `N2` are provided as notes in the README.md file describing this code. Other code is also described there. +## [1994/dodsond2](1994/dodsond2/dodsond2.c) ([README.md](1994/dodsond2/README.md)) + +Cody fixed an infinite loop that could happen when you shoot an arrow and end up +having no arrows, thus making one force quit the game. The problem was in a +condition in the outer loop it would repeatedly get input (if `getchar()` +returned `'\n'`), only if one has more than one arrow, returning after that. +But if there were 0 arrows left it did not return and so the loop started over, +doing nothing. This fix also seems to have fixed a problem where if you shoot +your last arrow it would not move you to the room you shoot into (whereas if you +had more arrows it would). + +Cody added an alt version that allows one to cheat by specifying how many arrows +to start with (this was for fun but it turned out a good way to debug the above +infinite loop too). + +As in some places it would properly say that you have '1 arrow' or else, if you +have any other number of arrows (including 0), it would say 'arrows', Cody fixed +a place where it always said 'arrows'. A minor fix and not that important. + +Cody notes that there is a (mis)feature in the program that might want to be +fixed that he has not had the time to fix yet; see [1991/dodsond2 in +bugs.md](/bugs.md#1994-dodsond2) for more details. + + ## [1994/horton](1994/horton/horton.c) ([README.md](1994/horton/README.md)) Cody fixed this to check that four args were specified. With the use of the C