maingame.c
来自「linux/unix环境下的建站系统」· C语言 代码 · 共 276 行
C
276 行
#include<stdio.h>#include<stdlib.h>#include<string.h>#ifdef _USE_NCURSE_#include<curses.h>#endif#include"gamedefs.h"#include"gamedata.h"#include"gamedraw.h"#include"gameinit.h"#include"gameplay.h"#include"gametty.h"#include"screens.h"#ifdef ENABLE_DL#define MAXDATA 1458#define RECORD_FILE "game/worker/high_record"#define HOME_FILE "box_record"struct high_record { int shortest; char userid[255];};static int load_highrecord(int level,struct high_record* hr,int myrecord){ int fd,ret; bzero(hr,sizeof(*hr)); if (level==-1) { hr->shortest=-1; return 0; } if (myrecord!=-1) fd=open(RECORD_FILE,O_RDWR|O_CREAT,0644); else fd=open(RECORD_FILE,O_RDONLY|O_CREAT,0644); if (fd==-1) { bbslog("3error","Box:can't open %s:%s",RECORD_FILE,strerror(errno)); return -1; } lseek(fd,sizeof(*hr)*(level-1),SEEK_SET); if (myrecord!=-1) readw_lock(fd,0,SEEK_SET,sizeof(*hr)*MAXDATA); else readw_lock(fd,sizeof(*hr)*(level-1),SEEK_SET,sizeof(*hr)); read(fd,hr,sizeof(*hr)); ret=0; if (myrecord!=-1) { if (hr->shortest>myrecord||hr->shortest<=0) { int i; int count; struct high_record allrecord[MAXDATA]; count=0; lseek(fd,0,SEEK_SET); read(fd,&allrecord,sizeof(*hr)*MAXDATA); for (i=0;i<MAXDATA;i++) { if (!strcasecmp(allrecord[i].userid,getCurrentUser()->userid)) count++; } if (count>20) ret = count; else { strcpy(hr->userid,getCurrentUser()->userid); hr->shortest=myrecord; lseek(fd,sizeof(*hr)*(level-1),SEEK_SET); write(fd,hr,sizeof(*hr)); ret=1; } } } if (myrecord!=-1) un_lock(fd,0,SEEK_SET,sizeof(*hr)*MAXDATA); else un_lock(fd,sizeof(*hr)*(level-1),SEEK_SET,sizeof(*hr)); close(fd); return ret;}#endifstatic void update_endline1(struct high_record* hr, int steps){ char buf[256]; move(scr_lns-1,0); if (hr->shortest==0) sprintf(buf,"步数: \x1b[36m%4d\x1b[33m 尚无成功者,你加油哦 ", steps); else if (hr->shortest==-1) sprintf(buf,"步数: \x1b[36m%-4d ", steps); else if (hr->userid[0]) { sprintf(buf,"步数:\x1b[36m%-4d\x1b[33m纪录:\x1b[36m%-4d\x1b[33m保持者:\x1b[36m%-12s ", steps,hr->shortest,hr->userid); } else sprintf(buf,"步数: \x1b[36m%-4d\x1b[33m本站纪录: \x1b[36m%-4d ", steps,hr->shortest); prints("\x1b[1;44;33m"); prints(buf); prints(" \x1b[33m重绘[\x1b[32mR\x1b[33m] 反悔[\x1b[32mDel\x1b[33m] 退出[\x1b[32m回车\x1b[33m] 重来[\x1b[32mTAB\x1b[33m]\x1b[m");}#ifdef ENABLE_DLint worker_main()#elseint main(int argc, char **argv)#endif{ char fname[256]; char defname[] = "game.dat"; Boolean b_play; int dir; int inch; int num_step; int num; unsigned char steplog[MaxSteps];#ifdef ENABLE_DL char buf[10]; struct high_record high; while (1) { num = 0; clear(); ansimore2("game/worker/welcome", false, 0, 0); while (num <= 0 || num > MAXDATA) { buf[0]=0; getdata(5, 61, "", buf, 5, 1, NULL, true); if (buf[0] == 0) return 0; num = atoi(buf); } sprintf(fname, "game/worker/%s.%d", defname, num); clear();#else { if (argc > 2) { sprintf(fname, "%s/%s.%s", argv[1], defname, argv[2]); num=atoi(argv[2]); } else if (2 == argc) { if (strlen(argv[1]) > 255) exit(1); sprintf(fname, "%s.%s", defname, argv[1]); num=atoi(argv[1]); } else { strcpy(fname, defname); num==-1; }#endif num_step=0; load_highrecord(num, &high, -1); if (TRUE == InitData(fname)) { if (TRUE == InitPad()) { b_play = TRUE; DrawPad(); update_endline1(&high,num_step); inch = 0; while (b_play) { if (inch) { showdiff(); cleardiff(); move(scr_lns-1, scr_cols - 1); refresh(); } if (wingame()) { int newrecord; char buf[100]; newrecord=0; if (num_step<high.shortest||high.shortest==0) newrecord=load_highrecord(num, &high, num_step); clear(); move(12,15); prints("祝贺你,你成功的完成了这一关"); move(13,15); if (newrecord==1) { sprintf(buf,"你也创造了本关使用步数的纪录(%d步)!好厉害~",num_step); } else if (newrecord!=0) { sprintf(buf,"你也创造了本关使用步数的纪录(%d步)!",num_step); prints(buf); move(14,15); sprintf(buf,"不过,让点创纪录机会给别人吧~你都有%d个记录了:P\n",newrecord); } else { sprintf(buf,"你用了%d步,纪录是%d步。",num_step,high.shortest); } prints(buf); move(23, 0); clrtoeol(); prints("\x1b[m \x1b[5;1;33m按任何键继续 ..\x1b[m"); igetkey(); break; } if (num_step>MaxSteps) { char askbuf[100]; clear(); sprintf(askbuf,"你已经用了%d步还没有成功,重来么?(Y/N)",num_step); getdata(12,0,askbuf,buf,2,1,NULL,true); if (toupper(buf[0])=='N') break; b_play = InitPad(); DrawPad(); num_step=0; } inch = igetkey(); if ((' ' == inch)||(inch == '\n')||(inch=='\r')) break; dir = NullDir; switch (inch) { case 'i': case 'I': case KEY_UP: dir = North; break; case 'j': case 'J': case KEY_LEFT: dir = West; break; case 'l': case 'L': case KEY_RIGHT: dir = East; break; case 'k': case 'K': case KEY_DOWN: dir = South; break; case 12: // Ctrl-L case 'R': // Ctrl-L clear(); DrawPad(); break; case '\t': b_play = InitPad(); DrawPad(); num_step=0; update_endline1(&high,num_step); break; case Ctrl('H'): case '\177': case KEY_DEL: if (num_step!=0) { num_step--; regretmove(steplog[num_step]); update_endline1(&high,num_step); } break; default: break; } if (NullDir != dir) { int ret; if ((ret=workermove(dir))!=0) { if (ret==2) steplog[num_step]=dir+8; else steplog[num_step]=dir; num_step++; update_endline1(&high,num_step); } } } } DestroyPad(); } DestroyData(); } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?