双人版:可穿墙
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define NUM 200
#define SIZE 20
#define SPEED 100
#define WIDTH 640
#define HEIGHT 480
enum Ch {
up = 72, down = 80, left = 75, right = 77 };
typedef struct Coor
{
int x;
int y;
}Coor;
typedef struct Snake
{
int n;
Ch ch;
Coor xy[NUM];
}Snake;
Snake snake1;
Snake snake2;
struct Food
{
int x;
int y;
bool iseat;
};
Food food;
void background();
void BGM();
void GameInit();
void DrawGame();
void SnakeMove();
void ChangeCh();
void CreateFood();
void EatFood();
int GameOver1();
int GameOver2();
int main()
{
int n;
int m;
initgraph(WIDTH, HEIGHT);
BGM();
GameInit();
while (1)
{
while (!_kbhit())
{
SnakeMove();
DrawGame();
CreateFood();
EatFood();
n = GameOver1();
m = GameOver2();
if (n || m)
{
break;
}
Sleep(SPEED);
}
if (n || m)
{
break;
}
ChangeCh();
}
getchar();
closegraph();
return 0;
}
void BGM()
{
mciSendString("open ./甩葱歌.mp3 alias BGM", 0, 0, 0);
mciSendString("play BGM repeat", 0, 0, 0);
if (0)
{
mciSendString("close BGM ", 0, 0, 0);
}
}
void GameInit()
{
srand((unsigned int)time(NULL));
snake1.n = 3;
snake1.ch = right;
snake1.xy[0].x = 100;
snake1.xy[0].y = 100;
snake1.xy[1].x = 90;
snake1.xy[1].y = 100;
snake1.xy[2].x = 80;
snake1.xy[2].y = 100;
snake2.n = 3;
snake2.ch = right;
snake2.xy[0].x = 500;
snake2.xy[0].y = 200;
snake2.xy[1].x = 490;
snake2.xy[1].y = 200;
snake2.xy[2].x = 480;
snake2.xy[2].y = 200;
food.iseat = true;
}
void DrawGame()
{
cleardevice();
BeginBatchDraw();
background();
setfillcolor(RED);
fillrectangle(snake1.xy[0].x, snake1.xy[0].y,
snake1.xy[0].x + SIZE, snake1.xy[0].y + SIZE);
setfillcolor(GREEN);
for (int i = 1; i < snake1.n; i++)
{
fillrectangle(snake1.xy[i].x, snake1.xy[i].y,
snake1.xy[i].x + SIZE, snake1.xy[i].y + SIZE);
}
setfillcolor(BLUE);
fillrectangle(snake2.xy[0].x, snake2.xy[0].y,
snake2.xy[0].x + SIZE, snake2.xy[0].y + SIZE);
setfillcolor(YELLOW);
for (int i = 1; i < snake2.n; i++)
{
fillrectangle(snake2.xy[i].x, snake2.xy[i].y,
snake2.xy[i].x + SIZE, snake2.xy[i].y + SIZE);
}
setfillcolor(RGB(253, 168, 198));
fillroundrect(food.x, food.y, food.x + SIZE, food.y + SIZE, SIZE / 2, SIZE / 2);
FlushBatchDraw();
}
void SnakeMove()
{
for (int i = snake1.n - 1; i > 0; i--)
{
snake1.xy[i].x = snake1.xy[i - 1].x;
snake1.xy[i].y = snake1.xy[i - 1].y;
}
switch (snake1.ch)
{
case up:
snake1.xy[0].y -= SIZE;
break;
case down:
snake1.xy[0].y += SIZE;
break;
case left:
snake1.xy[0].x -= SIZE;
break;
case right:
snake1.xy[0].x += SIZE;
break;
}
for (int i = snake2.n - 1; i > 0; i--)
{
snake2.xy[i].x = snake2.xy[i - 1].x;
snake2.xy[i].y = snake2.xy[i - 1].y;
}
switch (snake2.ch)
{
case up:
snake2.xy[0].y -= SIZE;
break;
case down:
snake2.xy[0].y += SIZE;
break;
case left:
snake2.xy[0].x -= SIZE;
break;
case right:
snake2.xy[0].x += SIZE;
break;
}
}
void ChangeCh()
{
char key;
key = _getch();
switch (key)
{
case up:
if (snake1.ch != down)
{
snake1.ch = up;
}
break;
case down:
if (snake1.ch != up)
{
snake1.ch = down;
}
break;
case left:
if (snake1.ch != right)
{
snake1.ch = left;
}
break;
case right:
if (snake1.ch != left)
{
snake1.ch = right;
}
break;
case 'w':
if (snake2.ch != down)
{
snake2.ch = up;
}
break;
case 's':
if (snake2.ch != up)
{
snake2.ch = down;
}
break;
case 'a':
if (snake2.ch != right)
{
snake2.ch = left;
}
break;
case 'd':
if (snake2.ch != left)
{
snake2.ch = right;
}
break;
}
}
void CreateFood()
{
bool flag;
if (food.iseat == true)
{
while (1)
{
flag = false;
food.x = rand() % (WIDTH / SIZE) * SIZE;
food.y = rand() % (HEIGHT / SIZE) * SIZE;
for (int i = 0; i < snake1.n; i++)
{
if (food.x == snake1.xy[i].x && food.y == snake1.xy[i].y)
{
flag = true;
break;
}
}
for (int i = 0; i < snake2.n; i++)
{
if (food.x == snake2.xy[i].x && food.y == snake2.xy[i].y)
{
flag = true;
break;
}
}
if (!flag)
{
food.iseat = false;
break;
}
}
}
}
void EatFood()
{
if (snake1.xy[0].x == food.x && snake1.xy[0].y == food.y)
{
food.iseat = true;
snake1.n++;
}
if (snake2.xy[0].x == food.x && snake2.xy[0].y == food.y)
{
food.iseat = true;
snake2.n++;
}
}
int GameOver1()
{
if (snake1.xy[0].x == 0 - SIZE || snake1.xy[0].x == WIDTH || snake1.xy[0].y == 0 - SIZE || snake1.xy[0].y == HEIGHT)
{
if (snake1.xy[0].x == 0 - SIZE)
{
snake1.xy[0].x = WIDTH;
}
else if (snake1.xy[0].x == WIDTH)
{
snake1.xy[0].x = 0;
}
else if (snake1.xy[0].y == 0 - SIZE)
{
snake1.xy[0].y = HEIGHT;
}
else if (snake1.xy[0].y == HEIGHT)
{
snake1.xy[0].y = 0;
}
}
for (int i = 1; i < snake1.n; i++)
{
if (snake1.xy[0].x == snake1.xy[i].x && snake1.xy[0].y == snake1.xy[i].y)
return 1;
}
for (int i = 0; i < snake2.n; i++)
{
if (snake1.xy[0].x == snake2.xy[i].x && snake1.xy[0].y == snake2.xy[i].y)
return 1;
}
return 0;
}
int GameOver2()
{
if (snake2.xy[0].x == 0 - SIZE || snake2.xy[0].x == WIDTH || snake2.xy[0].y == 0 - SIZE || snake2.xy[0].y == HEIGHT)
{
if (snake2.xy[0].x == 0 - SIZE)
{
snake2.xy[0].x = WIDTH;
}
else if (snake2.xy[0].x == WIDTH)
{
snake2.xy[0].x = 0;
}
else if (snake2.xy[0].y == 0 - SIZE)
{
snake2.xy[0].y = HEIGHT;
}
else if (snake2.xy[0].y == HEIGHT)
{
snake2.xy[0].y = 0;
}
}
for (int i = 1; i < snake2.n; i++)
{
if (snake2.xy[0].x == snake2.xy[i].x && snake2.xy[0].y == snake2.xy[i].y)
return 1;
}
for (int i = 0; i < snake1.n; i++)
{
if (snake2.xy[0].x == snake1.xy[i].x && snake2.xy[0].y == snake1.xy[i].y)
return 1;
}
return 0;
}
void background()
{
setfillcolor(RGB(192, 192, 192));
setlinecolor(BLACK);
for (int i = 0; i < WIDTH / SIZE; i++)
{
for (int j = 0; j < HEIGHT / SIZE; j++)
{
fillrectangle(i * SIZE, j * SIZE, i * SIZE + SIZE, j * SIZE + SIZE);
}
}
return;
}