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
|
||||
|
||||
John Tromp\
|
||||
Centre for Mathematics and Computer Science (CWI)\
|
||||
Oetgensstraat 7\
|
||||
1701CK Heerhugowaard\
|
||||
Netherlands
|
||||
|
||||
## To build:
|
||||
@@ -19,39 +16,44 @@ make all
|
||||
```
|
||||
|
||||
## Try:
|
||||
|
||||
```sh
|
||||
./tromp 5
|
||||
|
||||
# fast with vim keys
|
||||
# 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"
|
||||
./tromp 10 "hkl jq"
|
||||
```
|
||||
|
||||
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
|
||||
file might look like:
|
||||
|
||||
```
|
||||
330 by luser
|
||||
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:
|
||||
|
||||
The author provided an alternate version of the code with some improvements. We
|
||||
were unable to see the improvements in modern systems even after fixing it to
|
||||
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:
|
||||
The author provided an alternate version of the code with some improvements. See
|
||||
the judges' additional remarks in the author's remarks, for more details.
|
||||
|
||||
#### To use:
|
||||
|
||||
```sh
|
||||
make alt
|
||||
@@ -59,29 +61,33 @@ make alt
|
||||
|
||||
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:
|
||||
|
||||
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
|
||||
best used at 4800 baud or more.
|
||||
|
||||
By default, "drops_per_sec", the number of times an object
|
||||
will drop in a second, is 2. The default "cmd_string" is
|
||||
"jkl pq". The first 6 characters of "cmd_string" relate
|
||||
By default, `drops_per_sec`, the number of times a tetrimino
|
||||
will drop in a second, is 2. The default `cmd_string` is
|
||||
`jkl pq`. The first 6 characters of `cmd_string` relate
|
||||
to the following 6 game commands:
|
||||
|
||||
- j - left
|
||||
- k - rotate
|
||||
- l - right
|
||||
- space - drop
|
||||
- space - drop
|
||||
- p - pause
|
||||
- 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
|
||||
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
|
||||
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:
|
||||
|
||||
This program plays the familiar game of `TETRIS' with the
|
||||
This program plays the familiar game of `TETRIS` with the
|
||||
following features:
|
||||
|
||||
* outputs vt100-like escape-sequences for cursor
|
||||
@@ -98,32 +104,34 @@ following features:
|
||||
|
||||
* continuously increasing speed (except in pause)
|
||||
|
||||
* start speed selectable by giving n as first argument,
|
||||
where n is the number of drops per second (default=2).
|
||||
* start speed selectable by giving `n` as first argument,
|
||||
where `n` is the number of drops per second (default=2).
|
||||
|
||||
* 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
|
||||
|
||||
* maintains a high-score table
|
||||
|
||||
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 program:
|
||||
|
||||
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
|
||||
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
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
the program, but has the possible disadvantage that the program
|
||||
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);}
|
||||
```
|
||||
|
||||
NOTE: the alternate version was fixed for modern systems in 2023.
|
||||
|
||||
## Copyright and CC BY-SA 4.0 License:
|
||||
|
||||
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,
|
||||
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,
|
||||
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+
|
||||
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*
|
||||
*V,*a;{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,
|
||||
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;{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");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+
|
||||
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
|
||||
=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(
|
||||
8192);printf("\033[H\033[J\033[0m%d\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(
|
||||
"stty -cbreak echo stop \023;sort -mnr -o HI - HI;cat HI","w");fprintf(d,
|
||||
"%4d from level %1d by %s\n",w,l,getlogin());pclose(d);}
|
||||
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);}}system(
|
||||
"stty cbreak echo");d=popen("cat - HI 2>/dev/null|sort -mnr -o HI -;cat HI","w");fprintf(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()`.
|
||||
|
||||
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
|
||||
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
|
||||
IOCCC [Tetris](https://en.wikipedia.org/wiki/Tetris) working (this of course was
|
||||
not his only reason :-) )
|
||||
|
||||
Reference in new issue
Block a user