/*-----------------------------------
程序 : 打砖块(物理版)
游戏默认地图均采用for循环+逻辑构建所以,并没有直接初始化地图
bug: 1.目前对角相碰是进行的直接打破该方块,因为测试到进行正常的碰撞返回会重复之前的路。 (算是优化)
2.未知的原因导致开局影子脱节,目前已经优化到后期几乎看不到脱节。
优化: 实现类似贪吃蛇玩法,制造跟随的移动轨迹,并且交叉的移动轨迹不会直接清除导致脱节。
配色优化
---------------------------------*/
#include <conio.h> //用于getch()
#include <math.h>
#include <stdio.h>
#include <stdlib.h> //用于rand
#include <string.h>
#include <windows.h>
#define pi 3.14
const double g = 10; //标准数越模糊,轨迹越连贯。
//----------------------------------------------------------------------------------------------------------------------------------
// 系统默认生成关卡地图,若想自己改造关卡请将1 设置为0并且再下方初始化地图(黏贴地图)
int auto_made_map = 1;
char man_made_map[1000][1000];
//---------------------------------------------------------------------------------------------------------------------------------
char map[1000][1000];
char End[200][800] = {
{"## ## ## ## # "},
{" ## # ##### ###### ## ## "},
{" ##### ###### ###### ## # "},
{" ####### ## ###### "},
{"## ## # ##### ########## "},
{" ## #### ##### ## ###### "},
{" #### ## ## ## ## # "},
{" ## # ###### ### ## ## "},
{" # ## # ###### ## ## ## "},
{" # ## # ## #### ### "},
{" ## ## # ## ## # ## #"},
{" # ## # ## ## #### ##"},
{"## ### # ### # ### ####"},
{"## ## ## ## ## ###"},
{" "},
{" ## ## ## "},
{" ## ######### ###############"},
{" ## ######### ###############"},
{"## ## ## ## "},
{"###### ####### ############ "},
{" ## ####### ############ "},
{" ## ## ## ## "},
{"###### ####### ############ "},
{"###### ####### ##### "},
{" ## ## ## #### "},
{" ### ## ## ## ## ## "},
{"###### ####### ### ## ### "},
{"### ####### ## ## ## "},
{" ## ## ## "},
{" "},
{" 按 两 次 回 车 继 续 "},
};
char menu[40][40] = {
{" <---------------> "},
{" < 打 砖 块 > "},
{" <---------------> "},
{" "},
{" <1> 开始游戏 <$> "},
{" "},
{" <2> 贪吃蛇mod <$> "},
{" "},
{" <3> 编辑地图 <$> "},
{" "},
{" <4> 退出游戏 <$> "},
{" "}};
//全局变量区,在init里面改变
char wall, food, air, brick;
int width, length;
double X, Y, x, y, Vx, Vy, t, V; //默认向下向右为正
int old_x, old_y, head, tail, max, step, if_miss, food_num, goal, color;
int if_start, if_load_snake_mod, debug, life; //debug模式调成1手动开启
int temp_x, temp_y, menu_x, menu_y, left, right; //临时坐标
double C[8] = {0, 10, 30, 70, 90}; //初始斜抛的角度,自右向上转角(目前已调整好最好的角度)
struct Step //轨迹
{
int x;
int y;
} s[1000];
void HideCursor() //光标隐藏
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0}; //后边的0代表光标不可见
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void gotoxy(int x, int y) //坐标函数
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void init()
{
int i, j, a, b;
HideCursor();
width = 40, length = 150;
wall = '#', food = '*', air = ' ', brick = 'O';
head = 0, tail = 0, max = 60, step = 0, if_miss = 0, food_num = 400, goal = 0, color = 0;
debug = 0, life = 3; //debug模式调成1手动开启
temp_x = 2, temp_y = 2, menu_x = 18, menu_y = 68, left = 4, right = 20; //临时坐标
gotoxy(0, 0);
//菜单模式
if (if_start == 0)
{ //首页
for (i = 0; i <= width; i++)
{ //生成地图模板
for (j = 0; j <= length; j++)
{
if (i == 0 || i == width || j == 0 || j == length)
map[i][j] = wall;
else if ((i == width / 3 || i == width * 2 / 3) && (j >= length * 2 / 5 && j <= length * 3 / 5))
map[i][j] = wall;
else if ((i >= width / 3 && i <= width * 2 / 3) && (j == length * 2 / 5 || j == length * 3 / 5))
map[i][j] = wall;
else
map[i][j] = air;
}
}
while (food_num--)
{ //贪吃蛇生成食物
int a = rand() % width;
int b = rand() % length;
if ((a >= width / 3 && a <= width * 2 / 3) && (b >= length * 2 / 5 && b <= length * 3 / 5) || a == 0 || b == 0)
continue;
map[a][b] = food;
}
for (i = 0; i <= width; i++)
{ //布置砖块brick
for (j = 0; j <= length; j++)
{
if ((i == 15 || i == 20) && ((j >= 4 && j <= 50) || (j >= 100 && j <= 130)))
map[i][j] = brick;
}
}
}
//游戏模式
else if (if_start == 1 || if_start == -1)
{
if (auto_made_map == 1)
{
for (i = 0; i <= width; i++)
{ //生成地图模板
for (j = 0; j <= length; j++)
{
if (i == 0 || i == width || j == 0 || j == length)
map[i][j] = wall;
else if ((i == width * 2 / 3) && (j >= length * 2 / 5 && j <= length * 3 / 5))
map[i][j] = wall;
else if (i == width - 1 && j >= left && j <= right)
map[i][j] = wall;
else
map[i][j] = air;
}
}
if (if_load_snake_mod == 1)
{
food_num = 400;
while (food_num--)
{ //贪吃蛇生成食物
a = rand() % width;
b = rand() % length;
if ((a >= width / 3 && a <= width * 2 / 3) && (b >= length * 2 / 5 && b <= length * 3 / 5) || a == 0 || b == 0)
continue;
map[a][b] = food;
}
}
for (i = 0; i <= width; i++)
{ //布置砖块brick
for (j = 0; j <= length; j++)
{
if (((i >= 14 && i <= 15) && (j >= 1 && j <= 20)) || ((i >= 14 && i <= 15) && (j >= 130 && j <= 149)))
map[i][j] = brick;
if (((i >= 20 && i <= 22) && (j >= 10 && j <= 50)) || ((i >= 20 && i <= 22) && (j >= 100 && j <= 140)))
map[i][j] = brick;
if ((i == 10 || i == 11) && ((j >= 10 && j <= 50) || (j >= 100 && j <= 140)))
map[i][j] = brick;
}
}
}
else
{
for (i = 0; i <= width; i++)
{
strcpy(map[i], man_made_map[i]);
}
auto_made_map = 1;
}
gotoxy(2, width + 3);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 07);
printf("life:");
for (i = 0; i < life; i++)
printf("■");
}
gotoxy(0, 0);
for (i = 0; i <= width; i++)
{ //打印地图
for (j = 0; j <= length; j++)
{
if (if_start == 0 && i >= 14 &