?

Log in

No account? Create an account
2 сент, 2008 @ 11:55 Игра "ЖИЗНЬ"
Математическая модель: Джон Конуэй - http://beluch.ru/life/conway.htm
Программирование: Сергей Кившик
Под руководством: Гена Герасим - http://gena-gerasim.livejournal.com



/*======================================================================*/
/* */
/* Игра ЖИЗНЬ life2.c */
/* */
/*======================================================================*/
/* */
/* Математическая модель: Джон Конуэй - http://beluch.ru/life/conway.htm*/
/* Программирование: Сергей Кившик */
/* Под руководством: Гена Герасим - http://gena-gerasim.livejournal.com */
/* */
/*======================================================================*/

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <time.h>
#include <dos.h>
#include <conio.h>

#define ENTER 13 /* код клавиши ENTER */

int M; /* размер игрового поля по горизонтали */
int N; /* размер игрового поля по вертикали */
long int Z; /* ограничение скорости отображения на дисплей */

char mas[320][240/8]; /* массив игрового поля */

char mas2[320][240/8]; /* массив игрового поля 2 */

void init_MNZ( void ); /* инициализация M,N,Z */

int sosedi( int i, int j ); /* подсчет соседей */
void initmas( void ); /* генерация начального состояния поля */
void display( void ); /* отображение поля на дисплей */
int gr_init( void ); /* инициализация графики */

int bit_mas_read( int i, int j ); /* прочитать значение клетки поля */
void bit_mas_set( int i, int j ); /* заселить клетку поля */
void bit_mas_clear( int i, int j );/* очистить клетку поля */
void bit_mas2_set( int i, int j ); /* заселить клетку поля для mas2 */
void bit_mas2_clear( int i, int j ); /* очистить клетку поля для mas2 */

int get_key( void ); /* получить код клавишы */

/*======================================================================*/

void main( void )
{
int i,j,s,cc;

clrscr();

init_MNZ();

MET:;
printf( "Нажмите ENTER для старта\n" );
cc = get_key();
if ( cc != ENTER ) goto MET;

if ( !gr_init() ) exit(1);
initmas();
display();

for (;;) {
for ( i=0; i<M; i++ ) {
for ( j=0; j<N; j++ ) {
s = sosedi(i,j);
if ( bit_mas_read(i,j) == 0 ) {
if ( s == 3 ) bit_mas2_set(i,j);
}
if ( bit_mas_read(i,j) == 1 ) {
if ( s < 2 || s > 3 ) bit_mas2_clear(i,j);
else bit_mas2_set(i,j);
}
}
}
for ( i=0; i<320; i++ ) {
for ( j=0; j<240/8; j++ ) {
mas[i][j] = mas2[i][j];
}
}
display();
delay((unsigned)Z);
if ( kbhit() ) break;
}

}

/*----- Подсчет соседей ------------------------------------------------*/

int sosedi( int i, int j )
{
int s;
s = bit_mas_read(i-1,j-1) +
bit_mas_read(i-1,j) +
bit_mas_read(i-1,j+1) +
bit_mas_read(i,j-1) +
bit_mas_read(i,j+1) +
bit_mas_read(i+1,j-1) +
bit_mas_read(i+1,j) +
bit_mas_read(i+1,j+1);
return s;
}

/*----- Генерация начального состояния поля ----------------------------*/

void initmas( void )
{
int i,j,s;
randomize();
for ( i=0; i<M; i++ ) {
for ( j=0; j<N; j++ ) {
s = random(2);
if ( s == 0 ) bit_mas_clear(i,j);
if ( s == 1 ) bit_mas_set(i,j);
}
}
}

/*----- Отображение поля на дисплей ------------------------------------*/

void display( void )
{
int i,j;
for ( i=0; i<M; i++ ) {
for ( j=0; j<N; j++ ) {
if ( bit_mas_read(i,j) == 0 ) putpixel(i,j,BLACK);
if ( bit_mas_read(i,j) == 1 ) putpixel(i,j,WHITE);
}
}
}

/*----- Инициализация графики ------------------------------------------*/

int gr_init( void )
{
int drvr,mode,err;
detectgraph( &drvr, &mode );
initgraph( &drvr, &mode, "C:\\TC\\BGI" );
if ( ( err = graphresult() ) != grOk ) {
printf( "%s\n", grapherrormsg( err ) );
return 0;
}
cleardevice();
return 1;
}


/*----- Прочитать значение клетки поля ---------------------------------*/

int bit_mas_read( int i, int j )
{
if ( mas[i][j/8] & (1<<(7-j%8)) ) return 1;
else return 0;
}

/*----- Заселить клетку поля -------------------------------------------*/

void bit_mas_set( int i, int j )
{
mas[i][j/8] |= (1<<(7-j%8));
}

/*----- Очистить клетку поля -------------------------------------------*/

void bit_mas_clear( int i, int j )
{
mas[i][j/8] &= ~(1<<(7-j%8));
}

/*----- Заселить клетку поля для mas2 ----------------------------------*/

void bit_mas2_set( int i, int j )
{
mas2[i][j/8] |= (1<<(7-j%8));
}

/*----- Очистить клетку поля для mas2 ----------------------------------*/

void bit_mas2_clear( int i, int j )
{
mas2[i][j/8] &= ~(1<<(7-j%8));
}

/*----- Получить код клавишы -------------------------------------------*/

int get_key( void )
{
int c;
c = getch();
if ( !c ) c = getch() + 256;
return c;
}

/*----- Ввести значения M, N, Z ----------------------------------------*/

void init_MNZ( void ) {
char strvv[80];

printf( "*** ИГРА ЖИЗНЬ ***\n");
printf( "\n" );
printf( "Математическая модель: Джон Конуэй - http://beluch.ru/life/conway.htm\n" );
printf( "Программирование: Сергей Кившик\n" );
printf( "Под руководством: Гена Герасим - http://gena-gerasim.livejournal.com\n" );
printf( "\n" );
printf( "Введите размеры поля MxN:\n" );
printf( "\n" );
MET1:;
printf( "по горизонтали M= " );
scanf( "%s", strvv );
M = atoi( strvv );
if ( M == 0 ) {
printf( "M должно быть числом. Введите M заново...\n" );
goto MET1;
}
if ( M<1 || M>319 ) {
printf( "М должно быть >= 1 и <= 319. Введите M заново...\n" );
goto MET1;
}
MET2:;
printf( "по вертикали N= " );
scanf( "%s", strvv );
N = atoi( strvv );
if ( N == 0 ) {
printf( "N должно быть числом. Введите N заново...\n" );
goto MET2;
}
if ( N<1 || N>239 ) {
printf( "N должно быть >= 1 и <= 239. Введите N заново...\n" );
goto MET2;
}
MET3:;
printf( "Введите ограничение скорости ( от 1 до 63999 ) = ");
scanf( "%s", strvv );
Z = atol( strvv );
if ( Z == 0 ) {
printf( "Z должно быть числом. Введите Z заново...\n" );
goto MET3;
}
if ( Z<1 || Z>63999l ) {
printf( "Z должно быть >= 1 и <= 63999. Введите Z заново...\n" );
goto MET3;
}
}

/*======================================================================*/

Гена Герасим 3
gena_gerasim:
[User Picture Icon]
From:akkort
Date:Сентябрь, 2, 2008 09:56 (UTC)
(Ссылка)
Лет на 15-20 опоздали.
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:jakobz
Date:Сентябрь, 2, 2008 10:12 (UTC)
(Ссылка)
А сколько лет автору?
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:joreg
Date:Сентябрь, 2, 2008 10:17 (UTC)
(Ссылка)
Там вообще лулзы какие-то
http://gena-gerasim.livejournal.com/41646.html
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:jakobz
Date:Сентябрь, 2, 2008 10:50 (UTC)
(Ссылка)
В emocoders чтоли запостить...
(Ответить) (Уровень выше) (Ветвь дискуссии)
[User Picture Icon]
From:steel_monster
Date:Сентябрь, 2, 2008 10:58 (UTC)
(Ссылка)
Вы сообществом ошиблись. Это нужно было постить в code_wtf.
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:fester_ua
Date:Сентябрь, 2, 2008 11:52 (UTC)
(Ссылка)
Use fecking pastie.
(Ответить) (Ветвь дискуссии)
[User Picture Icon]
From:golergka
Date:Сентябрь, 3, 2008 15:09 (UTC)
(Ссылка)
лолшто?
(Ответить) (Ветвь дискуссии)