#include #include #include #include #include #include #define LEN 35 #define WID 50 #define RLEN LEN //real #define RWID WID #define DEAD 0 #define ALIVE 1 #define RED 2 /* _ _ |_) (_ | \ED_)QUARE Authored by Hossein Bakhtiarifar 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 level; byte py,px; byte cy,cx;//cross bool coherent;//square's coherence int anum,rnum;//reds and otherwise alive cell counts chtype colors[6]={0}; void cp(byte a[RLEN][RWID],byte b[RLEN][RWID]){ byte y,x; for(y=0;yalives) board[y][x]=RED; else if(alives>reds) board[y][x]=ALIVE; } else{ if(coherent && board[y][x]==RED) coherent=0; board[y][x]=DEAD; } } else if(alives+reds==3){ if(alives>reds) board[y][x]=ALIVE; else board[y][x]=RED; } } } } void add_line(byte board[LEN][WID],byte line,const char* str){ for(byte x=0;str[x]!='\0';x++){ if(str[x]=='#') board[line][x]=ALIVE; /*else board[line][x]=0;*/ } } void new_level(byte board[LEN][WID]){ level++; memset(board,0,RLEN*RWID); switch(level){ case 0: cy=12; cx=RWID/2; add_line(board,5, " #### #"); add_line(board,6, " #### #"); add_line(board,7, " # # "); add_line(board,8, " # ## # ## # ##"); add_line(board,9, " # # # ## # ## #"); add_line(board,10," # # # # # # # #"); add_line(board,11," ### ## # # # #"); add_line(board,15," #### "); add_line(board,16," # # "); add_line(board,17," # ## # ## # # ## # #"); add_line(board,18," # # # ## # # # # # # # #"); add_line(board,19," # # # # # # # # # # # # #"); add_line(board,20," #### ## # # # # ## # ###"); add_line(board,21," #"); add_line(board,22," # #"); add_line(board,23," ##"); break; case 1: cy=12; cx=RWID/2; add_line(board,5, " # # # #"); add_line(board,6, " # # ## # "); add_line(board,7, " # # # ## ### # # ## ## # # ##"); add_line(board,8, " # # # # # # # # ## # # # ##"); add_line(board,9, " # # # # # # # # # # # # #"); add_line(board,10," # # ## # ## # # # # # # #"); add_line(board,15," #### # "); add_line(board,16," # # # "); add_line(board,17," # # # ## # # # ## # ## # #"); add_line(board,18," ##### ## # # # # # # # # # #"); add_line(board,19," # # # # # # # # # # # #"); add_line(board,20," # # # # ## # # ## #"); break; case 2: cy= 12; cx= 10; add_line(board,3, " ## # #"); add_line(board,4, " ## # # "); add_line(board,5, " # # "); add_line(board,6, " # # # # "); add_line(board,7, " ### ### "); add_line(board,17," ## ## "); add_line(board,18," # # # #"); add_line(board,19," # # # # "); add_line(board,20," # # "); add_line(board,21," ### ### "); add_line(board,22," ### ### "); add_line(board,23," ## ## "); add_line(board,24," ## ## "); add_line(board,25," # ## ## # "); add_line(board,26," ### ###"); add_line(board,27," # #"); add_line(board,30," ##"); add_line(board,31," ##"); break; case 3: cy=RLEN/2; cx=RWID/2; add_line(board,0, " "); add_line(board,1, " # # "); add_line(board,2, " # # "); add_line(board,3, " ### ### "); add_line(board,4, " # # "); add_line(board,5, " # # "); add_line(board,6, " ### ### "); add_line(board,7, " # # "); add_line(board,8, " # # "); add_line(board,9, " ### ### "); add_line(board,10," # # "); add_line(board,11," # # "); add_line(board,12," ### ### "); add_line(board,13," # # "); add_line(board,14," # #"); add_line(board,15," ### ###"); add_line(board,17," "); add_line(board,18," # "); add_line(board,19," # "); add_line(board,20," ### "); add_line(board,21," # "); add_line(board,22," # "); add_line(board,23," ### "); add_line(board,24," # "); add_line(board,25," # "); add_line(board,26," ### "); add_line(board,27," # "); add_line(board,28," # "); add_line(board,29," ### "); add_line(board,30," # "); add_line(board,31," # "); add_line(board,32," ### "); break; case 4: cy=rand()%(RLEN/2); cx=rand()%(RWID/2); add_line(board,0, " "); add_line(board,1, " "); add_line(board,2, " "); add_line(board,3, " "); add_line(board,4, " "); add_line(board,5, " "); add_line(board,6, " "); add_line(board,0, " # # # # "); add_line(board,1, " # | | # # # "); add_line(board,2, " # # | | # # # # # # "); add_line(board,3 ," #### | | #### #### #### "); add_line(board,11," "); add_line(board,12," "); add_line(board,13," "); add_line(board,8 ," # # # # "); add_line(board,9 ," # # # # "); add_line(board,10," # # # # # # # # "); add_line(board,11," #### #### #### #### "); add_line(board,19," "); add_line(board,20," "); add_line(board,16," # # # # "); add_line(board,17," #| | # # # "); add_line(board,18," # #| | # # # # # # "); add_line(board,19," ####| | #### #### #### "); add_line(board,25," "); add_line(board,26," "); add_line(board,27," "); add_line(board,28," "); add_line(board,25," # # "); add_line(board,26," # # "); add_line(board,27," # # # # "); add_line(board,28," #### #### "); //add_line(board,5," #"); //add_line(board,6," ##"); //add_line(board,7," ##"); break; default: srand(level); rand_level(board); } } void rm_square(byte board[LEN][WID],byte prey,byte prex){ byte dy,dx,ry,rx; for(dy=0;dy<2;dy++){ for(dx=0;dx<2;dx++){ ry=prey+dy; if(ry==-1) ry=LEN-1; else if(ry==LEN) ry=0; rx=prex+dx; if(rx==-1) rx=WID-1; else if(rx==WID) rx=0; board[ry][rx]=DEAD; } } } void mk_square(byte board[LEN][WID]){ byte dy,dx,ry,rx; for(dy=0;dy<2;dy++){ for(dx=0;dx<2;dx++){ ry=py+dy; if(ry==-1) ry=LEN-1; else if(ry==LEN) ry=0; rx=px+dx; if(rx==-1) rx=WID-1; else if(rx==WID) rx=0; board[ry][rx]=RED; } } } //detect if there is a square and enable the player to move void reemerge(byte board[LEN][WID]){ byte y,x,dy,dx,ry,rx; for(y=0;y : Scroll"); mvprintw(12,0,"Press a key to continue"); refresh(); getch(); erase(); } void gameplay(void){ erase(); logo(); 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(void){ signal(SIGINT,sigint_handler); srand(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[RLEN][RWID]; memset(board,0,RLEN*RWID); char result[70]; int input; int prey,prex; int cinred; Start: cinred=0; py=LEN*3/4; px=WID/2; curs_set(0); level=-1; new_level(board); mk_square(board); while(1){ switch(rand()%5){//move the cross case 0: cx++; if(cx==WID) cx=0; break; case 1: cy--; if(cy==-1) cy=LEN-1; break; case 2: cx--; if(cx==-1) cx=WID-1; break; case 3: cy++; if(cy==LEN) cy=0; break; case 4: ;//stay there } if(board[cy][cx]==RED) cinred++; else cinred=0; /*if(rnum>anum||cinred==2){ mvprintw(LEN+5,0,"Well done! Press a key to continue:"); curs_set(1); getch(); curs_set(0); new_level(board); py=LEN*3/4; px=WID/2; mk_square(board); }*/ count(board); if(rnum!=4) coherent=0; if(!coherent && rnum==4) reemerge(board); erase(); logo(); draw(board); refresh(); if(rnum>anum||cinred==2){ mvprintw(LEN+5,0,"Well done! Press a key to continue:"); curs_set(1); getch(); curs_set(0); new_level(board); py=LEN*3/4; px=WID/2; mk_square(board); continue; } input = getch(); live(board); count(board);//apparently this should come at both sides of live+draw. resulting from trial and error. if(rnum!=4)//the square has participated in life reactions if so coherent=0; if(!coherent && rnum==4)//there can be a square reemerge(board); /*if(board[cy][cx]==RED) cinred++; else cinred=0;*/ /*if(rnum>anum||cinred==2){ mvprintw(LEN+5,0,"Well done! Press a key to continue:"); curs_set(1); getch(); curs_set(0); new_level(board); py=LEN*3/4; px=WID/2; mk_square(board); }*/ if( input==KEY_F(1) || input=='?' ) help(); if( input==KEY_F(2) ) gameplay(); prey=py; prex=px; if(input=='k' || input==KEY_UP){ py--; if(py==-1) py=LEN-1; } else if(input=='j' || input==KEY_DOWN){ py++; if(py==LEN) py=0; } else if(input=='h' || input==KEY_LEFT){ px--; if(px==-1) px=WID-1; } else if(input=='l' || input==KEY_RIGHT){ px++; if(px==WID) px=0; } else goto DidntMove; if(coherent){ rm_square(board,prey,prex); mk_square(board); } DidntMove: /*switch(rand()%5){//move the cross case 0: cx++; if(cx==WID) cx=0; break; case 1: cy--; if(cy==-1) cy=LEN-1; break; case 2: cx--; if(cx==-1) cx=WID-1; break; case 3: cy++; if(cy==LEN) cy=0; break; case 4: ;//stay there }*/ /*if(board[cy][cx]==RED) cinred++; else cinred=0; if(rnum>anum||cinred==2){ mvprintw(LEN+5,0,"Well done! Press a key to continue:"); curs_set(1); getch(); curs_set(0); new_level(board); py=LEN*3/4; px=WID/2; mk_square(board); }*/ if( input=='q') sigint_handler(0); } mvprintw(LEN+5,0,"Wanna play again?(y/n)"); curs_set(1); input=getch(); if(input != 'N' && input != 'n' && input != 'q') goto Start; endwin(); return EXIT_SUCCESS; }