- 王赟博 的博客
游戏
- @ 2026-6-6 17:51:25
贪吃蛇
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>
#include <vector>
using namespace std;
bool gameOver;
const int WIDTH = 30;
const int HEIGHT = 20;
int x, y; // 蛇头坐标
int fruitX, fruitY; // 食物坐标
int score;
vector<int> tailX; // 蛇身坐标
vector<int> tailY;
int tailLength;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;
void Setup() {
gameOver = false;
dir = STOP;
x = WIDTH / 2;
y = HEIGHT / 2;
fruitX = rand() % WIDTH;
fruitY = rand() % HEIGHT;
score = 0;
tailLength = 0;
}
void HideCursor() {
CONSOLE_CURSOR_INFO cursorInfo = {1, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
}
void Draw() {
// 移动光标到左上角(替代清屏)
COORD pos = {0, 0};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
// 绘制顶部边框
cout << string(WIDTH + 2, '-') << endl;
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0) cout << "|";
bool printTail = false;
// 绘制蛇头(红色)
if (i == y && j == x) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
cout << "O";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
// 绘制食物(绿色)
else if (i == fruitY && j == fruitX) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
cout << "●";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
// 绘制蛇身(黄色)
else {
for (int k = 0; k < tailLength; k++) {
if (tailX[k] == j && tailY[k] == i) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
cout << "o";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printTail = true;
break;
}
}
if (!printTail) cout << " ";
}
if (j == WIDTH - 1) cout << "|";
}
cout << endl;
}
// 绘制底部边框
cout << string(WIDTH + 2, '-') << endl;
cout << "分数: " << score << endl;
}
void Input() {
if (_kbhit()) {
switch (_getch()) {
case 75: // 左箭头
if (dir != RIGHT) dir = LEFT;
break;
case 77: // 右箭头
if (dir != LEFT) dir = RIGHT;
break;
case 72: // 上箭头
if (dir != DOWN) dir = UP;
break;
case 80: // 下箭头
if (dir != UP) dir = DOWN;
break;
case 'x':
gameOver = true;
break;
}
}
}
void ShowMenu() {
cout << "选择难度:\n1. 简单\n2. 中等\n3. 困难\n";
int choice;
cin >> choice;
switch (choice) {
case 1: Sleep(150); break;
case 2: Sleep(100); break;
case 3: Sleep(50); break;
}
}
void Logic() {
// 记录旧位置用于身体移动
int prevX = tailX.size() > 0 ? tailX[0] : x;
int prevY = tailY.size() > 0 ? tailY[0] : y;
int prev2X, prev2Y;
// 更新蛇身位置
if (tailLength > 0) {
tailX[0] = x;
tailY[0] = y;
for (int i = 1; i < tailLength; i++) {
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
}
// 移动蛇头
switch (dir) {
case LEFT: x--; break;
case RIGHT: x++; break;
case UP: y--; break;
case DOWN: y++; break;
}
// 穿墙检测
x = (x < 0) ? WIDTH - 1 : x % WIDTH;
y = (y < 0) ? HEIGHT - 1 : y % HEIGHT;
// 碰撞检测(自身)
for (int i = 0; i < tailLength; i++)
if (tailX[i] == x && tailY[i] == y)
gameOver = true;
// 吃食物
if (x == fruitX && y == fruitY) {
score += 10;
// 添加新身体段
if (tailX.size() <= tailLength) {
tailX.push_back(prevX);
tailY.push_back(prevY);
}
tailLength++;
// 生成新食物(确保不在蛇身上)
do {
fruitX = rand() % WIDTH;
fruitY = rand() % HEIGHT;
} while (fruitX == x && fruitY == y);
}
}
int main() {
ShowMenu();
srand(time(0));
Setup();
HideCursor();
while (!gameOver) {
Draw();
Input();
Logic();
Sleep(100 - min(score / 10, 50)); // 速度随分数增加加快
}
cout << "\n --- GAME OVER ! --- \n\n 最终分数: " << score << endl;
return 0;
}
飞机大战
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
#include <vector>
#include <ctime>
using namespace std;
// 控制台尺寸
const int WIDTH = 50;
const int HEIGHT = 30;
// 玩家结构体
struct Player {
int x, y;
bool alive;
int score;
};
// 子弹结构体
struct Bullet {
int x, y;
bool active;
};
// 敌机结构体
struct Enemy {
int x, y;
bool active;
};
// 游戏状态
Player player;
vector<Bullet> bullets;
vector<Enemy> enemies;
bool gameover;
// 控制台光标设置
void Gotoxy(int x, int y) {
COORD coord = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
// 隐藏光标
void HideCursor() {
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
// 初始化游戏
void InitGame() {
player.x = WIDTH / 2;
player.y = HEIGHT - 2;
player.alive = true;
player.score = 0;
bullets.clear();
enemies.clear();
gameover = false;
// 设置控制台尺寸
system(("mode con cols=" + to_string(WIDTH) + " lines=" + to_string(HEIGHT)).c_str());
HideCursor();
}
// 绘制游戏
void Draw() {
Gotoxy(0, 0);
// 绘制顶部边框
for (int i = 0; i < WIDTH; i++) cout << "#";
cout << endl;
// 绘制游戏区域
for (int y = 1; y < HEIGHT - 1; y++) {
for (int x = 0; x < WIDTH; x++) {
if (x == 0 || x == WIDTH - 1) cout << "#";
else {
bool printed = false;
// 绘制玩家
if (player.alive && x == player.x && y == player.y) {
cout << "A";
printed = true;
}
// 绘制子弹
if (!printed) {
for (auto& b : bullets) {
if (b.active && x == b.x && y == b.y) {
cout << "||";
printed = true;
break;
}
}
}
// 绘制敌机
if (!printed) {
for (auto& e : enemies) {
if (e.active && x == e.x && y == e.y) {
cout << " ▼";
printed = true;
break;
}
}
}
if (!printed) cout << " ";
}
}
cout << endl;
}
// 绘制底部边框和分数
for (int i = 0; i < WIDTH; i++) cout << "#";
cout << endl;
cout << " Score: " << player.score;
}
// 处理输入
void ProcessInput()
{
if (_kbhit())
{
switch (_getch())
{
case 75: // 左
if (player.x > 1) player.x-=2;
break;
case 77: // 右
if (player.x < WIDTH - 2) player.x+=2;
break;
case 32: // 空格(射击)
bullets.push_back({ player.x, player.y - 1, true });
break;
case 27: // ESC
gameover = true;
break;
}
}
}
// 更新游戏状态
void Update()
{
// 更新子弹
for (auto& b : bullets)
{
if (b.active)
{
b.y--;
if (b.y <= 0) b.active = false;
// 检查敌机碰撞
for (auto& e : enemies)
{
if (e.active && b.x == e.x && b.y == e.y)
{
e.active = false;
b.active = false;
player.score += 10;
}
}
}
}
// 生成敌机
if (rand() % 10 == 0) {
enemies.push_back({ rand() % (WIDTH - 2) + 1, 1, true });
}
// 更新敌机
for (auto& e : enemies)
{
if (e.active)
{
e.y++;
if (e.y >= HEIGHT - 1) e.active = false;
// 检查玩家碰撞
if (e.x == player.x && e.y == player.y)
{
gameover = true;
}
}
}
// 清理不活跃的子弹和敌机
bullets.erase(remove_if(bullets.begin(), bullets.end(),
[](const Bullet& b) { return !b.active; }), bullets.end());
enemies.erase(remove_if(enemies.begin(), enemies.end(),
[](const Enemy& e) { return !e.active; }), enemies.end());
}
int main()
{
srand(time(0));
InitGame();
while (!gameover)
{
Draw();
ProcessInput();
Update();
Sleep(50); // 控制游戏速度
}
system("cls");
cout << "-- Game Over! -- \n\n Final Score: " << player.score << endl << endl;
return 0;
}
愤怒的小鸟
/*愤怒的小鸟*/
#include <bits/stdc++.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
using namespace std;
const double pi = 3.1415926536;
int toint (float a)
{
return ((int) (a * 10 + 5)) / 10;
}
void Color (int a)
{
if (a == 0 || a == 14 || a == 20)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
} else if (a == 1 || a == 12)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
} else if (a == 2)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN);
} else if (a == 3)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
} else if (a == 4 || a == 11) {
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED);
} else if (a == 5 || a == 13)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
} else if (a == 7)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_BLUE);
} else if (a == 15)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
} else if (a == 16)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
} else if (a == 17)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), FOREGROUND_RED);
} else if (a == 8)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
} else if (a == 6)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);
} else if (a == 9)
{
SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_GREEN);
}
}
void SetPos (float x, float y)
{
int xx = toint (x), yy = toint (y);
COORD pos;
pos.X = yy * 2;
pos.Y = xx;
SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), pos);
}
struct node
{
int W, W2, S, mS;
float X, Y;
float vx, vy;
float ax, ay;
bool go, boom;
} blt[100001], pig[100001], boo[100001];
int T, yX, yY, Xy, put, K, K2, Sle, What;
int Bot, Pit, Blt, Pig, Sco, pigk, scok;
int m[41][41];
void Cout (int a, int x, int y)
{
if (a == 1)
{
SetPos (x, y);
Color (5);
cout << put << ' ';
}
if (y == 202)
{
SetPos (pig[a].X, pig[a].Y);
cout << " ";
if ((pig[a].W == 2 || pig[a].W == 3) && pig[a].X >= 2)
{
SetPos (pig[a].X - 2, pig[a].Y);
cout << " ";
SetPos (pig[a].X - 1, pig[a].Y);
cout << " ";
} else if (pig[a].W == 4)
{
SetPos (pig[a].X, pig[a].Y - 1);
cout << " ";
} else if (pig[a].W == 5)
{
SetPos (pig[a].X - 1, pig[a].Y);
cout << " ";
SetPos (pig[a].X - 1, pig[a].Y - 1);
cout << " ";
}
}
if (a == 2)
{
for (int i = 0; i <= 40; i++)
{
for (int j = 0; j <= 40; j++)
{
if (i <= 18 && m[i][j] == 1)
{
SetPos (i, j);
Color (7);
cout << "■";
}
if (m[i][j] >= 2 && m[i][j] <= 19)
{
SetPos (i, j);
Color (5);
cout << "█";
m[i][j]++;
}
if (m[i][j] > 19 && m[i][j] <= 29)
{
SetPos (i, j);
Color (0);
cout << "█";
m[i][j]++;
if (m[i][j] == 30)
{
SetPos (i, j);
Color (0);
cout << " ";
m[i][j] = 0;
}
if (m[i][j] >= 31 && m[i][j] <= 49)
{
SetPos (i, j);
Color (0);
cout << "■";
m[i][j]++;
}
if (m[i][j] == 50)
{
SetPos (i, j);
Color (7);
cout << "■";
m[i][j] = 1;
}
}
}
}
}
if (y == 666)
{
SetPos (blt[a].X, blt[a].Y);
Color (10 + blt[a].W);
cout << "●";
}
Color (0);
}
void Go (int a)
{
SetPos (blt[a].X, blt[a].Y) ;
cout << " ";
blt[a].X += blt[a].vx / 2;
blt[a].Y += blt[a].vy / 2;
blt[a].vx += blt[a].ax / 2;
blt[a].vy += blt[a].ay / 2;
if (blt[a].X >= 20)
{
blt[a].X = 19;
}
if (blt[a].X > 20 || blt[a].Y > 38 || blt[a].X < 0 || blt[a].Y <= 0)
{
blt[a].go = 1;
}
if (blt[a].W2 == 1 && blt[a].Y >= Xy)
{
blt[a].go = 1;
Sle = 0;//地跑鸟
}
if (blt[a].W2 == 0)
{
for (int i = 0; i <= blt[a].vx / 2 + 1; i++)
{
if (blt[a].vx > 0 && m[toint (blt[a].X) + i][toint (blt[a].Y)] == 1)
{
if (blt[a].W != 5)
{
blt[a].boom = 1;
}
blt[a].X = toint (blt[a].X) + i - 1;
blt[a].Y += blt[a].vy / 2;
blt[a].vx = -blt[a].vx * 0.4;
blt[a].vy = blt[a].vy * 0.8;
if (blt[a].W == 3)
{
blt[a].ax = 0.5;
}
if (blt[a].W == 7)
{
blt[a].vx *= 2;
}
if (blt[a].W == 10)
{
blt[a].go = 1;
Bot++;
boo[Bot].X = blt[a].X;
boo[Bot].Y = blt[a].Y;
boo[Bot].S = 1;
boo[Bot].mS = 4;
}
}
if (blt[a].vx < 0 && m[toint (blt[a].X) - i][toint(blt[a].Y)] == 1)
{
if (blt[a].W != 5)
{
blt[a].boom = 1;
}
blt[a].X = toint (blt[a].X) + i + 1;
blt[a].Y += blt[a].vy / 2;
blt[a].vx = -blt[a].vx;
blt[a].vy = blt[a].vy * 0.8;
if (blt[a].W == 3)
{
blt[a].ax = 0.5;
}
if (blt[a].W == 7)
{
blt[a].vx *= 2;
}
if (blt[a].W == 10)
{
blt[a].go = 1;
Bot++;
boo[Bot].X = blt[a].X;
boo[Bot].Y = blt[a].Y;
boo[Bot].S = 1;
boo[Bot].mS = 4;
}
}
}
if (abs (blt[a].vx) <= 0.1 && abs (blt[a].vy) <= 0.1 && abs (blt[a].ay) <= 0.1)
{
blt[a].go = 1;
if (blt[a].W == 5)
{
Bot++;
boo[Bot].X = blt[a].X;
boo[Bot].Y = blt[a].Y;
boo[Bot].S = 1;
boo[Bot].mS = 4;
blt[a].go = 1;
}
}
}
if (blt[a].go == 0)
{
Cout (a, 0, 666);
}
}
void Kill (int a)
{
if (pig[a].go == 0 && pig[a].W != 2 && pig[a].W != 3 && pig[a].Y < 16)
{
Cout (a, 202, 202);
pig[a].Y = 16;
}
if (pig[a].go == 0 && pig[a].W == 4 && pig[a].Y < 20)
{
pig[a].W = 1;
}
int R = rand () % 50;
Cout (a, 202, 202);
//清除猪猪
pig[a].X += pig[a].vx / 2;
pig[a].Y += pig[a].vy / 2;
pig[a].vx += pig[a].ax / 2;
pig[a].vy += pig[a].ay / 2;
for (int i = -2; i <= pig[a].vx / 2 + 1; i++)
{
if (m[toint (pig[a].X) + i][toint (pig[a].Y)] == 1)
{
pig[a].X = toint (pig[a].X) + i - 1;
pig[a].Y += pig[a].vy / 2;
pig[a].vx = -pig[a].vx * 0.5;
pig[a].vy = pig[a].vy * 0.8;
}
}
for (int i = Blt - 10; i <= Blt; i++)
{
if (pig[a].W == 5 && blt[i].go == 0 && abs (pig[a].X - blt[i].X) <= 1 && abs (pig[a].Y - blt[i].Y) <= 1)
{
m[toint (pig[a].X) - 1][toint (pig[a].Y)] = 2;
pig[a].W2++;
Sco += 2;
break;
}
if (pig[a].W == 5 && m[toint (pig[a].X)][toint (pig[a].Y)] >= 2 && m[toint (pig[a].X)][toint (pig[a].Y)] < 30)
{
m[toint (pig[a].X) - 1][toint (pig[a].Y)] = 2;
pig[a].W2++;
Sco += 2;
break;
}
if (blt[i].go == 0 && abs (pig[a].X - blt[i].X) <= 1 && abs (pig[a].Y - blt[i].Y) <= 1)
{
if (pig[a].W == 6)
{
Bot++;
boo[Bot].X = pig[a].X;
boo[Bot].Y = pig[a].Y;
boo[Bot].S = 1;
boo[Bot].mS = 4;
blt[i].go = 1;
}
m[toint (pig[a].X)][toint (pig[a].Y)] = 2;
pig[a].go = 1;
Pig--;
Sco += 10;
break;
}
if (m[toint (pig[a].X)][toint (pig[a].Y)] >= 2 && m[toint (pig[a].X)][toint (pig[a].Y)] < 30)
{
if (pig[a].W == 6)
{
Bot++;
boo[Bot].X = pig[a].X;
boo[Bot].Y = pig[a].Y;
boo[Bot].S = 1;
boo[Bot].mS = 4;
}
pig[a].go = 1;
Pig--;
Sco += 10;
break;
}
if ((pig[a].W == 2 || pig[a].W == 3) && blt[i].go == 0 && abs (pig[a].X - 2 - blt[i].X) <= 1 && abs (pig[a].Y - blt[i].Y) <= 1)
{
m[toint (pig[a].X)][toint (pig[a].Y)] = 2;
pig[a].go = 1;
Pig--;
Sco += 10;
break;
}
if ((pig[a].W == 2 || pig[a].W == 3) && m[toint (pig[a].X - 2)][toint (pig[a].Y)] >= 2 && m[toint (pig[a].X - 2)][toint (pig[a].Y)] < 30)
{
pig[a].go = 1;
Pig--;
Sco += 10;
break;
}
}
//弄死猪猪
if (pig[a].go == 0)
{
if (pig[a].go == 0 && pig[a].W != 2 && pig[a].W != 3 && pig[a].Y < 16)
{
Cout (a, 202, 202);
pig[a].Y = 16;
}
if (pig[a].go == 0 && pig[a].W == 4 && pig[a].Y < 20)
{
pig[a].W = 1;
}
int Xx = toint (pig[a].X), Xy = toint (pig[a].Y);
if (pig[a].W == 6)
{
SetPos (pig[a].X, pig[a].Y);
Color (9);
cout << "TN";
Color (0);
}
else
{
SetPos (pig[a].X, pig[a].Y);
Color (2);
cout << "●";
if ((pig[a].W == 2 || pig[a].W == 3) && pig[a].X >= 2)
{
SetPos (pig[a].X - 2, pig[a].Y);
Color (0);
cout << "○";
SetPos (pig[a].X - 1, pig[a].Y);
cout << "|";
} else if (pig[a].W == 4) {
SetPos (pig[a].X, pig[a].Y - 1);
Color (2);
cout << "﹃";
} else if (pig[a].W == 5) {
SetPos (pig[a].X - 1, pig[a].Y);
Color (8);
SetPos (pig[a].X - 1, pig[a].Y - 1);
cout << "▁";
if (pig[a].W2 == 0) {
cout << "▅";
} else if (pig[a].W2 == 1) {
cout << "▃";
} else if (pig[a].W2 == 2) {
cout << "▂";
} else if (pig[a].W2 == 3) {
pig[a].W = 1;
pig[a].W2 = 0;
SetPos (pig[a].X - 1, pig[a].Y - 1);
cout << " ";
}
}
}
//输出猪猪
if (pig[a].W == 2 && pig[a].X > pig[a].S) {
pig[a].W = 3;
pig[a].ax = -0.4;
pig[a].vx = 1.5;
} else if (pig[a].W == 3 && pig[a].X <= pig[a].S) {
pig[a].W = 2;
pig[a].ax = 0.4;
pig[a].vx = -1.5;
}
if ((pig[a].W == 2 || pig[a].W == 3) && (pig[a].Y <= 10 || pig[a].Y >= 38)) {
pig[a].vy *= -1;
}
if (pig[a].W == 4 && R == 0 && pig[a].X == 20) {
pig[a].vx = -((rand () % 40) / 10);
}
if (pig[a].W == 4) {
int r = rand () % 20;
for (int i = Blt - 10; i <= Blt; i++) {
if (r <= 5 && blt[i].go == 0 && pig[a].Y - blt[i].Y <= 5 &&
abs (blt[i].X - pig[a].X) <= 1.5 && r < 5) {
r = 0;
break;
}
}
if (r == 0) {
m[toint (pig[a].X)][toint (pig[a].Y) - 2] = 10;
m[toint (pig[a].X)][toint (pig[a].Y) - 3] = 2;
for (int j = toint (pig[a].Y) - 1; j >= toint (pig[a].Y) - 5; j--) {
for (int i = Blt - 10; i <= Blt; i++) {
if (blt[i].go == 0 && !(blt[i].W == 3 && blt[i].boom == 1)
&& blt[i].W2 == 0 && toint (blt[i].Y) == j
&& abs (blt[i].X - pig[a].X) <= 2) {
blt[i].vy = -2;
}
}
for (int i = Pit - 50; i <= Pit; i++) {
if (pig[i].go == 0 && toint (pig[i].Y) == j && abs (pig[i].X - pig[a].X) <= 2) {
pig[i].vy = -1;
}
}
}
}
}
//移动猪猪
if (pig[a].go == 0 && pig[a].W != 2 && pig[a].W != 3 && pig[a].Y < 16) {
Cout (a, 202, 202);
pig[a].Y = 16;
}
if (pig[a].go == 0 && pig[a].W == 4 && pig[a].Y < 20) {
pig[a].W = 1;
}
if (pig[a].X > 20 || pig[a].Y > 38 || pig[a].X < 0 || pig[a].Y <= 0) {
pig[a].go = 1;
Pig--;
Cout (a, 202, 202);
}
//清除猪猪
}
}
void Creat (int a, int p) {
if (a == -1 && p == -1) {
Blt++;
blt[Blt].W = What;
blt[Blt].W2 = 1;
blt[Blt].vy = 1;
blt[Blt].X = 19;
blt[Blt].Y = 0;
blt[Blt].boom = 1;
} else if (a == 0 && p == -1) {
int u = rand () % 7 + 1, U = rand() % 30;
if (u >= 5) {
Pit++;
pig[Pit].Y = rand () % 15 + 20;
pig[Pit].X = 2;
pig[Pit].ax = 0.5;
pig[Pit].W = 1;
} else if (u == 1) {
Pit++;
pig[Pit].Y = rand () % 15 + 20;
pig[Pit].X = 2;
pig[Pit].vy = 0.5;
pig[Pit].ax = 0.5;
pig[Pit].S = rand () % 5 + 7;
pig[Pit].W = 2;
} else if (u == 2) {
Pit++;
pig[Pit].Y = rand () % 15 + 20;
pig[Pit].X = 2;
pig[Pit].ax = 0.5;
pig[Pit].W = 4;
} else if (u == 3) {
Pit++;
pig[Pit].Y = rand () % 15 + 20;
pig[Pit].X = 2;
pig[Pit].ax = 0.5;
pig[Pit].W = 5;
} else if (u == 4) {
Pit++;
pig[Pit].Y = rand () % 15 + 20;
pig[Pit].X = 2;
pig[Pit].ax = 0.5;
pig[Pit].W = 6;
}
if (U == 1) {
Bot++;
boo[Bot].Y = rand () % 13 + 15;
boo[Bot].X = (rand () % 4) * 3 + 8;
boo[Bot].S = 0;
boo[Bot].mS = rand () % 2 + 2;
boo[Bot].W2 = 1;
}
} else {
Blt++;
blt[Blt].W = What;
if (a == 1) {
blt[Blt].X = yX;
blt[Blt].Y = yY;
blt[Blt].ax = 0.5; //抛物线
}
blt[Blt].vx = -3.5 * sin (p * pi / 180);
blt[Blt].vy = 3 * cos (p * pi / 180);
if (p <= 45) {
blt[Blt].vy *= 1 + (0.33 - 0.01 * (45 - p));
}
if (p >= 45) {
blt[Blt].vy *= 1 + (0.33 - 0.01 * (p - 45));
}
if (blt[Blt].W == 6) {
blt[Blt].vy *= 1.2;
blt[Blt].ax = 0.4;
}
} }
void Boom (int a) {
if (boo[a].W2 == 0) {
int ms = boo[a].mS, s = boo[a].S, x = boo[a].X, y = boo[a].Y;
if (s == ms) {
return ;
}
for (int i = x - s; i <= x + s; i++) {
for (int j = y - s; j <= y + s; j++) {
float k = (i - x) * (i - x) + (j - y) * (j - y) - s * s;
if (k <= s && k >= -s && i <= 20 && j <= 38 && i >= 0 && j > 0 && m[i][j] != 1) {
m[i][j] = 2;
}
}
}
boo[a].S++;
}
if (boo[a].W2 == 1) {
int ms = boo[a].mS, s = boo[a].S, x = boo[a].X, y = boo[a].Y;
if (s == ms) {
return ;
}
if (y - s > 10) {
m[x][y - s] = 31 - 31 * (boo[a].W2 - 1);
}
if (y + s < 40) {
m[x][y + s] = 31 - 31 * (boo[a].W2 - 1);
}
boo[a].S++;
} }
void Move (int a) {
Color (5);
if (a == -2) {
SetPos (17, Xy);
cout << " ";
SetPos (18, Xy);
cout << " ";
SetPos (19, Xy);
cout << " ";
SetPos (20, Xy);
cout << " ";
}
if (a == -1) {
SetPos (17, Xy);
cout << " ";
SetPos (18, Xy);
cout << " ┃ ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ▏";
}
if (a == 0) {
SetPos (18, Xy);
cout << " ┃";
Color (What + 10);
cout << "●";
Color (5);
cout << "┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ▏";
}
if (a == 1) {
SetPos (18, Xy);
cout << " ";
Color (What + 10);
cout << "●";
Color (5);
cout << " ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ▏";
}
if (a == 2) {
SetPos (18, Xy);
Color (What + 10);
cout << "●";
Color (5);
cout << "┃ ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ▏";
}
if (a == 3) {
SetPos (18, Xy);
cout << " ┃ ┃";
SetPos (19, Xy);
Color (What + 10);
cout << "●";
Color (5);
cout << "╰┳╯";
SetPos (20, Xy);
cout << " ▏";
}
if (a == 4) {
SetPos (18, Xy);
cout << " ┃ ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
Color (What + 10);
cout << "●";
Color (5);
cout << " ▏";
}
if (a == 5) {
SetPos (18, Xy);
cout << " ┃ ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ";
Color (What + 10);
cout << "●";
Color (5);
cout << " ▏";
}
if (a == 6) {
SetPos (18, Xy);
cout << " ┃ ┃";
SetPos (19, Xy);
cout << " ╰┳╯";
SetPos (20, Xy);
cout << " ";
Color (What + 10);
cout << "●";
Color (5);
cout << " ";
}
Color (0); }
void Start () {
char g;
Color (5);
system ("cls");
SetPos (1, 1);
cout << "------- 愤 怒 的 小 鸟 -------";
Color (0);
SetPos (3, 1);
cout << "空格瞄准,按X触发小鸟技能,←→移动弹弓";
SetPos (5, 1);
cout << "猪猪技能自动触发,空中会有墙出现。";
SetPos (7, 1);
cout << "危险值由命中率,猪的存活时间计算!";
SetPos (9, 1);
cout << "危险值点满后失败!300分通关!";
SetPos (1, 20);
cout << "-------- 小 鸟 技 能 --------";
SetPos (3, 20);
Color (11);
cout << "●";
Color (0);
cout << ":无技能";
SetPos (5, 20);
Color (12);
cout << "●";
Color (0);
cout << ":分身!不同分身初速度大小相同,";
SetPos(6, 20); cout << " 方向不同。";
SetPos (7, 20);
Color (13);
cout << "●";
Color (0);
cout << ":加速!以当前速度做匀速直线运动,";
SetPos (8, 20);
cout << " 且免疫狙击猪的冲击。";
SetPos (9, 20);
Color (14);
cout << "●";
Color (0);
cout << ":投蛋!并获得向上速度做匀速直线";
SetPos (10, 20);
cout << " 运动,快达可以穿墙。";
SetPos (11, 20);
Color (15);
cout << "●";
Color (0);
cout << ":爆炸!";
SetPos (13, 20);
Color (16);
cout << "●";
Color (0);
cout << ":回旋!开始做向左加速运动!发射";
SetPos (14, 20);
cout << " 时获得双倍水平速度。";
SetPos (15, 20);
Color (17);
cout << "●";
Color (0);
cout << ":[被动] 弹跳力为普通鸟三倍。发射";
SetPos (16, 20);
cout << " 时获得1.5倍水平、竖直速度。";
SetPos (11, 1);
cout << "-------- 猪 猪 技 能 --------";
SetPos (13, 2);
Color (2);
cout << "●";
Color (0);
cout << ":无技能";
SetPos (14, 1);
Color (8);
cout << "▁▅";
SetPos (15, 2);
Color (2);
cout << "●";
Color (0);
cout << ":防御力为普通猪三倍";
SetPos (16, 2);
cout << "○";
SetPos (17, 2);
cout << "│:做空中简谐运动,受死范围";
SetPos (18, 2);
Color (2);
cout << "●";
Color (0);
cout << " 为普通猪两倍。";
SetPos (19, 2);
cout << " 有几率跳起或发射冲击波,冲";
SetPos (20, 1);
Color (2);
cout << "﹃●";
Color (0);
cout << ":开小鸟与同类,可以引爆TNT!";
SetPos (18, 20);
Color (5);
cout << "按 y 开始游戏!"; A:
if (kbhit ()) {
g = _getch ();
}
if (g != 'y') {
goto A;
} }
int main ()
{
system ("mode con cols=79 lines=22");
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
srand ((unsigned)time(NULL)); St: Start ();
system ("cls");
memset (blt, 0, sizeof (blt));
memset (pig, 0, sizeof (pig));
memset (boo, 0, sizeof (boo));
memset (m, 0, sizeof (m));
T = put = K = K2 = Sle = What = Pig = Sco = 0;
pigk = scok = -1;
Xy = 4;
yX = 18;
yY = 6;
Blt = 20;
Bot = 20;
Pit = 60;
Color (7);
SetPos (19, 14);
cout << "■";
SetPos (20, 13);
cout << " █▍";
m[19][14] = m[20][13] = m[20][14] = 1;
SetPos (21, 0);
for (int i = 0; i < 39; i++)
{
cout << "■";
m[21][i] = 1;
}
Color (0);
What = rand () % 5 + 1;
while (1)
{
if (Sco >= 300)
{
break;
}
T++;
K = 0;
Color (0);
if (Sco != scok)
{
SetPos (1, 1);
cout << "分数:" << Sco << ' ';
}
if (Pig != pigk)
{
SetPos (3, 1);
cout << "危险值:";
int aa = min (Sco / 100, 10);
Pig += aa;
SetPos (3, 5);
if (Pig <= 2)
{
Color (2);
} else if (Pig <= 4)
{
Color (16);
} else if (Pig <= 6)
{
Color (7);
} else if (Pig <= 9)
{
Color (6);
} else if (Pig <= 12)
{
Color (3);
} else if (Pig <= 15)
{
Color (17);
} else
{
Color (11);
}
for (int i = 1; i <= Pig; i++)
{
cout << "■";
}
Color (0);
cout << ' ' << Pig;
for (int i = 1; i <= 5; i++)
{
cout << " ";
}
if (Pig > 18)
{
break;
}
Pig -= aa;
}
scok = Sco;
pigk = Pig;
if (GetAsyncKeyState (VK_LEFT) & 0x8000 && Xy > 0)
{
Move (-2);
Xy--;
K = 1;
}
if (GetAsyncKeyState (VK_RIGHT) & 0x8000 && Xy < 10)
{
Move (-2);
Xy++;
K = 1;
}
if (K == 1)
{
if (put == 0 && Sle == 0)
{
Move (0);
}
else
{
Move (-1);
}
}
if (kbhit ())
{
char g = _getch ();
if (g == 'x' || g == 'X')
{
for (int i = Blt - 10; i <= Blt; i++)
{
if (blt[i].go == 0 && blt[i].boom == 0 && blt[i].W != 1 && blt[i].W != 7)
{
blt[i].boom = 1;
if (blt[i].W == 2)
{
Blt++;
blt[Blt].W = 2;
blt[Blt].vy = blt[i].vy * 1.2;
blt[Blt].vx = blt[i].vx + 1;
blt[Blt].ax = blt[i].ax;
blt[Blt].X = blt[i].X;
blt[Blt].Y = blt[i].Y;
blt[Blt].boom = 1;
Blt++;
blt[Blt].W = 2;
blt[Blt].vy = blt[i].vy * 0.7;
blt[Blt].vx = blt[i].vx - 1;
blt[Blt].ax = blt[i].ax;
blt[Blt].X = blt[i].X;
blt[Blt].Y = blt[i].Y;
blt[Blt].boom = 1;
}
if (blt[i].W == 3)
{
blt[i].vy = fmax (blt[i].vy * 1.5, 2.5);
blt[Blt].vx++;
blt[i].ax = 0;
}
if (blt[i].W == 4)
{
blt[i].vx = -3;
blt[i].ax = 0.1;
Blt++;
blt[Blt].boom = 1;
blt[Blt].W = 10;
blt[Blt].X = blt[i].X;
blt[Blt].Y = blt[i].Y;
blt[Blt].ax = blt[i].ax;
blt[Blt].vx = 1;
}
if (blt[i].W == 5)
{
Bot++;
boo[Bot].X = blt[i].X;
boo[Bot].Y = blt[i].Y;
boo[Bot].S = 1;
boo[Bot].mS = 5;
blt[i].go = 1;
}
if (blt[i].W == 6)
{
blt[i].ay = -1;
blt[i].ax = 0.3;
blt[i].vx = min (blt[i].vx / 2, (float)0);
}
break;
}
}
}
}
if (GetAsyncKeyState (' ') & 0x8000 && K == 0 && Sle == 0)
{
if (put <= 5)
{
Move (1);
yX = 18;
yY = Xy + 1;
} else if (put <= 20)
{
Move (2);
yX = 18;
yY = Xy;
} else if (put <= 40)
{
Move (3);
yX = 19;
yY = Xy;
} else if (put <= 60)
{
Move (4);
yX = 20;
yY = Xy;
} else if (put <= 80)
{
Move (5);
yX = 20;
yY = Xy + 1;
}
else
{
Move (6);
yX = 20;
yY = Xy + 2;
}
if (put == 0)
{
K2 = 1;
}
if (put == 90)
{
K2 = -1;
}
if (K2 == 1)
{
put += min (rand () % 7 + 1, 90 - put);
}
if (K2 == -1)
{
put -= min(rand() % 7 + 1, put);
}
Cout (1, 17, Xy + 2);
}
if ((!(GetAsyncKeyState (' ') & 0x8000) && (put != 0)) || (put != 0 && K == 1))
{
Move (-1);
Creat (1, put);
put = 0;
yX = 18;
yY = 5;
Sle = 1;
What = rand () % 7 + 1;
Creat (-1, -1);
Sco = max (Sco - 5, 0);
}
for (int i = Blt - 10; i <= Blt; i++)
{
if (blt[i].go == 0)
{
Go (i);
}
}
for (int i = Bot - 10; i <= Bot; i++)
{
if (boo[i].go == 0)
{
Boom (i);
Cout (2, 0, 0);
}
}
for (int i = Pit - 50; i <= Pit; i++)
{
if (pig[i].go == 0)
{
Kill (i);
}
}
if (Sle != 0)
{
Move (-1);
} else if (put == 0) {
Move (0);
}
if (T % 300 == 0)
{
system ("cls");
pigk = scok = -1;
}
if (T % 100 == 0)
{
Color (7);
for (int i = 0; i <= 18; i++)
{
for (int j = 0; j <= 40; j++)
{
if (m[i][j] == 1 && T % 100 == 0)
{
SetPos (i, j);
cout << "■";
}
}
}
SetPos (19, 14);
cout << "■";
SetPos (20, 13);
cout << " █▍";
SetPos (21, 0);
for (int i = 0; i < 39; i++)
{
cout << "■";
Color (0);
}
}
if (T % min (50, (2000 - Sco) / 30) == 0)
{
Pig++;
Creat (0, -1);
}
Sleep (30);
}
if (Sco < 300)
{
if (MessageBox (NULL, "很遗憾,您输了,您还想再来一次吗?", "温馨提示", MB_YESNO) == IDYES)
{
goto St;
}
else
{
return 0;
}
}
else
{
if (MessageBox (NULL, "恭喜您赢了!您还想再来一次吗?", "温馨提示", MB_YESNO) == IDYES)
{
goto St;
}
else
{
return 0;
}
}
return 0;
}
会接着更新的~