头文件
#pragma once
#define HIGH 20
#define WIDE 60
struct BODY
{
int X;
int Y;
};
struct SNAKE
{
int size;
struct BODY body[HIGH * WIDE];
}snake;
int food[2]={0};
int score = 0;
//偏移坐标
int dx = 0;
int dy = 0;
//记录蛇末尾坐标
int lx = 0;
int ly = 0;
void InitFood();
void InitSnake();
void ShowUI();
void PlayGame();
void InitWall();
源文件
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#include "Snake.h"
void InitFood()
{
food[0] = rand() % (WIDE-2)+1;
food[1] = rand() % (HIGH-2)+1;
}
void InitSnake()
{
snake.size = 2;
snake.body[0].X = WIDE / 2;
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDE / 2-1;
snake.body[1].Y = HIGH / 2;
}
void ShowUI()
{
COORD coord;
//更新末尾空格
coord.X = lx;
coord.Y = ly;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
for (int i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i == 0)
{
putchar('@');
}
else
{
putchar('*');
}
}
coord.X = food[0];
coord.Y = food[1];
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
void PlayGame()
{
char key = 'D';
char temp = key;
while (snake.body[0].X >= 0 && snake.body[0].X < WIDE
&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)
{
ShowUI();
while (_kbhit())
{
key= _getch();
}
switch (key)
{
case 'D':case'd':dx = 1; dy = 0; break;
case 'A':case'a':dx = -1; dy = 0; break;
case 'W':case'w':dx = 0; dy = -1; break;
case 'S':case's':dx = 0; dy = 1; break;
}
for (int i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y)
{
return;
}
}
if (snake.body[0].X == food[0] && snake.body[0].Y == food[1])
{
InitFood();
snake.size++;
score += 10;
}
//更新蛇身体
lx = snake.body[snake.size - 1].X;
ly = snake.body[snake.size - 1].Y;
for (int i = snake.size - 1; i > 0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
//更新蛇头
snake.body[0].X += dx;
snake.body[0].Y += dy;
Sleep(200);
//system("cls");
}
}
void InitWall()
{
for (int i = 0; i <= HIGH; i++)
{
for (int j = 0; j <= WIDE; j++)
{
if (i == HIGH)
{
putchar('=');
}
else if (j == WIDE)
{
putchar('=');
}
else
{
putchar(' ');
}
}
printf("\n");
}
}
int main(void)
{
srand((unsigned int)time(NULL));
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
InitFood();
InitSnake();
InitWall();
/*ShowUI();*/
//getchar();
PlayGame();
printf("%d", score);
return 0;
}