荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Lg (创造人生的传奇), 信区: BBSAdmin
标  题: [转载] sao lei for firebird(转寄)
发信站: BBS 荔园晨风站 (Fri Oct 22 22:31:05 1999), 站内信件

【 以下文字转载自 Lg 的信箱 】
【 原文由 liugang.bbs@bbs.net.tsinghua.edu.cn 所发表 】
发信人: QuickBASIC (nju zhch), 信区: BBSMan_Dev
标  题: sao lei for firebird
发信站: BBS 水木清华站 (Sun Sep 26 11:04:46 1999)

信 息 潮 -- 文章阅读
--------------------------------------------------------------------------------
 发信人: zhch@InfoTide (zhch), 信区: BBSBuilder
标  题: 扫雷for bbs
发信站: 信 息 潮 (Sun Sep 26 10:21:17 1999)
转信站: InfoTide (local)


扫雷和bbs结合得不是很紧密,
在list.c或其他.c文件里加上以下代码,
在合适的地方直接调用winmine()即可。
扫雷时按'h'可以得到帮助。
扫雷通过后deliver(自动发信系统)会在notepad版报告所用时间。
目前记录是114秒。(30*16, 99雷).

int a[32][18],gameover;/*add by zhch for winmine*/
int winmine()
{
        int x,y;
        do
        {
                clear();
                gameover=0;
                modify_user_mode(12345);
                for (x=0;x<=31;x++)
                for (y=0;y<=17;y++)
                        a[x][y]=0;
                winrefresh();
                winloop();
                clear();
        }
        while(askyn("是否继续玩(Y/N)?",YEA,NA)==YEA);
        return;
}

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]=100;
        }
         for (x=1;x<=30;x++)
         for (y=1;y<=16;y++)
                 if (a[x][y]==100)
                {
                        if (a[x-1][y-1]<100)a[x-1][y-1]++;
                        if (a[x-1][y]<100)a[x-1][y]++;
                        if (a[x-1][y+1]<100)a[x-1][y+1]++;
                        if (a[x][y-1]<100)a[x][y-1]++;
                        if (a[x][y+1]<100)a[x][y+1]++;
                        if (a[x+1][y-1]<100)a[x+1][y-1]++;
                        if (a[x+1][y]<100)a[x+1][y]++;
                                if (a[x+1][y+1]<100)a[x+1][y+1]++;
                        }
}
int dblclick(int x,int y)
{
        int s,c,dx,dy;
        if(x<1||x>30||y<1||y>16)return;
        c=a[x][y];
        if(c<=512)return;
        c-=512;
        s=0;
        for(dx=x-1;dx<=x+1;dx++)
        for(dy=y-1;dy<=y+1;dy++)
                if(a[dx][dy]>=256&&a[dx][dy]<512)s++;
        if(s==c)
         {
                windig(x-1,y-1);
                windig(x-1,y);
                windig(x-1,y+1);
                windig(x,y-1);
                windig(x,y+1);
                windig(x+1,y-1);
                windig(x+1,y);
                windig(x+1,y+1);
        }
}

int windig(int x,int y)
{
        int c;
        if(x<1||x>30||y<1||y>16)return;
        c=a[x][y];
        if(c>=256)return;
        a[x][y]+=512;
        winsh(x,y,1);
        if(c==100)
        {
                gameover=1;
                return;
        }
        if(c==0)
        {
                windig(x-1,y-1);
                windig(x-1,y);
                windig(x-1,y+1);
                windig(x,y-1);
                windig(x,y+1);
                windig(x+1,y-1);
                windig(x+1,y);
                windig(x+1,y+1);
        }
}

int winsh(int x, int y, int cc)
{
        int c,c1;
        c=a[x][y];
        if(cc!=0)move(y-1,x*2-2);
        if (c<256){prints("※");return;}
        if (c>=256&&c<512)prints("●");
        c-=512;
        c1=1;
        if(c==0)c1=0;
        if(c==0)prints("·");
        if(c==1)prints("1");
        if(c==2)prints("2");
        if(c==3)prints("3");
        if(c==4)prints("4");
        if(c==5)prints("5");
        if(c==6)prints("6");
        if(c==7)prints("7");
        if(c==8)prints("8");
        if(c==100)prints("%c[31;1m雷%c[m",27,27);
}

int winloop()
{
        int x,y,c,marked,clicks,t0;
        x=10;
        y=8;
        marked=0;
        clicks=0;
        egetch();
        move(y-1,x*2-2);
        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(20,0);
                prints("时间: %d ",time(0)-t0);
                        move(20,40);
                        prints("标记: %d ",marked);
                        move(22,0);
                prints("坐标: %d,  %d    ",x,y);
                move(y-1,x*2-2);
                if(c=='h'||c=='H')winhelp();
                        if(c=='d'||c=='D')winrefresh();
                if(c==65||c==97){
                                clicks++;
                                if(clicks==1)wininit(x,y);
                                dig(x,y);
        }
        if((c==83||c==115)&&a[x][y]<512)
        {
                if(a[x][y]>=256){a[x][y]-=256;marked--;}else{a[x][y]+=256;
marked++;}
                        winsh(x,y,1);
        }
        if(c=='q'||c=='Q')return;
        if(checkwin()==1)
                {
                        move(22,0);
                        prints("You win!");
                        win_report(time(0)-t0);
                        gameover=0;
                        pressreturn();
                        return;
                }
                if(gameover==1)
        {
                move(22,0);
                prints("GAME OVER");
                        gameover=0;
                pressreturn();
                return;
        }
        move(y-1,x*2-2);
        }
}

int checkwin()
{
        int x,y,s;
        s=0;
        for(x=1;x<=30;x++)
        for(y=1;y<=16;y++)
                if(a[x][y]<512)s++;
        if(s==99)return 1;
        return 0;
}

int dig(int x,int y)
{
        if (a[x][y]<512) windig(x,y);else dblclick(x,y);
}

int winrefresh()
{
        int x,y;
        clear();
        prints("
扫 雷         \n");
        prints("
~~~~~         \n");
        move(23,0);
        prints("扫雷for bbs v0.91 by zhch.nju 99.9, press 'h' to get help, 'q'
to exit.");
        for(y=1;y<=16;y++)
        {
                move(y-1,0);
                for(x=1;x<=30;x++)
                winsh(x,y,0);
        }
}

int winhelp()
{
        clear();
        prints("==欢迎参加键盘扫雷游戏
==\n---------------------------------\n\n");
        prints("玩法很简单,和windows下的鼠标扫雷差不多.\n");
        prints("  'A'键的作用相当于鼠标的左键及双击的作用,程序根据你点击的位置
\n");
        prints("  自动判断要进行哪种操作。\n");
        prints("  'S'键则相当于鼠标右键的功能, 可用来标雷.\n");
        prints("  'H'键用来显示本帮助信息.\n");
        prints("  'Q'键退出游戏.\n");
        prints("  当屏幕乱掉时,可用'D'可用来刷新屏幕。\n");
        prints("建议用Netterm或cterm来玩(当然njuterm也可以,:)),telnet效果不是太
好\n");
        prints("第一次点击一定会开一片,很舒服吧。\n");
        prints("熟练后,速度还是很快的,几乎可以达到鼠标扫雷的速度.\n");
        pressreturn();
        winrefresh();
}

int win_report(int dt)
{
                FILE *fn;
                char filename[STRLEN],buf1[40];
                sprintf(filename,"tmp/record.%s",currentuser.userid);
                sprintf(buf1,"%s扫雷成功,时间为%d秒。",currentuser.userid,dt);
                if ((fn=fopen(filename,"w")) != NULL)
                {
                        fprintf(fn,"如题。祝贺%s.\n",currentuser.userid);
                        fclose(fn);
                        postfile(filename, "notepad", buf1,1);
                        unlink(filename);
                }
}

--

※ 来源:.信 息 潮 bbs.tide.dhs.org.[FROM: 202.119.46.31]


--------------------------------------------------------------------------------
分类讨论区 全部讨论区 上一篇 本讨论区 回文章

--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.119.37.7]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: ftp.szu.edu.cn]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店