摸摸鱼
和deepseek一起做的超难小游戏,a和s表示左右移动,w表示跳跃,重点来了,s代表下劈,向下下劈时向上移动,向左下劈时向右上移动,向右下劈时向左上移动。
P表示你自己,^表示刺,=表示可以站的平台,Q表示终点。
第一个通过第一关的在10点之前成功给3r,九点半之前成功给5r。
code:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
const int WIDTH = 50;
const int HEIGHT = 15;
const char PLAYER = 'P';
const char PLATFORM = '=';
const char EMPTY = ' ';
const char SPIKE = '^';
const char GOAL = 'G'; // 终点标志
void cls() {
COORD pos;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
pos.X = 0;
pos.Y = 0;
SetConsoleCursorPosition(hOut, pos);
}
class Game {
private:
struct Position {
int x, y;
Position(int x = 0, int y = 0) : x(x), y(y) {}
};
Position player;
Position goal; // 终点位置
vector<Position> platforms;
vector<Position> spikes;
float verticalVelocity;
bool canJump;
bool gameOver;
bool gameWin; // 游戏胜利标志
bool canDownSlash;
bool canSideSlash;
string slashDirection;
public:
Game() : verticalVelocity(0), canJump(true), gameOver(false), gameWin(false),
canDownSlash(false), canSideSlash(false), slashDirection("") {
player = Position(5, HEIGHT - 3);
goal = Position(WIDTH - 5, HEIGHT - 12); // 终点放在右上角高处
initializeGame();
srand(time(0));
}
void initializeGame() {
platforms.clear();
spikes.clear();
// 地面
for (int i = 0; i < WIDTH; i++) {
platforms.push_back(Position(i, HEIGHT - 1));
}
// 平台 - 设计一条通往终点的路径
createPlatform(5, HEIGHT - 3, 8); // 起始平台
// createPlatform(15, HEIGHT - 6, 6); // 第一个跳跃平台
// createPlatform(25, HEIGHT - 7, 5); // 需要下劈的平台
// createPlatform(35, HEIGHT - 10, 4); // 高平台
createSpikes(40, HEIGHT - 11, 3); // 接近终点的平台
createSpikes(44, HEIGHT - 12, 1); // 终点前平台
// 连接平台
createSpikes(10, HEIGHT - 11, 4); // 左侧连接平台
createSpikes(20, HEIGHT - 6, 5); // 中间连接平台
createSpikes(30, HEIGHT - 8, 6); // 右侧连接平台
// 刺 - 设计成障碍,需要下劈技巧通过
createSpikes(0, HEIGHT - 2, 100); // 地面刺
createSpikes(22, HEIGHT - 2, 4);
createSpikes(40, HEIGHT - 2, 2);
// 平台上的刺
createSpikes(16, HEIGHT - 6, 2); // 需要跳过
createSpikes(28, HEIGHT - 5, 2); // 需要下劈
createSpikes(36, HEIGHT - 7, 4);
// 空中刺(用于下劈)
// createSpikes(8, HEIGHT - 4, 1);
createSpikes(18, HEIGHT - 6, 2);
createSpikes(33, HEIGHT - 8, 1);
createSpikes(45, HEIGHT - 5, 1);
// 侧面下劈专用刺
// createSpikes(3, HEIGHT - 4, 1); // 左侧刺
// createSpikes(48, HEIGHT - 7, 1); // 右侧刺
// createSpikes(14, HEIGHT - 3, 1); // 玩家右侧刺
// createSpikes(26, HEIGHT - 6, 1); // 玩家左侧刺
// 墙面刺
// createSpikes(2, HEIGHT - 5, 1);
createSpikes(2, HEIGHT - 6, 1);
createSpikes(47, HEIGHT - 8, 1);
createSpikes(47, HEIGHT - 9, 1);
// 终点周围的刺(增加挑战性)
createSpikes(42, HEIGHT - 11, 2);
createSpikes(46, HEIGHT - 13, 1);
}
void createPlatform(int startX, int y, int length) {
for (int i = 0; i < length; i++) {
platforms.push_back(Position(startX + i, y));
}
}
void createSpikes(int startX, int y, int length) {
for (int i = 0; i < length; i++) {
spikes.push_back(Position(startX + i, y));
}
}
void draw() {
cls();
cout << "目标: 到达终点(G) | 控制: A(左) D(右) W(跳跃) S(下劈) Q(退出) R(重开)" << endl;
cout << "提示: 避开刺(^),使用下劈技巧到达终点" << endl;
if (canDownSlash || canSideSlash) {
cout << "*** 下劈可用!";
if (canDownSlash) cout << " 下方有刺";
if (canSideSlash) cout << " " << slashDirection << "侧有刺";
cout << ",按S键触发 ***" << endl;
} else {
cout << "下劈: 需要下方或侧面3格内有刺才能使用" << endl;
}
// 绘制游戏区域
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
char ch = EMPTY;
// 检查终点(最高优先级)
if (goal.x == x && goal.y == y) {
ch = GOAL;
}
// 检查刺
else if (ch == EMPTY) {
for (const auto& spike : spikes) {
if (spike.x == x && spike.y == y) {
ch = SPIKE;
break;
}
}
}
// 检查平台
if (ch == EMPTY) {
for (const auto& platform : platforms) {
if (platform.x == x && platform.y == y) {
ch = PLATFORM;
break;
}
}
}
// 检查玩家
if (x == player.x && y == player.y) {
ch = PLAYER;
}
cout << ch;
}
cout << endl;
}
if (gameOver) {
cout << "!!! 碰到刺了!游戏结束 !!!" << endl;
cout << "按R重新开始,按Q退出" << endl;
} else if (gameWin) {
cout << " 恭喜!你到达了终点!" << endl;
cout << "按R再玩一次,按Q退出" << endl;
}
}
// 检查下方是否有刺(3格范围内)
bool checkSpikeBelow() {
for (const auto& spike : spikes) {
if (spike.x == player.x) {
int distance = spike.y - player.y;
if (distance > 0 && distance <= 3) {
return true;
}
}
}
return false;
}
// 检查侧面是否有刺(3格范围内)
bool checkSpikeSide() {
canSideSlash = false;
slashDirection = "";
for (const auto& spike : spikes) {
if (spike.y == player.y) {
int leftDistance = player.x - spike.x;
int rightDistance = spike.x - player.x;
if (leftDistance > 0 && leftDistance <= 3) {
canSideSlash = true;
slashDirection = "左";
return true;
}
if (rightDistance > 0 && rightDistance <= 3) {
canSideSlash = true;
slashDirection = "右";
return true;
}
}
// 检查斜向的刺
int xDistance = abs(spike.x - player.x);
int yDistance = abs(spike.y - player.y);
if (xDistance <= 3 && yDistance <= 3 && xDistance + yDistance <= 4) {
if (spike.x < player.x) {
canSideSlash = true;
slashDirection = "左";
return true;
} else if (spike.x > player.x) {
canSideSlash = true;
slashDirection = "右";
return true;
}
}
}
return false;
}
void updatePhysics() {
// 检查是否到达终点
if (player.x == goal.x && player.y == goal.y) {
gameWin = true;
return;
}
// 更新下劈状态
canDownSlash = checkSpikeBelow();
checkSpikeSide();
// 应用重力
verticalVelocity += 0.3f;
// 保存旧位置
Position oldPosition = player;
// 尝试移动
player.y += (int)verticalVelocity;
// 检查平台碰撞
bool collision = false;
for (const auto& platform : platforms) {
if (player.x == platform.x && player.y == platform.y) {
collision = true;
break;
}
}
// 处理平台碰撞
if (collision) {
if (verticalVelocity > 0) {
player.y = oldPosition.y;
verticalVelocity = 0;
canJump = true;
} else if (verticalVelocity < 0) {
player.y = oldPosition.y;
verticalVelocity = 0;
}
}
// 检查是否站在地面上
bool onGround = false;
for (const auto& platform : platforms) {
if (player.x == platform.x && player.y + 1 == platform.y) {
onGround = true;
canJump = true;
verticalVelocity = 0;
break;
}
}
// 边界检查
if (player.x < 0) player.x = 0;
if (player.x >= WIDTH) player.x = WIDTH - 1;
if (player.y < 0) {
player.y = 0;
verticalVelocity = 0;
}
if (player.y >= HEIGHT - 1) {
player.y = HEIGHT - 2;
verticalVelocity = 0;
canJump = true;
}
// 检查刺碰撞 - 碰到就游戏结束
for (const auto& spike : spikes) {
if (player.x == spike.x && player.y == spike.y) {
gameOver = true;
return;
}
}
// 游戏结束条件:掉出屏幕底部
if (player.y >= HEIGHT) {
gameOver = true;
}
}
void jump() {
if (canJump) {
verticalVelocity = -2.0f;
canJump = false;
}
}
void downSlash() {
if (canDownSlash || canSideSlash) {
if (canDownSlash) {
verticalVelocity = -1.5f;
cout << "下方下劈!垂直跳跃!" << endl;
} else if (canSideSlash) {
verticalVelocity = -2.0f;
if (slashDirection == "左") {
player.x = min(WIDTH - 1, player.x + 2);
cout << "左侧下劈!向右斜跳!" << endl;
} else if (slashDirection == "右") {
player.x = max(0, player.x - 2);
cout << "右侧下劈!向左斜跳!" << endl;
}
}
canJump = false;
canDownSlash = false;
canSideSlash = false;
Sleep(100);
}
}
void handleInput() {
if (_kbhit()) {
char input = _getch();
input = tolower(input);
switch (input) {
case 'a':
player.x = max(0, player.x - 1);
break;
case 'd':
player.x = min(WIDTH - 1, player.x + 1);
break;
case 'w':
jump();
break;
case 's':
downSlash();
break;
case 'q':
gameOver = true;
break;
case 'r':
if (gameOver || gameWin) reset();
break;
}
}
}
void reset() {
player = Position(5, HEIGHT - 3);
verticalVelocity = 0;
canJump = true;
gameOver = false;
gameWin = false;
canDownSlash = false;
canSideSlash = false;
slashDirection = "";
initializeGame();
}
bool isGameEnd() {
return gameOver || gameWin;
}
void run() {
while (!isGameEnd()) {
draw();
handleInput();
updatePhysics();
Sleep(50);
}
draw();
// 等待重新开始
while (true) {
if (_kbhit()) {
char input = tolower(_getch());
if (input == 'r') {
reset();
run();
break;
} else if (input == 'q') {
break;
}
}
Sleep(100);
}
}
};
int main() {
cout << "=== 终点挑战平台跳跃游戏 ===" << endl;
cout << "控制: A(左) D(右) W(跳跃) S(下劈)" << endl;
cout << "目标: 避开刺(^),到达终点(G)" << endl;
cout << "下劈机制: " << endl;
cout << " - 下方3格内有刺:垂直高跳" << endl;
cout << " - 左侧3格内有刺:向右斜跳" << endl;
cout << " - 右侧3格内有刺:向左斜跳" << endl;
cout << "提示: 终点在右上角高处,需要巧妙使用下劈技巧才能到达" << endl;
cout << "按任意键开始..." << endl;
_getch();
Game game;
game.run();
cout << "谢谢游玩!" << endl;
return 0;
}