a3
This commit is contained in:
parent
fb7f6cdc18
commit
380c0a5779
134
a3/main.c
134
a3/main.c
@ -1,108 +1,68 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ncurses.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "snake.h"
|
#include "snake.h"
|
||||||
#include "world.h"
|
#include "world.h"
|
||||||
|
|
||||||
#define HIGHSCORE_FILE "highscore.txt"
|
void render(const struct state* state){
|
||||||
|
system("clear");
|
||||||
|
|
||||||
int read_highscore(){
|
for(int y = 0; y < state->height; y++){
|
||||||
FILE* file = fopen(HIGHSCORE_FILE, "r");
|
for(int x = 0; x < state->width; x++){
|
||||||
if (!file) return 0;
|
if(is_snake(state->snake, x, y)){
|
||||||
int score;
|
printf("O");
|
||||||
fscanf(file, "%d", &score);
|
}else if(is_food_at(state, x, y)){
|
||||||
fclose(file);
|
printf("@");
|
||||||
return score;
|
}else{
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_highscore(int score){
|
int get_key(){
|
||||||
FILE* file = fopen(HIGHSCORE_FILE, "w");
|
int ch;
|
||||||
if (file){
|
if (scanf("%c", &ch) != 1){
|
||||||
fprintf(file, "%d\n", score);
|
return -1;
|
||||||
fclose(file);
|
|
||||||
}
|
}
|
||||||
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
srand(time(NULL));
|
|
||||||
initscr();
|
|
||||||
start_color();
|
|
||||||
init_pair(1, COLOR_GREEN, COLOR_BLACK);
|
|
||||||
init_pair(2, COLOR_RED, COLOR_BLACK);
|
|
||||||
cbreak();
|
|
||||||
noecho();
|
|
||||||
curs_set(0);
|
|
||||||
keypad(stdscr, TRUE);
|
|
||||||
nodelay(stdscr, TRUE);
|
|
||||||
|
|
||||||
struct state game;
|
struct state game;
|
||||||
game.width = 40;
|
init_game(&game);
|
||||||
game.height = 20;
|
int ch;
|
||||||
game.sx = 1;
|
while(1){
|
||||||
game.sy = 0;
|
|
||||||
game.snake = add_snake(NULL, game.width / 2, game.height / 2);
|
|
||||||
place_food(&game);
|
|
||||||
|
|
||||||
int score = 0;
|
|
||||||
int highscore = read_highscore();
|
|
||||||
int running = 1;
|
|
||||||
|
|
||||||
while(running){
|
|
||||||
int ch = getch();
|
|
||||||
switch(ch){
|
|
||||||
case KEY_UP:
|
|
||||||
if (game.sy != 1) { game.sx = 0; game.sy = -1; }
|
|
||||||
break;
|
|
||||||
case KEY_DOWN:
|
|
||||||
if (game.sy != -1) { game.sx = 0; game.sy = 1; }
|
|
||||||
break;
|
|
||||||
case KEY_LEFT:
|
|
||||||
if (game.sx != 1) { game.sx = -1; game.sy = 0; }
|
|
||||||
break;
|
|
||||||
case KEY_RIGHT:
|
|
||||||
if (game.sx != -1) { game.sx = 1; game.sy = 0; }
|
|
||||||
break;
|
|
||||||
case 'q':
|
|
||||||
running = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int status = step_state(&game);
|
|
||||||
|
|
||||||
if(status == END_CONTINUE || status == END_FOOD){
|
|
||||||
struct snake* head = game.snake;
|
|
||||||
int length = 0;
|
|
||||||
while (head) {
|
|
||||||
length++;
|
|
||||||
head = head->next;
|
|
||||||
}
|
|
||||||
score = length - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
render(&game);
|
render(&game);
|
||||||
mvprintw(game.height, 0, "Score: %d High Score: %d (q to quit)", score, highscore);
|
ch = get_key();
|
||||||
refresh();
|
|
||||||
|
|
||||||
if(status != END_CONTINUE){
|
if(ch == 'q'){
|
||||||
if (score > highscore) {
|
|
||||||
write_highscore(score);
|
|
||||||
mvprintw(game.height + 1, 0, "New High Score! %d", score);
|
|
||||||
}else{
|
|
||||||
mvprintw(game.height + 1, 0, "Game Over! Score: %d", score);
|
|
||||||
}
|
|
||||||
|
|
||||||
mvprintw(game.height + 2, 0, "Press any key to exit...");
|
|
||||||
nodelay(stdscr, FALSE);
|
|
||||||
getch();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
usleep(150000);
|
if(ch == 'w'){
|
||||||
|
game.sy = -1;
|
||||||
|
game.sx = 0;
|
||||||
|
}else if(ch == 's'){
|
||||||
|
game.sy = 1;
|
||||||
|
game.sx = 0;
|
||||||
|
}else if(ch == 'a'){
|
||||||
|
game.sx = -1;
|
||||||
|
game.sy = 0;
|
||||||
|
}else if(ch == 'd'){
|
||||||
|
game.sx = 1;
|
||||||
|
game.sy = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = step_state(&game);
|
||||||
|
if (result != END_CONTINUE) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
usleep(100000);
|
||||||
}
|
}
|
||||||
|
|
||||||
endwin();
|
printf("Game Over\n");
|
||||||
free_snake(game.snake);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user