maingame.c
来自「bbs server linux平台下软件源码」· C语言 代码 · 共 288 行
C
288 行
#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) {#ifdef ENABLE_DL 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, currentuser->userid)) count++; } if (count > 20) ret = count; else { strcpy(hr->userid, currentuser->userid);#else {#endif hr->shortest = myrecord; lseek(fd, sizeof(*hr) * (level - 1), SEEK_SET); write(fd, hr, sizeof(*hr)); ret = 1;#ifdef ENABLE_DL }#endif } } 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_endline(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);// sprintf(genbuf, "搬运工游戏目前共有 %d 局, 请选择 : ", MAXDATA); 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);// initialize(); if (TRUE == InitData(fname)) { if (TRUE == InitPad()) { b_play = TRUE; DrawPad(); update_endline(&high, num_step); inch = 0; while (b_play) {/* DrawPad();*/ 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#ifdef ENABLE_DL clear(); DrawPad();#else clear(); DrawPad();#endif break; case '\t': b_play = InitPad(); DrawPad(); num_step = 0; update_endline(&high, num_step); break; case Ctrl('H'): case '\177': if (num_step != 0) { num_step--; regretmove(steplog[num_step]); update_endline(&high, num_step); } break; default: break; } if (NullDir != dir) { int ret; if (ret = workermove(dir)) { if (ret == 2) steplog[num_step] = dir + 8; else steplog[num_step] = dir; num_step++; update_endline(&high, num_step); } } } } DestroyPad(); } DestroyData();// finalize(); } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?