#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>
typedef struct point {
int x;
int y;
}MYPOINT;
struct Snake
{
MYPOINT xy[1000];
int position;
int num;
}snake;
struct Food
{
MYPOINT fdxy;
int flag;
int grade;
}food;
enum position {up, down, left,right};
/*************************模块化设计功能*******************************/
//玩蛇
//初始化蛇宽度10像素,高度10像素,三组的长度
//定义它的初始位置:原点
//初始长度,初始移动方向
void initSnake() {
//前三节
snake.xy[2].x = 0;
snake.xy[2].y = 0;
snake.xy[1].x = 10;
snake.xy[1].y = 0;
snake.xy[0].x = 20;
snake.xy[0].y = 0;
snake.position = right;
snake.num = 3;
}
void drawSnake() {
for (int i = 0;i < snake.num;i++) {
setlinecolor(BLACK);
setfillcolor(RGB(rand()%255,rand()%255,rand()%255));
fillrectangle(snake.xy[i].x,snake.xy[i].y, snake.xy[i].x+10, snake.xy[i].y+10);
}
}
void moveSnake() {
for (int i = snake.num - 1;i > 0;i--) {
snake.xy[i].x = snake.xy[i - 1].x;
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (snake.position)
{
case up:
snake.xy[0].y -= 10;
break;
case down:
snake.xy[0].y += 10;
break;
case left:
snake.xy[0].x -= 10;
break;
case right:
snake.xy[0].x += 10;
break;
}
}
void keyDown() {
char userkey = _getch();
switch (userkey)
{
case 'w':
case 'W':
case 72:
if (snake.position!=down)
snake.position = up;
break;
case 's':
case 'S':
case 80:
if (snake.position != up)
snake.position = down;
break;
case 'a':
case 'A':
case 75:
if (snake.position != right)
snake.position = left;
break;
case 'd':
case 'D':
case 77:
if (snake.position != left)
snake.position = right;
break;
}
}
void initFood() {
food.fdxy.x = rand() % 80 * 10;
food.fdxy.y = rand() % 60 * 10;
food.flag = 1;
for (int i = 0; i < snake.num; i++)
{
if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y) {
food.fdxy.x = rand() % 80 * 10;
food.fdxy.y = rand() % 60 * 10;
}
}
}
void drawFood() {
setlinecolor(BLACK);
setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
fillrectangle(food.fdxy.x,food.fdxy.y,food.fdxy.x+10,food.fdxy.y+10);
}
void earFood() {
if (snake.xy[0].x == food.fdxy.x&&snake.xy[0].y == food.fdxy.y){
snake.num++;
food.flag = 0;
food.grade += 10;
}
}
void showGrade() {
char grade[20] = "";
sprintf_s(grade, "grade:%d", food.grade);
settextcolor(LIGHTBLUE);
settextstyle(25, 0, "楷体");
outtextxy(650,50,grade);
}
int main()
{
srand((unsigned int)time(NULL));
initgraph(800, 600);
setbkcolor(RGB(200,120,119));
cleardevice();
mciSendString("open 1.mp3", 0, 0, 0);
mciSendString("play 1.mp3", 0, 0, 0);
initSnake();
drawSnake();
while (1)
{
cleardevice();
moveSnake();
drawSnake();
if (food.flag == 0) {
initFood();
}
if (_kbhit())
{
keyDown();
}
drawFood();
earFood();
showGrade();
Sleep(100);
}
_getch();
closegraph();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?