⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmine.c

📁 我搜集到的一个java常用类库的源代码
💻 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("雷");         return;      }     c= num_mine_beside(x, y);    d= 1;    if(c==0) d=0;     if(colorful)         sprintf(buf, "[%d;%dm%s", 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("扫雷for bbs v1.00 by zhch.nju 00.3, press 'h' to get help, '^C') 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("==欢迎来天大求实玩键盘扫雷游戏==\r\n---------------------------------\\r\n\r\n");    prints("玩法很简单,和windows下的鼠标扫雷差不多.\r\n");        prints("  'A'键的作用相当于鼠标的左键及双击的作用, 程序根据你点击的位置\r\n");        prints("  自动判断要进行哪种操作。\r\n");        prints("  'S'键则相当于鼠标右键的功能, 可用来标雷.\r\n");        prints("  'H'键用来显示本帮助信息.\r\n");        prints("  'Q'键退出游戏.\r\n");        prints("  当屏幕乱掉时,可用'D'可用来刷新屏幕。\r\n");        prints("建议用Netterm来玩(当然njuterm也可以,:)),telnet效果不是太好\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("                         -天大求实BBS扫雷排行榜-                                 \r\n");    prints(" 名次       名字        耗时                          来自                      \r\n");    for(n=0; n<=19; n++) {        sprintf(buf, "%3d%13s%12d%29s\r\n", n+1, topID[n], topT[n], topFROM[n]);        prints(buf);    }    sprintf(buf, "                                                                               \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("");}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 + -