From e2bfedbee1314db7665b1718cb9f4b5550c49f67 Mon Sep 17 00:00:00 2001 From: untakenstupidnick Date: Wed, 20 Mar 2019 17:46:33 +0330 Subject: [PATCH] Second version --- README.rst | 62 ++++ banner.png | Bin 0 -> 5841 bytes linux_exec/battleship | Bin 0 -> 23928 bytes linux_exec/checkers | Bin 0 -> 23864 bytes linux_exec/jewels | Bin 0 -> 23832 bytes linux_exec/mines | Bin 0 -> 23536 bytes linux_exec/pipes | Bin 0 -> 24216 bytes linux_exec/rabbithole | Bin 0 -> 19304 bytes linux_exec/reversi | Bin 0 -> 19008 bytes linux_exec/sos | Bin 0 -> 23808 bytes linux_exec/sudoku | Bin 0 -> 28064 bytes screenshot.png | Bin 9662 -> 13792 bytes sources/Makefile | 31 ++ sources/battleship.c | 618 ++++++++++++++++++++++++++++++++++++++ sources/checkers.c | 678 ++++++++++++++++++++++++++++++++++++++++++ sources/config.h | 3 + sources/jewels.c | 389 ++++++++++++++++++++++++ sources/mines.c | 361 ++++++++++++++++++++++ sources/pipes.c | 534 +++++++++++++++++++++++++++++++++ sources/rabbithole.c | 318 ++++++++++++++++++++ sources/reversi.c | 399 +++++++++++++++++++++++++ sources/sos.c | 403 +++++++++++++++++++++++++ sources/sudoku.c | 441 +++++++++++++++++++++++++++ 23 files changed, 4237 insertions(+) create mode 100644 README.rst create mode 100644 banner.png create mode 100755 linux_exec/battleship create mode 100755 linux_exec/checkers create mode 100755 linux_exec/jewels create mode 100755 linux_exec/mines create mode 100755 linux_exec/pipes create mode 100755 linux_exec/rabbithole create mode 100755 linux_exec/reversi create mode 100755 linux_exec/sos create mode 100755 linux_exec/sudoku create mode 100644 sources/Makefile create mode 100644 sources/battleship.c create mode 100644 sources/checkers.c create mode 100644 sources/config.h create mode 100644 sources/jewels.c create mode 100644 sources/mines.c create mode 100644 sources/pipes.c create mode 100644 sources/rabbithole.c create mode 100644 sources/reversi.c create mode 100644 sources/sos.c create mode 100644 sources/sudoku.c diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..954883d --- /dev/null +++ b/README.rst @@ -0,0 +1,62 @@ +New BSD Games +------------- +You have a computing machine from 1980's and you wonder how can you use it? + You deal with a GUI-less machine at work and are looking for ways to kill time? + You have to make a Reversi AI for your homework and you don't know where to copy it from? + You have been so excited about the bsdgames, but have grown tired of playing tetris, snake and robots for billions of times? + You feel they have fooled you by bundling stuff like phantasia with a package you except to contain GAMES? + +Don't worry anymore as you've got nbsdgames now! + +I originally made these to be added to NetBSD (but the few i talked with preferred to have games in the repositories rather than in /usr/games itself). + + +These include: + +Jewels (A game with a gameplay kinda similiar to that of Tetris, NOT my invention) +Sudoku +Mines (Minesweeper) +Reversi +Checkers +Battleship + +Post Made-for-NetBSD games: + +SOS +Rabbithole (A maze-exploring game where you have to gather items from all around the maze rather reaching an end,the idea maybe mine) +Pipes (Same as the famous Pipe Mania, unplayable on the environments that don't support the line characters) +Prerequisites +------------- + +* make (optional) +* A C compiler with C99 enabled +* The standard library +* libncurses (the dev package if you are on debian-based distros) + +How to run +---------- + +1) Download the files +2) Go to the sources directory +3) Set the environment variable PREFIX to the address you want them to be in +4) Install + +Like this: + +.. code:: bash + cd ~/Downloads/sources + export PREFIX= ~/bin + make install + +How do these look like +----------------------- +.. image:: https://raw.githubusercontent.com/untakenstupidnick/new-bsd-games/master/screenshot.png + + +License +------- +No rights reserved. + +I am living outside the Berne convention and therefore no meaningful licensing can be applied (meaning that it's public domain in most of the world). + + diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..f92b7360a0312fec48a15b295e83efee2fa6f2be GIT binary patch literal 5841 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 VRj2Z!Rd>_?=Tl%u{K-qd`~z5g-d6ws literal 0 HcmV?d00001 diff --git a/linux_exec/battleship b/linux_exec/battleship new file mode 100755 index 0000000000000000000000000000000000000000..c29b40836f118516be9b1cf854a57ad0f7dfd4a3 GIT binary patch literal 23928 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 AtN;K2 literal 0 HcmV?d00001 diff --git a/linux_exec/checkers b/linux_exec/checkers new file mode 100755 index 0000000000000000000000000000000000000000..dd25cf715a2d15d014f8503b67c3ea1d02c87c90 GIT binary patch literal 23864 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 Pfpl1PydVv~CCUB^MYB#$ literal 0 HcmV?d00001 diff --git a/linux_exec/mines b/linux_exec/mines new file mode 100755 index 0000000000000000000000000000000000000000..d7e4e7cb3566068c21283d1f5c143698dc046340 GIT binary patch literal 23536 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 NR5iRH4ZkJH{x|+QK+*sJ literal 0 HcmV?d00001 diff --git a/linux_exec/pipes b/linux_exec/pipes new file mode 100755 index 0000000000000000000000000000000000000000..eb89dad3eaf3129d8fc3ab767338994e32ce0ce6 GIT binary patch literal 24216 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 J%ad82{1=+n>LLID literal 0 HcmV?d00001 diff --git a/screenshot.png b/screenshot.png index e823d4c828b1b16c8ec44e2abd180924d4af4442..d486fd81c3509d86bdaf7963a4d2446d3a67e193 100644 GIT binary patch literal 13792 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

#rH%|0YPwnwMGi2ahc!rJxa=SoO0r{^5U!# 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 literal 9662 zcmeHNX;@QNx88_|ii(!Up^Cv)tpko#6cG~isuU38m>{Ew6(Ir3f}&e?mPJ*@Sv zcdxb1Ik|nC%f#_B#{&Q+x_-53Cje$R08GKyF|dYxnxe()Py8$TCcxF{bJ2=7H4ezQ$5aFLTi@GlJ{uc?08pe_D54 z)jYa7F<|ghI2r&8RTwhXc$c&G-eLeeuH*+x7XeV?i#!3~{FSE}aveL4hFrjB0aKC7 zoOy+#kn8bkbr!rlTj9}+VfZdfpM7u?sF{NFwLbs-c;M_2W_%k={sd?GBxm?3s38

5IUalw7f;bE13j9yGqfuCwt$q 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 diff --git a/sources/Makefile b/sources/Makefile new file mode 100644 index 0000000..bf17752 --- /dev/null +++ b/sources/Makefile @@ -0,0 +1,31 @@ +# -*- Makefile -*- + +all: jewels sudoku mines reversi checkers battleship rabbithole sos pipes + +jewels: jewels.c config.h + $(CC) jewels.c -lncurses -o ./jewels +sudoku: sudoku.c + $(CC) sudoku.c -lncurses -lm -o ./sudoku +mines: mines.c + $(CC) mines.c -lncurses -o ./mines +reversi: reversi.c + $(CC) reversi.c -lncurses -o ./reversi +checkers: checkers.c + $(CC) checkers.c -lncurses -o ./checkers +battleship: battleship.c + $(CC) battleship.c -lncurses -o ./battleship +rabbithole: rabbithole.c + $(CC) rabbithole.c -lncurses -o ./rabbithole +sos: sos.c + $(CC) sos.c -lncurses -o ./sos +pipes: pipes.c config.h + $(CC) pipes.c -lncurses -o ./pipes +clean: + rm ./jewels ./sudoku ./checkers ./mines ./reversi ./battleship ./rabbithole ./sos ./pipes +uninstall: + rm $(PREFIX)/jewels $(PREFIX)/sudoku $(PREFIX)/checkers $(PREFIX)/mines $(PREFIX)/reversi $(PREFIX)/battleship $(PREFIX)/rabbithole $(PREFIX)/sos $(PREFIX)/pipes +copy_sources: + cp Makefile config.h jewels.c sudoku.c mines.c reversi.c checkers.c battleship.c rabbithole.c sos.c pipes.c $(PREFIX) +install: all + cp jewels sudoku mines reversi checkers battleship rabbithole sos pipes $(PREFIX) + diff --git a/sources/battleship.c b/sources/battleship.c new file mode 100644 index 0000000..a384762 --- /dev/null +++ b/sources/battleship.c @@ -0,0 +1,618 @@ +#include +#include +#include +#include +#include +#include +#define MISS -2 +#define SEA -1 +#define HIT 0 +#define ENGLISH_LETTERS 26 +#define NOTHING -1 +#define ALL 0x7c +#define RED 3 +#define CYAN 2 +/* + _ +|_) +|_)ATTLESHIP + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +typedef unsigned char bitbox; +bool multiplayer; +byte py,px;//cursor + +chtype colors[4]={0}; + +byte game[2][10][10];//main board +bool computer[2] = {0}; +byte score[2] = {0};//set by header() +bitbox sunk[2]={0}; +byte just_sunk[2]={0};//to be displayed for human players + +byte firstinrowy , firstinrowx ; +byte lastinrowy ,lastinrowx; +byte goindirection; +byte shotinvain; +void sigint_handler(int x){ + endwin(); + puts("Quit."); + exit(x); +} +void mouseinput(bool ingame){ + MEVENT minput; + getmouse(&minput); + if(minput.bstate & (BUTTON1_CLICKED|BUTTON1_RELEASED)){ + if( minput.y-4 < 10){ + if( (ingame && minput.x-23<20 && minput.x-23>=0 ) || (!ingame && minput.x-1<20) ){//it most be on the trackboard if ingame is true + py=minput.y-4; + px=(minput.x-1-(ingame*2)) /2; + } + } + else + return; + } + if(minput.bstate & (BUTTON1_CLICKED|BUTTON1_RELEASED)) + ungetch('\n'); + if(minput.bstate & (BUTTON2_CLICKED|BUTTON2_RELEASED|BUTTON3_CLICKED|BUTTON3_RELEASED) ) + ungetch('r'); +} +void rectangle(byte sy,byte sx){ + for(byte y=0;y<=10+1;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+10*2,ACS_VLINE); + } + for(byte x=0;x<=10*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+10+1,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+10+1,sx,ACS_LLCORNER); + mvaddch(sy,sx+10*2,ACS_URCORNER);- + mvaddch(sy+10+1,sx+10*2,ACS_LRCORNER); +} +void print_type(byte type){ + switch(type){ + case(2): + addstr("patrol boat"); + break; + case(3): + addstr("destroyer"); + break; + case(4): + addstr("battleship"); + break; + case(5): + addstr("carrier"); + break; + case(6): + addstr("submarine"); + break; + } +} +void MID(byte *y , byte *x, byte direction){ + switch(direction){ + case(0): + *x=*x-1; + break; + case(1): + *y=*y-1; + break; + case(2): + *x=*x+1; + break; + case(3): + *y=*y+1; + break; + } +} +void genocide(bool side , byte type){ + byte y,x; + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + if(game[side][y][x] == type) + game[side][y][x] = SEA; + } + } +} +void header(bool side){ + score[0]=score[1]=0; + byte y,x; + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + if(game[!side][y][x] == HIT) + score[side]++; + if(game[side][y][x] == HIT) + score[!side]++; + } + } + mvaddch(0,1, '_'); + mvprintw(1,0,"|_) %2d:%2d",score[side],score[!side]); + mvprintw(2,0,"|_)ATTLESHIP "); +} + +void draw(bool side,byte sy,byte sx){//the game's board + rectangle(sy,sx); + chtype ch ; + byte y,x; + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + ch =A_NORMAL; + if(y==py && x==px) + ch |= A_STANDOUT; + if(game[side][y][x] == HIT) + ch |= 'X'|colors[RED]; + else if(game[side][y][x] > 0 ) + ch |= ACS_BLOCK|colors[side]; + else if(game[side][y][x]== MISS) + ch |= 'O'|colors[CYAN]; + else + ch |= '~'|colors[CYAN]; + + mvaddch(sy+1+y,sx+x*2+1,ch); + } + } +} +void draw_trackboard(bool side,byte sy,byte sx){ + rectangle(sy,sx); + chtype ch ; + byte y,x; + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + ch =A_NORMAL; + if(y==py && x==px-10) + ch |= A_STANDOUT; + + if(game[!side][y][x] == HIT) + ch |= '*'|colors[RED]; + else if(game[!side][y][x]== MISS) + ch |= '~'|colors[CYAN]; + else + ch |= '.'; + + mvaddch(sy+1+y,sx+x*2+1,ch); + } + } + refresh(); +} + +void autoset(bool side){ + byte y=0,x=0,direction=0, invain=0; + byte realy,realx; + byte l; + for(byte type=2;type<7;type++){ + SetLocation: + realy=random()%10; + realx=random()%10; + invain=0; + SetDirection: + y=realy; + x=realx; + direction=random()%4; + for(l=0;(type != 6 && l=10 || x>=10 || game[side][y][x] != SEA ){ + genocide(side,type); + invain++; + direction= (direction+1)%4; + if(invain<4) + goto SetDirection; + else + goto SetLocation;//endless loop + } + else{ + game[side][y][x]=type; + MID(&y,&x,direction); + } + } + } +} + +void set_the_board(bool side){ + if( computer[side] ){ + autoset(side); + return; + } + erase(); + mvaddch(0,1, '_'); + mvaddstr(1,0,"|_) Set your board"); + mvaddstr(2,0,"|_)ATTLESHIP"); + mvaddstr(16,0,"Press RETURN to specify the location and press R to rotate the ship."); + int input; + byte y=0,x=0,direction=0, invain=0; + byte realy,realx; + byte l; + py=px=0; + for(byte type=2;type<7;type++){ + mvaddstr(15,0,"Put your "); + print_type(type); + addstr(" in its position: "); + SetLocation: + while(1){ + draw(side,3,0); + refresh(); + input = getch(); + if( input == KEY_MOUSE ) + mouseinput(0); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py<9) + py++; + if( (input=='h' || input==KEY_LEFT) && px>0) + px--; + if( (input=='l' || input==KEY_RIGHT) && px<9) + px++; + if( input=='\n' ) + break; + if( input=='q' ) + sigint_handler(EXIT_SUCCESS); + } + + + realy=y=py; + realx=x=px; + invain=0; + SetDirection: + y=realy; + x=realx; + for(l=0;(type != 6 && l=10 || x>=10 || game[side][y][x] != SEA ){ + genocide(side,type); + invain++; + direction= (direction+1)%4; + if(invain<4) + goto SetDirection; + else + goto SetLocation;//endless loop + } + else{ + game[side][y][x]=type; + MID(&y,&x,direction); + } + } + while(1){ + invain=0; + draw(side,3,0); + input=getch(); + if( input== 'r' || input == 'R' ){ + genocide(side,type); + direction= (direction+1)%4; + goto SetDirection; + } + else if(input == KEY_MOUSE) + mouseinput(0); + else + break; + } + } +} + +void turn_shift(void){ + if(!multiplayer) + return; + char key = 'a'+(random()%ENGLISH_LETTERS); + int input1,input2,input3; + input1=input2=input3=0; + erase(); + beep(); + mvaddch(0,1, '_'); + mvaddstr(1,0,"|_) Anti-cheater"); + mvaddstr(2,0,"|_)ATTLESHIP"); + mvaddstr(4,0,"********************"); + mvprintw(5,0," Type '%c' 3 times ",key); + mvaddstr(6,0," before "); + mvaddstr(7,0," proceeding "); + mvaddstr(8,0," to the game "); + mvaddstr(10,0,"********************"); + refresh(); + while(1){ + input3=input2; + input2=input1; + input1=getch(); + if( (input1==input2) && (input2==input3) && (input3==key) ) + break; + } + erase(); +} +byte shoot(bool turn, byte y , byte x){ + byte s = game[!turn][y][x]; + if(s>0){ + game[!turn][y][x]=HIT; + return 1; + } + else if(s==HIT || s==MISS || y<0 || x<0 || y>9 || x>9 ){ //didn't shoot at all + return NOTHING; + } + else{ + game[!turn][y][x]=MISS; + return 0; + } + +} +void sink_announce(bool side){ + byte type,y,x; + for(type=2;type<7;type++){ + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + if( game[!side][y][x] == type ) + goto Next; + } + } + //there is no instance of 'type' in the opponet's board + if( ( (1 << type) | sunk[!side] ) != sunk[!side] ){ + sunk[!side] |= (1 << type); + if(computer[side]){ + lastinrowy=lastinrowx=firstinrowy=firstinrowx=-1; + shotinvain=0; + } + else{ + just_sunk[!side]=type;//leave to be displayed by you_sunk + } + return; + } + + + Next: + continue; + } +} +void you_sunk(bool side){ + if( just_sunk[!side] == 3) + mvaddstr(15,0,"You have destroyed my destroyer!!"); + else if( just_sunk[!side]){ + mvaddstr(15,0,"You have sunk my "); + print_type(just_sunk[!side]); + addstr("!!"); + } + just_sunk[!side]=0; +} +void cheat(bool side){ + /* its actually an anti-cheat, the player can place all their ships adjacent to the others and in the same direction, + and the algorithm will often play in a way that it will be left with one or two isolated tiles being unshot (with their respective ships being shot before). + in a such a situation a human will *very easily* find the tiles with logical thinking, but the computer shoots randomly and it will take such a long time for it + that it will often lose the winning game. + + this function still doesn't make a win,it's randomly executed.*/ + byte y,x; + for(y=0;y<10;y++){ + for(x=0;x<10;x++){ + if(game[!side][y][x]>0){ + shoot(side,y,x); + firstinrowy=y; + firstinrowx=x; + return; + } + } + } +} +void decide(bool side){// sink_announce is responsible for unsetting the global variables involved + byte y,x,r; + Again: + if( firstinrowy == NOTHING ){ + if( score[side] > 14 && score[side]9 || x>9) && r==NOTHING){ + goto Again; + } + } + r= shoot(side,y,x);//(y,x) may be MISS, but its impossible for it to be empty water, as executing this means it has tested every direction before + if(r==1){ + lastinrowy=y;//continue from the imaginary firstinrow + lastinrowx=x; + } + if(r==NOTHING) + goto Again; + } + + } + else{ + lastinrowy= y; + lastinrowx= x; + } + + if( r != NOTHING ) + return; + } + } + else{ + y=lastinrowy; + x=lastinrowx; + MID(&y,&x,goindirection); + r=shoot(side,y,x); + if( r == 1 ){ + lastinrowy=y; + lastinrowx=x; + } + else{ + lastinrowy=lastinrowx=NOTHING; + goindirection=(goindirection+2)%4; + } + if( r != NOTHING ) + return; + else{ + goto Again; + } + } +} +void help(bool side){//side is only there to feed header() + erase(); + header(side); + attron(A_BOLD); + mvprintw(3,0," **** THE CONTROLS ****"); + mvprintw(9,0,"YOU CAN ALSO USE THE MOUSE!"); + attroff(A_BOLD); + mvprintw(4,0,"RETURN/ENTER : Shoot"); + mvprintw(5,0,"R : Rotate"); + mvprintw(6,0,"hjkl/ARROW KEYS : Move cursor"); + mvprintw(7,0,"q : Quit"); + mvprintw(8,0,"F1 & F2 : Help on controls & gameplay"); + mvprintw(11,0,"Press a key to continue"); + getch(); + erase(); +} +void gameplay(bool side){//side is only there to feed header() + erase(); + header(side); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("Guess the location of your opponet's\n"); + printw("ships and sink them! The player\n"); + printw("who sinks all the opponet's ships wins."); + getch(); + erase(); +} +int main(void){ + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + curs_set(0); + noecho(); + cbreak(); + keypad(stdscr,1); + if( has_colors() ){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_GREEN,-1); + init_pair(2,COLOR_YELLOW,-1); + init_pair(3,COLOR_CYAN,-1); + init_pair(4,COLOR_RED,-1); + for(byte b=0;b<4;b++) + colors[b]=COLOR_PAIR(b+1); + } + int input; + printw("Choose type of the game:\n"); + printw("1 : Single Player*\n"); + printw("2 : Multi Player\n"); + input=getch(); + if(input == '2'){ + multiplayer=1; + computer[1]=computer[0]=0; + } + else{ + multiplayer=0; + computer[1]=1; + computer[0]=0; + } + Start: + firstinrowy=firstinrowx=lastinrowy=lastinrowx=goindirection=-1; + shotinvain=0; + sunk[0]=sunk[1]=0; + memset(game,SEA,200); + srandom(time(NULL)%UINT_MAX); + erase(); + + set_the_board(0); + turn_shift(); + set_the_board(1); + bool won; + bool turn=1; + Turn: + px=10; + py=0; + sink_announce(turn); + if( sunk[0]==ALL ){ + won=1; + goto End; + } + else if( sunk[1]==ALL ){ + won=0; + goto End; + } + //the turn starts HERE + turn=!turn; + turn_shift(); + if( computer[turn] ){ + decide(turn); + goto Turn; + } + else{ + erase(); + you_sunk(turn); + while(1){ + header(turn); + draw(turn,3,0); + draw_trackboard(turn,3,22); + refresh(); + input=getch(); + if(input == KEY_F(1) || input=='?' ) + help(turn); + if(input == KEY_F(2) ) + gameplay(turn); + if(input == KEY_MOUSE) + mouseinput(1); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py<9) + py++; + if( (input=='h' || input==KEY_LEFT) && px>10) + px--; + if( (input=='l' || input==KEY_RIGHT) && px<19) + px++; + if( input=='q') + sigint_handler(EXIT_SUCCESS); + if( input=='\n'){ + byte r=shoot(turn,py,px-10); + if(r != -1){ + goto Turn; + } + } + } + } + End: + erase(); + header(won); + draw(won,3,0); + draw_trackboard(won,3,22); + if( computer[won] ) + mvaddstr(15,0,"Hahaha! I won! "); + else + mvprintw(15,0,"Player %d won the game.",won+1); + addstr(" Wanna play again? (y/n)"); + refresh(); + curs_set(1); + input=getch(); + if( input!='n' && input !='N' && input!='q' ){ + curs_set(0); + goto Start; + } + endwin(); + return 0; +} diff --git a/sources/checkers.c b/sources/checkers.c new file mode 100644 index 0000000..01b564a --- /dev/null +++ b/sources/checkers.c @@ -0,0 +1,678 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#define LIGHT -1 +#define DARK 1 +#define KING 2 +#define DOESNT_MATTER 1 +#define IMAGINARY 0 +#define NORMAL 1 +#define ALT_IMG 2 +#define ALT_NRM 3 +#define WIN 100000 +/* + .-. +| ' +'._.HECKERS + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + + +Compile with -lncurses +*/ +typedef signed char byte; +byte py,px;//cursor +byte cy,cx;//selected(choosen) piece +int dpt; +byte game[8][8]; +byte computer[2]={0,0}; +byte score[2];//set by header() +bool endgame=false; +byte jumpagainy , jumpagainx; +bool kinged;//if a piece jumps over multiple others and becomes a king it cannot continue jumping + +bool in(byte A[4],byte B[4],byte a,byte b){ + for(byte c=0;c<4;c++) + if(A[c]==a && B[c]==b) + return true; + return false; +} +void rectangle(byte sy,byte sx){ + byte y,x; + for(y=0;y<=8+1;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+8*2,ACS_VLINE); + } + for(x=0;x<=8*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+8+1,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+8+1,sx,ACS_LLCORNER); + mvaddch(sy,sx+8*2,ACS_URCORNER); + mvaddch(sy+8+1,sx+8*2,ACS_LRCORNER); +} +void header(void){ + score[0]=score[1]=0; + byte y,x; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + if(game[y][x]){ + if(game[y][x]<0) + score[0]++; + else + score[1]++; + } + } + } + mvprintw(0,0," .-."); + mvprintw(1,0,"| ' %2d:%2d",score[0],score[1]); + mvprintw(2,0,"'._,HECKERS "); +} +void draw(byte sy,byte sx){//the game's board + rectangle(sy,sx); + chtype ch ; + byte y,x; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + ch=A_NORMAL; + if(y==py && x==px) + ch |= A_STANDOUT; + if(y==cy && x==cx) + ch |= A_BOLD; + if(game[y][x]){ + if(game[y][x]<0){ + if(has_colors()) + ch|=COLOR_PAIR(1); + else + ch |= A_UNDERLINE; + } + if(abs(game[y][x])<2) + ch |='O'; + else + ch |='K'; + } + else if( (y%2) != (x%2) ) + ch|='.'; + else + ch|=' '; + mvaddch(sy+1+y,sx+x*2+1,ch); + } + } +} +//place the pieces on the board +void fill(void){ + byte y,x; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + game[y][x]=0; + if( (y%2) != (x%2)){ + if(y<3) game[y][x]=1; + if(y>4) game[y][x]=-1; + } + } + } +} +//fill mvy/x with possible moves +bool moves(byte ty,byte tx,byte mvy[4],byte mvx[4]){ + bool ret=0; + byte ndx=0; + byte t= game[ty][tx]; + move(15,0); + byte dy,dx; + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if( !dy || !dx || (!ty && dy<0) || (!tx && dx<0) || (dy==-t) || (ty+dy>=8) || (tx+dx>=8) ) + ; + else if(!game[ty+dy][tx+dx]){ + ret=1; + mvy[ndx]=ty+dy; + mvx[ndx]=tx+dx; + ndx++; + } + else + ndx++; + } + } + return ret; +} +//would be much faster than applying moves() on every tile +bool can_move(byte side){ + byte y , x ,t, dy , dx; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + if( (t=game[y][x])*side > 0 ){ + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if( !dy || !dx || (!y && dy<0) || (!x && dx<0) || (dy==-t) || (y+dy>=8) || (x+dx>=8) ) + ; + else if( !game[y+dy][x+dx] ) + return 1; + } + } + } + } + } + return 0; + +} +//fill mvy/x with possible jumping moves +bool jumps(byte ty,byte tx,byte mvy[4],byte mvx[4]){ + bool ret=0; + byte ndx=0; + byte ey,ex; + byte t= game[ty][tx]; + byte dy,dx; + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + ey = dy*2; + ex = dx*2; + if(!dy || !dx ||(dy==-t)|| (ty+ey<0) || (tx+ex<0) || (ty+ey>=8) || (tx+ex>=8) ) + ; + else if(!game[ty+ey][tx+ex] && game[ty+dy][tx+dx]*t<0){ + ret=1; + mvy[ndx]=ty+ey; + mvx[ndx]=tx+ex; + ndx++; + } + else + ndx++; + } + } + return ret; +} +//same as can_move for jumps +byte can_jump(byte ty,byte tx){ + byte dy,dx,t=game[ty][tx]; + byte ey,ex; + byte ret=0; + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + ey=dy*2; + ex=dx*2; + if((dy==-t)||(ty+ey<0)||(tx+ex<0)||(ty+ey>=8)||(tx+ex>=8) ) + ; + else if(!game[ty+dy*2][tx+dx*2]&&game[ty+dy][tx+dx]*t<0){ + ret++; + if(ret>1) + return ret; + } + + } + } + return ret; +} +//see if the side is forced to do a jump +byte forced_jump(byte side){ + byte y,x; + byte foo,ret; + foo=ret=0; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + if(game[y][x]*side>0 && (foo=can_jump(y,x)) ) + ret+=foo; + if(ret>1) + return ret; + } + } + return ret; +} +byte cmove(byte fy,byte fx,byte sy,byte sx){//really move/jump , 'move' is a curses function + byte a = game[fy][fx]; + byte ret=0; + game[fy][fx]=0; + game[sy][sx]=a; + if(abs(fy-sy) == 2){ + ret =game[(fy+sy)/2][(fx+sx)/2]; + game[(fy+sy)/2][(fx+sx)/2]=0; + } + return ret; +} +//make the pawn a king +bool king(byte y,byte x){ + byte t= (4-y)*game[y][x]; + if( (y==7 || !y) && t<0 && t>-5 ){ + game[y][x]*=2; + return 1; + } + return 0; +} +double advantage(byte side){ + unsigned char own,opp; + own=opp=0; + byte foo; + byte y,x; + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + foo=game[y][x]*side; + if(foo>0){ + own++;//so it wont sacrfice two pawns for a king ( 2 kings == 3 pawns) + own+=foo; + } + else if(foo<0){ + opp++; + opp-=foo; + } + } + } + if(!own) + return 0; + else if(!opp) + return WIN; + else + return (double)own/opp; +} +double posadvantage(byte side){ + double adv=0; + double oppadv=0; + byte foo; + byte y,x; + byte goal= (side>0)*7 , oppgoal=(side<0)*7; + /*This encourages the AI to king its pawns and concentrate its kings in the center. + The idea is : With forces concentrated in the center, movements to all of the board would be in the game tree's horizon of sight(given enough depth); + and with forces being focused , its takes less movements to make an attack. */ + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + foo=game[y][x]*side; + if(foo>0){ + adv+=foo; + adv++; + if(foo==1) + adv+= 1/( abs(y-goal) );//adding positional value + else if(foo==2) + adv+= 1/( fabs(y-3.5)+ fabs(x-3.5) ); + } + else if( foo<0 ){ + oppadv-=foo; + oppadv++; + if(foo==-1) + adv+=1/( abs(y-oppgoal) ); + else if(foo==-2) + adv+= 1/( fabs(y-3.5)+ fabs(x-3.5) ); + } + } + } + if(!adv) + return 0; + else if( !oppadv ) + return WIN; + else + return adv/oppadv; + return adv; +} +//the AI algorithm +double decide(byte side,byte depth,byte s){//s is the type of move, it doesn't stand for anything + byte fj=forced_jump(side);//only one legal jump if returns 1 + byte nextturn; + + byte mvy[4],mvx[4]; + byte n; + + bool didking; + byte captured; + + double adv=0; + byte toy,tox; + byte y,x; + + double wrstadv=WIN+1; + + double bestadv=0; + byte besttoy,besttox; + byte besty,bestx; + bestx=besty=besttox=besttoy=-100; + bool canmove=0; + + byte nexts ; + if(s == IMAGINARY || s == NORMAL ) + nexts=IMAGINARY; + else + nexts=ALT_IMG; + + for(y=0;y<8;y++){ + for(x=0;x<8;x++){ + if(fj && (s==NORMAL || s==ALT_NRM) && jumpagainy>=0 && (jumpagainy!=y || jumpagainx!=x) ) + continue; + if(game[y][x]*side>0){ + canmove=0; + memset(mvy,-1,4); + memset(mvx,-1,4); + if(fj) + canmove=jumps(y,x,mvy,mvx); + else + canmove=moves(y,x,mvy,mvx); + if(canmove){ + for(n=0;n<4;n++){ + if(mvy[n] != -1){//a real move + toy=mvy[n]; + tox=mvx[n]; + captured=cmove(y,x,toy,tox);//do the imaginary move + if(fj && can_jump(toy,tox) ) //its a double jump + nextturn=side; + else + nextturn=-side; + didking=king(toy,tox); + + //see the advantage you get + if(fj==1 && (s==ALT_NRM || s==NORMAL) ) + adv= DOESNT_MATTER;//you have to do the move anyway + else if(!depth){ + if(s==IMAGINARY || s==NORMAL)//calculating advantage only based on numerical superiority + adv=advantage(side); + else + adv=posadvantage(side);//taking to account the position of the pieces + } + else{ + if(nextturn==side) + adv=decide(nextturn,depth,nexts); + else{ //best move is the one that gives least advantage to the opponet + adv=decide(nextturn,depth-!fj,nexts); + if(adv==WIN) + adv=0; + else if(adv) + adv=1/adv; + else + adv=WIN; + } + } + //undo the imaginary move + if(didking) + game[toy][tox]/=2; + game[y][x]=game[toy][tox]; + game[toy][tox]=0; + if(fj) + game[(toy+y)/2][(tox+x)/2]=captured; + + if(besty<0 || adv>bestadv || (adv==bestadv && ( random()%2 )) ){ + besty=y; + bestx=x; + besttoy=toy; + besttox=tox; + bestadv=adv; + } + if(adv= 0 ){ + if(endgame && fj!=1 && s==NORMAL && bestadv==wrstadv ){//the algorithm is not given enough depth to determine which move is better + if(wrstadv == WIN){//the randomization in the algorithm may cause an illusion of an inevitable win in several moves + if(depth > 1) + decide(side,depth-1,NORMAL); + else + goto Move; + } + else + decide(side,depth,ALT_NRM);//change your opinion about what advantage means + } + else{ + Move: + cmove(besty,bestx,besttoy,besttox); + kinged=king(besttoy,besttox); + if(!kinged && can_jump(besttoy,besttox) ){ + jumpagainy = besttoy;//so the next player (itself) can only continue the chain of jumps from there + jumpagainx = besttox; + } + else + jumpagainy=jumpagainx=-1; + } + } + return bestadv; +} +//peacefully close when ^C is pressed +void sigint_handler(int x){ + endwin(); + puts("Quit."); + exit(x); +} + +void mouseinput(void){ + MEVENT minput; + getmouse(&minput); + if( minput.y-4 <8 && minput.x-1<16){ + py=minput.y-4; + px=(minput.x-1)/2; + } + else + return; + if(minput.bstate & (BUTTON1_CLICKED|BUTTON1_PRESSED|BUTTON1_RELEASED) ) + ungetch('\n'); +} +void help(void){ + erase(); + header(); + attron(A_BOLD); + mvprintw(3,0," **** THE CONTROLS ****"); + mvprintw(9,0,"YOU CAN ALSO USE THE MOUSE!"); + attroff(A_BOLD); + mvprintw(4,0,"RETURN/ENTER : Select or move the piece"); + mvprintw(5,0,"SPACE : Flag/Unflag"); + mvprintw(6,0,"hjkl/ARROW KEYS : Move cursor"); + mvprintw(7,0,"q : quit"); + mvprintw(8,0,"F1 & F2 : Help on controls & gameplay"); + mvprintw(11,0,"Press a key to continue"); + refresh(); + getch(); + erase(); +} +void gameplay(void){ + erase(); + header(); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("1) The game starts with each player having 12 men;\n"); + printw(" men can only diagonally move forwards \n"); + printw(" (toward the opponet's side).\n\n"); + printw("2) Men can become kings by reaching the opponet's \n"); + printw(" first rank; kings can diagonally move both forwards\n"); + printw(" and backwards.\n\n"); + printw("3) Pieces can capture opponet's pieces by jumping over them\n"); + printw(" also they can capture several pieces at once by doing a\n"); + printw(" chain of jumps.\n\n"); + printw("4) You have to do a jump if you can.\n\n"); + printw("5) A player wins when the opponet can't do a move e. g. \n"); + printw(" all of their pieces are captured.\n\n"); + refresh(); + getch(); + erase(); +} +int main(int argc,char** argv){ + dpt=4; + if(argc>2){ + printf("Usage: %s [AIpower]\n",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + if(sscanf(argv[1],"%d",&dpt) && dpt<128 && dpt>0) + ; + else{ + puts("That should be a number from 1 to 127."); + return EXIT_FAILURE; + } + } + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + noecho(); + cbreak(); + keypad(stdscr,1); + int input ; + printw("Dark plays first.\nChoose type of the dark player(H/c)\n" ); + input=getch(); + if(input=='c'){ + computer[0]=dpt; + printw("Computer.\n"); + } + else{ + computer[0]=0; + printw("Human.\n"); + } + printw("Choose type of the light player(h/C)\n"); + input=getch(); + if(input=='h'){ + computer[1]=0; + printw("Human.\n"); + } + else{ + computer[1]=dpt; + printw("Computer.\n"); + } + if(has_colors()){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_RED,-1); + } + signal(SIGINT,sigint_handler); + Start: + srandom(time(NULL)%UINT_MAX); + fill(); + cy=cx=-1; + py=px=0; + byte mvy[4],mvx[4]; + memset(mvy,-1,4); + memset(mvx,-1,4); + byte turn=1; + bool t=1; + bool fj; + byte result; + byte todraw=0; + double adv = 1;//used to determine when the game is a draw + double previousadv =1; + Turn: + jumpagainy=jumpagainx=-1; + kinged=0; + turn =-turn; + t=!t;//t == turn<0 that's turn in binary/array index format + fj = forced_jump(turn); + erase(); + flushinp(); + header(); + draw(3,0); + if(t){ + previousadv=adv; + adv= advantage(1) + (score[0]*score[1]);//just taking the dry scores to account too,nothing special + if(previousadv==adv) + todraw++; + else + todraw=0; + } + if(!score[0] || (turn==-1 && !fj && !can_move(-1))){ + result=1; + goto End; + } + else if(!score[1] || (turn==1 && !fj && !can_move(1))){ + result=-1; + goto End; + } + else if(todraw==50){ // 50 turns without any gains for each side + result=0; + goto End; + } + endgame= score[t]<=5 || score[!t]<=5; + draw(3,0); + refresh(); + while(computer[t]){ + mvprintw(13,0,"Thinking..."); + refresh(); + computer[t]=dpt+ (score[!t] != score[t]) + endgame; + decide(turn,computer[t],1); + if(!(fj && jumpagainy>=0 && !kinged )){ + goto Turn; + } + } + while(1){ + erase(); + draw(3,0); + header(); + refresh(); + input=getch(); + if( input == KEY_F(1) || input=='?' ) + help(); + if( input == KEY_F(2) ) + gameplay(); + if( input == KEY_MOUSE ) + mouseinput(); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py<7) + py++; + if( (input=='h' || input==KEY_LEFT) && px>0) + px--; + if( (input=='l' || input==KEY_RIGHT) && px<7) + px++; + if( input=='q'){ + result=2; + goto End; + } + if(input=='\n'){ + if(game[py][px]*turn>0){ + cy=py; + cx=px; + memset(mvy,-1,4); + memset(mvx,-1,4); + if(!fj) + moves(py,px,mvy,mvx); + jumps(py,px,mvy,mvx); + } + if( in(mvy,mvx,py,px) && !(jumpagainy>=0 && (cy !=jumpagainy || cx != jumpagainx) ) ){ + memset(mvy,-1,4); + memset(mvx,-1,4); + cmove(cy,cx,py,px); + kinged=king(py,px); + cy=-1; + cx=-1; + if( !(fj && can_jump(py,px) && !kinged ) ){ + goto Turn; + } + else{ + jumpagainy=py; + jumpagainx=px; + } + } + } + } + End: + move(13,0); + switch(result){ + case -1: + printw("The dark side has won the game."); + break; + case 0: + printw("Draw."); + break; + case 1: + printw("The light side has won the game."); + break; + case 2: + printw("You resigned."); + } + printw(" Wanna rematch?(y/n)"); + curs_set(1); + input=getch(); + if(result==2){ + if (input=='Y' || input=='y') + goto Start; + } + else if(input!='n' && input!='N' && input!= 'q'){ + /*byte b=computer[0]; //switch sides, i don't know if it's necessary + computer[0]=computer[1]; + computer[1]=b;*/ + goto Start; + } + endwin(); + return EXIT_SUCCESS; +} diff --git a/sources/config.h b/sources/config.h new file mode 100644 index 0000000..0320d18 --- /dev/null +++ b/sources/config.h @@ -0,0 +1,3 @@ +#define PP_SCORES "PipesScores" +#define JW_SCORES "JewelsScores" +//for easier access diff --git a/sources/jewels.c b/sources/jewels.c new file mode 100644 index 0000000..eaf65dc --- /dev/null +++ b/sources/jewels.c @@ -0,0 +1,389 @@ +#include +#include +#include +#include +#include +#include "config.h" +#define LEN 17 +#define WID 19 +#define DELAY 2 +#define SAVE_TO_NUM 10 + +/* +Jewels + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lnucrses + +A pair of jewels appear on top of the window, And you can move and rotate them while they are falling down. +If you make a vertical or horizontal row of 4 jewels they will explode and add up to your score. +Like Tetris,You will lose the game when the center of the uppermost row is filled. +*/ + +typedef signed char byte; +chtype board[LEN][WID]; +chtype colors[6]={0}; +chtype next1,next2; +byte jx,jy; //first jewel's position +byte kx,ky;//second jewel's position in relation to that of j +long score=0; +char* controls = "j,l-Move k-Rotate p-Pause q-Quit"; +FILE* scorefile; +byte scorewrite(long score){// only saves the top 10 + bool deforno; + if( !getenv("JW_SCORES") && (scorefile= fopen(JW_SCORES,"r")) ){ + deforno=1; + } + else{ + deforno=0; + if( !(scorefile = fopen(getenv("JW_SCORES"),"r")) ){ + fprintf(stderr,"\nNo accessible score files found. You can make an empty text file in %s/%s or set JW_SCORES to such a file to solve this. \n",getenv("HOME"),JW_SCORES); + exit(EXIT_SUCCESS); + } + } + + char namebuff[SAVE_TO_NUM][60]; + long scorebuff[SAVE_TO_NUM]; + + memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) ); + memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) ); + + long fuckingscore =0; + char fuckingname[60]={0}; + byte location=0; + + while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location=itreached || score>=scorebuff[location]) ){ + fprintf(scorefile,"%s : %ld\n",getenv("USER"),score); + ret=location; + wroteit=1; + } + if(location*>*>Top %d<*<*<\n",SAVE_TO_NUM); + while( rank>>"); + printf("%d) %s : %ld\n",rank+1,pname,pscore); + rank++; + } + putchar('\n'); +} +//apply gravity +bool fall(void){ + bool jfall,kfall,ret; + jfall=kfall=ret=0; + for(int y=LEN-1;y>0;y--){ + chtype c,d; + for(int x=WID-1;x>=0;x--){ + c=board[y][x]; + d=board[y-1][x]; + if(!c && d){ + board[y-1][x]=0; + board[y][x]=d; + if(y-1==jy && x==jx) + jfall=1; + if((y-1==jy+ky) && (x==jx+kx)) + kfall=1; + ret=1; + } + } + } + if(jfall&&kfall) + jy++; + else + jy = LEN+1; + return ret; +} +// rotate 90d clockwise in ky/x format +void clockwise(byte* y,byte* x){ + /* + o x + x xo o ox*/ + chtype fx,fy; + if(*y) + fy=0; + fx=-*y; + + if(*x) + fx=0; + fy=*x; + *y=fy; + *x=fx; +} + +//rtt jwls +bool rotate(void){//f:future + if(jy>LEN) + return 0; + byte fy,fx; + fy=ky;fx=kx; + clockwise(&fy,&fx); + if( jy+fy<0 || jy+fy>=LEN || jx+fx<0 || jx+fx>=WID ) + return 0; + if(board[jy+fy][jx+fx]) + return 0; + chtype a = board[jy+ky][jx+kx]; + board[jy+ky][jx+kx]=0; + ky=fy; + kx=fx; + board[jy+ky][jx+kx]=a; + return 1; +} +//mv jwls +bool jmove(byte dy,byte dx){ + if(jy>LEN) + return 0; + + if(jx+dx>=WID || jx+dx<0 || jx+kx+dx>=WID ||jx+kx+dx<0 || jy+dx<0 ||jx+dx+kx<0) + return 0; + if( board[jy+ky+dy][jx+kx+dx] ) + if( !(jy+ky+dy == jy && jx+kx+dx==jx) ) + return 0; + + if( board[jy+dy][jx+dx]) + if(!(dx==kx && dy==ky)) + return 0; + //still alive? + chtype a = board[jy][jx]; + chtype b = board[jy+ky][jx+kx]; + board[jy][jx]=0; + board[jy+ky][jx+kx]=0; + board[jy+dy][jx+dx]=a; + board[jy+ky+dy][jx+kx+dx]=b; + jy+=dy;jx+=dx; + return 1; +} +//scoring algorithm +bool explode(byte combo){ + bool ret =0; + chtype c,uc; + byte n; + byte y,x; + for(y=0;y=3 && x==WID-1){//the chain ends because the row ends + x++; + goto HrExplsn; + } + } + else if(n>=3){ + HrExplsn: + score+=n*10*(n-2)*combo; + ret=1; + for(;n>=0;n--) + board[y][x-1-n]=0; + n=0; + } + else + n=0; + } + } + for(x=0;x=3 && y==LEN-1){ + y++; + goto VrExplsn; + } + } + else if(n>=3){ + VrExplsn: + score+=n*10*(n-2)*combo; + ret=1; + for(;n>=0;n--) + board[y-1-n][x]=0; + n=0; + } + else + n=0; + } + } + return ret; +} + +//display +void draw(void){ + erase(); + int middle = (COLS/2-1)-(WID/2); + chtype a=A_STANDOUT|' '; + mvhline(LEN,middle-2,a,WID+4); + mvvline(0,middle-1,a,LEN); + mvvline(0,middle-2,a,LEN); + mvvline(0,middle+WID,a,LEN); + mvvline(0,middle+WID+1,a,LEN); + mvprintw(0,0,"Score:%d",score); + mvaddstr(1,0,"Next:"); + addch(next1); + addch(next2); + for(byte y=0;y= 10){ + falls=fall(); + stop=0; + } + else if(input=='l' || input==KEY_RIGHT) + jmove(0,+1); + else if(input=='j' || input==KEY_LEFT ) + jmove(0,-1); + else if(input=='k' || input==KEY_UP) + rotate(); + else if(input=='p'){ + mvaddstr(LINES-2,COLS/2-15,"Paused - Press a key to continue "); + refresh(); + nocbreak(); + cbreak(); + getch(); + halfdelay(DELAY); + } + else if(input=='q') + goto Lose; + else if(input==' ') + while( (falls=fall()) ) + stop=0; + else{ + falls=fall(); + stop=0; + } + draw(); + } + combo=1; + while(explode(combo)){ // explode, fall, explode, fall until nothing is left + combo++; + while(fall()); + draw(); + } + } + Lose: + nocbreak(); + endwin(); + printf("%s _Jewels_ %s\n",jwstr,jwstr); + printf("You have scored %ld points.\n",score); + showscores(scorewrite(score)); + return EXIT_SUCCESS; +} diff --git a/sources/mines.c b/sources/mines.c new file mode 100644 index 0000000..9d897be --- /dev/null +++ b/sources/mines.c @@ -0,0 +1,361 @@ +#include +#include +#include +#include +#include +#include +#define FLAG 9 +#define UNCLEAR 10 +/* +|\/| +| |INES + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +int len,wid,py,px,flags; +int untouched; +int mscount; +chtype colors[6]={0}; +void rectangle(int sy,int sx){ + for(int y=0;y<=len+1;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+wid*2,ACS_VLINE); + } + for(int x=0;x<=wid*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+len+1,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+len+1,sx,ACS_LLCORNER); + mvaddch(sy,sx+wid*2,ACS_URCORNER); + mvaddch(sy+len+1,sx+wid*2,ACS_LRCORNER); +} +//display +void draw(int sy,int sx,byte board[len][wid]){ + rectangle(sy,sx); + chtype attr ; + char prnt; + int y,x; + for(y=0;y9) + prnt='?'; + + mvaddch(sy+1+y,sx+x*2+1,attr|prnt); + } + } +} +//show the mines +void drawmines(int sy,int sx,byte board[len][wid],bool mines[len][wid]){ + int y,x; + for(y=0;y=0 && board[ty][tx] <9)//it has been click()ed before + return 0; + else{//untouched + if(board[ty][tx]==FLAG) + flags--; + board[ty][tx]=0; + untouched--; + + } + int y,x; + for(y=ty-1;y=len) + break; + for (x=tx-1;x=wid) + break; + + if(mines[y][x]) + board[ty][tx]++; + } + } + + if(!board[ty][tx]){//there are no mines in the adjacent tiles + for(y=ty-1;y=len) + break; + for(x=tx-1;x=wid) + break; + + click(board,mines,y,x); + } + + } + } + return 0; +} + +void sigint_handler(int x){ + endwin(); + puts("Quit."); + exit(x); +} +void mouseinput(int sy, int sx){ + MEVENT minput; + getmouse(&minput); + if( minput.y-4-sy : Scroll"); + mvprintw(12,0,"Press a key to continue"); + refresh(); + getch(); + erase(); +} +void gameplay(void){ + erase(); + mvprintw(1,0,"|\\/|"); + mvprintw(2,0,"| |INES"); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + mvprintw(4,0,"Try to find the landmines in the field\n"); + printw("with logical reasoning: When you click\n"); + printw("on a tile ( a '.' here), numbers may show\n"); + printw("up that indicate the number of landmines\n"); + printw("in adjacent tiles; you should find and \n"); + printw("avoid the landmines based on them; and\n"); + printw("clicking on a landmine would make you\n"); + printw("lose the game."); + refresh(); + getch(); + erase(); +} +int main(int argc, char** argv){ + signal(SIGINT,sigint_handler); + if(argc>4 || (argc==2 && !strcmp("help",argv[1])) ){ + printf("Usage: %s [len wid [minescount]]\n",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + puts("Give both dimensions."); + return EXIT_FAILURE; + } + if(argc>=3){ + bool lool = sscanf(argv[1],"%d",&len) && sscanf(argv[2],"%d",&wid); + if(!lool){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if(len<5 || wid<5 || len>1000 || wid>1000){ + puts("At least one of your given dimensions is either too small or too big."); + return EXIT_FAILURE; + } + + } + else + len=wid=8; + if(argc==4){ + if( !sscanf(argv[3],"%d",&mscount)){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if( mscount<5 || mscount>= len*wid){ + puts("Too few/many mines."); + return EXIT_FAILURE; + } + } + else + mscount = len*wid/6; + srandom(time(NULL)%UINT_MAX); + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + noecho(); + cbreak(); + keypad(stdscr,1); + if(has_colors()){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_BLUE,-1); + init_pair(2,COLOR_GREEN,-1); + init_pair(3,COLOR_YELLOW,-1); + init_pair(4,COLOR_RED,-1); + init_pair(5,COLOR_RED,COLOR_YELLOW); + init_pair(6,COLOR_RED,COLOR_MAGENTA); + for(byte b= 0;b<6;b++){ + colors[b]=COLOR_PAIR(b+1); + } + + } + byte board[len][wid]; + bool mines[len][wid]; + char result[70]; + int input; + int sy,sx; + Start: + sy=sx=0; + py=px=0; + untouched=len*wid; + flags=0; + curs_set(0); + memset(board,-1,len*wid); + memset(mines,false,len*wid); + mine(mines); + + while(1){ + erase(); + mvprintw(sy+1,sx+0,"|\\/| Flags:%d\n",flags); + mvprintw(sy+2,sx+0,"| |INES Mines:%d\n",mscount); + draw(sy+3,sx+0,board); + refresh(); + if(untouched<=mscount){ + strcpy(result,"YAY!!"); + break; + } + input = getch(); + if( input==KEY_PPAGE && LINES< len+3){//the board starts in 3 + sy+=10; + if(sy>0) + sy=0; + } + if( input==KEY_NPAGE && LINES< len+3){ + sy-=10; + if(sy< -(len+3) ) + sy=-(len+3); + } + if( input=='<' && COLS< wid*2+1){ + sx+=10; + if(sx>0) + sx=0; + } + if( input=='>' && COLS< wid*2+1){ + sx-=10; + if(sx< -(wid*2+1)) + sx=-(wid*2+1); + } + if( input==KEY_F(1) || input=='?' ) + help(); + if( input==KEY_F(2) ) + gameplay(); + if( input==KEY_MOUSE ) + mouseinput(sy,sx); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py0) + px--; + if( (input=='l' || input==KEY_RIGHT) && px +#include +#include +#include +#include +#include +#include "config.h" +#define UP 1 +#define RIGHT 2 +#define DOWN 4 +#define LEFT 8 +#define CROSSOVER 15 +#define FILLED 16 +#define SPILL 13 +#define FLOWDELAY 5 +#define DELAY 3 +#define SAVE_TO_NUM 10 +#define SY 0 +#define SX 7 +/* + _ +|_) +| IPES + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +typedef unsigned char bitbox; +int len,wid,py,px,fy,fx;//p: pointer f: fluid +bitbox tocome[5]={0};//the row of pipes in the left side +chtype green=A_BOLD;//will use bold font instead of green if colors are not available +long score; +FILE* scorefile; +char error [150]={0}; + +void logo(void){ + mvprintw(0,0," _ "); + mvprintw(1,0,"|_)"); + mvprintw(2,0,"| IPES"); +} + +byte scorewrite(void){// only saves the top 10, returns the place in the chart + bool deforno; + if( !getenv("PP_SCORES") && (scorefile= fopen(PP_SCORES,"r")) ){ + deforno=1; + } + else{ + deforno=0; + if( !(scorefile = fopen(getenv("PP_SCORES"),"r")) ){ + sprintf(error,"No accessible score files found. You can make an empty text file in %s/%s or set PP_SCORES to such a file to solve this.",getenv("HOME"),PP_SCORES); + return -1; + } + } + + char namebuff[SAVE_TO_NUM][60]; + long scorebuff[SAVE_TO_NUM]; + + memset(namebuff,0,SAVE_TO_NUM*60*sizeof(char) ); + memset(scorebuff,0,SAVE_TO_NUM*sizeof(long) ); + + long fuckingscore =0; + char fuckingname[60]={0}; + byte location=0; + + while( fscanf(scorefile,"%59s : %ld\n",fuckingname,&fuckingscore) == 2 && location=itreached || score>=scorebuff[location]) ){ + fprintf(scorefile,"%s : %ld\n",getenv("USER"),score); + ret=location; + wroteit=1; + } + if(location0){ + byte a = (len-9)/2; + attron(A_BOLD); + mvprintw(SY,SX, "**** ***"); + mvprintw(SY+len+1,SX,"***********************"); + attroff(A_BOLD); + attron(green); + mvprintw(SY,SX+4,"CONGRATULATIONS!"); + attroff(green); + + mvprintw(SY+a+1,SX," _____ You bet the"); + mvprintw(SY+a+2,SX," .' | previous"); + mvprintw(SY+a+3,SX," .' | record"); + mvprintw(SY+a+4,SX," | .| | of"); + mvprintw(SY+a+5,SX," |.' | |%11ld",formerscore); + mvprintw(SY+a+6,SX," | | held by"); + mvprintw(SY+a+7,SX," ___| |___%7s!",formername); + mvprintw(SY+a+8,SX," | |"); + mvprintw(SY+a+9,SX," |____________|"); + mvprintw(len+2,0,"Game over! Press a key to proceed:"); + refresh(); + getch(); + erase(); + logo(); + } + + } + attron(A_BOLD); + mvprintw(3,0," HIGH"); + mvprintw(4,0,"SCORES"); + attroff(A_BOLD); + //scorefile is still open with w+ + char pname[60] = {0}; + long pscore=0; + byte rank=0; + rewind(scorefile); + while( rank>>"); + printw("%d",rank+1); + attroff(green); + printw(") %s : %ld",pname,pscore); + rank++; + } + refresh(); +} +//move in direction +void MID(bitbox direction){ + switch(direction){ + case UP: + fy--; + break; + case DOWN: + fy++; + break; + case LEFT: + fx--; + break; + case RIGHT: + fx++; + break; + } +} +bitbox opposite(bitbox direction){ + switch(direction){ + case UP: + return DOWN; + case DOWN: + return UP; + case LEFT: + return RIGHT; + case RIGHT: + return LEFT; + } + return 0; +} +void rectangle(void){ + for(int y=0;y<=len;y++){ + mvaddch(SY+y,SX,ACS_VLINE); + mvaddch(SY+y,SX+wid+1,ACS_VLINE); + } + for(int x=0;x<=wid;x++){ + mvaddch(SY,SX+x,ACS_HLINE); + mvaddch(SY+len+1,SX+x,ACS_HLINE); + } + mvaddch(SY,SX,ACS_ULCORNER); + mvaddch(SY+len+1,SX,ACS_LLCORNER); + mvaddch(SY,SX+wid+1,ACS_URCORNER); + mvaddch(SY+len+1,SX+wid+1,ACS_LRCORNER); +} +//this generates the pipes... +bitbox pipegen(void){ + if(random()%17){//17 so all forms have the same chance + byte a=random()%4; + byte b; + do{ + b=random()%4; + }while(b==a); + return (1 << a) | ( 1 << b); + } + else + return CROSSOVER;//sum of all directions, the crossover + +} +//.. and this is only for display +void addpipe(int y,int x,bitbox pipe , bool highlight){ + bitbox p= pipe & ~FILLED; + chtype foo ; + switch(p){ + case UP|RIGHT : + foo= ACS_LLCORNER; + break; + case UP|DOWN : + foo=ACS_VLINE; + break; + case UP|LEFT : + foo=ACS_LRCORNER; + break; + case DOWN|RIGHT : + foo =ACS_ULCORNER; + break; + case DOWN|LEFT : + foo=ACS_URCORNER; + break; + case LEFT|RIGHT: + foo=ACS_HLINE; + break; + case RIGHT: + foo = '>'; + break; + case LEFT: + foo = '<'; + break; + case UP: + foo = '^'; + break; + case DOWN: + foo = 'v'; + break; + case CROSSOVER: //all + foo = ACS_PLUS; + break; + default: + foo = ' '; + break; + } + if( pipe & FILLED ) + foo |= green; + mvaddch(y,x, foo|(highlight*A_REVERSE) ); +} +//display +void draw(bitbox board[len][wid]){ + int y,x; + for(y=0;y3 || (argc==2 && !strcmp("help",argv[1])) ){ + printf("Usage: %s [len wid]\n",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + puts("Give both dimensions."); + return EXIT_FAILURE; + } + if(argc==3){ + bool lool = sscanf(argv[1],"%d",&len) && sscanf(argv[2],"%d",&wid); + if(!lool){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if(len<5 || wid<5 || len>1000 || wid>1000){ + puts("At least one of your given dimensions is too small or too big."); + return EXIT_FAILURE; + } + + } + else{ + wid=20; + len=14; + } + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + time_t tstart , now, lasttime, giventime=len*wid/4; + srandom(time(NULL)%UINT_MAX); + bitbox direction,board[len][wid]; + int input; + byte foo; + bool flow,fast; + Start: //TODO in all the games, some things have to be moved behind the start . definize sy and sx + flow=0; + fast=0; + score=0; + memset(error,0,150); + memset(board,0,len*wid); + fy=1+(random()%(len-2) ); + fx=1+(random()%(wid-2) ); + board[fy][fx]= 1 << (random()%4); + direction= board[fy][fx]; + board[fy][fx]|=FILLED; + for(foo=0;foo<5;foo++) + tocome[foo]=pipegen(); + tstart = time(NULL); + lasttime=0; + initscr(); + curs_set(0); + noecho(); + cbreak(); + halfdelay(DELAY); + keypad(stdscr,1); + if(has_colors()){ + start_color(); + use_default_colors(); + init_pair(2,COLOR_GREEN,-1); + green=COLOR_PAIR(2); + + } + py=px=0; + while(1){ + now=time(NULL); + erase(); + logo(); + if(fast){ + attron(A_BOLD); + mvprintw(3,0," FAST"); + attroff(A_BOLD); + } + + if(!flow && giventime >= now-tstart){ + mvprintw(4,0,"Time:%ld",giventime-(now-tstart)); + mvprintw(5,0,"Score:"); + mvprintw(6,0,"%ld",score); + } + else{ + mvprintw(4,0,"Score:"); + mvprintw(5,0,"%ld",score); + } + for(foo=0;foo<5;foo++) + addpipe(11-foo,4,tocome[foo],0); + draw(board); + refresh(); + + if(now-tstart == giventime){ + flow=1; + } + if(flow && (fast || ( !(now%FLOWDELAY)&& now!=lasttime ) )){ + lasttime = now; + MID(direction); + if(fy=0&& fx>=0 && ( board[fy][fx]&opposite(direction) ) ){ + if(board[fy][fx] != CROSSOVER && board[fy][fx] != (CROSSOVER|FILLED) ) + direction = board[fy][fx] & ~opposite(direction); + score++; + if(fast) + score++; + } + else + goto End; + board[fy][fx]|=FILLED; + } + + input = getch(); + if( input == KEY_F(1) || input=='?' ){ + help(); + if(!flow) + tstart += time(NULL)-now; + } + if( input == KEY_F(2) ){ + gameplay(); + if(!flow) + tstart += time(NULL)-now; + } + if( input == KEY_MOUSE ) + mouseinput(); + if( (input=='k' || input==KEY_UP) && py>0 ) + py--; + if( (input=='j' || input==KEY_DOWN) && py0 ) + px--; + if( (input=='l' || input==KEY_RIGHT) && px +#include +#include +#include +#include +#include +#define UP 1 +#define RIGHT 2 +#define DOWN 4 +#define LEFT 8 +#define VISITED 16 +#define CARROT 32 +/* + _ +|_) +| \ABBITHOLE + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +typedef unsigned char bitbox; +int len,wid,py,px; + +chtype colors[6]={0}; + +typedef struct point{ + int y; + int x; +} point; + +point MID(int y,int x,bitbox direction){//move in direction + point pt = {y,x}; + switch(direction){ + case UP: + pt.y--; + return pt; + case DOWN: + pt.y++; + return pt; + case LEFT: + pt.x--; + return pt; + case RIGHT: + pt.x++; + return pt; + } + return pt; +} +void rectangle(int sy,int sx){ + for(int y=0;y<=len*2;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+wid*2,ACS_VLINE); + } + for(int x=0;x<=wid*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+len*2,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+len*2,sx,ACS_LLCORNER); + mvaddch(sy,sx+wid*2,ACS_URCORNER); + mvaddch(sy+len*2,sx+wid*2,ACS_LRCORNER); +} + +void draw(int sy,int sx,bitbox board[len][wid]){ + int y,x; + bitbox d; + chtype prnt; + point pt; + for(y=0;y : Scroll"); + mvprintw(10,0,"Press a key to continue"); + + refresh(); + while ( getch()==ERR ); + erase(); +} +void gameplay(void){ + erase(); + mvprintw(0,0," _ "); + mvprintw(1,0,"|_)"); + mvprintw(2,0,"| \\ABBITHOLE"); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("Try to gather all the carrots in the maze\n"); + printw("in the given time. The determining factors\n"); + printw("are your choice of paths and the speed of\n "); + printw("your fingers.\n"); + refresh(); + while ( getch()==ERR ); + erase(); +} +void sigint_handler(int x){ + endwin(); + puts("Quit."); + exit(x); +} +int main(int argc, char** argv){ + bool autoset=0; + signal(SIGINT,sigint_handler); + if(argc>3 || (argc==2 && !strcmp("help",argv[1])) ){ + printf("Usage: %s [len wid]\n",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + puts("Give both dimensions."); + return EXIT_FAILURE; + } + if(argc==3){ + bool lool = sscanf(argv[1],"%d",&len) && sscanf(argv[2],"%d",&wid); + if(!lool){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if(len<5 || wid<5 || len>800 || wid>800){ + puts("At least one of your given dimensions is either too small or too big."); + return EXIT_FAILURE; + } + + } + else{ + autoset=1; + } + initscr(); + if(autoset){ + if((LINES-7)/2 < 10) + len=10; + else + len=(LINES-7)/2; + + if((COLS-5)/2 < 20) + wid=20; + else + wid=(COLS-5)/2; + } + int carrot_count= (len*wid)/50; + int carrots_found; + time_t tstart , now, giventime=len*wid/5; + srandom(time(NULL)%UINT_MAX); + point start={0,0}; + bitbox board[len][wid]; + int sy,sx; + Start: + tstart = time(NULL); + carrots_found=0; + initscr(); + curs_set(0); + noecho(); + cbreak(); + halfdelay(3); + keypad(stdscr,1); + if(has_colors()){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_BLUE,-1); + init_pair(2,COLOR_GREEN,-1); + init_pair(3,COLOR_YELLOW,-1); + init_pair(4,COLOR_RED,-1); + init_pair(5,COLOR_RED,COLOR_YELLOW); + init_pair(6,COLOR_RED,COLOR_MAGENTA); + for(byte b= 0;b<6;b++){ + colors[b]=COLOR_PAIR(b+1); + } + + } + sy=sx=0; + py=px=0; + memset(board,0,len*wid); + make_maze(board,start); + carrotify(board,carrot_count); + int input; + while(1){ + board[py][px] |= VISITED; + if( board[py][px] & CARROT ){ + carrots_found++; + board[py][px] &= ~CARROT; + } + now=time(NULL); + erase(); + mvprintw(sy+0,sx+0," _ "); + mvprintw(sy+1,sx+0,"|_) Time left :%ld",giventime-(now-tstart)); + mvprintw(sy+2,sx+0,"| \\ABBITHOLE Carrots left :%d",carrot_count-carrots_found); + draw(sy+3,sx+0,board); + refresh(); + if(carrots_found==carrot_count || now-tstart == giventime){ + flushinp(); + break; + } + input = getch(); + if( input==KEY_PPAGE && LINES< len+3){//the board starts in 3 + sy+=10; + if(sy>0) + sy=0; + } + if( input==KEY_NPAGE && LINES< len+3){ + sy-=10; + if(sy< -(len+3) ) + sy=-(len+3); + } + if( input=='<' && COLS< wid*2+1){ + sx+=10; + if(sx>0) + sx=0; + } + if( input=='>' && COLS< wid*2+1){ + sx-=10; + if(sx< -(wid*2+1)) + sx=-(wid*2+1); + } + if( input == KEY_F(1) || input=='?' ) + help(); + if( (input=='k' || input==KEY_UP) && py>0 && (board[py][px]&UP) ) + py--; + if( (input=='j' || input==KEY_DOWN) && py0 && (board[py][px]&LEFT) ) + px--; + if( (input=='l' || input==KEY_RIGHT) && px +#include +#include +#include +/* + _ +|_) +| \EVERSI + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +byte py,px;//cursor +const char piece[2] = "OX"; +char game[8][8];//main board +byte computer[2] = {0,0}; +byte score[2];//set by header() + +void rectangle(byte sy,byte sx){ + for(byte y=0;y<=8+1;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+8*2,ACS_VLINE); + } + for(byte x=0;x<=8*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+8+1,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+8+1,sx,ACS_LLCORNER); + mvaddch(sy,sx+8*2,ACS_URCORNER); + mvaddch(sy+8+1,sx+8*2,ACS_LRCORNER); +} + +void header(void){//abuse, used to count the pieces on each side too + score[0]=score[1]=0; + for(byte y=0;y<8;y++){ + for(byte x=0;x<8;x++){ + if(game[y][x]){ + if(game[y][x]==piece[0]) + score[0]++; + else + score[1]++; + } + } + } + mvaddch(0,1, '_'); + mvprintw(1,0,"|_) %2d:%2d",score[0],score[1]); + mvprintw(2,0,"| \\EVERSI "); +} + +void draw(byte sy,byte sx){//the game's board + rectangle(sy,sx); + chtype attr ; + for(byte y=0;y<8;y++){ + for(byte x=0;x<8;x++){ + attr=A_NORMAL; + if(y==py && x==px) + attr |= A_STANDOUT; + if(game[y][x]) + mvaddch(sy+1+y,sx+x*2+1,attr|game[y][x]); + else + mvaddch(sy+1+y,sx+x*2+1,attr|'.'); + } + } +} + +bool can_reverse(byte ty , byte tx,char board[8][8],char piece){//can place a piece there? + byte y,x,count; + if(board[ty][tx]) + return false; + for(byte dy=-1;dy<2;dy++){ //changes the direction + for(byte dx=-1;dx<2;dx++){ + if(dx==0&&dy==0)//it would be itself + dx=1; + count=0; + y=ty+dy; + x=tx+dx; + while(1){ + if(y<0 || y>=8 ||x<0 || x>=8){//reaches edges of the board + count=0; + break; + } + if(!board[y][x]){//gap + count=0; + break; + } + + if(board[y][x]!=piece){ + count++; + y+=dy; + x+=dx; + } + else + break;//same color + } + if(count) + return true; + } + } + return false; +} + +void reverse(byte ty,byte tx,char board[8][8],char piece){//place a piece there + board[ty][tx]=piece; + byte y,x; + for(byte dy=-1;dy<2;dy++){//changes the direction + for(byte dx=-1;dx<2;dx++){ + if(dy==0 && dx==0) + dx=1; + y=ty+dy; + x=tx+dx; + while(1){ + if(y<0 || y>=8 || x<0 || x>=8) + break; + if(!board[y][x]) + break; + if(board[y][x]!=piece){ + y+=dy; + x+=dx; + } + else{ //of same kind + while(y!=ty || x!=tx){ //reverse the disks + board[y][x]=piece; + y-=dy; + x-=dx; + } + break; + } + } + } + } +} + +bool can_move(char board[8][8],char piece){//can move at all? + for(byte y=0;y<8;y++) + for(byte x=0;x<8;x++) + if(can_reverse(y,x,board,piece)) + return true; + return false; +} + +double advantage(char board[8][8],char piece){ + double own=0; + double opp=0; + for(byte y=0;y<8;y++){ + for(byte x=0;x<8;x++){ + if(board[y][x]){ + if(board[y][x]==piece){ + own++; + if( ((y==7 || y==0)&&(x!=7 && x!=0)) || ((x==7 || x==0)&&(y!=7 && y!=0)) )//edges + own+=100; + if( (y==7 || y==0)&&(x==7 || x==0) )//corners + own+=10000; + } + else{ + opp++; + if( ((y==7 || y==0)&&(x!=7 && x!=0)) || ((x==7 || x==0)&&(y!=7 && y!=0)) ) + opp+=100; + if( (y==7 || y==0)&&(x==7 || x==0) ) + opp+=10000; + } + } + + } + } + return own/opp; +} + +void cp(char A[8][8],char B[8][8]){//copy the board A to B + for(byte y=0;y<8;y++) + for(byte x=0;x<8;x++) + B[y][x]=A[y][x]; +} + +double decide(char board[8][8],char piece,char opponet,byte depth){//AI algorithm + if(!can_move(board,piece)) + return 0; + char plan[8][8]; + double adv,bestadv; + adv=bestadv=0; + byte besty,bestx; + for(byte y=0;y<8;y++){ + for(byte x=0;x<8;x++){ + if(can_reverse(y,x,board,piece) ){ + cp(board,plan);//backtrack + reverse(y,x,plan,piece); + if(depth){ + adv= decide(plan,opponet,piece,depth-1);//least benefit for the opponet + if(adv) //the opponet can make a move + adv = 1/adv; + else + adv=advantage(plan,piece); + } + else + adv=advantage(plan,piece); + if(adv>bestadv){ + bestadv=adv; + besty=y; + bestx=x; + } + } + } + } + reverse(besty,bestx,board,piece);//do the move + return bestadv; +} +//peacefully close when ^C is pressed +void sigint_handler(int x){ + endwin(); + puts("Quit."); + exit(x); +} +void mouseinput(void){ + MEVENT minput; + getmouse(&minput); + if( minput.y-4 <8 && minput.x-1<16){ + py=minput.y-4; + px=(minput.x-1)/2; + } + else + return; + if(minput.bstate & BUTTON1_CLICKED) + ungetch('\n'); +} +void help(void){ + erase(); + header(); + attron(A_BOLD); + mvprintw(3,0," **** THE CONTROLS ****"); + mvprintw(8,0,"YOU CAN ALSO USE THE MOUSE!"); + attroff(A_BOLD); + mvprintw(4,0,"RETURN/ENTER : Put the piece"); + mvprintw(5,0,"hjkl/ARROW KEYS : Move cursor"); + mvprintw(6,0,"q : Quit"); + mvprintw(7,0,"F1 & F2 : Help on controls & gameplay"); + mvprintw(10,0,"Press a key to continue"); + curs_set(1); + getch(); +} +void gameplay(void){ + erase(); + header(); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("Players take turns placing disks on the board:\n\n"); + printw("1) Any pieces of the opponet's color that is bounded\n"); + printw(" in a straight line between the piece just placed and\n"); + printw(" another piece of the current player's color would turn\n"); + printw(" to the current player's color.\n\n"); + printw("2) You can only put pieces if at least one of your \n"); + printw(" opponet's pieces turns into your color.\n\n"); + printw("3) The game ends when neither side can do a move and\n"); + printw(" the player with more pieces wins.\n"); + getch(); +} +int main(int argc , char** argv){ + int depth=2; + if(argc>2){ + printf("Usage:%s [AIpower]",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + if(sscanf(argv[1],"%d",&depth) && depth<128 && 0=2)//both sides cant move, the game ends + goto End; + + turn = !turn; + if(computer[turn]){ + if(can_move(game,piece[turn])){ + mvprintw(13,0,"Thinking..."); + refresh(); + decide(game,piece[turn],piece[!turn],computer[turn]); + cantmove=0; + } + else + cantmove++; + goto Turn; + + } + + if(!can_move(game,piece[turn])){ + cantmove++; + goto Turn; + } + else{ + cantmove=0; + while(1){ //human control + erase(); + header(); + draw(3,0); + input=getch(); + if( input==KEY_F(1) || input=='?' ) + help(); + if( input==KEY_F(2) ) + gameplay(); + if( input==KEY_MOUSE ) + mouseinput(); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py<7) + py++; + if( (input=='h' || input==KEY_LEFT) && px>0) + px--; + if( (input=='l' || input==KEY_RIGHT) && px<7) + px++; + if( input=='q'){ + resign=1; + goto End; + } + if(input=='\n'){ + if(can_reverse(py,px,game,piece[turn])){ + reverse(py,px,game,piece[turn]); + goto Turn; + } + + } + + } + } + End: + if(resign) + mvprintw(13,0,"You resigned."); + else if(score[0]==score[1]) + mvprintw(13,0,"Draw!!"); + else if(score[0] > score[1]) + mvprintw(13,0,"'%c' won.",piece[0]); + else + mvprintw(13,0,"'%c' won.",piece[1]); + + printw(" Wanna play again?(y/n)"); + curs_set(1); + input=getch(); + if( resign){ + if (input=='Y' || input=='y') + goto Start; + } + else if(input != 'N' && input != 'n' && input != 'q') + goto Start; + endwin(); + return EXIT_SUCCESS; +} diff --git a/sources/sos.c b/sources/sos.c new file mode 100644 index 0000000..80b2b7a --- /dev/null +++ b/sources/sos.c @@ -0,0 +1,403 @@ +#include +#include +#include +#include +#include +#include +#define NOTHING 123 +/* + _ _ _ +(_'| |(_' +._):_:._) + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses +*/ +typedef signed char byte; +int len,wid,py,px; +chtype colors[6]={A_BOLD}; +int score[2] ={0}; +int computer[2]={0}; +char so[2] = {'S','O'}; + +char rd(char board[len][wid],int y, int x){ + if(y<0 || x<0 || y>= len || x>=wid) + return NOTHING; + else + return board[y][x]; +} +void color(byte colored[len][wid],int y,int x,bool side){ + if(colored[y][x] == !side || colored[y][x]==2) + colored[y][x]=2; + else + colored[y][x]=side; +} +void rectangle(int sy,int sx){ + for(int y=0;y<=len+1;y++){ + mvaddch(sy+y,sx,ACS_VLINE); + mvaddch(sy+y,sx+wid*2,ACS_VLINE); + } + for(int x=0;x<=wid*2;x++){ + mvaddch(sy,sx+x,ACS_HLINE); + mvaddch(sy+len+1,sx+x,ACS_HLINE); + } + mvaddch(sy,sx,ACS_ULCORNER); + mvaddch(sy+len+1,sx,ACS_LLCORNER); + mvaddch(sy,sx+wid*2,ACS_URCORNER); + mvaddch(sy+len+1,sx+wid*2,ACS_LRCORNER); +} + +void draw(int sy,int sx,char board[len][wid],byte colored[len][wid]){ + rectangle(sy,sx); + chtype attr ; + char prnt; + int y,x; + for(y=0;y=0) + attr |= colors[colored[y][x]]; + if( board[y][x] ) + prnt = board[y][x]; + else + prnt = '_'; + mvaddch(sy+1+y,sx+x*2+1,attr|prnt); + } + } +} + +byte did_sos(char board[len][wid], int y , int x ){ + byte dy,dx; + byte soses=0; + if(board[y][x]== 'S'){ + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if(rd(board,y+dy,x+dx)=='O' && rd(board,y+2*dy,x+2*dx) == 'S' ) + soses++; + } + } + return soses; + } + else if(board[y][x]== 'O'){ + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if(rd(board,y+dy,x+dx)=='S' && rd(board,y-dy,x-dx) =='S') + soses++; + } + } + return soses/2; + } + return 0; +} +void color_sos(char board[len][wid],byte colored[len][wid], int y , int x ,bool side){ + byte dy,dx; + if(board[y][x]== 'S'){ + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if(rd(board,y+dy,x+dx)=='O' && rd(board,y+2*dy,x+2*dx) == 'S' ){ + color(colored,y,x,side); + color(colored,y+dy,x+dx,side); + color(colored,y+2*dy,x+2*dx,side); + } + } + } + } + else if(board[y][x]== 'O'){ + for(dy=-1;dy<2;dy++){ + for(dx=-1;dx<2;dx++){ + if(rd(board,y+dy,x+dx)=='S' && rd(board,y-dy,x-dx) =='S'){ + color(colored,y,x,side); + color(colored,y+dy,x+dx,side); + color(colored,y-dy,x-dx,side); + } + } + } + } +} +void randmove(int* y,int* x,byte* c){ + *y=random()%len; + *x=random()%wid; + *c=random()%2; +} +int decide ( char board[len][wid],byte colored[len][wid], byte depth , byte side ){ //the move is imaginary if side is negative + int adv,bestadv; + int oppadv; + int besty,bestx; + char bestchar; + byte c; + oppadv=adv=bestadv=INT_MIN; + besty=bestx=-1; + int y,x; + + int ry,rx; + byte rc; + randmove(&ry,&rx,&rc);//provides efficient randomization + for(y=0;y0) + oppadv= decide(board,NULL,depth-1,-1); + if(depth>0 && oppadv != INT_MIN)//this has no meanings if the opponet cannot move + adv-=1*oppadv; + if(besty<0 ||adv>bestadv || (adv==bestadv && y==ry && x==rx && c==rc /*c==0*/) ){ + bestadv=adv; + besty=y; + bestx=x; + bestchar=so[c]; + } + board[y][x]=0; + } + } + } + } + if(besty>=0 && side >= 0 ){ + board[besty][bestx]=bestchar; + score[side]+= did_sos(board,besty,bestx); + color_sos(board,colored,besty,bestx,side); + } + return bestadv; +} +bool isfilled(char board[len][wid]){ + int y,x; + for(y=0;y : Scroll"); + mvprintw(11,0,"Press a key to continue"); + refresh(); + getch(); + erase(); +} +void gameplay(void){ + erase(); + mvprintw(0,0," _ _ _"); + mvprintw(1,0,"(_'| |(_' "); + mvprintw(2,0,"._):_:._) "); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("The game is similiar to Tic Tac Toe:\n"); + printw("The players write S and O in the squares\n"); + printw("and making the straight connected sequence\n"); + printw("S-O-S makes you a score; obviously, the\n"); + printw("player with a higher score wins."); + refresh(); + getch(); + erase(); +} +int main(int argc, char** argv){ + int dpt=1; + signal(SIGINT,sigint_handler); + if(argc>4 || (argc==2 && !strcmp("help",argv[1])) ){ + printf("Usage: %s [len wid [AIpower]]\n",argv[0]); + return EXIT_FAILURE; + } + if(argc==2){ + puts("Give both dimensions."); + return EXIT_FAILURE; + } + if(argc>=3){ + bool lool = sscanf(argv[1],"%d",&len) && sscanf(argv[2],"%d",&wid); + if(!lool){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if(len<3 || wid<3 || len>300 || wid>300){ + puts("At least one of your given dimensions is either too small or too big."); + return EXIT_FAILURE; + } + + } + else{ + len=5; + wid=6; + } + if(argc==4){ + if( !sscanf(argv[3],"%d",&dpt)){ + puts("Invalid input."); + return EXIT_FAILURE; + } + if( dpt<1 || dpt>= 127){ + puts("That should be between 1 and 127."); + return EXIT_FAILURE; + } + } + srandom(time(NULL)%UINT_MAX); + int input; + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + curs_set(0); + noecho(); + cbreak(); + keypad(stdscr,1); + printw("Black plays first.\n Choose the type of the blue player(H/c)\n" ); + input=getch(); + if(input=='c'){ + computer[0]=dpt; + printw("Computer.\n"); + } + else{ + computer[0]=0; + printw("Human.\n"); + } + printw("Choose the type of the yellow player(h/C)\n"); + input=getch(); + if(input=='h'){ + computer[1]=0; + printw("Human.\n"); + } + else{ + computer[1]=dpt; + printw("Computer.\n"); + } + if(has_colors()){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_BLUE,-1); + init_pair(2,COLOR_YELLOW,-1); + init_pair(3,COLOR_GREEN,-1); + for(byte b= 0;b<6;b++){ + colors[b]=COLOR_PAIR(b+1); + } + + } + int sy,sx; + Start: + sy=sx=0;//for scrolling + py=px=0; + char board[len][wid]; + byte colored[len][wid]; + bool t=1; + score[0]=score[1]=0; + memset(board,0,len*wid); + memset(colored,-1,len*wid); + Turn: + erase(); + mvprintw(sy+0,sx+0," _ _ _"); + mvprintw(sy+1,sx+0,"(_'| |(_' %d vs %d \n",score[0],score[1]); + mvprintw(sy+2,sx+0,"._):_:._) \n"); + draw(sy+3,sx+0,board,colored); + if( isfilled(board) ) + goto End; + refresh(); + t=!t; + if(computer[t]){ + mvprintw(sy+len+5,sx+0,"Thinking..."); + refresh(); + decide(board,colored,dpt,t); + goto Turn; + } + //else + while(1){ + erase(); + mvprintw(sy+0,sx+0," _ _ _"); + mvprintw(sy+1,sx+0,"(_'| |(_' %d vs %d \n",score[0],score[1]); + mvprintw(sy+2,sx+0,"._):_:._) \n"); + draw(sy+3,sx+0,board,colored); + refresh(); + input = getch(); + if( input==KEY_PPAGE && LINES< len+3){//the board starts in 3 + sy+=10; + if(sy>0) + sy=0; + } + if( input==KEY_NPAGE && LINES< len+3){ + sy-=10; + if(sy< -(len+3) ) + sy=-(len+3); + } + if( input=='<' && COLS< wid*2+1){ + sx+=10; + if(sx>0) + sx=0; + } + if( input=='>' && COLS< wid*2+1){ + sx-=10; + if(sx< -(wid*2+1)) + sx=-(wid*2+1); + } + if( input==KEY_F(1) || input=='?') + help(); + if( input==KEY_F(2) ) + gameplay(); + if( input==KEY_MOUSE ) + mouseinput(sy,sx); + if( (input=='k' || input==KEY_UP) && py>0) + py--; + if( (input=='j' || input==KEY_DOWN) && py0) + px--; + if( (input=='l' || input==KEY_RIGHT) && pxscore[0]) +1); + printw(" Wanna play again?(y/n)"); + curs_set(1); + flushinp(); + input=getch(); + curs_set(0); + if(input != 'N' && input != 'n' && input!='q') + goto Start; + endwin(); + return EXIT_SUCCESS; +} diff --git a/sources/sudoku.c b/sources/sudoku.c new file mode 100644 index 0000000..a4e9d81 --- /dev/null +++ b/sources/sudoku.c @@ -0,0 +1,441 @@ +#include +#include +#include +#include //to seed random +#include +#include +#include +/* + _ +(_ + _)UDOKU + + +copyright Hossein Bakhtiarifar 2018 (c) +No rights are reserved and this software comes with no warranties of any kind to the extent permitted by law. + +compile with -lncurses + +NOTE: This program is only made for entertainment porpuses. The puzzles are generated by randomly clearing tiles on the table and are guaranteed to have a solution , but are not guaranteed to have only one unique solution. +*/ +typedef signed char byte; +byte wait=0, waitcycles=0; +byte size,s;//s=size*size +byte py,px; +byte diff; +unsigned int filled; +chtype colors[6]={0}; +void cross(byte sy,byte sx,chtype start,chtype middle,chtype end){ //to simplify drawing tables. doesn't draw a cross (why did I choose that name?) + mvaddch(sy,sx,start); + byte f = 2*size; + for(char n=1;ns) + return 1; + for(byte y=0;ys) + board[y][x]=int2sgn(k=1); + } + k++; + if(k>s) + k=1; + } + } + for(byte n=0;n4) + printw(" (some of these alphabet controls maybe overrided in certain sizes)"); + mvprintw(10,0,"? : Hint (not like in other games)"); + mvprintw(11,0,"F1 & F2: Help on controls & gameplay"); + mvprintw(12,0,"PgDn,PgUp,<,> : Scroll"); + mvprintw(15,0,"Press a key to continue"); + refresh(); + getch(); + erase(); +} +void gameplay(void){ + erase(); + header(0,0); + attron(A_BOLD); + mvprintw(3,0," **** THE GAMEPLAY ****"); + attroff(A_BOLD); + move(4,0); + printw("Fill the table with digits"); + if(size>3) + printw(" (and characters) \n"); + else + addch('\n'); + + printw("so that all the rows, columns and smaller subregions \n"); + printw("contain all of the digits from 1 to "); + if(size<=3){ + addch(int2sgn(s)); + addch('.'); + } + if(size>3){ + addch('9'); + printw(" and all\nthe alphabet letters from 'a' to '%c'.",int2sgn(s)); + } + printw("\n\nPress a key to continue."); + refresh(); + getch(); + erase(); +} +int main(int argc,char** argv){ + signal(SIGINT,sigint_handler); + if(argc>4 || (argc==2 && !strcmp("help",argv[1])) ){ + printf("Usage: %s [size [ difficulty]] \n",argv[0]); + return EXIT_FAILURE; + } + if(argc>1 ){ + if(strlen(argv[1])>1 || argv[1][0]-'0'>7 || argv[1][0]-'0'< 2){ + printf("2 <= size <= 7\n"); + return EXIT_FAILURE; + } + else + size = *argv[1]-'0'; + } + else + size=3; + if(argc>2){ + if (strlen(argv[2])>1 || argv[2][0]-'0'>4 || argv[2][0]-'0'<= 0 ){ + printf("1 <= diff <=4\n"); + return EXIT_FAILURE; + } + else + diff = *argv[2]-'0'+1; + } + else + diff=2; + bool fastgen= !(!getenv("SUDOKU_FASTGEN")); + initscr(); + mousemask(ALL_MOUSE_EVENTS,NULL); + noecho(); + cbreak(); + keypad(stdscr,1); + srandom(time(NULL)%UINT_MAX); + if( has_colors() ){ + start_color(); + use_default_colors(); + init_pair(1,COLOR_YELLOW,-1); + init_pair(2,COLOR_GREEN,-1); + init_pair(3,COLOR_BLUE,-1); + init_pair(4,COLOR_CYAN,-1); + init_pair(5,COLOR_MAGENTA,-1); + init_pair(6,COLOR_RED,-1); + for(byte b=0;b<6;b++){ + colors[b]=COLOR_PAIR(b+1); + } + } + s= size*size; + char board[s][s]; + char empty[s][s]; + char game[s][s]; + int input=0; + int sy,sx; + Start: + sy=sx=0; + erase(); + curs_set(0); + filled =0; + memset(board,0,s*s); + memset(empty,0,s*s); + memset(game,0,s*s); + if(fastgen) + justfill(board); + else + fill(board); + mkpuzzle(board,empty,game); + py=px=0; + + while(1){ + erase(); + draw(sy+3,sx+0,empty,game); + header(sy+0,sx+0); + refresh(); + if(filled == s*s) + break; + input = getch(); + if( input==KEY_PPAGE && LINES< s+size+3){//the board starts in 3 + sy+=10; + if(sy>0) + sy=0; + } + if( input==KEY_NPAGE && LINES< s+size+3){ + sy-=10; + if(sy< -(s+size+3) ) + sy=-(s+size+3); + } + if( input=='<' && COLS< s*2){ + sx+=10; + if(sx>0) + sx=0; + } + if( input=='>' && COLS< s*2){ + sx-=10; + if(sx< -(s*2)) + sx=-(s*2); + } + if(input == KEY_F(1)) + help(); + if(input == KEY_F(2)) + gameplay(); + if(input == KEY_MOUSE) + mouseinput(sy,sx); + if(input == KEY_UP && py) + py--; + if(input == KEY_DOWN && py