wm: gsnake

Download patch

ref: f16a708e5c6b95dd75bdf02d5678b19ec368a020
author: grey-S <63976509+grey-S@users.noreply.github.com>
date: Sun Apr 19 22:27:38 EDT 2020

Add files via upload

--- /dev/null
+++ b/config.h
@@ -1,0 +1,49 @@
+#include <unistd.h>
+#include <ncurses.h>
+#include <time.h>
+#include <stdbool.h>
+#include <stdlib.h>
+typedef struct point { int x , y ;}point;
+typedef enum dir{left,right,up,down}dir;
+
+#define TIMEOUT 3 
+#define MAX_SNAKE 30000
+#define START_DIR right 
+#define START_SIZE 5
+
+
+int FG = COLOR_YELLOW;
+int BG = COLOR_BLACK;
+int color_slow = COLOR_CYAN;
+int color_speed = COLOR_RED;
+
+bool game_over = false;
+
+const static bool teleport = true;
+const bool auto_color_change = true;
+
+const char snake_c[]=" ";
+const char food_c[]="G";
+const char head_char[]="N";;
+const char speed_head_char[]="X";
+const char slow_head_char[]="S";
+
+bool speed = false ; 
+bool slow = false ; 
+
+point snake[MAX_SNAKE];
+point food;
+dir current_dir = START_DIR;
+
+int max_x , max_y , snake_len = START_SIZE , score , highest_score,last_scores[10];
+int next_x , next_y;
+int delay = 40000;
+
+void draw_obj(point , const char[]);
+void create_food();	
+void init_screen();
+void init_game();
+void shift_snake();
+void draw_all();
+bool loop();
+void pause_game();
--- /dev/null
+++ b/gsnake.c
@@ -1,0 +1,177 @@
+#include "config.h"
+
+void change_color(){
+	int tmp = FG;
+	FG = rand() % 7;
+	while(FG == tmp ||  FG == BG){
+		FG = rand() % 7;}}
+
+
+void pause_game(){
+	char c;
+	while(c!='p'){
+		c=getchar();}
+}
+
+void draw_obj(point p , const char c[]){
+	mvprintw(p.y,p.x,c);}
+
+void create_food(){
+	food.x = (rand() % max_x);
+	food.y = (rand() % max_y);}
+
+void init_screen(){
+	initscr();
+	noecho();
+	keypad(stdscr,TRUE);
+	start_color();
+	
+	init_pair(1,FG,BG);
+	attron(A_BOLD | A_STANDOUT | A_REVERSE | COLOR_PAIR(1));
+	timeout(TIMEOUT);
+	curs_set(0);
+	cbreak();
+	getmaxyx(stdscr,max_y,max_x);}
+
+void init_game(){
+	srand(time(0));
+	int j = 0 ;
+
+	for(int i = snake_len -1 ; i > 0 ; i--){
+		snake[j].y = max_y /2;
+		snake[j].x = i;
+		j++;}
+
+	create_food();
+	refresh();}
+
+void shift_snake(){
+	point tmp = snake[snake_len -1];
+	for(int i = snake_len -1 ; i > 0 ; i--){
+			snake[i] = snake[i-1];}
+	snake[0]=tmp;}
+
+void draw_all(){
+	clear();
+	for(int i  = 0 ; i < snake_len ; i++){
+		draw_obj(snake[i],snake_c);}
+	if(speed){
+	draw_obj(snake[snake_len -1 ],speed_head_char);}
+	
+	else if(slow){
+		draw_obj(snake[snake_len -1],slow_head_char);}
+	
+	else{draw_obj(snake[snake_len -1],head_char);}
+
+	attroff(A_STANDOUT | A_REVERSE);
+	draw_obj(food,food_c);
+
+	mvprintw(max_y -2 , (max_x /2)-5 , "score:%d",score);
+	attron(A_STANDOUT | A_REVERSE);
+	
+	if(speed){
+		init_pair(1,color_speed,COLOR_BLACK);	
+		usleep(delay - 30000);}
+	else if(slow){
+		init_pair(1,color_slow,COLOR_BLACK);
+		usleep(100000);}
+
+	else{
+	usleep(delay);
+	init_pair(1,FG,BG);}
+}
+bool loop(){
+	int x , y;
+	int ch ;
+	while(1){
+		if(game_over){break;}
+		getmaxyx(stdscr,max_y,max_x);
+		if(x != max_x || y != max_y){
+			create_food();
+		}
+		x = max_x ; y = max_y;
+		ch=getch();
+		srand(time(0));
+
+
+		if((ch == KEY_LEFT || ch == 'a') &&
+		(current_dir != left && current_dir != right))
+		{current_dir = left;}
+		
+		else if((ch == KEY_RIGHT || ch == 'd') && 
+		(current_dir != left && current_dir != right))
+		{current_dir = right;}
+
+		else if((ch == KEY_UP || ch == 'w') && 
+		(current_dir != down && current_dir != up)){current_dir = up;}
+		
+		else if((ch == KEY_DOWN || ch == 's')  &&
+		(current_dir != down && current_dir != up))
+		{current_dir = down;}
+		
+		else if(ch == 'x'){
+		if(speed){speed = false; slow = true;}
+		
+		else if(slow){slow = false;}
+		else{speed = true;}}
+		
+		else if(ch =='p'){pause_game();}
+		else if(ch == 'c'){change_color();}
+		next_x = snake[0].x;
+		next_y = snake[0].y;
+
+		switch(current_dir){
+			case right:next_x++;break;
+			case left:next_x--;break;
+
+			case up:next_y--;break;
+			case down:next_y++;break;}
+		
+
+		if(next_x == food.x && next_y == food.y){
+			snake[snake_len].x = food.x;
+			snake[snake_len].y = food.y;
+			
+			snake_len++;
+			if(speed){score += 10;}
+			else if(slow){score += 2;}
+			else{score += 5;}
+			delay-= 400;
+			
+			if(auto_color_change){
+			change_color();}
+
+			create_food();
+			}
+
+		else{	
+			for(int i = 0 ; i  < snake_len ; i++){
+				if(next_x == snake[i].x && next_y == snake[i].y){
+				game_over = true;}}
+			snake[snake_len -1 ].x = next_x;
+			snake[snake_len -1 ].y = next_y;}
+
+		if(!teleport){
+			if((next_x >= max_x || next_x <= 0) || (next_y >= max_y || next_y <=0)){
+				game_over = true;}}
+
+		else if(teleport){
+			if(next_x >= max_x){timeout(0);snake[snake_len -1 ].x = 0;}
+			else if(next_x < 0 ){timeout(0);snake[snake_len -1].x = max_x;}
+			else if(next_y > max_y){timeout(0);snake[snake_len -1].y = 0;}
+			else if(next_y < 0){timeout(0);snake[snake_len -1].y = max_y;}
+			timeout(TIMEOUT);
+		}
+		draw_all();
+		shift_snake();}
+	return game_over;
+}
+int main(){
+	init_screen();
+	init_game();
+	bool stat = loop();
+	if(stat){
+		endwin();
+		printf("\e[1;31mGameOver:))\n%s : %d\n\e[0;m",getenv("USER"),score);
+		return 0;}}
+