游戏目标
在敌人 和**竞争者(寻宝者)**的干扰下,率先找到宝藏。
游戏要素
-
玩家(P) :由
(xx+5, yy+15)表示,使用WASD键移动 -
宝藏(H) :随机生成的
(px, py)坐标,玩家触碰即获胜 -
敌人(@红色) :初始位置
(x, y),会追踪玩家,触碰后HP-1 -
寻宝者(@黄色) :初始位置
(xxx, yyy),会与玩家竞争寻找宝藏
移动机制
-
玩家移动 :通过
KEY_DOWN宏检测按键(S/D/A/W对应下/右/左/上),移动前检查是否为墙壁'#' -
敌人AI:每4帧(l%4==0)且游戏运行超过300帧后,向玩家位置移动
-
寻宝者AI:同样每4帧,在200帧后开始向宝藏位置移动
操作方式
-
W键:向上移动
-
S键:向下移动
-
A键:向左移动
-
D键:向右移动
游戏角色说明
| 符号 | 颜色 | 身份 | 说明 |
|---|---|---|---|
| P | 青色 | 你(玩家) | 通过WASD控制移动 |
| H | 绿色 | 宝藏 | 触碰即获胜 |
| @ | 红色 | 敌人 | 会追踪你,触碰扣除1点HP |
| @ | 黄色 | 寻宝者 | 竞争对手,会先于你寻找宝藏 |
游戏规则
-
地图大小:1000×1000的网格世界
-
障碍物:地图随机生成"#"符号作为墙壁,无法穿过
-
生命值:初始HP=100,每次触碰红色敌人减少1点
-
胜负条件:
-
✅ 胜利:你的"P"移动到绿色"H"的位置
-
❌ 失败1:黄色寻宝者先找到宝藏
-
❌ 失败2:HP降至0或以下
-
游戏界面
屏幕会显示:
-
11行×31列的局部地图视野
-
实时坐标信息(你的位置、敌人位置、宝藏位置)
-
当前生命值
游玩流程
-
启动游戏,阅读介绍和规则
-
按任意键开始,地图随机生成
-
使用WASD移动,避开红色敌人,赶在黄色寻宝者之前找到宝藏
-
触碰绿色"H"即可获胜
小提示:敌人和寻宝者都会自动移动,需要规划路线快速行动!
cpp
#include<iostream>
#include<windows.h>
#define KEY_DOWN(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 1:0)
#define KEY_UP(vKey) ((GetAsyncKeyState(vKey) & 0x8000) ? 0:1)
#include<bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
char a[1005][1005];
int px,py,xx=500,yy=500,x=502,y=503,HP=100,xxx=510,yyy=510;
void COLOR_PRINT(const char* s, int color) {
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | color);
printf("%s", s);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7); // 恢复默认颜色
}
int main() {
cout<<"欢迎来到寻宝世界"<<endl;
cout<<endl<<endl<<endl<<endl<<endl;
system("pause") ;
system("cls");
cout<<"规则:"<<endl;
cout<<"1. ";
COLOR_PRINT("@", 6);
cout<<" 这是寻宝者,你需要在它之前找到宝藏。"<<endl;
cout<<"2. ";
COLOR_PRINT("H", 2);
cout<<" 这是宝藏,你需要在1000*1000的地图里找到它"<<endl;
cout<<"3. ";
COLOR_PRINT("@", 4);
cout<<" 这是敌人,它会追杀你,你有100HP,碰到它就会扣血"<<endl;
cout<<"4. 地图下面有各个图标的坐标"<<endl;
cout<<"5. 地控制方向用w,s,a,d四个键"<<endl;
cout<<endl<<endl;
system("pause") ;
system("cls");
srand((unsigned)time(NULL));
for(int i=1; i<=1000; i++) {
for(int j=1; j<=1000; j++) {
int o=rand()%10;
if(o==1)a[i][j]='#';
else a[i][j]=' ';
}
}
px=rand()%1000;
py=rand()%1000;
a[px][py]=' ';
int l=0;
while(1) {
l++;
for(int i=xx; i<=xx+10; i++) {
for(int j=yy; j<=yy+30; j++) {
if(i==xx+5&&j==yy+15) {
COLOR_PRINT("P", 3);
} else if(i==x&&j==y) {
COLOR_PRINT("@", 4);
} else if(i==px&&j==py) {
COLOR_PRINT("H", 2);
} else if(i==xxx&&j==yyy) {
COLOR_PRINT("@", 6);
} else {
cout<<a[i][j];
}
}
cout<<endl;
}
cout<<"坐标 x="<<xx+5<<" y="<<yy+15<<" 敌人坐标 x="<<x<<" y="<<y<<" 目标位置 x="<<px<<" y="<<py<<endl;
cout<<"HP="<<HP<<" 寻宝人位置 x="<<xxx<<" y="<<yyy<<endl;
if(KEY_DOWN(83)&&a[xx+6][yy+15]!='#') {
xx++;
} else if(KEY_DOWN(68)&&a[xx+5][yy+16]!='#') {
yy++;
} else if(KEY_DOWN(65)&&a[xx+5][yy+14]!='#') {
yy--;
} else if(KEY_DOWN(87)&&a[xx+4][yy+15]!='#') {
xx--;
}
if(l%4==0&&l>300) {
if(xx+5>x) {
x++;
} else if(xx+5<x) {
x--;
}
if(yy+15<y) {
y--;
} else if(yy+15>y) {
y++;
}
}
if(l%4==0&&l>200) {
if(px>xxx) {
xxx++;
} else if(px<xxx) {
xxx--;
}
if(py<yyy) {
yyy--;
} else if(py>yyy) {
yyy++;
}
}
if(xx+5==px&&yy+15==py) {
break;
}
if(xx+5==x&&yy+15==y) {
HP--;
}
if(xxx==px&&yyy==py) {
cout<<"you lost!";
system("pause");
system("cls");
return 0;
}
if(HP<=0) {
cout<<"you die...";
system("pause") ;
system("cls");
return 0;
}
system("cls");
}
cout<<endl;
cout<<"you win!"<<endl;
system("pause") ;
system("cls");
return 0;
}