Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
244
18-04.md
244
18-04.md
|
|
@ -12,155 +12,161 @@ pages: 361-365
|
|||
|
||||
**LISTING 18.3 MAIN.C**
|
||||
|
||||
// MAIN.C
|
||||
//
|
||||
// David Stafford
|
||||
//
|
||||
```c
|
||||
// MAIN.C
|
||||
//
|
||||
// David Stafford
|
||||
//
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <time.h>
|
||||
#include <bios.h>
|
||||
#include "life.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <time.h>
|
||||
#include <bios.h>
|
||||
#include "life.h"
|
||||
|
||||
// functions in VIDEO.C
|
||||
void enter_display_mode( void );
|
||||
void exit_display_mode( void );
|
||||
void show_text( int x, int y, char *text );
|
||||
// functions in VIDEO.C
|
||||
void enter_display_mode( void );
|
||||
void exit_display_mode( void );
|
||||
void show_text( int x, int y, char *text );
|
||||
|
||||
void InitCellmap( void )
|
||||
void InitCellmap( void )
|
||||
{
|
||||
unsigned int i, j, t, x, y, init;
|
||||
|
||||
for( init = (HEIGHT * WIDTH * 3) / 2; init; init— )
|
||||
{
|
||||
x = random( WIDTH * 3 );
|
||||
y = random( HEIGHT );
|
||||
|
||||
CellMap[ (y * WIDTH) + x / 3 ] |= 0x1000 << (2 - (x % 3));
|
||||
}
|
||||
|
||||
for( i = j = 0; i < WIDTH * HEIGHT; i++ )
|
||||
{
|
||||
if( CellMap[ i ] & 0x7000 )
|
||||
{
|
||||
unsigned int i, j, t, x, y, init;
|
||||
|
||||
for( init = (HEIGHT * WIDTH * 3) / 2; init; init— )
|
||||
{
|
||||
x = random( WIDTH * 3 );
|
||||
y = random( HEIGHT );
|
||||
|
||||
CellMap[ (y * WIDTH) + x / 3 ] |= 0x1000 << (2 - (x % 3));
|
||||
}
|
||||
|
||||
for( i = j = 0; i < WIDTH * HEIGHT; i++ )
|
||||
{
|
||||
if( CellMap[ i ] & 0x7000 )
|
||||
{
|
||||
ChangeList1[ j++ ] = (short)&CellMap[ i ];
|
||||
}
|
||||
}
|
||||
|
||||
NextGen(); // Set cell states, prime the pump.
|
||||
ChangeList1[ j++ ] = (short)&CellMap[ i ];
|
||||
}
|
||||
}
|
||||
|
||||
void main( void )
|
||||
{
|
||||
unsigned long generation = 0;
|
||||
char gen_text[ 80 ];
|
||||
long start_time, end_time;
|
||||
unsigned int seed;
|
||||
NextGen(); // Set cell states, prime the pump.
|
||||
}
|
||||
|
||||
printf( "Seed (0 for random seed): " );
|
||||
scanf( "%d", &seed );
|
||||
if( seed == 0 ) seed = (unsigned) time(NULL);
|
||||
srand( seed );
|
||||
void main( void )
|
||||
{
|
||||
unsigned long generation = 0;
|
||||
char gen_text[ 80 ];
|
||||
long start_time, end_time;
|
||||
unsigned int seed;
|
||||
|
||||
#ifndef NODRAW
|
||||
enter_display_mode();
|
||||
show_text( 0, 10, "Generation:" );
|
||||
#endif
|
||||
printf( "Seed (0 for random seed): " );
|
||||
scanf( "%d", &seed );
|
||||
if( seed == 0 ) seed = (unsigned) time(NULL);
|
||||
srand( seed );
|
||||
|
||||
InitCellmap(); // randomly initialize cell map
|
||||
#ifndef NODRAW
|
||||
enter_display_mode();
|
||||
show_text( 0, 10, "Generation:" );
|
||||
#endif
|
||||
|
||||
_bios_timeofday( _TIME_GETCLOCK, &start_time );
|
||||
InitCellmap(); // randomly initialize cell map
|
||||
|
||||
do
|
||||
{
|
||||
NextGen();
|
||||
generation++;
|
||||
_bios_timeofday( _TIME_GETCLOCK, &start_time );
|
||||
|
||||
#ifndef NOCOUNTER
|
||||
sprintf( gen_text, "%10lu", generation );
|
||||
show_text( 0, 12, gen_text );
|
||||
#endif
|
||||
}
|
||||
#ifdef GEN
|
||||
while( generation < GEN );
|
||||
#else
|
||||
while( !kbhit() );
|
||||
#endif
|
||||
do
|
||||
{
|
||||
NextGen();
|
||||
generation++;
|
||||
|
||||
_bios_timeofday( _TIME_GETCLOCK, &end_time );
|
||||
end_time -= start_time;
|
||||
#ifndef NOCOUNTER
|
||||
sprintf( gen_text, "%10lu", generation );
|
||||
show_text( 0, 12, gen_text );
|
||||
#endif
|
||||
}
|
||||
#ifdef GEN
|
||||
while( generation < GEN );
|
||||
#else
|
||||
while( !kbhit() );
|
||||
#endif
|
||||
|
||||
#ifndef NODRAW
|
||||
getch(); // clear keypress
|
||||
exit_display_mode();
|
||||
#endif
|
||||
_bios_timeofday( _TIME_GETCLOCK, &end_time );
|
||||
end_time -= start_time;
|
||||
|
||||
printf( "Total generations: %ld\nSeed: %u\n", generation, seed );
|
||||
printf( "%ld ticks\n", end_time );
|
||||
printf( "Time: %f generations/second\n",
|
||||
(double)generation / (double)end_time * 18.2 );
|
||||
}
|
||||
#ifndef NODRAW
|
||||
getch(); // clear keypress
|
||||
exit_display_mode();
|
||||
#endif
|
||||
|
||||
printf( "Total generations: %ld\nSeed: %u\n", generation, seed );
|
||||
printf( "%ld ticks\n", end_time );
|
||||
printf( "Time: %f generations/second\n",
|
||||
(double)generation / (double)end_time * 18.2 );
|
||||
}
|
||||
```
|
||||
|
||||
**LISTING 18.4 VIDEO.C**
|
||||
|
||||
/* VGA mode 13h functions for Game of Life.
|
||||
Tested with Borland C++. */
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <dos.h>
|
||||
```c
|
||||
/* VGA mode 13h functions for Game of Life.
|
||||
Tested with Borland C++. */
|
||||
#include <stdio.h>
|
||||
#include <conio.h>
|
||||
#include <dos.h>
|
||||
|
||||
#define TEXT_X_OFFSET 28
|
||||
#define SCREEN_WIDTH_IN_BYTES 320
|
||||
#define TEXT_X_OFFSET 28
|
||||
#define SCREEN_WIDTH_IN_BYTES 320
|
||||
|
||||
#define SCREEN_SEGMENT 0xA000
|
||||
#define SCREEN_SEGMENT 0xA000
|
||||
|
||||
/* Mode 13h mode-set function. */
|
||||
void enter_display_mode()
|
||||
{
|
||||
union REGS regset;
|
||||
/* Mode 13h mode-set function. */
|
||||
void enter_display_mode()
|
||||
{
|
||||
union REGS regset;
|
||||
|
||||
regset.x.ax = 0x0013;
|
||||
int86(0x10, ®set, ®set);
|
||||
}
|
||||
regset.x.ax = 0x0013;
|
||||
int86(0x10, ®set, ®set);
|
||||
}
|
||||
|
||||
/* Text mode mode-set function. */
|
||||
void exit_display_mode()
|
||||
{
|
||||
union REGS regset;
|
||||
/* Text mode mode-set function. */
|
||||
void exit_display_mode()
|
||||
{
|
||||
union REGS regset;
|
||||
|
||||
regset.x.ax = 0x0003;
|
||||
int86(0x10, ®set, ®set);
|
||||
}
|
||||
regset.x.ax = 0x0003;
|
||||
int86(0x10, ®set, ®set);
|
||||
}
|
||||
|
||||
/* Text display function. Offsets text to non-graphics area of
|
||||
screen. */
|
||||
void show_text(int x, int y, char *text)
|
||||
{
|
||||
gotoxy(TEXT_X_OFFSET + x, y);
|
||||
puts(text);
|
||||
}
|
||||
/* Text display function. Offsets text to non-graphics area of
|
||||
screen. */
|
||||
void show_text(int x, int y, char *text)
|
||||
{
|
||||
gotoxy(TEXT_X_OFFSET + x, y);
|
||||
puts(text);
|
||||
}
|
||||
```
|
||||
|
||||
**LISTING 18.5 LIFE.H**
|
||||
|
||||
void far NextGen( void );
|
||||
```c
|
||||
void far NextGen( void );
|
||||
|
||||
extern unsigned short CellMap[];
|
||||
extern unsigned short far ChangeList1[];
|
||||
extern unsigned short CellMap[];
|
||||
extern unsigned short far ChangeList1[];
|
||||
|
||||
#define LEFT (-2)
|
||||
#define RIGHT (+2)
|
||||
#define UP (WIDTH * LEFT)
|
||||
#define DOWN (WIDTH * RIGHT)
|
||||
#define UPPERLEFT (UP + LEFT)
|
||||
#define UPPERRIGHT (UP + RIGHT)
|
||||
#define LOWERLEFT (DOWN + LEFT)
|
||||
#define LOWERRIGHT (DOWN + RIGHT)
|
||||
#define WRAPLEFT (RIGHT * (WIDTH - 1))
|
||||
#define WRAPRIGHT (LEFT * (WIDTH - 1))
|
||||
#define WRAPUP (DOWN * (HEIGHT - 1))
|
||||
#define WRAPDOWN (UP * (HEIGHT - 1))
|
||||
#define LEFT (-2)
|
||||
#define RIGHT (+2)
|
||||
#define UP (WIDTH * LEFT)
|
||||
#define DOWN (WIDTH * RIGHT)
|
||||
#define UPPERLEFT (UP + LEFT)
|
||||
#define UPPERRIGHT (UP + RIGHT)
|
||||
#define LOWERLEFT (DOWN + LEFT)
|
||||
#define LOWERRIGHT (DOWN + RIGHT)
|
||||
#define WRAPLEFT (RIGHT * (WIDTH - 1))
|
||||
#define WRAPRIGHT (LEFT * (WIDTH - 1))
|
||||
#define WRAPUP (DOWN * (HEIGHT - 1))
|
||||
#define WRAPDOWN (UP * (HEIGHT - 1))
|
||||
```
|
||||
|
||||
### Keeping Track of Change with a Change List {#Heading5}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue