代码演示
#include<stdio.h>
#include<stdlib.h>
#include <math.h>
#include <windows.h>
#include <graphics.h>
#include <conio.h>
#include <map>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
using namespace std;
#define MAX_SNAKE 20
#define db double
#define Y_MAX 720
#define X_MAX 1280
#define SNAKE_SIZE_MAX 5000
#define FOOD_MAX 500
#define COLOR_NUMBER 11
#define snake_root_r 6
#define snake_body_r 4
#define DELAY 15
enum DIR {
UP, DOWN, LEFT, RIGHT,
};
typedef struct Snake {
int dir_cnt;
int temp_sum;
int sum;
int size;
int dir;
int speed;
POINT body[SNAKE_SIZE_MAX];
DWORD color;
} Snake;
typedef struct Food {
POINT point;
DWORD color;
int r;
int value;
} Food;
Snake snake[MAX_SNAKE + 5];
Food food[FOOD_MAX];
void Graphics_Window() {
initgraph(X_MAX, Y_MAX, SHOWCONSOLE);
return;
}
void Food_Init(const int& i) {
food[i].r = rand() % 6;
food[i].point.x = rand() % X_MAX;
food[i].point.y = rand() % Y_MAX;
food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
food[i].value = 5;
}
void Snake_Init(const int& i) {
snake[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
snake[i].dir_cnt = 10;
snake[i].temp_sum = 0;
snake[i].sum = 0;
snake[i].size = rand() % 3 + 3;
snake[i].dir = rand() % 4;
snake[i].speed = rand() % 3 + 1;
if (rand() & 1) {
snake[i].body[0].x = rand() % X_MAX;
snake[i].body[0].y = rand() % Y_MAX;
}
else {
snake[i].body[0].x = 300 + rand() % 300;
snake[i].body[0].y = 300 + rand() % 300;
}
for (int j = 1; j < snake[i].size; j++) {
snake[i].body[j].x = snake[i].body[j - 1].x - 9;
snake[i].body[j].y = snake[i].body[j - 1].y;
}
}
void Game_Init(const int& n) {
mciSendString("open ./res/snake_bgm.mp3 alias BGM", 0, 0, 0);
mciSendString("play BGM repeat", 0, 0, 0);
for (int i = 0; i < FOOD_MAX; i++) {
Food_Init(i);
}
for (int i = 1; i <= n; i++) {
Snake_Init(i);
}
snake[0].temp_sum = 0;
snake[0].size = 3;
snake[0].dir = rand() % 4;
snake[0].sum = 0;
snake[0].speed = 5;
if (rand() & 1) {
snake[0].body[0].x = 300 - rand() % 100;
snake[0].body[0].y = 300 - rand() % 100;
}
else {
snake[0].body[0].x = 300 + rand() % 100;
snake[0].body[0].y = 300 + rand() % 100;
}
for (int i = 1; i < snake[0].size; i++) {
snake[0].body[i].x = snake[0].body[i - 1].x - 9;
snake[0].body[i].y = snake[0].body[i - 1].y;
}
return;
}
void Key_Control() {
if (_kbhit() == false) return;
switch (_getch()) {
case 'W':
case 'w':
case 72:
if (snake[0].dir == DOWN) break;
snake[0].dir = UP;
break;
case 'S':
case 's':
case 80:
if (snake[0].dir == UP) break;
snake[0].dir = DOWN;
break;
case 'A':
case 'a':
case 75:
if (snake[0].dir == RIGHT) break;
snake[0].dir = LEFT;
break;
case 'D':
case 'd':
case 77:
if (snake[0].dir == LEFT) break;
snake[0].dir = RIGHT;
break;
case ' ':
while (1) {
if (_getch() == ' ') return;
}
break;
}
return;
}
void Circular_Draw(const int& x, const int& y, const int& r) {
solidcircle(x, y, r);
return;
}
void Snake_Draw(const int& j, const DWORD& colour) {
setfillcolor(colour);
Circular_Draw(snake[j].body[0].x, snake[j].body[0].y, snake_root_r);
for (int i = 1; i < snake[j].size; i++) {
Circular_Draw(snake[j].body[i].x, snake[j].body[i].y, snake_body_r);
}
return;
}
void Game_Draw(const int& n) {
BeginBatchDraw();
setbkcolor(RGB(255, 218, 185));
cleardevice();
for (int i = 0; i < FOOD_MAX; i++) {
setfillcolor(food[i].color);
Circular_Draw(food[i].point.x, food[i].point.y, food[i].r);
}
Snake_Draw(0, RED);
for (int j = 1; j <= n; j++) {
Snake_Draw(j, snake[j].color);
}
EndBatchDraw();
return;
}
void Copy(const int& t) {
for (int i = snake[t].size - 1; i; i--) {
snake[t].body[i] = snake[t].body[i - 1];
}
}
void Snake_Move(const int& t) {
Copy(t);
switch (snake[t].dir) {
case 0:
snake[t].body[0].y -= snake[t].speed;
break;
case 1:
snake[t].body[0].y += snake[t].speed;
break;
case 2:
snake[t].body[0].x -= snake[t].speed;
break;
case 3:
snake[t].body[0].x += snake[t].speed;
break;
}
return;
}
void Modify_Snake(const int& i) {
if (snake[i].temp_sum / 10 == 0) return;
if (snake[i].size == SNAKE_SIZE_MAX) {
return;
}
int k = snake[i].temp_sum / 10;
if (snake[i].size + k < SNAKE_SIZE_MAX) {
snake[i].size += k;
snake[i].temp_sum -= k * 10;
}
else {
snake[i].size = SNAKE_SIZE_MAX;
snake[i].temp_sum = 0;
}
return;
}
void Game_Rule(const int& n) {
for (int i = 1; i <= n; i++) {
if (snake[i].body[0].x < 0 || snake[i].body[0].y < 0 || snake[i].body[0].x > X_MAX || snake[i].body[0].y > Y_MAX) {
Snake_Init(i);
}
}
if (snake[0].body[0].x < 0 || snake[0].body[0].y < 0 || snake[0].body[0].x > X_MAX || snake[0].body[0].y > Y_MAX) {
printf("游戏结束\n");
exit(0);
}
for (int i = 1; i <= n; i++) {
double dis = sqrt(pow((db)snake[i].body[0].x - (db)snake[0].body[0].x, 2) + pow((db)snake[i].body[0].y - (db)snake[0].body[0].y, 2));
if (dis <= (db)(snake_root_r << 1)) {
printf("游戏结束!!!!!!!!!\n");
printf("你的蛇已死亡,死亡最后总分为:%d\n", snake[0].sum);
exit(0);
}
for (int j = 1; j < snake[i].size; j++) {
dis = sqrt(pow((db)snake[i].body[j].x - (db)snake[0].body[0].x, 2) + pow((db)snake[i].body[j].y - (db)snake[0].body[0].y, 2));
if (dis <= (db)(snake_root_r + snake_body_r)) {
printf("游戏结束\n");
exit(0);
}
}
}
int snake_vis[MAX_SNAKE + 1];
memset(snake_vis, false, sizeof(snake_vis));
for (int i = 1; i < n; i++) {
double dis;
for (int j = i + 1; j <= n; j++) {
if (snake_vis[j]) continue;
dis = sqrt(pow((db)snake[i].body[0].x - (db)snake[j].body[0].x, 2) + pow((db)snake[i].body[0].y - (db)snake[j].body[0].y, 2));
if (dis <= (db)(snake_root_r << 1)) {
printf("序号为%d的蛇死亡,死亡最后总分为:%d\n", i, snake[i].sum);
Snake_Init(i);
printf("序号为%d的蛇死亡,死亡最后总分为:%d\n", j, snake[j].sum);
Snake_Init(j);
continue;
}
for (int k = 1; k < snake[j].size; k++) {
dis = sqrt(pow((db)snake[i].body[0].x - (db)snake[j].body[k].x, 2) + pow((db)snake[i].body[0].y - (db)snake[j].body[k].y, 2));
if (dis <= (db)(snake_root_r + snake_body_r)) {
printf("序号为%d的蛇死亡,死亡最后总分为:%d\n", i, snake[i].sum);
Snake_Init(i);
continue;
}
}
}
snake_vis[i] = true;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j < snake[0].size; j++) {
double dis = sqrt(pow((db)snake[i].body[0].x - (db)snake[0].body[j].x, 2) + pow((db)snake[i].body[0].y - (db)snake[0].body[j].y, 2));
if (dis <= (db)(snake_root_r + snake_body_r)) {
printf("序号为%d的蛇死亡,死亡最后总分为:%d\n", i, snake[i].sum);
Snake_Init(i);
break;
}
}
}
for (int j = 0; j <= n; j++) {
for (int i = 0; i < FOOD_MAX; i++) {
double dis = sqrt(pow((db)food[i].point.x - (db)snake[j].body[0].x, 2) + pow((db)food[i].point.y - (db)snake[j].body[0].y, 2));
if (dis <= (db)(food[i].r + (db)snake_root_r)) {
if (j) {
snake[j].temp_sum += food[i].value << 1;
snake[j].sum += food[i].value << 1;
} else {
snake[j].temp_sum += food[i].value;
snake[j].sum += food[i].value;
}
Food_Init(i);
Modify_Snake(j);
}
}
}
return;
}
void f(const int& n) {
for (int i = 1; i <= n; i++) {
if (snake[i].dir_cnt) {
snake[i].dir_cnt--;
Snake_Move(i);
continue;
}
snake[i].dir = rand() % 4;
snake[i].dir_cnt = rand() % 4 + 3;
}
return;
}
int main() {
srand((unsigned int)time(0));
const int n = 12;
Graphics_Window();
Game_Init(n);
printf("snake(%d, %d),dir = %d, speed = %d\n", snake[0].body[0].x, snake[0].body[0].y, snake[0].dir, snake[0].speed);
printf("size = %d\n", snake[0].size);
for (int i = 1; i < snake[0].size; i++) {
printf("body(%d, %d),dir = %d\n", snake[0].body[i].x, snake[0].body[i].y, snake[0].dir);
}
while (1) {
Game_Draw(n);
Key_Control();
f(n);
for (int i = 0; i <= n; i++) {
Snake_Move(i);
}
Game_Rule(n);
Sleep(DELAY);
}
return 0;
}