平台:Win10,Visual Studio 2022
实现了“贪吃蛇”最基本的玩法,直接上代码,
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
constexpr auto LEN = 40;
constexpr auto HIGHT = 40;
// create cache
unsigned char arr[HIGHT][LEN] = { 0 };
// store point
int point_yx[2] = { 0 };
// for snake position
typedef struct
{
int x;
int y;
} S_Position;
int s_len = 0;
int fd = 0;
char cmd_buffer[1] = { 0 };
unsigned char temp_cmd = 0;
S_Position s_position[20] = { 0 };
S_Position temp_position = { 0 };
void fill_margin();
void get_random_point();
void place_snake();
void update_snake_position();
void draw();
void gotoxy(int x, int y);
void HideCursor();
int main()
{
HideCursor();
fill_margin();
place_snake();
get_random_point();
while (1)
{
update_snake_position();
draw();
Sleep(120);
}
return 0;
}
void fill_margin()
{
for (int i = 0; i < HIGHT; i++)
{
for (int j = 0; j < LEN; j++)
{
if (i == 0 || i == HIGHT - 1 || j == 0 || j == LEN - 1)
{
arr[i][j] = 1;
}
}
}
}
void get_random_point()
{
srand(time(NULL));
int x = rand() % LEN;
int y = rand() % HIGHT;
x == 0 ? x++ : x;
y == 0 ? y++ : y;
x == LEN - 1 ? x-- : x;
y == HIGHT - 1 ? y-- : y;
point_yx[0] = y;
point_yx[1] = x;
arr[point_yx[0]][point_yx[1]] = 1;
}
void gotoxy(int x, int y)
{
COORD pos = { x,y };
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void draw()
{
gotoxy(0, 0);
if (s_len == 10)
{
system("cls");
printf("Congratulations! You win!\n");
Sleep(2000);
exit(0);
}
for (int i = 0; i < HIGHT; i++)
{
for (int j = 0; j < LEN; j++)
{
if (arr[i][j] == 1)
{
printf("\033[47m");
}
if (i == s_position[0].y && j == s_position[0].x)
{
printf("\033[41m");
printf("OO");
}
else
{
printf(" ");
}
printf("\033[0m");
}
printf("\n");
}
}
void place_snake()
{
s_position[0].x = 20;
s_position[0].y = 30;
s_position[1].x = 19;
s_position[1].y = 30;
s_position[2].x = 18;
s_position[2].y = 30;
s_len = 3;
for (int i = 0; i < s_len; i++)
{
arr[s_position[i].y][s_position[i].x] = 1;
}
}
void update_snake_position()
{
if (_kbhit())
{
cmd_buffer[0] = _getch();
if ((cmd_buffer[0] == 'w' && temp_cmd == 's') || (cmd_buffer[0] == 's' && temp_cmd == 'w') || (cmd_buffer[0] == 'a' && temp_cmd == 'd') || (cmd_buffer[0] == 'd' && temp_cmd == 'a'))
{
//这个return很灵性,起到了刹车的效果 ^_^
return;
}
//避免其他按键导致小蛇停止
if (cmd_buffer[0] != 'w' && cmd_buffer[0] != 's' && cmd_buffer[0] != 'a' && cmd_buffer[0] != 'd')
{
cmd_buffer[0] = temp_cmd;
}
temp_cmd = cmd_buffer[0];
}
else
{
cmd_buffer[0] = temp_cmd;
}
if (cmd_buffer[0] == 'w')
{
temp_cmd = 'w';
temp_position.x = s_position[0].x;
temp_position.y = s_position[0].y;
s_position[0].y--;
if (s_position[0].y == point_yx[0] && s_position[0].x == point_yx[1])
{
// eat point
s_len++;
get_random_point();
}
for (int i = 1; i < s_len; i++)
{
if (i == s_len - 1)
{
arr[s_position[i].y][s_position[i].x] = 0;
}
s_position[i].x = s_position[i].x ^ temp_position.x;
temp_position.x = s_position[i].x ^ temp_position.x;
s_position[i].x = s_position[i].x ^ temp_position.x;
s_position[i].y = s_position[i].y ^ temp_position.y;
temp_position.y = s_position[i].y ^ temp_position.y;
s_position[i].y = s_position[i].y ^ temp_position.y;
}
for (int i = 0; i < s_len; i++)
{
arr[s_position[i].y][s_position[i].x] = 1;
}
}
else if (cmd_buffer[0] == 's')
{
temp_cmd = 's';
temp_position.x = s_position[0].x;
temp_position.y = s_position[0].y;
s_position[0].y++;
if (s_position[0].y == point_yx[0] && s_position[0].x == point_yx[1])
{
// eat point
s_len++;
get_random_point();
}
for (int i = 1; i < s_len; i++)
{
if (i == s_len - 1)
{
arr[s_position[i].y][s_position[i].x] = 0;
}
s_position[i].x = s_position[i].x ^ temp_position.x;
temp_position.x = s_position[i].x ^ temp_position.x;
s_position[i].x = s_position[i].x ^ temp_position.x;
s_position[i].y = s_position[i].y ^ temp_position.y;
temp_position.y = s_position[i].y ^ temp_position.y;
s_position[i].y = s_position[i].y ^ temp_position.y;
}
for (int i = 0; i < s_len; i++)
{
arr[s_position[i].y][s_position[i].x] = 1;
}
}
else if (cmd_buffer[0] == 'a')
{
temp_cmd = 'a';
temp_position.x = s_position[0].x;
temp_position.y = s_position[0].y;
s_position[0].x--;
if (s_position[0].y == point_yx[0] && s_position[0].x == point_yx[1])
{
// eat point
s_len++;
get_random_point();
}
for (int i = 1; i < s_len; i++)
{
if (i == s_len - 1)
{
arr[s_position[i].y][s_position[i].x] = 0;
}
s_position[i].x = s_position[i].x ^ temp_position.x;
temp_position.x = s_position[i].x ^ temp_position.x;
s_position[i].x = s_position[i].x ^ temp_position.x;
s_position[i].y = s_position[i].y ^ temp_position.y;
temp_position.y = s_position[i].y ^ temp_position.y;
s_position[i].y = s_position[i].y ^ temp_position.y;
}
for (int i = 0; i < s_len; i++)
{
arr[s_position[i].y][s_position[i].x] = 1;
}
}
else if (cmd_buffer[0] == 'd')
{
temp_cmd = 'd';
temp_position.x = s_position[0].x;
temp_position.y = s_position[0].y;
s_position[0].x++;
if (s_position[0].y == point_yx[0] && s_position[0].x == point_yx[1])
{
// eat point
s_len++;
get_random_point();
}
for (int i = 1; i < s_len; i++)
{
if (i == s_len - 1)
{
arr[s_position[i].y][s_position[i].x] = 0;
}
s_position[i].x = s_position[i].x ^ temp_position.x;
temp_position.x = s_position[i].x ^ temp_position.x;
s_position[i].x = s_position[i].x ^ temp_position.x;
s_position[i].y = s_position[i].y ^ temp_position.y;
temp_position.y = s_position[i].y ^ temp_position.y;
s_position[i].y = s_position[i].y ^ temp_position.y;
}
for (int i = 0; i < s_len; i++)
{
arr[s_position[i].y][s_position[i].x] = 1;
}
};
if (s_position[0].x == LEN - 1 || s_position[0].y == HIGHT - 1 || s_position[0].x == 0 || s_position[0].y == 0)
{
system("cls");
printf("Please try again!\n");
exit(0);
}
}