#include <bits/stdc++.h>
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
int toint(double a) {
return ((int)(a * 10 + 5)) / 10;
}
int rand(int a) {
return rand() % a;
}
void SlowDisplay(int x, char *p) {
while (1) {
if (*p != 0)
printf("%c", *p++);
else
break;
Sleep(x);
}
}
void Setpos(double x, double y) {
COORD pos;
pos.X = toint(y * 2), pos.Y = toint(x);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void Color(int a) {
if (a == -1)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
if (a == -2)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
if (a == -3)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
if (a == 0)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
if (a == 1)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED);
if (a == 2)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_RED);
if (a == 3)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN);
if (a == 4)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
if (a == 5)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_RED | BACKGROUND_BLUE);
if (a == 6)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_BLUE);
}
struct node {
int what;
double x, y, vx, vy, r, m;
bool life;
int gun, master = -1;
} Sun[1000001];
int b, T, m[41][41], n[41][41], m2[41][41], n2[41][41], dif[11], Speed = 10, Ba, Hotguntime, Hotguntimemax = 10, Blood,
Score;
double Speedmax, Speedless, Speedmore = 1, Balljump = -0.7, Fire = 0.08;
void Push(int a, int b) {
if (Sun[a].master == b || Sun[b].master == a)
return;
if (Sun[a].life == 0 || Sun[b].life == 0)
return;
if (Sun[a].what == 3 || Sun[b].what == 3)
return;
if (Sun[a].what == 4 || Sun[b].what == 4)
return;
double Ax = Sun[a].x - Sun[b].x, Ay = Sun[a].y - Sun[b].y, Dis = sqrt(Ax * Ax + Ay * Ay) * 1.0,
fDis = sqrt((Sun[a].vx - Sun[b].vx) * (Sun[a].vx - Sun[b].vx) + (Sun[a].vy - Sun[b].vy) * (Sun[a].vy - Sun[b].vy));
if (Dis == 0)
return;
if (abs(Ay) <= 0.0001)
Ay = 0.0001;
if (Sun[a].what == 2 || Sun[b].what == 2)
int c;
else if (Dis <= Sun[a].r + Sun[b].r + fDis) {
double Vx = (Sun[a].vx + Sun[b].vx) / 2.0, Vy = (Sun[a].vy + Sun[b].vy) / 2.0,
aX = (Sun[a].x + Sun[b].x + Sun[a].vx + Sun[b].vx) / 2.0, aY = (Sun[a].y + Sun[b].y + Sun[a].vy + Sun[b].vy) / 2.0;
Sun[a].vx = Sun[b].vx = Vx, Sun[a].vy = Sun[b].vy = Vy;
Sun[a].x = aX - (Ax / Dis) / 2.0, Sun[b].x = aX + (Ax / Dis) / 2.0;
Sun[a].y = aY - (Ay / Dis) / 2.0, Sun[b].y = aY + (Ay / Dis) / 2.0;
return;
}
double ac = Sun[a].m * Sun[b].m / (Dis * Dis) * 1.0, afx = 0, afy = 0, d = abs(Ax / Ay * 1.0);
afy = sqrt(ac / (1 + d * d)) * 1.0, afx = sqrt(ac / (1 + d * d)) * d * 1.0;
if (Ax > 0)
afx *= -1;
if (Ay > 0)
afy *= -1;
#define A Sun[a].vx+=afx/Sun[a].m*Speedless,Sun[a].vx=max(-Speedmax,min(Speedmax,Sun[a].vx)),Sun[a].vy+=afy/Sun[a].m*Speedless,Sun[a].vy=max(-Speedmax,min(Speedmax,Sun[a].vy))
#define B Sun[b].vx-=afx/Sun[b].m*Speedless,Sun[b].vx=max(-Speedmax,min(Speedmax,Sun[b].vx)),Sun[b].vy-=afy/Sun[b].m*Speedless,Sun[b].vy=max(-Speedmax,min(Speedmax,Sun[b].vy))
Speedmax = 0.1, Speedless = 0.01;
if (Sun[a].what == 2 && Sun[b].what == 2)
Speedmax = 3.0;
if (Sun[a].what == 0) {
Speedless = 0.008;
Speedmax = 1.0;
A;
} else if (Sun[a].what == 1) {
A;
if (Sun[b].what == 1)
B;
} else if (Sun[a].what == 2) {
Speedless = 0.8;
B;
if (Sun[b].what == 2)
A;
} else {
A;
B;
}
}
int Painting[41][41] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},};
void Paint(int a);
void Move(int a) {
Blood = 10000000;
memset(m, 0, sizeof(m));
memset(m2, 0, sizeof(m2));
#define ix toint(Sun[i].x/1.0)
#define iy toint(Sun[i].y/1.0)
#define jx toint(Sun[j].x/1.0)
#define jy toint(Sun[j].y/1.0)
if (Sun[0].life == 1) {
Sun[0].x += Sun[0].vx / Speedmore;
Sun[0].y += Sun[0].vy / Speedmore;
if (Sun[0].x > 40)
Sun[0].x = 40, Sun[0].vx = 0;
if (Sun[0].x < 0)
Sun[0].x = 0, Sun[0].vx = 0;
if (Sun[0].y > 40)
Sun[0].y = 40, Sun[0].vy = 0;
if (Sun[0].y < 0)
Sun[0].y = 0, Sun[0].vy = 0;
}
for (int i = 0; i <= b; i++)
for (int j = i + 1; j <= b; j++)
Push(i, j);
for (int i = 0; i <= b; i++)
for (int j = 0; j <= b; j++) {
if (i == j || Sun[i].life == 0 || Sun[j].life == 0)
continue;
if (Sun[i].what == 4 && (Sun[j].what >= 100 && Sun[j].what < 200)) {
if (abs(ix - jx) < 1 && abs(iy - jy) < 1)
Ba--, Sun[i].life = Sun[j].life = 0, Score += 10;
}
if (Sun[i].what == 203 && Sun[i].master != j && Sun[j].what < 200)
if (abs(ix - jx) < 2 && abs(iy - jy) < 2)
Sun[j].vx -= Sun[i].vx / 10.0, Sun[j].vy -= Sun[i].vy / 10.0, Sun[i].life = 0;
if (Sun[i].what == 204 && Sun[i].master != j && Sun[j].what < 200)
if (abs(ix - jx) < 2 && abs(iy - jy) < 2)
Sun[j].vx += Sun[i].vx / 10.0, Sun[j].vy += Sun[i].vy / 10.0, Sun[i].life = 0;
}
int i = 0;
if (m[ix][iy] > 0 && m[ix][iy] < 100) {
if (m[ix][iy] <= 1)
Blood -= 1;
else if (m[ix][iy] <= 4)
Blood -= 2;
else if (m[ix][iy] <= 10)
Blood -= 3;
else if (m[ix][iy] > 10 && m[ix][iy] < 100)
Blood -= 4;
}
for (int i = 1; i <= b; i++) {
if (Sun[i].life == 0)
continue;
Sun[i].x += Sun[i].vx / Speedmore;
Sun[i].y += Sun[i].vy / Speedmore;
Balljump = -0.7;
if (Sun[i].what == 3)
Balljump = -1;
if (Sun[i].what == 4)
Balljump = -1;
if (Sun[i].x > 40)
Sun[i].x = 40, Sun[i].vx *= Balljump;
if (Sun[i].x < 0)
Sun[i].x = 0, Sun[i].vx *= Balljump;
if (Sun[i].y > 40)
Sun[i].y = 40, Sun[i].vy *= Balljump;
if (Sun[i].y < 0)
Sun[i].y = 0, Sun[i].vy *= Balljump;
if (Sun[i].what == 1) {
m[ix][iy] += 2;
int R;
R = rand(3);
if (R == 0 && ix < 40)
m[ix + 1][iy]++;
R = rand(3);
if (R == 0 && ix > 0)
m[ix - 1][iy]++;
R = rand(3);
if (R == 0 && iy < 40)
m[ix][iy + 1]++;
R = rand(3);
if (R == 0 && iy > 0)
m[ix][iy - 1]++;
}
if (Sun[i].what == 2) {
m[ix][iy] += 2;
if (ix < 40)
m[ix + 1][iy] += 10;
if (ix > 0)
m[ix - 1][iy] += 10;
if (iy < 40)
m[ix][iy + 1] += 10;
if (iy > 0)
m[ix][iy - 1] += 10;
if (ix < 40 && iy < 40)
m[ix + 1][iy + 1] += 4;
if (ix < 40 && iy > 0)
m[ix + 1][iy - 1] += 4;
if (ix > 0 && iy < 40)
m[ix - 1][iy + 1] += 4;
if (ix > 0 && iy > 0)
m[ix - 1][iy - 1] += 4;
m[ix][iy] = 10086;
}
if (Sun[i].what == 3) {
if (abs(ix - Sun[0].x) < 1 && abs(iy - Sun[0].y) < 1)
Ba--, Sun[i].life = 0;
else
m2[ix][iy] = 2;
}
if (Sun[i].what == 4) {
m2[ix][iy] = 2;
}
if (Sun[i].what >= 100 && Sun[i].what < 300) {
if (Sun[i].x == 0 || Sun[i].y == 0 || Sun[i].x == 40 || Sun[i].y == 40 || (abs(Sun[i].vx) <= 0.5
&& abs(Sun[i].vy) <= 0.5))
Sun[i].life = 0;
if (Sun[i].what == 203 || Sun[i].what == 204) {
m[ix][iy] = Sun[i].what;
if (ix < 40)
m[ix + 1][iy] = Sun[i].what;
if (ix > 0)
m[ix - 1][iy] = Sun[i].what;
if (iy < 40)
m[ix][iy + 1] = Sun[i].what;
if (iy > 0)
m[ix][iy - 1] = Sun[i].what;
} else
m2[ix][iy] = Sun[i].what;
}
}
if (Sun[0].life == 1)
m2[toint(Sun[0].x / 1.0)][toint(Sun[0].y / 1.0)] = 1;
Paint(a);
}
void Paint(int a) {
for (int i = 0; i <= 40; i++)
for (int j = 0; j <= 40; j++) {
if (a == 0 && Painting[i][j] != 0)
continue;
if (m2[i][j] != n2[i][j]) {
n2[i][j] = m2[i][j];
n[i][j] = 0;
Setpos(i, j);
if (m2[i][j] == 0)
Color(0), cout << " ";
else if (m2[i][j] == 1)
Color(-1), cout << "●";
else if (m2[i][j] == 2)
Color(-3), cout << "◎";
else if (m2[i][j] == 101)
Color(-1), cout << "☉";
else if (m2[i][j] == 102)
Color(3), cout << " ";
continue;
}
if (m[i][j] != n[i][j]) {
n[i][j] = m[i][j];
n2[i][j] = 0;
Setpos(i, j);
if (m[i][j] >= 10086)
Color(4), cout << "●";
else if (m[i][j] == 203)
Color(5), cout << " ";
else if (m[i][j] == 204)
Color(6), cout << " ";
else if (m[i][j] == 0)
Color(0), cout << " ";
else if (m[i][j] <= 1)
Color(1), cout << " ";
else if (m[i][j] <= 4)
Color(2), cout << " ";
else if (m[i][j] <= 10)
Color(3), cout << " ";
else if (m[i][j] > 10 && m[i][j] < 100)
Color(4), cout << " ";
else
Color(0), cout << "?!";
}
Color(0);
}
}
void RandStart(int a) {
for (int i = 1; i <= a; i++) {
b++;
Sun[b].x = rand(41), Sun[b].y = rand(41);
Sun[b].vx = (rand(41) - 20) / 10.0, Sun[b].vy = (rand(41) - 20) / 10.0, Sun[b].m = 1, Sun[b].r = 1, Sun[b].life = 1,
Sun[b].what = 1;
}
}
void CornerStart(int a) {
for (int i = 1; i <= a; i++) {
b++;
int k = rand(4);
if (k == 0 || k == 2)
Sun[b].x = rand(41);
else
Sun[b].y = rand(41);
if (k == 0)
Sun[b].y = 0;
if (k == 1)
Sun[b].x = 0;
if (k == 2)
Sun[b].y = 40;
if (k == 3)
Sun[b].x = 40;
Sun[b].vx = (rand(41) - 20) / 10.0, Sun[b].vy = (rand(41) - 20) / 10.0, Sun[b].m = 1, Sun[b].r = 1, Sun[b].life = 1,
Sun[b].what = 1;
}
}
void SunStart(int x, int y, int r, int vx, int vy) {
b++;
Sun[b].x = x, Sun[b].y = y;
Sun[b].vx = vx, Sun[b].vy = vy, Sun[b].m = 1000, Sun[b].r = 1, Sun[b].life = 1, Sun[b].what = 2;
for (int i = x - r; i <= x + r; i++)
for (int j = y - r; j <= y + r; j++) {
b++;
Sun[b].x = i, Sun[b].y = j;
Sun[b].vx = (rand(41) - 20) / 100.0 + vx, Sun[b].vy = (rand(41) - 20) / 100.0 + vy, Sun[b].m = 1, Sun[b].r = 1,
Sun[b].life = 1, Sun[b].what = 1;
}
for (float i = (int)(x - r / 2) - 0.5; i <= (int)(x + r / 2) + 0.5; i++)
for (float j = (int)(y - r / 2) - 0.5; j <= (int)(y + r / 2) + 0.5; j++) {
b++;
Sun[b].x = i, Sun[b].y = j;
Sun[b].vx = (rand(41) - 20) / 100.0 + vx, Sun[b].vy = (rand(41) - 20) / 100.0 + vy, Sun[b].m = 1, Sun[b].r = 1,
Sun[b].life = 1, Sun[b].what = 1;
}
}
void Shoot(int a, bool q) {
double Sunavx = Sun[a].vx, Sunavy = Sun[a].vy;
if (Sun[a].vx == 0 && Sun[a].vy == 0)
Sunavx = -1;
if (Sun[a].vy == 0)
Sunavy = 0.001;
if (Sun[a].gun >= 1 && Sun[a].gun <= 4) {
b++;
Sun[b].x = Sun[a].x, Sun[b].y = Sun[a].y;
double ac;
if (Sun[a].gun == 1)
ac = 3.0;
if (Sun[a].gun >= 2 && Sun[a].gun <= 4)
ac = 7.0;
double d = abs(Sunavx / Sunavy * 1.0);
Sun[b].vy = sqrt(ac / (1 + d * d)) * 1.0, Sun[b].vx = sqrt(ac / (1 + d * d)) * d * 1.0;
if (Sunavx > 0)
Sun[b].vx *= -1;
if (Sunavy > 0)
Sun[b].vy *= -1;
if (q == 1)
Sun[b].vx *= -1, Sun[b].vy *= -1;
Sun[b].life = 1;
Sun[b].master = a;
int bb = b;
if (Sun[a].gun == 1 || Sun[a].gun == 2)
Sun[b].what = 100 + Sun[a].gun, Sun[b].m = 1;
if (Sun[a].gun == 3 || Sun[a].gun == 4)
Sun[b].what = 200 + Sun[a].gun, Sun[b].m = 1;
if (Sun[a].gun >= 2 && Sun[a].gun <= 4) {
double kx = Sun[bb].x, ky = Sun[bb].y;
for (int j = 1; j <= 7; j++) {
kx -= Sun[bb].vx / 3.5, ky -= Sun[bb].vy / 3.5;
if (kx < 0 || ky < 0 || kx > 40 || ky > 40)
continue;
b++, Sun[b].x = kx, Sun[b].y = ky, Sun[b].vx = Sun[bb].vx, Sun[b].vy = Sun[bb].vy, Sun[b].what = Sun[bb].what,
Sun[b].master = a, Sun[b].life = 1;
}
}
}
}
void Start() {
for (int i = 0; i <= 40; i++)
for (int j = 0; j <= 40; j++) {
if (Painting[i][j] == 1)
Setpos(i, j), Color(-2), cout << "■";
if (Painting[i][j] == 2)
Setpos(i, j), Color(-2), cout << "作者:郭思辰";
if (Painting[i][j] == 3)
Setpos(i, j), Color(-2), cout << "按 y 开始游戏!";
if (Painting[i][j] == 4)
Setpos(i, j), Color(-2), cout << "不要搞错成拼音输入法!";
if (Painting[i][j] == 5)
Setpos(i, j), Color(-2), cout << "Three-Body STAR WARs!";
}
for (int i = 1; i <= 3; i++)
SunStart(rand(31) + 5, rand(31) + 5, 5, (rand(101) - 50) / 10.0, (rand(101) - 50) / 10.0);
T = 0;
while (1) {
T++;
if (T % 50 == 0)
CornerStart(1);
if (kbhit()) {
char g = _getch();
if (g == 'y')
break;
}
Move(0);
Sleep(Speed);
}
Color(0);
system("cls");
Setpos(10, 10);
SlowDisplay(30, "你想要教程吗?(y/n)");
char g = _getch();
if (g != 'y')
return;
Setpos(10, 10);
SlowDisplay(30, "那我们开始。。。 ");
Sleep(500);
system("cls");
Setpos(30, 10);
system("cls");
memset(Sun, 0, sizeof(Sun));
memset(m, 0, sizeof(m));
memset(m2, 0, sizeof(m2));
Sun[0].x = Sun[0].y = 20;
Sun[0].life = 1;
Sun[0].m = 10;
T = 0;
int step = 0;
while (1) {
T++;
if (T == 2) {
Setpos(10, 10), SlowDisplay(30, "这是你的飞船,你可以用↑↓←→键来操纵它。");
Sleep(500);
Setpos(12, 10), SlowDisplay(30, "在宇宙航行没有阻力,也就是说你的惯性会主导一切。");
Sleep(500);
Setpos(14, 10), SlowDisplay(30, "当你撞到边界时,你的速度会减为零。");
Sleep(1000);
Setpos(16, 10), SlowDisplay(30, "试试看。");
}
if (T == 200) {
Setpos(10, 10), SlowDisplay(30, "在宇宙航行时有两个小技巧: ");
Setpos(12, 10), SlowDisplay(30, "1、不要太快。 ");
Setpos(14, 10), SlowDisplay(30, "2、有时转向比调头更有用。 ");
Sleep(1000);
Setpos(16, 10), SlowDisplay(30, "接下来我们稍稍提高点难度!请到达所有靶位点!");
Sleep(500);
b++;
Sun[b].x = rand(40), Sun[b].y = rand(40);
Sun[b].vx = (rand(101) - 50) / 30.0, Sun[b].vy = (rand(101) - 50) / 30.0, Sun[b].life = 1, Sun[b].what = 3;
Ba++;
Move(1);
Sleep(1000);
}
if (Ba > 0)
Setpos(1, 1), cout << "剩余靶位点:" << Ba << ' ';
if (step >= 1)
Setpos(5, 1), cout << "Cooling time: " << Hotguntime << " ";
if (T > 200 && Ba == 0 && step == 0)
T = 201, step = 1, Setpos(1, 1), cout << " ";
if (T > 300 && Ba == 0 && step == 1)
T = 201, step = 2, Setpos(1, 1), cout << " ";
if (T == 202 && step == 1) {
Setpos(10, 10), SlowDisplay(30, "做的好!看来是时候给你装备初始武器了。");
Setpos(12, 10), SlowDisplay(50, "。。。 星际电磁轨道炮 已装备。");
Setpos(14, 10), SlowDisplay(30, "按下w/s发射子弹! ");
Sun[0].gun = 1;
Hotguntime = 0;
}
if (T == 300 && step == 1) {
Setpos(16, 10), SlowDisplay(30, "来吧!请击毁所有靶位点!");
Sleep(500);
b++;
Sun[b].x = rand(40), Sun[b].y = rand(40);
Sun[b].vx = (rand(101) - 50) / 30.0, Sun[b].vy = (rand(101) - 50) / 30.0, Sun[b].life = 1, Sun[b].what = 4;
Ba++;
Move(1);
Sleep(1000);
Ba = 1;
}
if (T == 202 && step == 2) {
Setpos(10, 10), SlowDisplay(30, "太阳什么的你也看到过了。 ");
Setpos(12, 10), SlowDisplay(30, "其旁缠绕着的火会扣你的血。 ");
Setpos(14, 10), SlowDisplay(30, "打靶位点可以积10分,发射子弹-1分,分数达到20通关,简单吧!");
Sleep(1000);
Setpos(16, 10), SlowDisplay(60, "让 我 们 开 始 吧!!!");
Sleep(1000);
system("cls");
return;
}
double v = sqrt(Sun[0].vx * Sun[0].vx + Sun[0].vy * Sun[0].vy);
if (GetAsyncKeyState(VK_UP) & 0x8000) {
if (Sun[0].vx >= 0)
Sun[0].vx -= 2 * Fire;
else if (v < 4)
Sun[0].vx -= Fire;
} else if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
if (Sun[0].vx <= 0)
Sun[0].vx += 2 * Fire;
else if (v < 4)
Sun[0].vx += Fire;
}
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
if (Sun[0].vy >= 0)
Sun[0].vy -= 2 * Fire;
else if (v < 4)
Sun[0].vy -= Fire;
} else if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
if (Sun[0].vy <= 0)
Sun[0].vy += 2 * Fire;
else if (v < 4)
Sun[0].vy += Fire;
}
if (Hotguntime > 0)
Hotguntime--;
if (kbhit()) {
char g = _getch();
if (Hotguntime == 0 && g == 's') {
if (abs(Sun[0].vx) >= 0.01)
Sun[0].vx *= 0.7;
if (abs(Sun[0].vy) >= 0.01)
Sun[0].vy *= 0.7;
Shoot(0, 0);
Hotguntime = Hotguntimemax;
}
if (Hotguntime == 0 && g == 'w') {
if (abs(Sun[0].vx) <= 2)
Sun[0].vx *= 1.2;
if (abs(Sun[0].vy) <= 2)
Sun[0].vy *= 1.2;
Shoot(0, 1);
Hotguntime = Hotguntimemax;
}
}
Move(1);
Sleep(Speed);
}
}
int main() {
system("mode con cols=82 lines=43");
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
srand((unsigned)time(NULL));
Y:
Start();
memset(Sun, 0, sizeof(Sun));
memset(m, 0, sizeof(m));
memset(m2, 0, sizeof(m2));
YY:
system("cls");
Setpos(10, 10), SlowDisplay(30, "选难度吧,几个太阳?(0~10,回车确定)");
int i = 10;
while (dif[i] != 1 && i >= 0) {
i--;
}
Setpos(12, 10);
if (i == -1)
printf("推荐难度:0个太阳。");
else if (i < 10)
printf("加油,推荐难度:%d个太阳。", i + 1);
else if (i == 10)
printf("你通关了!随便选吧!", i);
Setpos(15, 10);
int p;
cin >> p;
if (p < 0 || p > 10) {
SlowDisplay(150, "输入错误!"), Sleep(1000);
goto YY;
}
for (int i = 1; i <= p; i++)
SunStart(rand(31) + 5, rand(31) + 5, 5, (rand(101) - 50) / 10.0, (rand(101) - 50) / 10.0);
Sun[0].x = Sun[0].y = 5;
Sun[0].vx = 0.1;
Sun[0].life = 1;
Sun[0].m = 10;
T = 0;
Sun[0].gun = 1;
Blood = 100;
Score = 0;
Ba = 0;
for (int i = 1; i <= 10; i++) {
b++;
Sun[b].x = rand(40), Sun[b].y = rand(40);
Sun[b].vx = (rand(101) - 50) / 30.0, Sun[b].vy = (rand(101) - 50) / 30.0, Sun[b].life = 1, Sun[b].what = 4;
Ba++;
}
while (Blood > 0 && Score < 100) {
Setpos(1, 1), cout << "Blood: " << Blood << " ";
Setpos(3, 1), cout << "Score: " << Score << " ";
Setpos(5, 1), cout << "Cooling time: " << Hotguntime << " ";
T++;
if (T == 1)
Sleep(1000);
if (T % 50 == 0)
CornerStart(1);
if (T % 30 == 0 && Ba < 5) {
b++;
Sun[b].x = rand(40), Sun[b].y = rand(40);
Sun[b].vx = (rand(101) - 50) / 30.0, Sun[b].vy = (rand(101) - 50) / 30.0, Sun[b].life = 1, Sun[b].what = 4;
Ba++;
}
if (T % 40 == 0 && Blood < 100)
Blood++;
double v = sqrt(Sun[0].vx * Sun[0].vx + Sun[0].vy * Sun[0].vy);
if (GetAsyncKeyState(VK_UP) & 0x8000) {
if (Sun[0].vx >= 0)
Sun[0].vx -= 2 * Fire;
else if (v < 4)
Sun[0].vx -= Fire;
} else if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
if (Sun[0].vx <= 0)
Sun[0].vx += 2 * Fire;
else if (v < 4)
Sun[0].vx += Fire;
}
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
if (Sun[0].vy >= 0)
Sun[0].vy -= 2 * Fire;
else if (v < 4)
Sun[0].vy -= Fire;
} else if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
if (Sun[0].vy <= 0)
Sun[0].vy += 2 * Fire;
else if (v < 4)
Sun[0].vy += Fire;
}
if (Hotguntime > 0)
Hotguntime--;
if (kbhit()) {
char g = _getch();
if (Hotguntime == 0 && g == 's') {
if (abs(Sun[0].vx) >= 0.01)
Sun[0].vx *= 0.7;
if (abs(Sun[0].vy) >= 0.01)
Sun[0].vy *= 0.7;
Shoot(0, 0);
Score = max(Score - 1, 0);
Hotguntime = Hotguntimemax;
}
if (Hotguntime == 0 && g == 'w') {
if (abs(Sun[0].vx) <= 2)
Sun[0].vx *= 1.2;
if (abs(Sun[0].vy) <= 2)
Sun[0].vy *= 1.2;
Shoot(0, 1);
Score = max(Score - 1, 0);
Hotguntime = Hotguntimemax;
}
}
Move(1);
Sleep(Speed);
}
system("cls");
if (Score < 20)
Setpos(10, 10), SlowDisplay(150, "Sorry,你死了。");
else
Setpos(10, 10), SlowDisplay(10, "赢了!快去挑战下一个难度吧!"), dif[p] = 1;
Sleep(1000);
goto Y;
return 0;
}
标签:iy,ix,Sun,星际大战,&&,vx,vy
From: https://www.cnblogs.com/niuzeyu1/p/17612484.html