迷宫闯关 V1.4.2 !
V1.3.x
V1.3.0 (2023/8/6)
- 加入了“技能”和“商店”功能
- 将炸弹和地雷爆炸设定为连锁反应
- 进一步优化代码长度
V1.3.1
- 修复了炸弹被多次引爆的问题
- 修复了地图左下角总是出现空位,导致爆炸输出越界的问题
- 修复了不经常自动存档的问题
- 修复了在收集血包时可以无限加血的问题
- 修复了炸弹爆炸时加血和加分会再次调用的问题
- 修复了已开启但未通过第五关时商店就解锁的问题
V1.3.2
- 加入了存档问题检测,使随意更改存档成为过去
- 加入了技能面板
- 进一步优化代码长度
V1.3.3.1 (2023/8/8)
- 加入了消耗品商店,可购买血包和技能体验卡
- 加入了当铺,可以用来倒卖消耗品
- 优化了技能面板
- 进一步优化了代码长度,并修改了大量已知 \(BUG\),优化了游玩体验
小修改
- 提高了技能的价格
- \(Hard\) 模式下通过第 \(3\) 关就可以解锁商店
V1.3.4
- 在中等和困难模式中加入 \(5 \times 5\) 的大炸弹
- 大炸弹的爆炸范围内的碎砖墙可能发生破碎
- 将炸弹伤害与距离爆炸中心的距离挂钩
小修改
- 降低了爆炸产生碎砖墙的概率
V1.4
V1.4.0 (2023/8/26)
- 加入了探索模式,将原先的正常迷宫归入扫荡模式(通关后才能进入扫荡模式)。
- 修复了已知 \(BUG\)。
V1.4.1.3
- 加入了“地毯”。
- 将未失明时的地图探索做出了一点小更改。
- 优化了代码长度并修复了已知 \(BUG\)。
V1.4.2 (2023/9/22)
- 加入键位修改功能。
- 更改每一关的胜利界面的小细节(没法直接进入商店了)。
- 将部分按键改为平滑检测。
- 修复了已知 \(BUG\)。
V1.4.3(预告)(可能又会断更了)
- 有可能将所有按键检测变为平滑检测(详见 我的
根本没打出来的新游戏 以及 此头文件)
- 加入技能升级系统,背包系统
上代码!
#include <bits/stdc++.h>
#include <windows.h>
#define maxn 20
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1 : 0)
using namespace std;
int mp[200][200] = {0}, rx, ry, score = 0, blood = 10, bao = 0, sgless;
int nandu, op[10] = {0}, boomm[100] = {0}, len = 1, rlen = 1, facing;
int costsco[maxn] = {0, 40, 30, 50, 40, 25, 20, 15, 10, 20, 15};
int needblo[maxn] = {0, 1, 4, 0, -1, -2, 1, 4, 0, -1};
int dir[5][2] = {{0, 0}, {0, -1}, {-1, 0}, {0, 1}, {1, 0}}, have[maxn];
char whichkey[] = {'Q', 'Z', 'X', 37, 38, 39, 40, 'A', 'W', 'D', 'S'};
bool issg, isopen, isup[260];
float xt = 0;
string thisgamename;
char keyname[260][60] = {"", "鼠标左键", "鼠标右键", "[Ctrl]+[Break]",
"鼠标中键", "X1 鼠标按钮", "X2 鼠标按钮", "", "[Backspace]", "[Tab]", "", "",
"[Clear]", "[Enter]", "", "", "[Shift]", "[Ctrl]", "[Alt]", "[Pause]",
"[CapsLock]", "", "", "", "", "", "", "[Esc]", "", "", "", "", "[Space]",
"[PageUp]", "[PageDown]", "[End]", "[Home]", "[Left]", "[Up]", "[Right]",
"[Down]", "[Select]", "[Print]", "[Execute]", "[PrintScreen]", "[Insert]",
"[Delete]", "[Help]", "[0]", "[1]", "[2]", "[3]", "[4]", "[5]", "[6]", "[7]",
"[8]", "[9]", "", "", "", "", "", "", "", "[A]", "[B]", "[C]", "[D]", "[E]",
"[F]", "[G]", "[H]", "[I]", "[J]", "[K]", "[L]", "[M]", "[N]", "[O]", "[p]",
"[Q]", "[R]", "[S]", "[T]", "[U]", "[V]", "[W]", "[X]", "[Y]", "[Z]", "左[Win]",
"右[Win]", "[App]", "", "[Sleep]", "小键盘[0]", "小键盘[1]", "小键盘[2]",
"小键盘[3]", "小键盘[4]", "小键盘[5]", "小键盘[6]", "小键盘[7]", "小键盘[8]",
"小键盘[9]", "[×]", "[+]", "[分隔符]", "[-]", "[Dec]", "[/]", "[F1]", "[F2]",
"[F3]", "[F4]", "[F5]", "[F6]", "[F7]", "[F8]", "[F9]", "[F10]", "[F11]",
"[F12]", "[F13]", "[F14]", "[F15]", "[F16]", "[F17]", "[F18]", "[F19]", "[F20]",
"[F21]", "[F22]", "[F23]", "[F24]", "", "", "", "", "", "", "", "", "[NumLock]",
"[ScrollLock]", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"左[Shift]", "右[Shift]", "左[Ctrl]", "右[Ctrl]", "左[Alt]", "右[Alt]", "", "", "", "",
"", "", "", "静音", "音量减小", "音量增加", "下一首", "上一首", "停止", "播放/暂停",
"启动邮件", "选择媒体", "启动应用程序_1", "启动应用程序_2", "", "", "[;]",
"[+]", "[,]", "[-]", "[.]", "[/]", "[~]", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "[{]", "[\\]",
"[}]", "[']", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"", "", "", "", "", "", "[Attn]", "[CrSel]", "[ExSel]", "[ErEOF]", "播放键",
"缩放键", "", "[PA1]", "清除键"
};
struct blk {
char ch[3];
int clr;
blk (const char *s = " ", int a = 7) {
ch[0] = s[0], ch[1] = s[1], ch[2] = '\0', clr = a;
}
} blocks[11];
struct node {
int x, y;
};
queue<node> boom;
inline void color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
inline void gto(int x, int y) {
COORD pos;
pos.X = y;
pos.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
bool new_game(), cundang(), read(string name), game(), to_start();
bool checkup(int x, int y, int n), whichmod(int n), notwall(int x, int y);
bool isair(int x, int y);
int gq(int n, bool mod), rnk(int x, bool y = 1);
void start(), jiaocheng(), shop(), jinengshop(), scoshop(), huishou();
void whichxitong(), dlt(string name), all_clear(), sout(string a, int t);
void update(int x), manout(int n), mpout(int n, bool mod), goofput(int rx, int ry);
void lose(int num), win(), addvis(int n), boardout(int n), prt(int x, int y);
void booom(int n, bool mod), boomclear(), mpout(int x, int y, bool isbig, bool mod);
void save(string name), look(int n, bool mod), go_though(int x, int y, int n);
void addop(int x, int y, int n, int face), setkey(), change(int x);
void whichxitong() {
typedef void(__stdcall * NTPROC)(DWORD *, DWORD *, DWORD *);
HINSTANCE hinst = LoadLibrary("ntdll.dll");
DWORD dwMajor, dwMinor, dwBuildNumber;
NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
proc(&dwMajor, &dwMinor, &dwBuildNumber);
if (dwMajor == 10 && dwMinor == 0) {
xt = 10;
return ;
}
SYSTEM_INFO info;
GetSystemInfo(&info);
OSVERSIONINFOEX os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO *)&os)) {
if (os.dwMajorVersion == 6 && os.wProductType == VER_NT_WORKSTATION) {
xt = 7;
}
}
}
int main() {
srand((unsigned)time(NULL));
blocks[6] = blocks[0] = {" ", 238};
blocks[4] = blocks[3] = blocks[1] = {" ", 119};
blocks[2] = {"!!", 27};
blocks[10] = blocks[5] = {"[]", 236};
blocks[7] = {"☆", 231};
blocks[8] = {"☆", 236};
blocks[9] = {"国", 120};
for (int i = 1; i <= 256; i++) {
if (!KEY_DOWN(i)) {
isup[i] = 1;
}
}
start();
return 0;
}
bool read(string name) {
string str = name + ".save";
char ch[30];
memset(ch, 0, sizeof ch);
for (unsigned int i = 0; i < str.size(); i++) {
ch[i] = str[i];
}
char *s = ch;
FILE *fp = fopen(s, "r");
fscanf(fp, "%d%d%d%d", &nandu, &blood, &bao, &score);
bool isold = 0;
unsigned long long hsh = rnk(nandu, 0) + rnk(blood, 0) + rnk(bao, 0) + rnk(score, 0), thehsh;
for (int i = 0; i < 10; i++) {
fscanf(fp, "%d", op + i);
hsh += rnk(op[i], 0);
}
for (int i = 1; i < maxn; i++) {
if (fscanf(fp, "%d", have + i) == EOF) isold = 1, have[i] = 0;
hsh += rnk(have[i], 0);
}
have[5] = bao;
int a = 0;
if (fscanf(fp, "%d", &a) == EOF) {
isold = 1, isopen = 0;
} else {
isopen = ((a || (nandu == 3 ? op[4] : op[6])) ? 1 : 0);
}
hsh += rnk(isopen, 0);
for (int i = 0; i <= 10; i++) {
if (fscanf(fp, "%d", &a) == EOF) isold = 1;
else whichkey[i] = a;
hsh += rnk(whichkey[i], 0);
}
if (fscanf(fp, "%llu", &thehsh) == EOF) isold = 1;
fclose(fp);
if (thehsh != hsh && !isold) return 0;
if (isopen == 0) memset(have, 0, sizeof have);
save(name);
return 1;
}
void save(string name) {
name += ".save";
char ch[30];
memset(ch, 0, sizeof ch);
for (unsigned int i = 0; i < name.size(); i++) ch[i] = name[i];
char *s = ch;
FILE *fp = fopen(s, "w");
fprintf(fp, "%d %d %d %d ", nandu, blood, bao, score);
unsigned long long hsh = rnk(nandu, 0) + rnk(blood, 0) + rnk(bao, 0) + rnk(score, 0);
for (int i = 0; i < 10; i++) {
fprintf(fp, "%d ", op[i]);
hsh += rnk(op[i], 0);
}
for (int i = 1; i < maxn; i++) {
have[5] = bao;
fprintf(fp, "%d ", have[i]);
hsh += rnk(have[i], 0);
}
isopen |= (nandu == 3 ? op[4] : op[6]);
fprintf(fp, "%d ", isopen), hsh += rnk(isopen, 0);
for (int i = 0; i <= 10; i++) {
fprintf(fp, "%d ", whichkey[i]);
hsh += rnk(whichkey[i], 0);
}
fprintf(fp, "%llu", hsh);
fclose(fp);
return ;
}
string keys[] = {"", "使用血包", "感知", "跃迁", "向左", "向上", "向右", "向下"};
void change(int x) {
bool flag = 0;
color(7), gto(x * 2 + 6, 4), cout << keys[x], color(13);
gto(x * 2 + 6, 15), printf("[ %s ] ", keyname[(int)whichkey[x - 1]]);
Sleep(50);
while (1) {
for (int i = 2; i <= 256; i++)
if (KEY_DOWN(i)) {
if (!isup[i]) continue;
isup[i] = 0;
bool ffff = 1;
for (int l = 0; l <= 10; l++) {
if (l == x - 1) continue;
if (i == whichkey[l]) {
ffff = 0, MessageBox(
NULL,
"键位冲突!请选择其他键位!",
"Wrong",
MB_ICONEXCLAMATION | MB_OK
);
}
}
if (ffff) flag = 1, whichkey[x - 1] = i;
break;
} else {
isup[i] = 1;
}
if (flag) break;
}
color(7), gto(x * 2 + 6, 15), printf("[ %s ] ", keyname[(int)whichkey[x - 1]]);
Sleep(100), flag = 0;
if (x >= 4) {
color(13);
gto(x * 2 + 6, 25), printf("[ %s ] ", keyname[(int)whichkey[x + 3]]);
while (1) {
for (int i = 2; i <= 256; i++)
if (KEY_DOWN(i)) {
if (!isup[i]) continue;
isup[i] = 0;
bool ffff = 1;
for (int l = 0; l <= 10; l++) {
if (l == x - 1) continue;
if (i == whichkey[l]) {
ffff = 0, MessageBox(
NULL,
"键位冲突!请选择其他键位!",
"Wrong",
MB_ICONEXCLAMATION | MB_OK
);
}
}
if (ffff) flag = 1, whichkey[x - 1] = i;
break;
} else
isup[i] = 1;
if (flag) break;
}
color(7);
gto(x * 2 + 6, 25), printf("[ %s ] ", keyname[(int)whichkey[x + 3]]);
}
}
void setkey() {
system("cls"), system("mode con cols=50 lines=30");
int now = 1, lst = 1;
color(7), gto(2, 11), printf("键位设置");
for (int i = 1; i <= 7; i++) {
gto(i * 2 + 6, 15), printf("[ %s ] ", keyname[(int)whichkey[i - 1]]);
if (i >= 4) {
gto(i * 2 + 6, 25), printf("[ %s ] ", keyname[(int)whichkey[i + 3]]);
}
}
A:
for (int i = 1; i <= 7; i++) {
if (now == i) color(13);
gto(i * 2 + 6, 4), cout << keys[i];
if (now == i) color(7);
}
while (1) {
Sleep(50);
if (!KEY_DOWN(40)) isup[40] = 1;
if (!KEY_DOWN(38)) isup[38] = 1;
if (!KEY_DOWN(13)) isup[13] = 1;
if (!KEY_DOWN(27)) isup[27] = 1;
if (isup[40] && KEY_DOWN(40)) {
isup[40] = 0;
now = min(7, now + 1), Sleep(30);
}
if (isup[38] && KEY_DOWN(38)) {
isup[38] = 0;
now = max(1, now - 1), Sleep(30);
}
if (now != lst) {
lst = now;
goto A;
}
if (isup[13] && KEY_DOWN(13)) {
isup[13] = 0;
change(now), save(thisgamename), Sleep(30);
goto A;
}
if (isup[27] && KEY_DOWN(27)) {
isup[27] = 0;
break;
}
}
}
void all_clear() {
blood = 10, bao = score = 0, nandu = 1;
isopen = 0;
memset(op, 0, sizeof op);
memset(have, 0, sizeof have);
}
void start() {
A:
system("cls");
system("mode con cols=40 lines=30");
int isk = 1, lst = 0;
gto(7, 10), printf("迷宫の勇者! v1.4.2");
B:
all_clear();
gto(13, 25), printf("开始教程!");
gto(15, 25), printf("新游戏!");
gto(17, 25), printf("读取存档!");
color(13);
if (isk == 1) {
gto(13, 25), printf("开始教程!");
} else if (isk == 2) {
gto(15, 25), printf("新游戏!");
} else {
gto(17, 25), printf("读取存档!");
}
color(7);
gto(29, 39);
while (1) {
Sleep(30);
if (!KEY_DOWN(40)) isup[40] = 1;
if (!KEY_DOWN(38)) isup[38] = 1;
if (!KEY_DOWN(27)) isup[27] = 1;
if (isup[40] && KEY_DOWN(40)) isup[40] = 0, isk = min(3, isk + 1), Sleep(30);
if (isup[38] && KEY_DOWN(38)) isup[38] = 0, isk = max(1, isk - 1), Sleep(30);
if (isk != lst) {
lst = isk;
goto B;
}
if (KEY_DOWN(13)) {
if (isk == 1) {
jiaocheng();
goto A;
} else if (isk == 2) {
if (new_game()) if (!game()) return ;
goto A;
} else {
if (cundang()) if (!game()) return ;
goto A;
}
}
if (isup[27] && KEY_DOWN(27)) {
isup[27] = 0;
break;
}
}
return ;
}
bool new_game() {
system("cls"), system("mode con cols=50 lines=30");
gto(10, 14), printf("为坠落的存档命名:");
fflush(stdin);
cin >> thisgamename;
gto(15, 18), printf("选择你的难度!\n");
int now = 1, lst = 0;
string str[4] = {"", "Easy ", "Medium", "Hard "};
gto(21, 15), printf("按下 [Esc] 退出选择");
gto(20, 14), printf("使用左右箭头更改难度");
gto(16, 18), printf("▁▁▁▁");
if (xt == 10) {
printf("▁▁▁▁");
}
gto(18, 18), printf("▔▔▔▔");
if (xt == 10) {
printf("▔▔▔▔");
}
gto(17, 18), printf("▏");
gto(17, 26), printf("▏");
Sleep(100);
while (1) {
Sleep(50);
if (KEY_DOWN(37)) {
now = max(1, now - 1);
Sleep(30);
}
if (KEY_DOWN(39)) {
now = min(3, now + 1);
Sleep(30);
}
if (lst != now) {
for (int i = 1; i <= 3; i++) {
gto(17, (2 - now + i) * 10);
cout << str[i];
}
if (lst < now) {
gto(17, (6 - now) * 10), printf(" ");
} else {
gto(17, (2 - now) * 10), printf(" ");
}
gto(29, 39), lst = now;
}
if (KEY_DOWN(13)) {
nandu = now;
break;
}
if (KEY_DOWN(27)) return 0;
}
save(thisgamename);
return 1;
}
vector<string> vec;
vector<int> dif, bol, baonum, sco, gotowhere, wrongs;
bool cundang() {
vec.clear(), dif.clear(), bol.clear(), baonum.clear(), sco.clear();
gotowhere.clear(), wrongs.clear();
system("cls"), Sleep(100);
struct _finddata_t filefind;
string curr = "./*.save", now;
int handle = _findfirst(curr.c_str(), &filefind);
if (handle == -1) {
gto(12, 6), color(12), printf("您还没有存档!按[Enter]返回!"), color(7);
while (1) {
Sleep(50);
if (KEY_DOWN(13)) break;
}
return 0;
}
do {
if (!strcmp(filefind.name, "..")) continue;
now = filefind.name;
now.erase(now.end() - 5, now.end());
vec.push_back(now);
} while (!(_findnext(handle, &filefind)));
_findclose(handle);
int num = vec.size(), which = 0, lst = 0, l;
string str[4] = {"", "Easy", "Medium", "Hard"};
for (int i = 0; i < num; i++) {
if (!read(vec[i])) wrongs.push_back(1);
else wrongs.push_back(0);
dif.push_back(nandu);
baonum.push_back(bao);
bol.push_back(blood);
sco.push_back(score);
l = 1;
while (op[l + 1]) l++;
gotowhere.push_back(l);
}
all_clear();
A:
system("cls");
gto(0, 5), printf("press [Enter] to chose;");
gto(1, 5), printf("press [Delete] to remove;");
gto(2, 5), printf("press [Esc] to exit.");
for (int i = 0; i < num; i++) {
if (wrongs[i]) {
gto((i + 1) * 3 + 1, 1), color(12);
printf("[ 此 存 档 出 现 问 题, 无 法 读 取 ]"), color(7);
continue;
}
gto((i + 1) * 3 + 1, 4), printf("血量: %d", bol[i]);
gto((i + 1) * 3 + 1, 14), printf("血包数: %d", baonum[i]);
gto((i + 1) * 3 + 1, 27), printf("积分: %d", sco[i]);
gto((i + 1) * 3 + 2, 10);
(gotowhere[i] >= 6 ? printf("已通关") : printf("第 %d 关", gotowhere[i]));
}
B:
for (int i = 0; i < num; i++) {
gto((i + 1) * 3, 6);
if (i == which) color(12);
cout << vec[i];
gto((i + 1) * 3, 30);
cout << str[dif[i]];
if (i == which) color(7);
}
gto(29, 39);
while (1) {
Sleep(50);
if (KEY_DOWN(40)) {
which = min(num - 1, which + 1);
Sleep(30);
}
if (KEY_DOWN(38)) {
which = max(0, which - 1);
Sleep(30);
}
if (which != lst) {
lst = which;
goto B;
}
if (KEY_DOWN(13) && wrongs[which] == 0) {
thisgamename = vec[which];
read(thisgamename);
break;
}
if (KEY_DOWN(46)) {
thisgamename = vec[which];
dlt(thisgamename);
vec.erase(vec.begin() + which);
dif.erase(dif.begin() + which);
bol.erase(bol.begin() + which);
baonum.erase(baonum.begin() + which);
sco.erase(sco.begin() + which);
gotowhere.erase(gotowhere.begin() + which);
wrongs.erase(wrongs.begin() + which);
num--, which = 0;
goto A;
}
if (KEY_DOWN(27) || num == 0) return 0;
}
return 1;
}
void dlt(string name) {
name += ".save";
char ch[30];
memset(ch, 0, sizeof ch);
for (unsigned int i = 0; i < name.size(); i++) {
ch[i] = name[i];
}
char *s = ch;
remove(s);
}
void jiaocheng() {
system("mode con cols=50 lines=25");
gto(3, 0), sout("你是村里的年轻人\n最近村里正在招募“勇士”\n只有通过村北边的迷宫,才能受到大家的认可!\n", 1);
system("pause");
system("cls"), gto(3, 0);
sout("迷宫总共有5关,规模会随着进行的关数增大\n迷宫里还有各种陷阱\n很可能会命丧黄泉!!\n", 1);
system("pause");
system("cls"), gto(3, 0), sout("接下来是迷宫的介绍:\n“", 1);
color(119), cout << " ", color(7);
sout("”是墙\n“ ”是空气\n这些是破砖墙(肯定不是门)“国”\n有些墙上有暗门,是可以打开的!\n还有一些是迷雾弹,隐藏在墙中,会让你失明一阵子\n还有红色的炸弹,长这样:“", 1);
color(12), printf("[]"), color(7);
sout("”,爆炸的范围是3米,但是不会破坏墙壁\n和炸弹一样的是地雷,地雷会在你踩中它之后发出红光,然后爆炸\n", 1);
system("pause"), system("cls"), gto(3, 0);
sout("☆是可收集品!收集它可以得一积分,积分可以兑换技能!\n", 1);
color(12), printf("☆"), color(7);
sout("是血包!当你受伤的时候就可以按[Q]来回血!\n“", 1);
color(10), printf("!!"), color(7);
sout("”是终点,是可以把你传送到下一关的传送门!\n", 1);
system("pause");
system("cls"), gto(5, 10), sout("教程结束,去尽情闯关吧!!!\n", 1);
system("pause"), system("cls");
return ;
}
void sout(string a, int t) {
t *= 25;
int len = a.size();
for (int i = 0; i < len; i++) {
printf("%c", a[i]);
Sleep(t);
}
return ;
}
bool to_start() {
system("cls"), system("mode con cols=26 lines=5");
gto(2, 3), printf("返回起始菜单吗?(Y/N)");
while (1) {
Sleep(50);
if (KEY_DOWN('Y')) {
return 1;
} else if (KEY_DOWN('N')) {
return 0;
}
}
}
int big[] = {0, 16, 20, 30, 40, 50};
bool game() {
int keydown[] = {0, 49, 50, 51, 52, 53}, now;
string bigturn[] = {"", "cols=54 lines=27", "cols=54 lines=30",
"cols=74 lines=40", "cols=94 lines=50",
"cols=114 lines=60"
};
op[1] = 1;
A:
system("cls"), system("mode con cols=50 lines=25");
if (isopen) {
gto(8, 20), printf("按 [X] 进入商店");
} else {
gto(8, 20), color(8), printf("通过第 %d 关后解锁商店", (nandu == 3 ? 3 : 5)), color(7);
}
gto(11, 20), printf("按 [S] 更改键位");
gto(14, 20), printf("按 [Esc] 退出");
gto(3, 1), sout("请选择关卡\n\n\n\n", 1);
for (int i = 1; i <= 5; i++) {
if (op[i]) {
printf("%d.%d x %d 迷宫\n\n", i, big[i], big[i]);
} else {
printf("%d.xxxxxxxxxxxx\n\n", i);
}
}
bool k[10], whmod;
memset(k, 0, sizeof k);
while (1) {
if (!KEY_DOWN(27)) isup[27] = 1;
Sleep(30);
for (int i = 1; i <= 5; i++) {
if ((KEY_DOWN(keydown[i]) && op[i]) || k[i]) {
string str = "mode con " + bigturn[i];
char ch[30] = {0};
for (unsigned int i = 0; i < str.size(); i++) {
ch[i] = str[i];
}
whmod = whichmod(i);
system(ch);
now = gq(big[i], whmod);
if (now == 0) {
lose(i);
return 1;
} else if (now == 1) {
op[i + 1] = 1;
save(thisgamename);
goto A;
} else if (now == 2) {
if (i == 5) {
win();
goto A;
} else {
op[i + 1] = k[i + 1] = 1;
save(thisgamename);
}
}
Sleep(30);
}
}
if (isopen && KEY_DOWN('X')) {
shop(), save(thisgamename), Sleep(30);
goto A;
}
if (KEY_DOWN('S')) {
setkey();
goto A;
}
if (isup[27] && KEY_DOWN(27)) {
isup[27] = 0;
return to_start();
}
}
}
bool whichmod(int n) {
if (!op[n + 1]) {
return 1;
}
system("cls"), system("mode con cols=26 lines=5");
gto(2, 3), printf("进入扫荡模式?(Y/N)");
A:
if (KEY_DOWN('Y')) {
return 0;
} else if (KEY_DOWN('N')) {
return 1;
} else {
goto A;
}
}
void shop() {
A:
vector<void(*)()>Funcs = {shop, scoshop, huishou, jinengshop};
system("cls"), system("mode con cols=50 lines=10");
int now = 1, lst = 1;
color(7), gto(2, 23), printf("商店");
string shopname[] = {"", "7-11 Shop", "Garbage Dumps", "Skill Shop"};
for (int i = 1; i <= 3; i++) {
gto(5, i * 15 - 12);
cout << shopname[i];
}
B:
for (int i = 1; i <= 3; i++) {
if (now == i) color(12);
gto(7, i * 15 - 9), printf("进入");
if (now == i) color(7);
}
while (1) {
Sleep(50);
if (KEY_DOWN(37)) now = max(1, now - 1), Sleep(30);
if (KEY_DOWN(39)) now = min(3, now + 1), Sleep(30);
if (lst != now) {
lst = now;
goto B;
}
if (KEY_DOWN(13)) {
Funcs[now]();
save(thisgamename), Sleep(30);
goto A;
}
if (KEY_DOWN(27)) break;
}
}
void huishou() {
system("cls"), system("mode con cols=50 lines=30");
int now = 1, lst = 1;
color(7), gto(2, 23), printf("当铺");
string goods[] = {"", "血包", "[感知] 体验卡", "[跃迁] 体验卡", "[拆弹专家] 体验卡", "[拿钱卖命] 体验卡"};
for (int i = 1; i <= 5; i++) {
gto(i * 4 + 4, 4), cout << goods[i];
gto(i * 4 + 4, 32), printf("收购价:%d 积分", costsco[i + 4] - 5);
}
A:
gto(1, 35), printf("积分:%d ", score);
for (int i = 1; i <= 5; i++) {
if (now == i) color(13);
gto(i * 4 + 4, 26), printf("卖出");
if (now == i) color(7);
if (have[i + 4]) gto(i * 4 + 5, 23), printf("还剩余 %d 个 ", have[i + 4]);
}
while (1) {
Sleep(50);
if (KEY_DOWN(40)) {
now = min(5, now + 1);
Sleep(30);
}
if (KEY_DOWN(38)) {
now = max(1, now - 1);
Sleep(30);
}
if (now != lst) {
lst = now;
goto A;
}
if (KEY_DOWN(13) && have[now + 4]) {
score += costsco[now + 4] - 5;
have[now + 4]--;
if (now == 1) bao--;
save(thisgamename);
goto A;
}
if (KEY_DOWN(27)) break;
}
}
void scoshop() {
system("cls"), system("mode con cols=50 lines=30");
int now = 1, lst = 1;
color(7), gto(2, 11), printf("7-11 商店");
string goods[] = {"", "血包", "[感知] 体验卡", "[跃迁] 体验卡", "[拆弹专家] 体验卡", "[拿钱卖命] 体验卡"};
string statement[] = {"", "购买血包", "一次性使用", "一次性使用", "一次性使用", "一次性使用"};
for (int i = 1; i <= 5; i++) {
gto(i * 4 + 4, 4), cout << goods[i];
gto(i * 4 + 4, 32), printf("这将花费 %d 积分", costsco[i + 4]);
gto(i * 4 + 5, 5), printf("使用此消耗品会");
cout << (needblo[i + 4] >= 0 ? "损失" : "获得");
color(12), printf(" %d ", abs(needblo[i + 4])), color(7), printf("滴血");
gto(i * 4 + 6, 5), cout << statement[i];
}
A:
gto(1, 35), printf("积分:%d ", score);
for (int i = 1; i <= 5; i++) {
if (now == i) color(13);
gto(i * 4 + 4, 26), printf("购买");
if (now == i) color(7);
if (have[i + 4]) gto(i * 4 + 3, 24), printf("已拥有 %d 个", have[i + 4]);
}
while (1) {
Sleep(50);
if (KEY_DOWN(40)) {
now = min(5, now + 1);
Sleep(30);
}
if (KEY_DOWN(38)) {
now = max(1, now - 1);
Sleep(30);
}
if (now != lst) {
lst = now;
goto A;
}
if (KEY_DOWN(13) && score >= costsco[now + 4]) {
score -= costsco[now + 4];
have[now + 4]++;
if (now == 1) bao++;
save(thisgamename);
goto A;
}
if (KEY_DOWN(27)) break;
}
}
void jinengshop() {
system("cls"), system("mode con cols=50 lines=26");
int now = 1, lst = 1;
color(7), gto(2, 11), printf("寄能商店");
string jineng[] = {"", "感知", "跃迁", "拆弹专家", "拿钱卖命"};
string statement[] = {"", "长按 [Z] 可以感知所有暗门和“傻瓜蛋”",
"面对墙按下 [A] 可以穿墙而过",
"踩到地雷时有 40% 的几率不将其引爆",
"无血包时按下 [Q] 会花费 10 积分回 1 点血"
};
for (int i = 1; i <= 4; i++) {
gto(i * 4 + 4, 10), cout << jineng[i];
if (!have[i]) {
gto(i * 4 + 4, 32), printf("这将花费 %d 积分", costsco[i]);
}
gto(i * 4 + 5, 5), printf("使用此寄能会");
cout << (needblo[i] >= 0 ? "损失" : "获得");
color(12), printf(" %d ", abs(needblo[i])), color(7), printf("滴血");
gto(i * 4 + 6, 5), cout << statement[i];
}
A:
gto(1, 35), printf("积分:%d ", score);
for (int i = 1; i <= 4; i++) {
if (now == i) color(13);
gto(i * 4 + 4, 20), printf((have[i] ? "已拥有" : "购买"));
if (now == i) color(7);
}
while (1) {
Sleep(50);
if (KEY_DOWN(40)) {
now = min(4, now + 1);
Sleep(30);
}
if (KEY_DOWN(38)) {
now = max(1, now - 1);
Sleep(30);
}
if (now != lst) {
lst = now;
goto A;
}
if (KEY_DOWN(13) && !have[now] && score >= costsco[now]) {
score -= costsco[now];
have[now] = 1;
gto(now * 4 + 4, 32);
printf(" ");
save(thisgamename);
goto A;
}
if (KEY_DOWN(27)) break;
}
}
void lose(int num) {
system("cls");
system("mode con cols=50 lines=30");
gto(10, 0), sout("很可惜,你离勇者只差", 1), printf(" %d ", 5 - num);
sout("个关卡了!!!\n", 1);
system("pause"), system("cls");
sout("你成功被村民们抢救了回来!\n你以后在村庄里将怎样生存呢?\n ", 1);
gto(10, 10), sout("未完待续......", 3), system("pause");
return ;
}
void win() {
op[6] = isopen = 1;
save(thisgamename);
system("cls"), system("mode con cols=50 lines=30"), gto(10, 10);
sout("恭喜你!你成功闯过了这些复杂的迷宫!\n你是村里唯一成为的 “勇者” 的人!!\n\n", 1);
system("pause");
system("cls"), gto(10, 10), sout("成为勇者后的你将会怎么样呢? ", 1);
gto(13, 10), sout("未完待续......", 3);
system("pause");
return ;
}
bool vis[200][200];
int gq(int n, bool mod) {
int nowb = blood, nows = score, nowba = bao;
int nowhave[maxn];
for (int i = 1; i < maxn; i++) {
nowhave[i] = have[i];
}
Q:
system("cls");
memset(vis, 0, sizeof vis);
for (int i = 1; i < maxn; i++) {
have[i] = nowhave[i];
}
facing = 3;
boomclear();
blood = nowb, score = nows, bao = nowba;
sgless = issg = 0;
rx = 2, ry = 1;
update(n), addvis(n), mpout(n, mod), manout(n), boardout(n);
while (1) {
Sleep(50);
for (int i = 1; i <= 4; i++) {
if (KEY_DOWN(whichkey[2 + i]) || KEY_DOWN(whichkey[6 + i])) {
int x0 = rx + dir[i][0], y0 = ry + dir[i][1];
facing = i;
if (mp[x0][y0] == 1 || mp[x0][y0] == 9) {
continue;
}
goofput(rx, ry);
rx = min(n, max(1, x0));
ry = min(n, max(1, y0));
addvis(n), manout(n);
if (mp[rx][ry] == 7) {
score++;
boardout(n);
} else if (mp[rx][ry] == 8) {
bao++;
boardout(n);
}
}
}
if (KEY_DOWN(whichkey[0]) && blood < 10) {
if (bao >= 1) {
blood = min(10, blood + 2);
bao--;
} else if ((have[4] || have[9]) && score >= 10) {
if (!have[4]) {
have[9]--;
}
score -= 10;
blood++;
}
boardout(n);
} else if (KEY_DOWN(whichkey[1])) {
look(n, mod);
} else if (KEY_DOWN(whichkey[2])) {
go_though(rx, ry, n);
}
if (issg) {
sgless--;
if (sgless == 0) {
issg = 0;
addvis(n), mpout(n, mod), manout(n);
}
}
booom(n, mod);
if (blood <= 0) {
system("cls"), gto(4, 10), sout("你死了……", 3);
Sleep(3000);
gto(10, 10), sout("1.重生 2.退出游戏", 1);
while (1) {
if (KEY_DOWN(49)) {
goto Q;
} else if (KEY_DOWN(50)) {
for (int i = 1; i < maxn; i++) {
have[i] = nowhave[i];
}
blood = nowb, score = nows, bao = nowba;
return 0;
}
}
}
if (mp[rx][ry] == 2) {
system("cls"), gto(10, 10), sout("恭喜你!闯过了这一关!!", 1);
gto(13, 10), sout("1.回家 2.下一关", 1);
save(thisgamename);
while (1) {
if (KEY_DOWN(49) && n != 50) {
return 1;
} else if (KEY_DOWN(50) || (KEY_DOWN(49) && n == 50)) {
return 2;
}
}
}
}
}
bool checkup(int x, int y, int n) {
return x > 0 && y > 0 && x <= n + 1 && y <= n;
}
bool notwall(int x, int y) {
return mp[x][y] != 1 && mp[x][y] != 9;
}
bool isair(int x, int y) {
return notwall(x, y) && mp[x][y] != 3 && mp[x][y] != 4;
}
void prt(int x, int y) {
gto(x + 4, (y - 1) * 2);
if (issg) {
printf(" ");
} else {
color(blocks[mp[x][y]].clr);
printf(blocks[mp[x][y]].ch);
color(7);
}
}
void addop(int x, int y, int n, int face = facing) {
int bak = (face + 1) % 4 + 1;
int lx = x + dir[face][0], ly = y + dir[face][1];
int gx = x + dir[bak][0], gy = y + dir[bak][1];
if (checkup(x, y, n) && !vis[x][y]) prt(x, y), vis[x][y] = 1;
if (checkup(lx, ly, n) && !isair(lx, ly) && !vis[lx][ly]) prt(lx, ly), vis[lx][ly] = 1;
if (checkup(gx, gy, n) && !isair(gx, gy) && !vis[gx][gy]) prt(gx, gy), vis[gx][gy] = 1;
}
void addvis(int n) {
int lft = (facing + 2) % 4 + 1, rgt = (facing) % 4 + 1;
int lfx = rx + dir[lft][0], lfy = ry + dir[lft][1];
int rgx = rx + dir[rgt][0], rgy = ry + dir[rgt][1];
if (!issg && isair(lfx, lfy)) {
lfx += dir[lft][0], lfy += dir[lft][1];
if (checkup(lfx, lfy, n)) addop(lfx, lfy, n);
}
if (!issg && isair(rgx, rgy)) {
rgx += dir[rgt][0], rgy += dir[rgt][1];
if (checkup(rgx, rgy, n)) addop(rgx, rgy, n);
}
int x = rx, y = ry, lx, ly, gx, gy;
while ((isair(x, y) || (mp[rx][ry] == 3 && x == rx && y == ry))
&& checkup(x, y, n)) {
lx = x + dir[lft][0], ly = y + dir[lft][1];
gx = x + dir[rgt][0], gy = y + dir[rgt][1];
if (checkup(x, y, n) && !vis[x][y]) prt(x, y), vis[x][y] = 1;
if (checkup(lx, ly, n) && !vis[lx][ly]) prt(lx, ly), vis[lx][ly] = 1;
if (checkup(gx, gy, n) && !vis[gx][gy]) prt(gx, gy), vis[gx][gy] = 1;
x += dir[facing][0], y += dir[facing][1];
}
addop(x, y, n, lft);
}
void go_though(int x, int y, int n) {
goofput(rx, ry);
x = x + dir[facing][0], y = y + dir[facing][1];
if (!(have[2] || have[7]) || blood <= needblo[2] || (mp[x][y] != 1
&& mp[x][y] != 9)) {
return ;
}
while (!notwall(x, y)) {
x = x + dir[facing][0], y = y + dir[facing][1];
}
if (checkup(x, y, n)) {
rx = x, ry = y;
blood -= needblo[2];
if (!have[2]) have[7]--;
addvis(n), manout(n), boardout(n);
}
}
void mpout(int n, bool mod) {
gto(5, 0), color(7);
for (int i = 1; i <= n + 1; i++) {
for (int l = 1; l <= n; l++) {
if (mod && !vis[i][l]) {
printf(" ");
} else {
color(blocks[mp[i][l]].clr);
printf(blocks[mp[i][l]].ch);
color(7);
}
}
printf("\n");
}
}
void boardout(int n) {
color(7);
gto(4, 5), printf("score:%d ", score);
gto(2, 5), printf("blood: ");
if (blood <= 3) {
color(77);
} else if (blood <= 6) {
color(221);
} else {
color(170);
}
for (int i = 1; i <= blood; i++) {
printf(" ");
}
color(7);
for (int i = blood; i < 10; i++) {
printf(" ");
}
printf("▏");
if (xt == 10) {
gto(1, 12), printf("▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁");
gto(3, 12), printf("▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔");
} else {
gto(1, 12), printf("▁▁▁▁▁▁▁▁▁▁");
gto(3, 12), printf("▔▔▔▔▔▔▔▔▔▔");
}
gto(4, 20), color(12), printf("★:%d ", bao), color(7);
char str[][50] = {"", "感知", "跃迁", "[被动] 拆弹专家", "拿钱卖命"};
int ftog[] = {0, 1, 2, 0, 0};
gto(n + 7, 2), printf(" ");
gto(n + 7, 29), printf(" ");
gto(n + 8, 2), printf(" ");
gto(n + 8, 29), printf(" ");
int cnt = 1;
for (int i = 1; i <= 4; i++) {
gto((cnt + 1) / 2 + n + 6, (((cnt + 1) & 1) + 1) * 27 - 25);
if (have[i] || have[i + 5]) {
if (i == 3) printf("%s ", str[i]);
else printf("[%c] %s ", whichkey[ftog[i]], str[i]);
printf((!have[i] ? "剩余%d张" : "%c"), (!have[i] ? have[i + 5] : ' '));
cnt++;
}
}
}
void goofput(int x, int y) {
color(7), gto(x + 4, (y - 1) * 2);
if (mp[x][y] == 7 || mp[x][y] == 8) {
mp[x][y] = 0;
}
if (issg) {
printf(" ");
} else {
color(blocks[mp[x][y]].clr);
printf(blocks[mp[x][y]].ch);
color(7);
}
return ;
}
void look(int n, bool mod) {
if (!(have[1] || have[6]) || blood <= needblo[1] || issg) {
return ;
}
if (!have[1]) {
have[6]--;
}
blood -= needblo[1];
boardout(n);
for (int i = 1; i <= n; i++) {
for (int l = 1; l <= n; l++) {
if (mp[i][l] == 3 || mp[i][l] == 4) {
gto(i + 4, (l - 1) * 2), color(13), printf("▎");
if (xt == 10) {
printf(" ");
}
color(7);
}
}
}
while (KEY_DOWN(90));
for (int i = 1; i <= n; i++) {
for (int l = 1; l <= n; l++) {
if ((!mod || (mod && vis[i][l])) && (mp[i][l] == 3 || mp[i][l] == 4)) {
gto(i + 4, (l - 1) * 2), color(119), printf(" "), color(7);
} else if (mp[i][l] == 3 || mp[i][l] == 4) {
gto(i + 4, (l - 1) * 2), printf(" ");
}
}
}
}
void mpout(int x, int y, bool isbig, bool mod) {
color(7);
for (int i = x; i <= x + (isbig ? 4 : 2); i++) {
for (int l = max(y, 1); l <= y + (isbig ? 4 : 2); l++) {
gto(i + 4, (l - 1) * 2);
if (issg || (mod && !vis[i][l])) {
printf(" ");
} else {
color(blocks[mp[i][l]].clr);
printf(blocks[mp[i][l]].ch);
color(7);
}
}
}
}
void booom(int n, bool mod) {
srand((unsigned)time(0));
for (int i = rlen; i < len; i++) {
boomm[i]--;
}
bool isbig;
for (int i = rlen; i < len; i++) {
if (boomm[i] > 0) continue;
node now = boom.front();
rlen++, boom.pop(), mp[now.x][now.y] = 0, isbig = 0;
if (nandu != 1 && rnk(rand()) % 20 < 4)
isbig = 1;
if (rx == now.x && ry == now.y) {
blood -= (isbig ? 4 : 3), boardout(n);
} else if (rx >= now.x - 1 && rx <= now.x + 1 && ry >= now.y - 1
&& ry <= now.y + 1) {
blood -= (isbig ? 3 : 2), boardout(n);
} else if (isbig && (rx >= now.x - 2 && rx <= now.x + 2 && ry >= now.y - 2
&& ry <= now.y + 2)) {
blood--, boardout(n);
}
color(192);
for (int i = now.x - (isbig ? 2 : 1); i <= now.x + (isbig ? 2 : 1); i++) {
for (int l = max(now.y - (isbig ? 2 : 1), 1); l <= now.y + (isbig ? 2 : 1); l++) {
gto(i + 4, (l - 1) * 2);
printf(" ");
}
}
Sleep(200);
for (int i = max(1, now.x - (isbig ? 2 : 1)); i <= now.x + (isbig ? 2 : 1); i++) {
for (int l = max(1, now.y - (isbig ? 2 : 1)); l <= now.y + (isbig ? 2 : 1); l++) {
if (mp[i][l] == 5 || mp[i][l] == 6) {
boom.push({i, l});
if (mp[i][l] == 6) {
boomm[len] = 5;
} else {
boomm[len] = 15;
}
mp[i][l] = 10;
len++;
} else if (mp[i][l] != 9 && mp[i][l] != 1 && mp[i][l] != 2 && mp[i][l] != 10) {
mp[i][l] = 0;
} else if (isbig && mp[i][l] == 9 && rnk(rand()) % 20 < 4) {
mp[i][l] = 0;
}
if (mp[i][l] == 1 && rand() % 5 == 0) {
mp[i][l] = 9;
}
}
}
mpout(now.x - (isbig ? 2 : 1), now.y - (isbig ? 2 : 1), isbig, mod);
manout(n);
}
}
int rnk(int x, bool y) {
int a;
if (y) a = rand() % 1145 + 1, x *= a;
x ^= x << 17;
x ^= x >> 7;
x ^= x << 13;
if (y) x /= a;
return abs(x);
}
void manout(int n) {
gto(rx + 4, (ry - 1) * 2);
if (mp[rx][ry] == 3) {
if (issg) color(8);
else color(224);
printf("▎"), color(7);
if (xt == 10)
printf(" ");
} else if (mp[rx][ry] == 4) {
sgless = 150, issg = 1, mp[rx][ry] = 0;
system("cls"), boardout(n), gto(rx + 4, (ry - 1) * 2), printf("♀");
} else if (mp[rx][ry] == 6 || mp[rx][ry] == 5) {
node now = {rx, ry};
if (issg) color(7);
else color(224);
printf("♀");
if (!(have[3] || have[8]) || (rnk(rand()) % 20 >= 8)) {
boom.push(now);
if (mp[rx][ry] == 6) boomm[len] = 5;
else boomm[len] = 15;
len++;
mp[rx][ry] = 10;
} else {
if (!have[3]) have[8]--;
mp[rx][ry] = 0, boardout(n);
}
} else if (mp[rx][ry] == 7) {
if (issg) color(7);
else color(231);
printf("★");
} else if (mp[rx][ry] == 8) {
if (issg) color(12);
else color(236);
printf("★"), color(7);
} else {
if (issg) color(7);
else color(224);
printf("♀");
}
color(7);
}
void update(int L) {
float k = 1.0 * (4 - nandu) / 2.0;
for (int i = 0; i <= L + 1; i++) {
for (int l = 0; l < L + 1; l++) {
mp[i][l] = 1;
}
}
srand((unsigned)time(0));
for (int i = 0; i < L; i++) {
mp[0][i] = mp[i][0] = 0;
mp[i][L - 1] = mp[L - 1][i] = 1;
}
vector<int> X, Y;
X.push_back(2), Y.push_back(2);
int r, x, y, count;
while (X.size()) {
r = rand() % X.size();
x = X[r], y = Y[r];
count = 0;
for (int i = x - 1; i < x + 2; i++) {
for (int j = y - 1; j < y + 2; j++) {
if (abs(x - i) + abs(y - j) == 1 && mp[i][j] == 0) {
count++;
}
}
}
if (count <= 1) {
mp[x][y] = 0;
for (int i = x - 1; i < x + 2; i++) {
for (int j = y - 1; j < y + 2; j++) {
if (abs(x - i) + abs(y - j) == 1 && mp[i][j] == 1) {
X.push_back(i), Y.push_back(j);
}
}
}
}
X.erase(X.begin() + r), Y.erase(Y.begin() + r);
}
for (int i = L; i >= 0; i--) {
if (mp[i][L - 1] == 0) {
mp[i][L] = 2;
break;
}
}
for (int i = 1; i <= (L * 2 / 3) / k; i++) {
A:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 3;
} else {
goto A;
}
}
for (int i = 1; i <= (L / 3) / k; i++) {
B:
x = rand() % L + 1;
y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 4;
} else {
goto B;
}
}
for (int i = 1; i <= L / k; i++) {
C:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 5;
} else {
goto C;
}
}
for (int i = 1; i <= (L / 2) / k; i++) {
D:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 6;
} else {
goto D;
}
}
for (int i = 1; i <= L / 2; i++) {
E:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 7;
} else {
goto E;
}
}
for (int i = 1; i <= int(1.0 * log(L) / log(2)) * k; i++) {
F:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 0) {
mp[x][y] = 8;
} else {
goto F;
}
}
for (int i = 1; i <= L / 4; i++) {
G:
x = rand() % L + 1, y = rand() % L + 1;
if (mp[x][y] == 1) {
mp[x][y] = 9;
} else {
goto G;
}
}
mp[2][1] = 0, mp[L][1] = mp[L - 1][1] = 1;
return ;
}
void boomclear() {
while (!boom.empty()) {
boom.pop();
}
for (int i = 1; i <= len; i++) {
boomm[i] = 0;
}
len = rlen = 1;
return ;
}