📄 level.c
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include <draw.h>#include "sokoban.h"voidconsumeline(Biobuf *b){ while(Bgetc(b) != '\n') ;}/* parse a level file */intloadlevels(char *path){ Biobuf *b; int x = 0, y = 0, lnum = 0; char c; if(path == nil) return 0; b = Bopen(path, OREAD); if(b == nil) { fprint(2, "could not open file %s: %r\n", path); return 0; } memset(levels, 0, Maxlevels*sizeof(Level)); while((c = Bgetc(b)) > 0) { switch(c) { case ';': consumeline(b); /* no ';'-comments in the middle of a level */ break; case '\n': levels[lnum].index = lnum; levels[lnum].done = 0; x = 0; levels[lnum].max.y = ++y; c = Bgetc(b); if(c == '\n' || c == Beof) { /* end of level */ if(++lnum == Maxlevels) goto Done; x = 0; y = 0; } else Bungetc(b); break; case '#': levels[lnum].board[x][y] = Wall; x++; break; case ' ': levels[lnum].board[x][y] = Empty; x++; break; case '$': levels[lnum].board[x][y] = Cargo; x++; break; case '*': levels[lnum].board[x][y] = GoalCargo; x++; break; case '.': levels[lnum].board[x][y] = Goal; x++; break; case '@': levels[lnum].board[x][y] = Empty; levels[lnum].glenda = Pt(x, y); x++; break; case '+': levels[lnum].board[x][y] = Goal; levels[lnum].glenda = Pt(x, y); x++; break; default: fprint(2, "impossible character for level %d: %c\n", lnum+1, c); return 0; } if(x > levels[lnum].max.x) levels[lnum].max.x = x; levels[lnum].max.y = y; }Done: Bterm(b); level = levels[0]; numlevels = lnum; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -