📄 winmine.c
字号:
#include "time.h"#include "stdio.h"#include "termios.h"#define WINMINEPATH "/bbsdata/etc/winmine/"int a[32][18]; //雷int m[32][18]; //markedint o[32][18]; //openedchar topID[20][20],topFROM[20][32];char userid[20]="unknown.", fromhost[20]="unknown.";int topT[20], gameover=0;static char buf[10000]; // output bufferstruct termios oldtty, newtty; int colorful=1;int main(int n, char* cmd[]) { tcgetattr(0, &oldtty); cfmakeraw(&newtty); tcsetattr(0, TCSANOW, &newtty); if(n>=2) strcpy(userid, cmd[1]); if(n>=3) strcpy(fromhost, cmd[2]); syslog("ENTER"); winmine(); tcsetattr(0, TCSANOW, &oldtty);}int winmine() { int x,y; win_showrec(); clear(); prints("Enable ANSI color?[Y/N]"); refresh(); if(strchr("Nn", egetch())) colorful= 0; while(1) { clear(); for (x=0;x<=31;x++) for (y=0;y<=17;y++) { a[x][y]= 0; m[x][y]= 0; o[x][y]= 0; } winrefresh(); winloop(); pressanykey(); }}int num_mine_beside(int x1, int y1) { int dx, dy, s; s= 0; for(dx= x1-1; dx<=x1+1; dx++) for(dy= y1-1; dy<=y1+1; dy++) if(!(dx==x1&&dy==y1)&&a[dx][dy]) s++; return s; }int num_mark_beside(int x1, int y1) { int dx, dy, s; s= 0; for(dx= x1-1; dx<=x1+1; dx++) for(dy= y1-1; dy<=y1+1; dy++) if(!(dx==x1&&dy==y1)&&m[dx][dy]) s++; return s; }int wininit(int x1, int y1) { int n, x, y; randomize(); for(n=1; n<=99; n++) { do { x= rand()%30 +1; y= rand()%16 +1; } while(a[x][y]!=0||(abs(x-x1)<2&&abs(y-y1)<2)); a[x][y]=1; }}/* 双键 */int dblclick(int x, int y) { int dx, dy; if(x<1|| x>30|| y<1|| y>16) return; if(!o[x][y]) return; if(num_mine_beside(x, y)!=num_mark_beside(x, y)) return; for(dx=x-1;dx<=x+1;dx++) for(dy=y-1;dy<=y+1;dy++) windig(dx, dy);}/* 左键 */int windig(int x, int y) { int dx, dy; if(x< 1|| x> 30|| y< 1|| y> 16) return; if(o[x][y]||m[x][y]) return; o[x][y]=1; winsh(x, y); if(a[x][y]) { gameover=1; return; } if(num_mine_beside(x, y)==0) { for(dx=x-1;dx<=x+1;dx++) for(dy=y-1;dy<=y+1;dy++) windig(dx, dy); }}/* 显示[x][y]处 */int winsh(int x, int y) { move(x*2-2, y-1); winsh0(x, y); }/* 同上, 加快速度 */int winsh0(int x, int y) { int c, d; static char word[9][10]= { "·", "1", "2", "3", "4", "5", "6", "7", "8" }; static int cc[9]= {38, 37, 32, 31, 33, 35, 36, 40, 39}; char buf[100]; if (!o[x][y]&&!m[x][y]) { prints("※"); return; } if (m[x][y]) { prints("●"); return; } if (a[x][y]) { prints("[1;31m雷[m"); return; } c= num_mine_beside(x, y); d= 1; if(c==0) d=0; if(colorful) sprintf(buf, "[%d;%dm%s[m", d, cc[c], word[c]); else strcpy(buf, word[c]); prints(buf); }int winloop(){ int x, y, c, marked, t0, inited; char buf[100]; x= 10; y= 8; inited= 0; marked= 0; clearbuf(); t0= time(0); while(1) { c= egetch(); if(c==257&&y>1) y--; if(c==258&&y<16) y++; if(c==260&&x>1) x--; if(c==259&&x<30) x++; move(0, 20); sprintf(buf, "时间: %d ", time(0)-t0); prints(buf); move(40, 20); sprintf(buf, "标记: %d ", marked); prints(buf); move(0, 22); sprintf(buf, "坐标: %3d, %3d", x, y); prints(buf); move(x*2-2, y-1); if(c=='h'|| c=='H') winhelp(); if(c=='d'|| c=='D') winrefresh(); if(c=='a'|| c=='A'){ if(!inited) { wininit(x, y); inited= 1; } dig(x, y); } if((c==83|| c==115)&&!o[x][y]) { if(m[x][y]){ m[x][y]=0; marked--; } else { m[x][y]=1; marked++; } winsh(x, y); } if(checkwin()==1) { move(0, 22); prints("祝贺你!你成功了! "); { char buf[100]; sprintf(buf, "finished in %d s.", time(0)-t0); win_checkrec(time(0)-t0); syslog(buf); } gameover= 0; return; } if(gameover) { move(0, 22); prints("很遗憾,你失败了... 再来一次吧! "); { char buf[100]; sprintf(buf, "failed in %d s.", time(0)-t0); syslog(buf); } gameover= 0; return; } move(x*2-2, y-1); refresh(); }}int checkwin() { int x,y,s; s=0; for(x=1; x<=30; x++) for(y=1; y<=16; y++) if(!o[x][y])s++; if(s==99) return 1; return 0;}int dig(int x, int y) { if (!o[x][y]) windig(x, y); else dblclick(x, y);}int winrefresh() { int x, y; clear(); move(0, 23); prints("[1;32m扫雷[mfor bbs v1.00 by zhch.nju 00.3, press '[1;32mh[m' to get help, '[1;32m^C[m') to exit."); for(y=1; y<=16; y++) { move(0, y-1); for(x=1; x<=30; x++) winsh0(x, y); } refresh(); }int winhelp() { clear(); prints("==欢迎来[1;35m天大求实[m玩键盘扫雷游戏==\r\n---------------------------------\\r\n\r\n"); prints("玩法很简单,和[1;34mwindows[m下的鼠标扫雷差不多.\r\n"); prints(" '[1;32mA[m'键的作用相当于鼠标的左键及双击的作用, 程序根据你点击的位置\r\n"); prints(" 自动判断要进行哪种操作。\r\n"); prints(" '[1;32mS[m'键则相当于鼠标右键的功能, 可用来标雷.\r\n"); prints(" '[1;32mH[m'键用来显示本帮助信息.\r\n"); prints(" '[1;32mQ[m'键退出游戏.\r\n"); prints(" 当屏幕乱掉时,可用'[1;32mD[m'可用来刷新屏幕。\r\n"); prints("建议用[1;32mNetterm[m来玩(当然njuterm也可以,:)),[1;32mtelnet[m效果不是太好\r\n"); prints("第一次点击一定会开一片,很舒服吧。\r\n"); prints("熟练后,速度还是很快的,几乎可以达到鼠标扫雷的速度.\r\n"); pressanykey(); winrefresh();}int win_loadrec() { FILE *fp; int n; for(n=0; n<=19; n++) { strcpy(topID[n], "null."); topT[n]=999; strcpy(topFROM[n], "unknown."); } fp=fopen(WINMINEPATH"mine2.rec", "r"); if(fp==NULL) { win_saverec(); return; } for(n=0; n<=19; n++) fscanf(fp, "%s %d %s\n", topID[n], &topT[n], &topFROM[n]); fclose(fp);}int win_saverec() { FILE *fp; int n; fp=fopen(WINMINEPATH"mine2.rec", "w"); for(n=0; n<=19; n++) { fprintf(fp, "%s %d %s\n", topID[n], topT[n], topFROM[n]); } fclose(fp);}int win_showrec() { char buf[200]; int n; win_loadrec(); clear(); prints("[44;37m -天大求实BBS扫雷排行榜- \r\n[m"); prints("[41m 名次 名字 耗时 来自 [m\r\n"); for(n=0; n<=19; n++) { sprintf(buf, "[1;37m%3d[32m%13s[0;37m%12d[m%29s\r\n", n+1, topID[n], topT[n], topFROM[n]); prints(buf); } sprintf(buf, "[41m [m\r\n"); prints(buf); pressanykey();}int win_checkrec(int dt) { char id[20]; int n; win_loadrec(); strcpy(id, userid); for(n=0; n<=19; n++) if(!strcmp(topID[n], id)) { if(dt< topT[n]) { topT[n]= dt; strcpy(topFROM[n], fromhost); win_sort(); win_saverec(); } return; } if(dt<topT[19]) { strcpy(topID[19], id); topT[19]= dt; strcpy(topFROM[19], fromhost); win_sort(); win_saverec(); return; }}int win_sort() { int n, n2, tmp; char tmpID[20]; clear(); prints("祝贺! 您刷新了自己的纪录!\r\n"); pressanykey(); for(n=0; n<=18; n++) for(n2=n+1; n2<=19; n2++) if(topT[n]> topT[n2]) { tmp= topT[n]; topT[n]= topT[n2]; topT[n2]= tmp; strcpy(tmpID, topID[n]); strcpy(topID[n], topID[n2]); strcpy(topID[n2], tmpID); strcpy(tmpID, topFROM[n]); strcpy(topFROM[n], topFROM[n2]); strcpy(topFROM[n2], tmpID); } win_saverec(); win_showrec(); }int clear() { prints("[H[J");}int refresh() { write(0, buf, strlen(buf)); buf[0]= 0;}int prints(char* b) { strcat(buf, b);}int randomize() { srandom(time(0));}int move(int x, int y) { char c[100]; sprintf(c, "[%d;%dH", y+1, x+1); prints(c); }int egetch() { int c,d,e; c=getch0(); if(c==3||c==4||c==-1) quit(); if(c!=27) return c; d=getch0(); e=getch0(); if(e=='A') return 257; if(e=='B') return 258; if(e=='C') return 259; if(e=='D') return 260; return 0;}int getch0() { char c; if(read(0, &c, 1)<=0) quit(); return c; }int quit() { tcsetattr(0, TCSANOW, &oldtty); clear(); refresh(); syslog("QUIT"); exit(0); }int pressanykey() { refresh(); clearbuf(); }int clearbuf() { char buf[128]; refresh(); read(0, buf, 100); }syslog(char* cc ){ FILE *fp; time_t t; t=time(0); fp=fopen(WINMINEPATH"winmine.log","a"); fprintf(fp,"%s did %s on %s", userid, cc, ctime(&t)); fclose(fp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -