Files
ioccc/2004/vik1
Cody Boone Ferguson af5482825c Reorganise menus
The sections have been modified a fair amount. The Entries menu has been
extended to have: Fixing entries, Updating author info, Thanks for the
help. The first two were moved from FAQ and the last one from About.
The rationale for these, in order: entries and authors have to do with
entries and most of the help involves entries. It also has to do with
website but in 'about' it does not seem the right place, unless maybe it
is renamed to 'Credits' or something (I am not suggesting this one way
or the other). This one is debatable but that was the rationale.

The Status menu has been extended to have: Markdown guidelines and
Security policy. The rationale is that the markdown guidelines are part
of contest guidelines and the security policy is about the status of the
entries and how if there are any security problems they will not be
addressed (instead of about the IOCCC).

The FAQ was extended to have: Compiling entries, Running entries, How to
help. The reason to not have compiling and running entries under Entries
is because this is 'how to' and also the menu was too long. How to help
seems like a good idea under FAQ too (was in About).

About was extended to have the new 'about.html' page (from about.md).
This is a rare case where a new file is useful as it fits under 'About'.
The menu now is: Home page, About the IOCCC, The Judges, Contact us. I
was pondering the 'About [the IOCCC]' at the top and also naming it
'About us' but it seemed like a link to index.html was necessary and as
for 'about us' it seemed less clear as to whether it was about the
judges or the contest itself. The FAQ has been updated slightly for
this.

After further inspection the bin/index.html and the inc/index.html links
were removed from the about section.

With these changes, renaming an item or slight reordering
notwithstanding, I believe that #2006 is probably in good shape.
2024-10-25 11:23:21 -07:00
..
2024-10-25 11:23:21 -07:00
2024-08-15 10:15:32 -07:00
2022-09-18 23:37:49 -07:00
2023-07-06 21:49:38 -07:00

To build:

    make

NOTE: this entry requires the X11/Xlib.h header file and the X11 library to compile. For more information see the FAQ on "X11".

To use:

    ./vik1 [arg]

Try:

    ./vik1

    ./vik1 a

    ./vik1 d2

    ./vik1 ad3

Can you figure out how to cheat?

Also see the author's remarks below for more details on the different modes/options.

Judges' remarks:

Daniel Vik has presented a tour de force feature rich X11-based racing game that fit within the contest size limits. Take a glance at the feature list he provided below. Amazing!

The author posted a video of this on YouTube: https://www.youtube.com/watch?v=xTseqWCtAUA.

Happy touring on the road and in the code!

Author's remarks:

Features

This program is a complete car race game with a lot of nice features:

  • Drive on a road in a 3D landscape with hills and curves.

  • Mountains in the horizon.

  • A sun in the sky when driving during the day.

  • Dark sky and reduced visibility when driving at night.

  • Snow when driving in the winter.

  • Slippery road when driving in the winter.

  • When driving off the road, the car slows down to a halt.

  • Three different race tracks that takes about one minute to complete.

  • Speedometer.

  • Computer driven opponent cars.

  • Collision detection when driving into other cars.

  • Lap time measurement.

  • The best lap time is stored as reference.

Build and Run

Compile the source code and link X libraries if necessary. The program takes three options which have to be typed in a specific order as described below.

Usage:

    ./vik1 ['a']['d'][#]
  • a
    • Advanced racing in a winter landscape.
  • d
    • Racing in at night in the dark.
  • #
    • Race track selection 1-3 are valid numbers.

Examples:

  • ./vik1

    • Run track 1 at daytime in the summer.
  • ./vik1 a

    • Run track 1 at daytime in the winter.
  • ./vik1 d

    • Run track 1 at night in the summer.
  • ./vik1 3

    • Run track 3 at daytime in the summer.
  • ./vik1 d3

    • Run track 3 at night in the summer.
  • ./vik1 ad2

    • Run track 2 at night in the winter.

Note that the order in which the argument characters are entered is important. It is for example not possible to type ./vik1 da. (Well it is possible, but the result will not be as expected.)

The space key accelerates the car. Releasing the space key slowly reduces the speed. The left and right arrow keys are used to steer the car.

Obfuscation

The main obfuscation is the fact that the program is extremely compact. There are a few things I didn't want to do, e.g. define #define to a single letter to save some space, or to remove casts to save some space.

The program uses a lot of variables. In fact, all letters a-z are used and most letters A-Z.

The constants are chosen very carefully and they have multiple purposes, e.g. a constant can be both the length of the track and a color.

Most of the code is kept inside five for loops each without a body. Each for loop does many things. One for loop draws all cars by restarting a couple of times. Another draws the road, mountains, and the sun.

main() is called recursively. The return value and output depends on the arguments. main() can return the current time, draw lines and of course be the entry point of the application.

The program frequently uses the ?: operator mainly to save space but it makes the program more obscure.

Compiler warnings

There are no compiler warnings when compiling with -ansi but there are many warnings from lclint, mainly because the program is very optimized for code size.

Limitations

The program only compiles and runs on X based systems.

The program requires a display with 24 bit color depth. It also assumes that the byte order of the colors are as on my Linux PC. That is, The colors are represented by a 32 bit value where the bytes (from high to low) are { 0, RED, GREEN, BLUE }.