//一言
//我是奥尔加·伊滋卡,几颗子弹不要紧的!
//——机动战士高达:铁血的孤儿
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<iostream>
#include<windows.h>
#include<cstdlib>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<conio.h>
#include<cmath>
#include<ctime>
using namespace std;
void seter(){
#define set_g SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
#define set_b SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
#define set_r SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
#define set_w SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
#define set_y SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
#define set_o SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_GREEN);
#define set_p SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
#define set_d SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
#define ll long long
#define GTC GetTickCount()
#define timer move_vul=GTC+vul;
}
ll dx[5]={0,1,-1,0},dy[5]={1,0,0,-1},vul=22000,l_l=12,r_r=10,watch,eqq=1,shine_time,bag[10],show_hp,sum,typp,d[5]={0,1,2,2,4};
char ma[31][71],n,act_line[10001];
static ll game_time,move_vul,m_t,h_t,ft,t1[10],blood_time,mt;
bool st,fight,pool[6],sh,L;
struct tool{
int x,y;
}type[4];
struct equ{
string st;
int t;
}eq[10];
struct hero_ans_moster{
int x,y,dep,hp,mp,ret_time,rr_time;
int ij,tu,x0,y0;
}h,m[21];
struct find{
int x[4],y[4];
}p[20];
struct moster_s_skills{
int s[10],type;
}ms[21];
int disc(int x1,int y1,int x2,int y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int eisc(int x1,int y1,int x2,int y2){return max(abs(x1-x2),abs(y1-y2));}
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info={1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void sco(){
switch(rand()%7){
case 0:{set_y break;}
case 1:{set_r break;}
case 2:{set_g break;}
case 3:{set_p break;}
case 4:{set_y break;}
case 5:{set_d break;}
case 6:{set_b break;}
}
}
void put_st(){
switch(GTC%5){
case 0:{set_g break;}
case 1:{set_y break;}
case 2:{set_r break;}
case 3:{set_d break;}
case 4:{set_p break;}
}
printf(
" ------------ ------- ----- ---- ---------\n"
" ------------ ----- ------ ---- ----------\n"
" ---- --- --- --- --- --- ---\n"
" -------- --- --- --- --- --- ---\n"
" -------- --- --- --- --- --- ---\n"
" ---- --- --- --- --- --- ---\n"
" ---- ----- --- --- --- --- ---\n"
" ---- ------- --- ----- ----------\n"
" 请按下'x'开始 \n"
" 按下'b'查看玩fa,乱搞! \n"
);
}
void pan(int wt){
if(m[wt].hp<=0){
m[wt].x=m[wt].x0,m[wt].y=m[wt].y0;
m[wt].rr_time+=3000;
if(wt==1)m[wt].hp=20,eqq=max(eqq,1ll);
if(wt==2)m[wt].hp=8,eqq=max(eqq,2*1ll);
if(wt==3)m[wt].hp=40,eqq=max(eqq,3*1ll);
sum++;
}
}
void attack(){
if(move_vul>GTC)return ;
cin>>act_line;
switch(act_line[0]){
case 'P':{
typp=1;
for(int i=1;i<=3;i++){
if(m[i].x>0&&m[i].y>0&&m[i].y<=l_l&&m[i].x<=r_r){
m[i].hp-=10;
pan(i);
}
}
mt=GTC+800;
shine_time=GTC+800;
break;
}
case 'f':{
typp=2;
m[watch].hp-=12;
pan(watch);
for(int i=1;i<=3;i++){
if(i!=watch){
if(disc(m[watch].x,m[watch].y,m[i].x,m[i].y)<=3){
m[i].hp-=6;
pan(i);
}
}
}
mt=GTC+800;
shine_time=GTC+800;
break;
}
}
timer
}
void get_move(){
if(!kbhit())return ;
n=getch();
if(n=='k')attack();
if(h_t>GTC)return ;
h_t=GTC+100;
if(n=='i'){
if(disc(h.x,h.y,m[watch].x,m[watch].y)<=d[eqq]){
if(m[watch].hp>0)m[watch].hp-=2;
pan(watch);
h_t=GTC+600;
ft=GTC+500;
}
}
if(n=='a'&&h.y-1>0)h.y--;
if(n=='s'&&h.x+1<=r_r)h.x++;
if(n=='w'&&h.x-1>0)h.x--;
if(n=='d'&&h.y+1<=l_l)h.y++;
if(n=='p'){
watch++;
if(watch>=4)watch=1;
}
if(n=='1'){
if(bag[1]>0)bag[1]--,h.hp+=2;
else n='2';
}
if(n=='2'){
if(bag[3]>0){
if(m[watch].hp>0){
bag[3]-=3,m[watch].hp--;
pan(watch);
ft=GTC+500;
}
}
else n='3';
}
if(n=='3'){
if(bag[2]>0)bag[2]--,h.hp+=8;
}
}
int check(int x,int y,int dep){
if(m[3].tu&&eisc(x,y,m[3].x,m[3].y)==1)return 9;
if(x==h.x&&y==h.y)return 1;
for(int i=1;i<=20;i++){
if(x==m[i].x&&y==m[i].y)return 0;
}
for(int i=1;i<=3;i++){
if(x==p[dep].x[i]&&y==p[dep].y[i])return 2;
}
for(int i=1;i<=4;i++){
if(x==type[i].x&&y==type[i].y)return i+2;
}
return 10;
}
void put_map(int dep){
for(int i=1;i<=r_r;i++){
for(int j=1;j<=l_l;j++){
switch(check(i,j,dep)){
case 1:{set_p putchar('@');break;}
case 0:{
set_r
if(mt<=GTC&&(ft<=GTC||disc(i,j,m[watch].x,m[watch].y)!=0)){
if(disc(i,j,m[1].x,m[1].y)==0)putchar('m');
else if(disc(i,j,m[2].x,m[2].y)==0)putchar('M');
else {
sco();
putchar('W');
}
}
else {
printf("*");
}
break;
}
case 2:{set_w putchar('n');break;}
case 3:{set_g putchar('u');break;}
case 4:{set_g putchar('o');break;}
case 5:{set_g putchar(',');break;}
case 6:{set_g putchar('Q');break;}
case 9:{set_r putchar('w');break;}
case 10:{
if(shine_time>=GTC){
if(sh){
if(mt>GTC){
if(typp==1)set_p
if(typp==2)set_y
}
else set_w
}
else {
if(mt>GTC){
if(typp==1)set_d
if(typp==2)set_r
}
else set_r
}
sh=!sh;
}
else set_w
putchar('.');break;
}
}
putchar(' ');
}
putchar('\n');
}
printf("%lld\n",sum);
set_y printf("-------------------\n");
set_g printf("hp %d ",show_hp);
set_d printf("looking %d\n",watch);
set_w
if(bag[1]){printf("orange %d\n",bag[1]);}
if(bag[2]){printf("bread favour bread %d\n",bag[2]);}
if(bag[3]){printf("stone made by water %d\n",bag[3]);}
set_y printf("-------------------\n");
}
void clear_set(){
m[1].x=l_l+1,m[1].y=r_r+1;
show_hp=m[1].hp=20;
m[1].ret_time=GTC+1100;
m[2].x=0,m[2].y=0;
m[2].hp=8;
m[2].ret_time=GTC+90000;
m[2].rr_time=GTC+90000;
m[3].x=0,m[3].y=l_l+1;
m[3].hp=50;
m[3].ret_time=GTC+600;
m[3].rr_time=GTC+200000;
h.hp=10;
type[1].x=type[2].x=type[3].x=type[4].x=l_l+1;
type[1].y=type[2].y=type[3].y=type[4].y=r_r+1;
t1[1]=GTC+10000;
t1[2]=GTC+70000;
t1[3]=GTC+120000;
t1[4]=GTC+200000;
}
void moster_move(){
for(int mm=1;mm<=2;mm++){
if(GTC>=m[mm].ret_time){
if(m[mm].tu<=0){
if(m[mm].x==h.x){
if(m[mm].y<h.y)m[mm].ij=0;
else m[mm].ij=3;
}
else if(m[mm].y==h.y){
if(m[mm].x<h.x)m[mm].ij=1;
else m[mm].ij=2;
}
else continue;
m[mm].tu=(mm==1?4:6);
}
if(m[mm].tu>0){
if(m[mm].rr_time<GTC){
int xx=m[mm].x+dx[m[mm].ij];
int yy=m[mm].y+dy[m[mm].ij];
if(xx>0&&xx<=r_r)m[mm].x=xx;
if(yy>0&&yy<=l_l)m[mm].y=yy;
m[mm].tu--;
if(m[mm].tu<=0){
m[mm].ret_time=GTC+2100;
}
m[mm].rr_time=GTC+100;
if(h.x==m[mm].x&&h.y==m[mm].y){
// Beep(880,100);
shine_time=GTC+300;
h.hp-=mm;
}
}
return ;
}
}
}
if(GTC>=m[3].rr_time){
if(m[3].tu==0){
m[3].tu=8;
}
else {
if(eisc(h.x,h.y,m[3].x,m[3].y)<=1){
// Beep(880,100);
shine_time=GTC+300;
h.hp-=2;
}
m[3].tu--;
if(m[3].tu<=0){
m[3].rr_time=GTC+3000;
}
}
}
for(int mm=1;mm<=3;mm++){
if(GTC<m[mm].rr_time||(m[mm].tu&&mm!=3))continue;
if(mm==1)m[mm].rr_time=GTC+330;
if(mm==2)m[mm].rr_time=GTC+180;
if(mm==3)m[mm].rr_time=GTC+250;
int tmp=1000,rest;
for(int j=0;j<4;j++){
int xx=m[mm].x+dx[j];
int yy=m[mm].y+dy[j];
if(disc(h.x,h.y,xx,yy)<tmp&&disc(h.x,h.y,xx,yy)>=1){
for(int k=1;k<=3;k++){
if(k==mm)continue;
if(disc(m[k].x,m[k].y,xx,yy)!=0){
tmp=disc(h.x,h.y,xx,yy);
rest=j;
}
}
}
}
if(tmp<=disc(h.x,h.y,m[mm].x,m[mm].y)){
m[mm].x+=dx[rest];
m[mm].y+=dy[rest];
if(mm==3&&m[3].tu>0)m[3].tu--;
}
}
}
void game_over(){
if(show_hp<=0){
Sleep(1000);
system("cls");
while(1){
for(int i=1;i<=5;i++)putchar('\n');
printf(" ");
set_r putchar('g');
set_g putchar('a');
set_b putchar('m');
set_y putchar('e');
putchar(' ');
set_p putchar('o');
set_r putchar('v');
set_w putchar('e');
set_g putchar('r');
set_d printf("\n 你好蔡啊\n");
}
}
}
void winner(){
if(sum>=30){
system("cls");
while(1){
system("cls");
printf("\n");
sco();
printf(" ---- ---- -------- ---- ----\n");
sco();
printf(" ---- ---- ---------- ---- ----\n");
sco();
printf(" ---- ---- --- ---- ---- ---\n");
sco();
printf(" ------ --- ---- ---- ---\n");
sco();
printf(" ---- --- ---- ---- ---\n");
sco();
printf(" ---- ------- ------\n");
sco();
printf(" --- --- --- ----- --- ---\n");
sco();
printf(" -- -- -- --- -- -- --\n");
sco();
printf(" --- --- -- -- -- --\n");
sco();
printf(" - - ---- --- - --- ");
}
}
}
void tooler(){
for(int i=1;i<=4;i++){
if(type[i].x>l_l||type[i].y>r_r){
if(t1[i]<GTC){
type[i].x=rand()%(l_l-1),type[i].y=rand()%(r_r-1);
if(type[i].x==0)type[i].x=l_l;
if(type[i].y==0)type[i].y=r_r;
t1[i]=GTC+rand()%(i*10000)+2000;
}
}
if(h.x==type[i].x&&h.y==type[i].y){
if(i!=4){
type[i].x=l_l+1,type[i].y=r_r+1;
bag[i]++;
}
else {
system("cls");
int tmp=0;
printf(
" \n"
" \n"
" \n"
" @ @ \n"
);
printf("不要怕危险\n");
printf("选一个吧(1 2)\n");
n=getch();
if(n=='1'){
printf("这把剑给你\n");
Sleep(1000);
eqq=4;
}
if(n=='2'){
printf("休息一下吧\n");
Sleep(1000);
h.hp+=20;
}
// if(n=='3'){
// printf("天降正义\n");
// Sleep(1000);
//
// for(int i=1;i<=3;i++){
// if(m[i].x>0&&m[i].y>0&&m[i].y<=l_l&&m[i].x<=r_r){
// m[i].hp-=50;
// pan(i);
// }
// }
//
// }
type[i].x=l_l+1,type[i].y=r_r+1;
}
}
}
}
void booker(){
set_w
printf("wasd为方向\n");
printf("你需要按下'p'选择注视一个敌人,你的所有攻击会自动打向注视着的敌人\n");
set_r
printf("另外,m的编号为1,M的编号为2\n");
set_w
printf("按下'i'键普通攻击(有攻击距离)\n");
set_g
printf("按下'k'后,输入指令使用技能(内置CD)\n");
set_w
printf("按下'x'开始");
n=getch();
if(n=='x'){
st=1;
return ;
}
}
int main(){
srand(100);
move_vul=1000+GTC;
HideCursor();
clear_set();
h.x=5,h.y=5;
while(!st){
put_st();n=getch();
if(n=='x'){
st=1;
}
else if(n=='b'){
system("cls");
booker();
}
system("cls");
}
timer
game_time+=11;
blood_time=GTC+500;
set_w
while(1){
if(GTC>blood_time){
if(h.hp>show_hp)show_hp++;
else if(h.hp<show_hp)show_hp--;
blood_time=GTC+750;
}
while(GTC<game_time){n='?';}
game_time+=33;
system("cls");
tooler();
get_move();
moster_move();
put_map(1);
game_over();
winner();
}
}