first
This commit is contained in:
parent
bb007f68ab
commit
6c91d899d2
54
final/.gitignore
vendored
Normal file
54
final/.gitignore
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
game
|
||||||
|
|
||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Linker output
|
||||||
|
*.ilk
|
||||||
|
*.map
|
||||||
|
*.exp
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
# Debug files
|
||||||
|
*.dSYM/
|
||||||
|
*.su
|
||||||
|
*.idb
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
# Kernel Module Compile Results
|
||||||
|
*.mod*
|
||||||
|
*.cmd
|
||||||
|
.tmp_versions/
|
||||||
|
modules.order
|
||||||
|
Module.symvers
|
||||||
|
Mkfile.old
|
||||||
|
dkms.conf
|
29
final/LICENSE
Normal file
29
final/LICENSE
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
BSD 3-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2019, Daniel Hládek
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
12
final/Makefile
Normal file
12
final/Makefile
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
CFLAGS=-std=c99 -Wall -g
|
||||||
|
|
||||||
|
all: game
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm game
|
||||||
|
|
||||||
|
game: main.c game.c game.h commands.c commands.h
|
||||||
|
gcc main.c game.c game.h commands.c commands.h -lcurses -lm -o game
|
||||||
|
|
66
final/README.md
Normal file
66
final/README.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# World Game Library
|
||||||
|
|
||||||
|
Learn asycnronous C programming by a game.
|
||||||
|
|
||||||
|
## Installation and Running
|
||||||
|
|
||||||
|
Make sure, that `ncurses` is installed.
|
||||||
|
|
||||||
|
Clone this repository.
|
||||||
|
|
||||||
|
Compile:
|
||||||
|
|
||||||
|
```c
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```c
|
||||||
|
./game
|
||||||
|
```
|
||||||
|
|
||||||
|
## Make your own game
|
||||||
|
|
||||||
|
The game happens in a rectangular world of colorful characters.
|
||||||
|
Your goal as a programmer is to modify the world according to the pressed keys and the internal game state.
|
||||||
|
The library implements the game loop and draws the world to screen.
|
||||||
|
|
||||||
|
Your game consists of two functions:
|
||||||
|
|
||||||
|
- `void* init_game(struct world* g)` is called in the beginning. Here you can initialize the internal state of the game.
|
||||||
|
The function should return a pointer to an instance of the initial game state `game`.
|
||||||
|
- `int world_event(struct world* world,void* game)`
|
||||||
|
is called by the game loop in periodic interval or when a key was pressed. Non-zero return value or `Ctrl+C` key interrupts the game loop.
|
||||||
|
|
||||||
|
The world variable represents state of two-dimensional grid of characters on the screen. The screen matrix looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
origin
|
||||||
|
[0,0] width
|
||||||
|
+--------------------+
|
||||||
|
h | |
|
||||||
|
e | |
|
||||||
|
i | |
|
||||||
|
g | |
|
||||||
|
h | |
|
||||||
|
t | |
|
||||||
|
+--------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
The world has the following parameters:
|
||||||
|
|
||||||
|
- `int height`: y-dimension of the grid.
|
||||||
|
- `int width`: x-dimension of the grid.
|
||||||
|
- `int interval`: maximum time between steps in milliseconds.
|
||||||
|
|
||||||
|
### The World Event Function
|
||||||
|
|
||||||
|
The `int world_event(struct world* world,void* game)`
|
||||||
|
function should:
|
||||||
|
|
||||||
|
1. Read the game state (from the `void* game`) pointer.
|
||||||
|
1. Examine the pressed key. If the `key` variable is non-zero, a key was pressed. According to the pressed key, modify the game state `game`.
|
||||||
|
1. Draw the game state. In the beginning of the step function the screen is empty.
|
||||||
|
1. Returning non-zero value ends the game loop.
|
||||||
|
|
231
final/commands.c
Normal file
231
final/commands.c
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
#include "commands.h"
|
||||||
|
#include "game.h"
|
||||||
|
#include <curses.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void welcome_screen(){
|
||||||
|
box(stdscr, ACS_VLINE, ACS_HLINE);
|
||||||
|
mvprintw(LINES / 2 - 8, COLS / 2 - 12, "Use WASD to change direction");
|
||||||
|
mvprintw(LINES / 2 - 6, COLS / 2 - 15, "Dont touch the walls or your path");
|
||||||
|
mvprintw(LINES / 2 - 4, COLS / 2 - 10, "To exit anytime use 'q'");
|
||||||
|
mvprintw(LINES / 2 - 2, COLS / 2 - 11, "Press any key to continue");
|
||||||
|
getch();
|
||||||
|
erase();
|
||||||
|
}
|
||||||
|
|
||||||
|
int pick_color(){
|
||||||
|
mvprintw(LINES / 2 - 11, COLS / 2 - 20, "Pick color. To change use 's' and 'w'");
|
||||||
|
mvprintw(LINES / 2 - 9, COLS / 2 - 13, "To confirm use 'space'");
|
||||||
|
int color = 2;
|
||||||
|
while(1){
|
||||||
|
init_pair(1, COLOR_BLACK, (color == 5) ? 7 : color);
|
||||||
|
attron(COLOR_PAIR(1));
|
||||||
|
for(int i = 0; i < 10; i++){
|
||||||
|
for(int q = 0; q < 20; q++){
|
||||||
|
mvaddch(LINES / 2 - 3 + i, COLS / 2 - 2 + q - 10, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ch = getch();
|
||||||
|
if(ch == ' ') break;
|
||||||
|
else if(ch == 's'){
|
||||||
|
color++;
|
||||||
|
if(color > 6) color = 1;
|
||||||
|
}
|
||||||
|
else if(ch == 'w'){
|
||||||
|
color--;
|
||||||
|
if(color < 1) color = 6;
|
||||||
|
}
|
||||||
|
else if(ch == 'q'){
|
||||||
|
endwin();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
flushinp();
|
||||||
|
}
|
||||||
|
return (color == 5) ? 7 : color;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pick_speed(){
|
||||||
|
box(stdscr, ACS_VLINE, ACS_HLINE);
|
||||||
|
mvprintw(LINES / 2 - 8, COLS / 2 - 12, "Pick speed. To change use 's'");
|
||||||
|
mvprintw(LINES / 2 - 6, COLS / 2 - 8, "To confirm use 'space'");
|
||||||
|
|
||||||
|
int speed = 60;
|
||||||
|
while(1){
|
||||||
|
mvprintw(LINES / 2 - 3, COLS / 2 + 2, "%d", 70 - speed);
|
||||||
|
int ch = getch();
|
||||||
|
if(ch == ' ') break;
|
||||||
|
else if(ch == 's'){
|
||||||
|
speed -= 10;
|
||||||
|
if(speed == 10) speed = 60;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
erase();
|
||||||
|
box(stdscr, ACS_VLINE, ACS_HLINE);
|
||||||
|
return speed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_screen(struct game* game){
|
||||||
|
initscr();
|
||||||
|
resize_term(LINES, (COLS % 2) ? COLS : COLS - 1);
|
||||||
|
curs_set(0);
|
||||||
|
noecho();
|
||||||
|
welcome_screen();
|
||||||
|
game->speed = pick_speed();
|
||||||
|
srand(time(NULL));
|
||||||
|
if(has_colors() == true){
|
||||||
|
start_color();
|
||||||
|
init_pair(7, COLOR_BLACK, COLOR_MAGENTA);
|
||||||
|
int color = pick_color();
|
||||||
|
init_pair(8, color, COLOR_BLACK);
|
||||||
|
init_pair(9, COLOR_WHITE, COLOR_BLACK);
|
||||||
|
erase();
|
||||||
|
attron(COLOR_PAIR(9));
|
||||||
|
box(stdscr, ACS_VLINE, ACS_HLINE);
|
||||||
|
attron(COLOR_PAIR(8));
|
||||||
|
}
|
||||||
|
game->y = rand() % (LINES - 5) + 2;
|
||||||
|
game->x = (rand() % (COLS - 5) + 2) / 2 * 2;
|
||||||
|
mvaddch(game->y, game->x, '@');
|
||||||
|
mvaddch(game->y + 1, game->x, ACS_HLINE);
|
||||||
|
mvaddch(game->y - 1, game->x, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x + 2, ACS_VLINE);
|
||||||
|
mvaddch(game->y, game->x - 2, ACS_VLINE);
|
||||||
|
mvaddch(game->y + 1, game->x + 2, '+');
|
||||||
|
mvaddch(game->y + 1, game->x - 2, '+');
|
||||||
|
mvaddch(game->y - 1, game->x - 2, '+');
|
||||||
|
mvaddch(game->y - 1, game->x + 2, '+');
|
||||||
|
timeout(game->speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_path(struct game* game){
|
||||||
|
static char save;
|
||||||
|
char line;
|
||||||
|
getyx(stdscr, game->y, game->x);
|
||||||
|
if(save != game->direction){
|
||||||
|
if(save == 'w' && game->direction == 'd') mvaddch(game->y, game->x - 1, ACS_ULCORNER);
|
||||||
|
else if(save == 'w' && game->direction == 'a') mvaddch(game->y, game->x - 1, ACS_URCORNER);
|
||||||
|
else if(save == 's' && game->direction == 'd') mvaddch(game->y, game->x - 1, ACS_LLCORNER);
|
||||||
|
else if(save == 's' && game->direction == 'a') mvaddch(game->y, game->x - 1, ACS_LRCORNER);
|
||||||
|
else if(save == 'a' && game->direction == 's'){
|
||||||
|
mvaddch(game->y, game->x, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_ULCORNER);
|
||||||
|
}
|
||||||
|
else if(save == 'a' && game->direction == 'w'){
|
||||||
|
mvaddch(game->y, game->x, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_LLCORNER);
|
||||||
|
}
|
||||||
|
else if(save == 'd' && game->direction == 's'){
|
||||||
|
mvaddch(game->y, game->x - 2, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_URCORNER);
|
||||||
|
}
|
||||||
|
else if(save == 'd' && game->direction == 'w'){
|
||||||
|
mvaddch(game->y, game->x - 2, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_LRCORNER);
|
||||||
|
}
|
||||||
|
save = game->direction;
|
||||||
|
}
|
||||||
|
else if(game->direction == 'w' || game->direction == 's'){
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_VLINE);
|
||||||
|
}
|
||||||
|
else if(game->direction == 'd'){
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x - 2, ACS_HLINE);
|
||||||
|
}
|
||||||
|
else if(game->direction == 'a'){
|
||||||
|
mvaddch(game->y, game->x - 1, ACS_HLINE);
|
||||||
|
mvaddch(game->y, game->x, ACS_HLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int direction_check(struct game* game ){
|
||||||
|
getyx(stdscr, game->y, game->x);
|
||||||
|
int read = -1;
|
||||||
|
switch(game->direction){
|
||||||
|
case 'w':
|
||||||
|
read = mvinch(game->y - 1, game->x - 1) & A_CHARTEXT;
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
read = mvinch(game->y, game->x - 3) & A_CHARTEXT;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
read = mvinch(game->y + 1, game->x - 1) & A_CHARTEXT;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
read = mvinch(game->y, game->x + 1) & A_CHARTEXT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
usleep(100);
|
||||||
|
move(game->y, game->x);
|
||||||
|
if(read == (ACS_HLINE & A_CHARTEXT) || read == (ACS_VLINE & A_CHARTEXT) || read == ('#' & A_CHARTEXT) ) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int movement(struct game* game){
|
||||||
|
static char save;
|
||||||
|
if((game->direction == 'w' && save == 's') || (game->direction == 's' && save == 'w') || (game->direction == 'a' && save == 'd') || (game->direction == 'd' && save == 'a')) game->direction = save;
|
||||||
|
if(direction_check(game)) return 0;
|
||||||
|
switch(game->direction){
|
||||||
|
case 'w':
|
||||||
|
draw_path(game);
|
||||||
|
mvaddch(game->y - 1, game->x - 1, '^');
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
draw_path(game);
|
||||||
|
mvaddch(game->y, game->x - 3, '<');
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
draw_path(game);
|
||||||
|
mvaddch(game->y + 1, game->x - 1, 'v');
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
draw_path(game);
|
||||||
|
mvaddch(game->y, game->x + 1, '>');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
save = game->direction;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spawn_blocks(struct game* game){
|
||||||
|
int y = (rand() % LINES - 4) + 2;
|
||||||
|
int x = (rand() % (COLS - 5) + 2) / 2 * 2;
|
||||||
|
if(abs(y - game->y) < 10 || abs(x - game->x) < 20) return;
|
||||||
|
attron(COLOR_PAIR(7));
|
||||||
|
for(int i = 0; i < 3; i++){
|
||||||
|
for(int q = 0; q < 6; q++){
|
||||||
|
mvaddch(y + i, x + q, '#');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
attron(COLOR_PAIR(8));
|
||||||
|
}
|
||||||
|
|
||||||
|
void game_over(struct game* game){
|
||||||
|
timeout(9);
|
||||||
|
for(int i = 0, cycle = 0; i < LINES; i++){
|
||||||
|
flushinp();
|
||||||
|
for(int q = 0; q < COLS; q += 4){
|
||||||
|
attron(COLOR_PAIR(7));
|
||||||
|
mvaddch(i, q - (i % 2), ' ');
|
||||||
|
addch(' ');
|
||||||
|
attron(COLOR_PAIR(9));
|
||||||
|
addch(' ');
|
||||||
|
addch(' ');
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
if(getch() != ERR) break;
|
||||||
|
}
|
||||||
|
attron(COLOR_PAIR(9));
|
||||||
|
timeout(-1);
|
||||||
|
flushinp();
|
||||||
|
erase();
|
||||||
|
mvprintw(LINES / 2 - 2, COLS / 2 - 5, "Score: %d", game->score);
|
||||||
|
mvprintw(LINES / 2, COLS / 2 - 10, "Press any key to exit");
|
||||||
|
getch();
|
||||||
|
endwin();
|
||||||
|
printf("\033[33mScore: %d\n\033[32mThanks for playing!\033[35m\n@Corupt Runner \033[37mby \033[36mArtem Horbunov\033[0m\n", game->score);
|
||||||
|
free(game);
|
||||||
|
}
|
27
final/commands.h
Normal file
27
final/commands.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _COMMANDS_H_INCLUDE_
|
||||||
|
#define _COMMANDS_H_INCLUDE_
|
||||||
|
|
||||||
|
#include "game.h"
|
||||||
|
|
||||||
|
//Shows user a guide how to play
|
||||||
|
void welcome_screen();
|
||||||
|
|
||||||
|
//Initialize the screen with all configurations
|
||||||
|
void init_screen();
|
||||||
|
|
||||||
|
//Draw path after the player
|
||||||
|
void draw_path(struct game* game);
|
||||||
|
|
||||||
|
//Check there is something on the way
|
||||||
|
int direction_check(struct game* game );
|
||||||
|
|
||||||
|
//Change the direction of player
|
||||||
|
int movement(struct game* game);
|
||||||
|
|
||||||
|
//Spawn the blocking structure
|
||||||
|
void spawn_blocks(struct game* game);
|
||||||
|
|
||||||
|
//Show the score and destroy the game
|
||||||
|
void game_over(struct game* game);
|
||||||
|
|
||||||
|
#endif
|
48
final/game.c
Normal file
48
final/game.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include <curses.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "game.h"
|
||||||
|
#include "commands.h"
|
||||||
|
|
||||||
|
// Start is called one in the beginning
|
||||||
|
struct game* init_game(){
|
||||||
|
// Allocate memory for the state
|
||||||
|
struct game* st = calloc(1,(sizeof(struct game)));
|
||||||
|
// Initialize state
|
||||||
|
st->score = 0;
|
||||||
|
st->x = (rand() % (COLS - 5) + 2) / 2 * 2;
|
||||||
|
st->y = rand() % (LINES - 5) + 2;
|
||||||
|
// Store pointer to the state to the world variable
|
||||||
|
return st;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It should modify the state and draw it.
|
||||||
|
int world_event(struct game* game){
|
||||||
|
//Wait for input to start the game
|
||||||
|
do{
|
||||||
|
game->direction = getch();
|
||||||
|
}while(game->direction != 'w' && game->direction != 'a' && game->direction != 's' && game->direction != 'd');
|
||||||
|
for(int i = -1; i < 2; i++){
|
||||||
|
for(int q = -2; q < 4; q += 2){
|
||||||
|
mvaddch(game->y + i, game->x + q, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//The loop of the game
|
||||||
|
while(1){
|
||||||
|
if(rand() % 10 == 0){
|
||||||
|
spawn_blocks(game);
|
||||||
|
move(game->y, game->x);
|
||||||
|
}
|
||||||
|
int save = game->direction;
|
||||||
|
flushinp();
|
||||||
|
game->direction = getch();
|
||||||
|
//If wrong input- ignore it and change to the old one
|
||||||
|
if(game->direction != 'w' && game->direction != 'a' && game->direction != 's' && game->direction != 'd' && game->direction != 'q') game->direction = save;
|
||||||
|
if(game->direction == 'q') break;
|
||||||
|
if(movement(game) == 0) break;
|
||||||
|
game->score += 1;
|
||||||
|
}
|
||||||
|
getch();
|
||||||
|
game_over(game);
|
||||||
|
}
|
25
final/game.h
Normal file
25
final/game.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef _GAME_H_INCLUDE_
|
||||||
|
#define _GAME_H_INCLUDE_
|
||||||
|
|
||||||
|
// Set of variables that expresses state of the game.
|
||||||
|
//
|
||||||
|
struct game {
|
||||||
|
//X position of the player
|
||||||
|
int x;
|
||||||
|
//Y position of the player
|
||||||
|
int y;
|
||||||
|
//Score
|
||||||
|
int score;
|
||||||
|
//Direction
|
||||||
|
int direction;
|
||||||
|
//Speed
|
||||||
|
int speed;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns pointer to newly allocated player
|
||||||
|
struct game* init_game();
|
||||||
|
|
||||||
|
// Changes world according to the game state (pressed key, screen size or other event)
|
||||||
|
int world_event(struct game* game);
|
||||||
|
|
||||||
|
#endif
|
9
final/main.c
Normal file
9
final/main.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "game.h"
|
||||||
|
#include "commands.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char** argv){
|
||||||
|
struct game* game = init_game();
|
||||||
|
init_screen(game);
|
||||||
|
world_event(game);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user