Fix 1989/tromp alt code
Originally I put in the author's code without fixes in place. This is one of the reasons I did not see the improvements that he suggested. Several fixes had to be made and now it works. It should be noted I have not tested more than one user updating the high score file but the file is now created (I had to make a similar fix to the original entry as well). Format/typo check README.md file. Not sure I'm done with this one though as presentation might be improved.
This commit is contained in:
1 parent
8f119955cb
commit
3d9f7763d0
3 files changed
+66
-46
No files matched your search
+46
-36
@@ -1,9 +1,6 @@
|
|||||||
# Best game
|
# Best game
|
||||||
|
|
||||||
John Tromp\
|
John Tromp\
|
||||||
Centre for Mathematics and Computer Science (CWI)\
|
|
||||||
Oetgensstraat 7\
|
|
||||||
1701CK Heerhugowaard\
|
|
||||||
Netherlands
|
Netherlands
|
||||||
|
|
||||||
## To build:
|
## To build:
|
||||||
@@ -19,39 +16,44 @@ make all
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Try:
|
## Try:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
./tromp 5
|
./tromp 5
|
||||||
|
|
||||||
# fast with vim keys
|
./tromp 10 "hkl jq"
|
||||||
# h - left (left)
|
|
||||||
# k - rotate (arbitrary, in vim k = up)
|
|
||||||
# l - right (right)
|
|
||||||
# j - drop (down)
|
|
||||||
# space - pause (literal space in vim)
|
|
||||||
# q - quit (similar to :q in vim)
|
|
||||||
|
|
||||||
./tromp 10 "hklj q"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
NOTE: after this game ends a file called `HI` will be in the directory with the
|
The second command, `./tromp 10 "hkl jq"`, will set up the keys kind of like
|
||||||
|
vim:
|
||||||
|
|
||||||
|
- h - left (left)
|
||||||
|
- k - rotate (up)
|
||||||
|
- l - right (right)
|
||||||
|
- j - drop (down)
|
||||||
|
- space - pause (space)
|
||||||
|
- q - quit (:q)
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: after the game ends a file called `HI` will be in the directory with the
|
||||||
high scores (up to 20 runs saved) so one can see who has the highest score. The
|
high scores (up to 20 runs saved) so one can see who has the highest score. The
|
||||||
file might look like:
|
file might look like:
|
||||||
|
|
||||||
```
|
```
|
||||||
330 by luser
|
330 by luser
|
||||||
136 by loser
|
136 by loser
|
||||||
|
100 by winner
|
||||||
```
|
```
|
||||||
|
|
||||||
... or so, where in this case the luser is the winner and the loser is the loser :-)
|
... or so, where in this case the [luser is the winner, the loser is in second
|
||||||
|
place and the winner is the
|
||||||
|
loser](https://web.archive.org/web/20181023221954/https://www.chicagotribune.com/news/ct-xpm-2002-07-31-0207310310-story.html) :-)
|
||||||
|
|
||||||
|
|
||||||
### Alternate code:
|
### Alternate code:
|
||||||
|
|
||||||
The author provided an alternate version of the code with some improvements. We
|
The author provided an alternate version of the code with some improvements. See
|
||||||
were unable to see the improvements in modern systems even after fixing it to
|
the judges' additional remarks in the author's remarks, for more details.
|
||||||
compile (the high score file was not created at all) but if you have an old
|
|
||||||
compiler you can try compiling it in its original unmodified form by running:
|
#### To use:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make alt
|
make alt
|
||||||
@@ -59,29 +61,33 @@ make alt
|
|||||||
|
|
||||||
Use `tromp.alt` as you would `tromp` above.
|
Use `tromp.alt` as you would `tromp` above.
|
||||||
|
|
||||||
|
NOTE: testing more than one user updating the high score file, one of the
|
||||||
|
benefits of the alt version, has not been done.
|
||||||
|
|
||||||
|
The original unmodified alternate code is provided later.
|
||||||
|
|
||||||
## Judges' remarks:
|
## Judges' remarks:
|
||||||
|
|
||||||
This is a character terminal version of the TETRIS program.
|
This is a character terminal version of the `TETRIS` game.
|
||||||
It runs on a VT100 compatible terminal or emulator. It is
|
It runs on a VT100 compatible terminal or emulator. It is
|
||||||
best used at 4800 baud or more.
|
best used at 4800 baud or more.
|
||||||
|
|
||||||
By default, "drops_per_sec", the number of times an object
|
By default, `drops_per_sec`, the number of times a tetrimino
|
||||||
will drop in a second, is 2. The default "cmd_string" is
|
will drop in a second, is 2. The default `cmd_string` is
|
||||||
"jkl pq". The first 6 characters of "cmd_string" relate
|
`jkl pq`. The first 6 characters of `cmd_string` relate
|
||||||
to the following 6 game commands:
|
to the following 6 game commands:
|
||||||
|
|
||||||
- j - left
|
- j - left
|
||||||
- k - rotate
|
- k - rotate
|
||||||
- l - right
|
- l - right
|
||||||
- space - drop
|
- space - drop
|
||||||
- p - pause
|
- p - pause
|
||||||
- q - quit
|
- q - quit
|
||||||
|
|
||||||
Specifying "cmd_string" allows one to re-define the commands.
|
Specifying `cmd_string` allows one to redefine the commands.
|
||||||
The pause command pauses the game, clears the screen and
|
The pause command pauses the game, clears the screen and
|
||||||
prints the current score. To resume, type the pause
|
prints the current score. To resume, type the pause
|
||||||
character again, which by default is "p".
|
character again, which by default is `p`.
|
||||||
|
|
||||||
As was stated last year, we are likely to be more strict about
|
As was stated last year, we are likely to be more strict about
|
||||||
portability in the future. [ We mean it this time :-) ]
|
portability in the future. [ We mean it this time :-) ]
|
||||||
@@ -89,7 +95,7 @@ portability in the future. [ We mean it this time :-) ]
|
|||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
This program plays the familiar game of `TETRIS' with the
|
This program plays the familiar game of `TETRIS` with the
|
||||||
following features:
|
following features:
|
||||||
|
|
||||||
* outputs vt100-like escape-sequences for cursor
|
* outputs vt100-like escape-sequences for cursor
|
||||||
@@ -98,32 +104,34 @@ following features:
|
|||||||
|
|
||||||
* continuously increasing speed (except in pause)
|
* continuously increasing speed (except in pause)
|
||||||
|
|
||||||
* start speed selectable by giving n as first argument,
|
* start speed selectable by giving `n` as first argument,
|
||||||
where n is the number of drops per second (default=2).
|
where `n` is the number of drops per second (default=2).
|
||||||
|
|
||||||
* controls also selectable by giving as the second argument
|
* controls also selectable by giving as the second argument
|
||||||
a string of 6 characters. By default they are "jkl pq".
|
a string of 6 characters. By default they are `jkl pq`.
|
||||||
|
|
||||||
* screen is blanked during the pause and the score is shown
|
* screen is blanked during the pause and the score is shown
|
||||||
|
|
||||||
* maintains a high-score table
|
* maintains a high-score table
|
||||||
|
|
||||||
Giving a full path name for the table will result in a
|
Giving a full path name for the table will result in a
|
||||||
system-wide hiscore allowing a competition between users.
|
system-wide high-score allowing a competition between users.
|
||||||
|
|
||||||
|
### Additional remarks from the judges:
|
||||||
|
|
||||||
The author provided us with the following notes and new version of
|
The author provided us with the following notes and new version of
|
||||||
the program:
|
the program:
|
||||||
|
|
||||||
Here is a somewhat improved version of my tetris entry. All the
|
Here is a somewhat improved version of my tetris entry. All the
|
||||||
changes are in the popen() at the end. Formerly a move was done
|
changes are in the `popen()` at the end. Formerly a move was done
|
||||||
to the HI score file which is not permitted for other users. Now
|
to the HI score file which is not permitted for other users. Now
|
||||||
other users can change the HI score file. The extra option -m is
|
other users can change the `HI` score file. The extra option `-m` is
|
||||||
passed to sort, so that it knows that its input files are already
|
passed to sort, so that it knows that its input files are already
|
||||||
sorted. The -o output option of sort is used instead of a
|
sorted. The `-o` output option of sort is used instead of a
|
||||||
temporary file.
|
temporary file.
|
||||||
|
|
||||||
You may also want to consider giving just the raw option to stty
|
You may also want to consider giving just the raw option to `stty`
|
||||||
at the start and -raw at the end. This further reduces the size of
|
at the start and `-raw` at the end. This further reduces the size of
|
||||||
the program, but has the possible disadvantage that the program
|
the program, but has the possible disadvantage that the program
|
||||||
can only by stopped by 'q' or by the `kill -9' command.
|
can only by stopped by 'q' or by the `kill -9' command.
|
||||||
|
|
||||||
@@ -149,6 +157,8 @@ can only by stopped by 'q' or by the `kill -9' command.
|
|||||||
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
|
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
NOTE: the alternate version was fixed for modern systems in 2023.
|
||||||
|
|
||||||
## Copyright and CC BY-SA 4.0 License:
|
## Copyright and CC BY-SA 4.0 License:
|
||||||
|
|
||||||
This file is Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved.
|
This file is Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved.
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}c,d,l,v[]={(int)t,0,2},w,s,I,K
|
long h[4];t(){h[3]-=h[3]/3000;setitimer(0,h,0);}FILE *d;long c,l,v[]={0,0,2},w,s,I,K
|
||||||
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
|
=0,i=276,j,k,q[276],Q[276],*n=q,*m,x=17,f[]={7,-13,-12,1,8,-11,-12,-1,9,-1,1,
|
||||||
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
|
12,3,-13,-12,-1,12,-1,11,1,15,-1,13,1,18,-1,1,2,0,-12,-1,11,1,-12,1,13,10,-12,
|
||||||
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
|
1,12,11,-12,-1,1,2,-12,-1,12,13,-12,12,13,14,-11,-1,1,4,-13,-12,12,16,-11,-12,
|
||||||
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
|
12,17,-13,1,-1,5,-12,12,11,6,-12,12,24};u(){for(i=11;++i<264;)if((k=q[i])-Q[i]
|
||||||
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%d;%dH",(I=i)/12,i%12*2+28);printf(
|
){Q[i]=k;if(i-++I||i%12<1)printf("\033[%ld;%ldH",(I=i)/12,i%12*2+28);printf(
|
||||||
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
|
"\033[%dm "+(K-k?0:5),k);K=k;}Q[263]=c=getchar();}G(b){for(i=4;i--;)if(q[i?b+
|
||||||
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V,a)char*
|
n[i]:b])return 0;return 1;}g(b){for(i=4;i--;q[i?x+n[i]:x]=b);}main(C,V)char*
|
||||||
*V,*a;{h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
|
*V;{char *a;*v=(long)t;h[3]=1000000/(l=C>1?atoi(V[1]):2);for(a=C>2?V[2]:"jkl pq";i;i--)*n++=i<
|
||||||
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo stop u");sigvec(14,v,
|
25||i%12<2?7:0;srand(getpid());system("stty cbreak -echo");sigaction(14,v,
|
||||||
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
|
0);t();puts("\033[H\033[J");for(n=f+rand()%7*4;;g(7),u(),g(0)){if(c<0){if(G(x+
|
||||||
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
|
12))x+=12;else{g(7);++w;for(j=0;j<252;j=12*(j/12+1))for(;q[++j];)if(j%12==10){
|
||||||
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
|
for(;j%12;q[j--]=0);u();for(;--j;q[j+12]=q[j]);u();}n=f+rand()%7*4;G(x=17)||(c
|
||||||
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
|
=a[5]);}}if(c==*a)G(--x)||++x;if(c==a[1])n=f+4**(m=n),G(x)||(n=m);if(c==a[2])G
|
||||||
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
|
(++x)||--x;if(c==a[3])for(;G(x+12);++w)x+=12;if(c==a[4]||c==a[5]){s=sigblock(
|
||||||
8192);printf("\033[H\033[J\033[0m%d\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
|
8192);printf("\033[H\033[J\033[0m%ld\n",w);if(c==a[5])break;for(j=264;j--;Q[j]=
|
||||||
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}d=popen(
|
0);while(getchar()-a[4]);puts("\033[H\033[J\033[7m");sigsetmask(s);}}system(
|
||||||
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
|
"stty cbreak echo");d=popen("cat - HI 2>/dev/null|sort -mnr -o HI -;cat HI","w");fprintf(d,
|
||||||
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
|
"%4ld from level %1ld by %s\n",w,l,getlogin());pclose(d);}
|
||||||
+11
-1
@@ -592,11 +592,21 @@ To get it to work with clang the variable `a` had to not be the third argument
|
|||||||
to `main()` but instead be a variable in `main()`.
|
to `main()` but instead be a variable in `main()`.
|
||||||
|
|
||||||
Cody also fixed a segfault and made it so the that the high score file would
|
Cody also fixed a segfault and made it so the that the high score file would
|
||||||
work (it was not even being created but it was supposed to be).
|
work (it was not even being created but it was supposed to be). This was
|
||||||
|
happening due to a file pointer being declared as a `long` and more
|
||||||
|
significantly is the command in `popen(3)` was not correct.
|
||||||
|
|
||||||
Another problem Cody fixed was that the terminal was left in an insane state where you
|
Another problem Cody fixed was that the terminal was left in an insane state where you
|
||||||
could not type '`u`' and echo was completely disabled.
|
could not type '`u`' and echo was completely disabled.
|
||||||
|
|
||||||
|
Cody later on fixed the alt version, provided by the author, so that it would
|
||||||
|
compile with clang, not abort (with an alarm), would have the tetriminos fall,
|
||||||
|
it would write to the high score file (the command to `popen(3)` was incorrect
|
||||||
|
here too but as can be seen it differs from the submitted version), could use
|
||||||
|
`stty` properly (and thus turn on echo again - it did not work because it was in
|
||||||
|
the `popen(3)` call rather than using `system(3)`), a couple compiler errors and
|
||||||
|
various other things, so that now the alt version, which is better, can be used.
|
||||||
|
|
||||||
Although we appreciate the help here, he cynically noted that he had to have an
|
Although we appreciate the help here, he cynically noted that he had to have an
|
||||||
IOCCC [Tetris](https://en.wikipedia.org/wiki/Tetris) working (this of course was
|
IOCCC [Tetris](https://en.wikipedia.org/wiki/Tetris) working (this of course was
|
||||||
not his only reason :-) )
|
not his only reason :-) )
|
||||||
|
|||||||
Reference in new issue
Block a user