Migrated handling of grid and game to game.(c/h).
This commit is contained in:
parent
1ad1660736
commit
50eeaa8f0a
53
game.c
53
game.c
@ -6,38 +6,45 @@
|
|||||||
static Grid* grid = 0;
|
static Grid* grid = 0;
|
||||||
|
|
||||||
static bool running = true;
|
static bool running = true;
|
||||||
|
static bool stepping_mode = false;
|
||||||
static bool do_step = true;
|
static bool do_step = true;
|
||||||
static Vect2i cursor;
|
static Vect2i cursor;
|
||||||
|
|
||||||
|
// declaration of locally used
|
||||||
|
static void toggleStepMode();
|
||||||
|
|
||||||
|
static void toggleCell();
|
||||||
|
|
||||||
void initGame()
|
void initGame()
|
||||||
{
|
{
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
// stdscr is screen created by initscr()
|
// stdscr is screen created by initscr()
|
||||||
getmaxyx(stdscr, height, width);
|
getmaxyx(stdscr, height, width);
|
||||||
|
|
||||||
initGrid(grid, height, width);
|
grid = initGrid(width, height);
|
||||||
randomizeGrid(grid);
|
randomizeGrid(grid);
|
||||||
cursor.x = width/2; cursor.y = height/2;
|
cursor.x = width/2; cursor.y = height/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void step() { do_step ^= 1; }
|
|
||||||
|
|
||||||
void updateGame()
|
void updateGame()
|
||||||
{
|
{
|
||||||
if (!grid) return;
|
if (!grid) return;
|
||||||
if (do_step) updateGrid(grid);
|
if (do_step) {
|
||||||
|
updateGrid(grid);
|
||||||
|
if (stepping_mode) do_step = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawGame()
|
void drawGame()
|
||||||
{
|
{
|
||||||
if (!grid) return;
|
if (!grid) return;
|
||||||
drawGrid(grid);
|
drawGrid(grid);
|
||||||
refresh();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isRunning() { return running; }
|
bool isRunning() { return running; }
|
||||||
|
|
||||||
|
|
||||||
void handleInput(char ch)
|
void handleInput(char ch)
|
||||||
{
|
{
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
@ -45,7 +52,7 @@ void handleInput(char ch)
|
|||||||
running = false;
|
running = false;
|
||||||
break;
|
break;
|
||||||
case ' ':
|
case ' ':
|
||||||
do_step ^= 1;
|
toggleStepMode();
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
moveVect2i(&cursor, -1, 0);
|
moveVect2i(&cursor, -1, 0);
|
||||||
@ -59,13 +66,18 @@ void handleInput(char ch)
|
|||||||
case 'l':
|
case 'l':
|
||||||
moveVect2i(&cursor, 1, 0);
|
moveVect2i(&cursor, 1, 0);
|
||||||
break;
|
break;
|
||||||
case 's':
|
case '\n':
|
||||||
step();
|
do_step = true;
|
||||||
break;
|
break;
|
||||||
|
case 'i':
|
||||||
|
toggleCell();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (ch != -1) do_step = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void showLastPressed(char ch)
|
void drawLastPressed(char ch)
|
||||||
{
|
{
|
||||||
static char lastc = ' ';
|
static char lastc = ' ';
|
||||||
if (ch != -1) lastc = ch;
|
if (ch != -1) lastc = ch;
|
||||||
@ -74,16 +86,33 @@ void showLastPressed(char ch)
|
|||||||
attroff(COLOR_PAIR(2));
|
attroff(COLOR_PAIR(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void showCurPos()
|
void drawCurPos()
|
||||||
{
|
{
|
||||||
attron(COLOR_PAIR(2));
|
attron(COLOR_PAIR(2));
|
||||||
mvprintw(1, 0, "curpos: %i, %i", cursor.x, cursor.y);
|
mvprintw(1, 0, "curpos: %i, %i", cursor.x, cursor.y);
|
||||||
|
attroff(COLOR_PAIR(2));
|
||||||
attron(COLOR_PAIR(3));
|
attron(COLOR_PAIR(3));
|
||||||
mvaddch(cursor.y, cursor.x, ' ');
|
mvaddch(cursor.y, cursor.x, ' ');
|
||||||
attroff(COLOR_PAIR(3));
|
attroff(COLOR_PAIR(3));
|
||||||
attroff(COLOR_PAIR(2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void endGame()
|
void endGame()
|
||||||
{
|
{
|
||||||
|
// free stuff
|
||||||
|
}
|
||||||
|
|
||||||
|
// locally used
|
||||||
|
static void toggleStepMode()
|
||||||
|
{
|
||||||
|
stepping_mode ^= 1;
|
||||||
|
do_step = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void toggleCell()
|
||||||
|
{
|
||||||
|
if (!grid) return;
|
||||||
|
bool cell = getPixel(grid, cursor.x, cursor.y);
|
||||||
|
if (cell) setPixel(grid, cursor.x, cursor.y, 0);
|
||||||
|
else setPixel(grid, cursor.x, cursor.y, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
4
game.h
4
game.h
@ -15,9 +15,9 @@ void handleInput(char ch);
|
|||||||
|
|
||||||
// Overlays
|
// Overlays
|
||||||
// Draws cursor and cursor position
|
// Draws cursor and cursor position
|
||||||
void showLastPressed(char ch);
|
void drawLastPressed(char ch);
|
||||||
|
|
||||||
void showCurPos();
|
void drawCurPos();
|
||||||
|
|
||||||
bool endgame();
|
bool endgame();
|
||||||
|
|
||||||
|
86
grid.c
86
grid.c
@ -3,12 +3,17 @@
|
|||||||
#include <ncurses.h>
|
#include <ncurses.h>
|
||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
|
|
||||||
void initGrid(Grid* grid, unsigned int width, unsigned int height)
|
// locally used declaration
|
||||||
|
static bool isAliveNext(Grid* grid, int x, int y);
|
||||||
|
|
||||||
|
Grid* initGrid(unsigned int width, unsigned int height)
|
||||||
{
|
{
|
||||||
|
Grid* grid = (Grid*)malloc(sizeof(Grid));
|
||||||
grid->size = width*height;
|
grid->size = width*height;
|
||||||
grid->width = width;
|
grid->width = width;
|
||||||
grid->state = (bool*)malloc(sizeof(bool)*grid->size);
|
grid->state = (bool*)malloc(sizeof(bool)*grid->size);
|
||||||
grid->next_state = (bool*)malloc(sizeof(bool)*grid->size);
|
grid->next_state = (bool*)malloc(sizeof(bool)*grid->size);
|
||||||
|
return grid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void randomizeGrid(Grid* grid)
|
void randomizeGrid(Grid* grid)
|
||||||
@ -34,6 +39,46 @@ void clearGrid(Grid* grid)
|
|||||||
for (int i = 0; i < grid->size; i++) grid->state[i]=false;
|
for (int i = 0; i < grid->size; i++) grid->state[i]=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateGrid(Grid* grid)
|
||||||
|
{
|
||||||
|
unsigned int width = grid->width;
|
||||||
|
unsigned int height = grid->size/width;
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
grid->next_state[toIndex(grid, x, y)] = isAliveNext(grid, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < grid->size; i++) {
|
||||||
|
grid->state[i] = grid->next_state[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPixel(Grid* grid, int x, int y, bool on)
|
||||||
|
{
|
||||||
|
grid->state[toIndex(grid, x, y)] = on;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawGrid(Grid* grid)
|
||||||
|
{
|
||||||
|
unsigned int width, height;
|
||||||
|
width = grid->width;
|
||||||
|
height = grid->size/width;
|
||||||
|
// Init color pair init_pair(index, fg, bg);
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
if (grid->state[toIndex(grid, x, y)]){
|
||||||
|
attron(COLOR_PAIR(1));
|
||||||
|
mvaddch(y, x, ' ');
|
||||||
|
attroff(COLOR_PAIR(1));
|
||||||
|
}
|
||||||
|
else mvaddch(y, x, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// locally used
|
||||||
// check if cell's next state is alive
|
// check if cell's next state is alive
|
||||||
static bool isAliveNext(Grid* grid, int x, int y)
|
static bool isAliveNext(Grid* grid, int x, int y)
|
||||||
{
|
{
|
||||||
@ -71,42 +116,3 @@ static bool isAliveNext(Grid* grid, int x, int y)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateGrid(Grid* grid)
|
|
||||||
{
|
|
||||||
unsigned int width = grid->width;
|
|
||||||
unsigned int height = grid->size/width;
|
|
||||||
|
|
||||||
for (int y = 0; y < height; y++) {
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
grid->next_state[toIndex(grid, x, y)] = isAliveNext(grid, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < grid->size; i++) {
|
|
||||||
grid->state[i] = grid->next_state[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void putPixel(Grid* grid, int x, int y)
|
|
||||||
{
|
|
||||||
grid->state[toIndex(grid, x, y)] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawGrid(Grid* grid)
|
|
||||||
{
|
|
||||||
unsigned int width, height;
|
|
||||||
width = grid->width;
|
|
||||||
height = grid->size/width;
|
|
||||||
// Init color pair init_pair(index, fg, bg);
|
|
||||||
for (int y = 0; y < height; y++) {
|
|
||||||
for (int x = 0; x < width; x++) {
|
|
||||||
if (grid->state[toIndex(grid, x, y)]){
|
|
||||||
attron(COLOR_PAIR(1));
|
|
||||||
mvaddch(y, x, ' ');
|
|
||||||
attroff(COLOR_PAIR(1));
|
|
||||||
}
|
|
||||||
else mvaddch(y, x, ' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
4
grid.h
4
grid.h
@ -10,7 +10,7 @@ typedef struct Grid {
|
|||||||
bool* next_state;
|
bool* next_state;
|
||||||
} Grid;
|
} Grid;
|
||||||
|
|
||||||
void initGrid(Grid* grid, unsigned int width, unsigned int height);
|
Grid* initGrid(unsigned int width, unsigned int height);
|
||||||
|
|
||||||
void randomizeGrid(Grid* grid);
|
void randomizeGrid(Grid* grid);
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ void clearGrid(Grid* grid);
|
|||||||
|
|
||||||
void updateGrid(Grid* grid);
|
void updateGrid(Grid* grid);
|
||||||
|
|
||||||
void putPixel(Grid* grid, int x, int y);
|
void setPixel(Grid* grid, int x, int y, bool on);
|
||||||
|
|
||||||
void drawGrid(Grid* grid);
|
void drawGrid(Grid* grid);
|
||||||
|
|
||||||
|
10
main.c
10
main.c
@ -36,7 +36,7 @@ int main()
|
|||||||
const int FRAME_RATE = 30;
|
const int FRAME_RATE = 30;
|
||||||
const float FRAME_TIME = 1.f/(float)FRAME_RATE;
|
const float FRAME_TIME = 1.f/(float)FRAME_RATE;
|
||||||
|
|
||||||
//initGame();
|
initGame();
|
||||||
|
|
||||||
float t = 0;
|
float t = 0;
|
||||||
while (isRunning()) {
|
while (isRunning()) {
|
||||||
@ -45,9 +45,13 @@ int main()
|
|||||||
|
|
||||||
handleInput(ch);
|
handleInput(ch);
|
||||||
|
|
||||||
//drawGame();
|
drawGame();
|
||||||
|
drawLastPressed(ch);
|
||||||
|
drawCurPos();
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
|
||||||
//updateGame();
|
updateGame();
|
||||||
|
|
||||||
usleep(pow(10,6)*(FRAME_TIME-t));
|
usleep(pow(10,6)*(FRAME_TIME-t));
|
||||||
float t = (float) (clock()-start_t) / (float) CLOCKS_PER_SEC;
|
float t = (float) (clock()-start_t) / (float) CLOCKS_PER_SEC;
|
||||||
|
Loading…
Reference in New Issue
Block a user