#include #include #include #include #include #include #include #define FLAG 9 #define UNCLEAR 10 /* |\/| | |INES 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 */ /* The Plan9 compiler can not handle VLAs */ #ifdef Plan9 #define len 8 #define wid 8 #endif typedef signed char byte; #ifndef Plan9 int len,wid,py,px,flags; #else int py,px,flags; #endif 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; #ifdef PDCURSES nc_getmouse(&minput); #else getmouse(&minput); #endif 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){ #ifndef Plan9 bool lool = sscanf(argv[1],"%d",&len) && sscanf(argv[2],"%d",&wid); #else bool lool = sscanf(argv[1],"%d",len) && sscanf(argv[2],"%d",wid); #endif 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 #ifndef Plan9 len=wid=8; #endif 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; 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[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