First Upload
This commit is contained in:
429
Projects/LifeGame/life_game.c
Normal file
429
Projects/LifeGame/life_game.c
Normal file
@@ -0,0 +1,429 @@
|
||||
#include "General.h"
|
||||
|
||||
#define WORLD_SIZE 25
|
||||
#define FIVETEEN 15
|
||||
#define FORTY 40
|
||||
#define FIVTY 50
|
||||
#define THIRTY 30
|
||||
#define TWENTY 20
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Random
|
||||
// ------
|
||||
//
|
||||
// General : Create random number.
|
||||
//
|
||||
// Parameters :
|
||||
// seed - seed of random (int **).
|
||||
// min - minimum for result.
|
||||
// max - maximum for result.
|
||||
//
|
||||
// Return value : random number.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
int Random(int ** seed, int min, int max)
|
||||
{
|
||||
return ((*((*seed)++) % (++max)) + min);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// InitWorld
|
||||
// ---------
|
||||
//
|
||||
// General : Initialize the world.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
// rows - Amount of rows in the world.
|
||||
// cols - Amount of columns in the world.
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void InitWorld(SM * world, int rows, int cols)
|
||||
{
|
||||
unsigned short counter;
|
||||
for (counter = ZERO; counter < rows; counter++)
|
||||
{
|
||||
AddRowSM(world);
|
||||
}
|
||||
for (counter = ZERO; counter < cols; counter++)
|
||||
{
|
||||
AddColSM(world);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// RemoveWorld
|
||||
// -----------
|
||||
//
|
||||
// General : Deletes the world, freeing up space in memory.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void RemoveWorld(SM * world)
|
||||
{
|
||||
unsigned short counter;
|
||||
unsigned short rows = RowsCountSM(world);
|
||||
unsigned short cols = ColsCountSM(world);
|
||||
for (counter = ZERO; counter < rows; counter++)
|
||||
{
|
||||
RemoveRowSM(world);
|
||||
}
|
||||
for (counter = ZERO; counter < cols; counter++)
|
||||
{
|
||||
RemoveColSM(world);
|
||||
}
|
||||
free(world);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// RandomWorld
|
||||
// -----------
|
||||
//
|
||||
// General : Creates a random population.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
// seed - seed for random (int **).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void RandomWorld(SM * world, int ** seed)
|
||||
{
|
||||
unsigned short rows = RowsCountSM(world);
|
||||
unsigned short cols = ColsCountSM(world);
|
||||
unsigned short counter;
|
||||
unsigned short length = rows * cols;
|
||||
for (counter = ZERO; counter < length; counter++)
|
||||
{
|
||||
Random(seed, ZERO, ONE) ? AddItemSM(world, counter / rows, counter % cols) : ZERO;
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Earthquake
|
||||
// ----------
|
||||
//
|
||||
// General : Decreases world size because of earthquake.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
// row - row of point to check (unsigned int).
|
||||
// col - column of point to check (unsigned int).
|
||||
//
|
||||
// Return value : Amount of neughbors (short (0-8)).
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
short CountNeighbors(SM * world, unsigned int row, unsigned int col)
|
||||
{
|
||||
short count = -ONE;
|
||||
short loop_counter;
|
||||
for (loop_counter = -ONE; loop_counter < TWO; loop_counter++)
|
||||
{
|
||||
count += GetItemSM(world, row - ONE , col + loop_counter) != NULL;
|
||||
count += GetItemSM(world, row, col + loop_counter) != NULL;
|
||||
count += GetItemSM(world, row + ONE, col + loop_counter) != NULL;
|
||||
}
|
||||
|
||||
return (count);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Earthquake
|
||||
// ----------
|
||||
//
|
||||
// General : Decreases world size because of earthquake.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void Earthquake(SM * world)
|
||||
{
|
||||
int del_rows_count = RowsCountSM(world) / TEN;
|
||||
int del_cols_count = ColsCountSM(world) / TEN;
|
||||
unsigned short counter;
|
||||
for (counter = ZERO; counter < del_rows_count; counter++)
|
||||
{
|
||||
RemoveRowSM(world);
|
||||
}
|
||||
for (counter = ZERO; counter < del_cols_count; counter++)
|
||||
{
|
||||
RemoveColSM(world);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Epidemic
|
||||
// --------
|
||||
//
|
||||
// General : Expands the world in rows and columns because of ocean retreat.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void WithdrawalOceans(SM * world)
|
||||
{
|
||||
int add_rows_count = RowsCountSM(world) / FIVE;
|
||||
int add_cols_count = ColsCountSM(world) / FIVE;
|
||||
unsigned short counter;
|
||||
for (counter = ZERO; counter < add_rows_count; counter++)
|
||||
{
|
||||
AddRowSM(world);
|
||||
}
|
||||
for (counter = ZERO; counter < add_cols_count; counter++)
|
||||
{
|
||||
AddColSM(world);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Epidemic
|
||||
// --------
|
||||
//
|
||||
// General : Reduces the amount of ranks in the world because of an epidemic.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void Epidemic(SM * world)
|
||||
{
|
||||
int del_rows_count = RowsCountSM(world) / FIVETEEN;
|
||||
unsigned short counter;
|
||||
for (counter = ZERO; counter < del_rows_count; counter++)
|
||||
{
|
||||
RemoveRowSM(world);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Drying
|
||||
// ------
|
||||
//
|
||||
// General : Expands the world space due to drying and lakes.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void Drying(SM * world)
|
||||
{
|
||||
int add_cols_count = RowsCountSM(world) / FIVETEEN;
|
||||
unsigned short counter;
|
||||
for (counter = ZERO; counter < add_cols_count; counter++)
|
||||
{
|
||||
AddColSM(world);
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// PercentagePopulation
|
||||
// --------------------
|
||||
//
|
||||
// General : Checks the amount of population relative to world size.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : Percentage (int).
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
int PercentagePopulation(SM * world)
|
||||
{
|
||||
unsigned short alives = ZERO;
|
||||
unsigned short counter;
|
||||
unsigned short rows = RowsCountSM(world);
|
||||
unsigned short cols = ColsCountSM(world);
|
||||
unsigned short length = rows * cols;
|
||||
for (counter = ZERO; counter < length; counter++)
|
||||
{
|
||||
alives += (GetItemSM(world, counter / rows, counter % cols) != NULL);
|
||||
}
|
||||
|
||||
return ((alives / length) * ONE_HUNDRED);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// OneGenerationWorld
|
||||
// ------------------
|
||||
//
|
||||
// General : Performs a one-generation world-wide process.
|
||||
//
|
||||
// Parameters :
|
||||
// world - sparce matrix pointer (SM *).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void OneGenerationWorld(SM * world)
|
||||
{
|
||||
int percentage = PercentagePopulation(world);
|
||||
(percentage >= FIVTY) ? Earthquake(world) : ZERO;
|
||||
(percentage < TWENTY) ? WithdrawalOceans(world) : ZERO;
|
||||
(percentage == THIRTY) ? Epidemic(world) : ZERO;
|
||||
(percentage == FORTY) ? Drying(world) : ZERO;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// OneGenerationPopulation
|
||||
// -----------------------
|
||||
//
|
||||
// General : Performs one generation process in population.
|
||||
//
|
||||
// Parameters :
|
||||
// world - pointer of sparce matrix pointer (SM **).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void OneGenerationPopulation(SM ** world)
|
||||
{
|
||||
SM * new_world;
|
||||
SM * temp;
|
||||
unsigned short counter;
|
||||
unsigned short rows = RowsCountSM(*world);
|
||||
unsigned short cols = ColsCountSM(*world);
|
||||
unsigned short length = rows * cols;
|
||||
short count_neighbors;
|
||||
InitSM(&new_world);
|
||||
InitWorld(new_world, rows, cols);
|
||||
for (counter = ZERO; counter < length; counter++)
|
||||
{
|
||||
count_neighbors = CountNeighbors(*world, counter / rows, counter % cols);
|
||||
temp = GetItemSM(*world, counter / rows, counter % cols);
|
||||
if ((temp == NULL && count_neighbors == TWO) ||
|
||||
(temp != NULL && count_neighbors <= THREE && count_neighbors >= TWO))
|
||||
{
|
||||
AddItemSM(new_world, counter / rows, counter % cols);
|
||||
}
|
||||
}
|
||||
RemoveWorld(*world);
|
||||
*world = new_world;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// OneGeneralGeneration
|
||||
// --------------------
|
||||
//
|
||||
// General : Performs one generation procedure and prints it.
|
||||
//
|
||||
// Parameters :
|
||||
// world - pointer of sparce matrix pointer (SM **).
|
||||
//
|
||||
// Return value : None.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void OneGeneralGeneration(SM ** world)
|
||||
{
|
||||
OneGenerationPopulation(world);
|
||||
OneGenerationWorld(*world);
|
||||
PrintSM(*world, PrintIntDataType);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Minesweeper
|
||||
// -----------
|
||||
//
|
||||
// General : The game is a zero-player game, meaning that its evolution is determined by
|
||||
// its initial state, requiring no further input. One interacts with the Game
|
||||
// of Life by creating an initial configuration and observing how it evolves.
|
||||
//
|
||||
// Input : Accepts like the generations the user wants to do.
|
||||
//
|
||||
// Process : The program accepts the number of generations and loops each time it
|
||||
// processes the world and prints to the user what happens in each generation.
|
||||
//
|
||||
// Output : What the world looks like in each generation.
|
||||
//
|
||||
//---------------------------------------------------------------------------------------
|
||||
// Programmer : Cohen Idan
|
||||
// Student No : 211675038
|
||||
// Date : 30.12.2019
|
||||
//---------------------------------------------------------------------------------------
|
||||
void main(void)
|
||||
{
|
||||
unsigned int generations;
|
||||
unsigned int counter;
|
||||
int * seed;
|
||||
SM * world;
|
||||
InitSM(&world);
|
||||
InitWorld(world, WORLD_SIZE, WORLD_SIZE);
|
||||
RandomWorld(world, &seed);
|
||||
PrintSM(world, PrintIntDataType);
|
||||
printf("Enter count of generations: ");
|
||||
scanf("%u", &generations);
|
||||
for (counter = ZERO; counter < generations; counter++)
|
||||
{
|
||||
OneGeneralGeneration(&world);
|
||||
}
|
||||
RemoveWorld(world);
|
||||
}
|
||||
Reference in New Issue
Block a user