|
@@ -0,0 +1,167 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <conio.h>
|
|
|
+#include <graphics.h>
|
|
|
+
|
|
|
+/*
|
|
|
+ 复习:结构体、循环、函数、数组、eaxyx
|
|
|
+ eaxyx:图形界面库
|
|
|
+*/
|
|
|
+//做界面1,创建一个图形界面窗口
|
|
|
+//🐍的方向
|
|
|
+//🐍的速度
|
|
|
+//🐍的结构
|
|
|
+#define SNAKE_NUM 500 //蛇的最大节数
|
|
|
+
|
|
|
+enum DIR //表示🐍的方向
|
|
|
+{
|
|
|
+ UP,
|
|
|
+ DOWN,
|
|
|
+ LEFT,
|
|
|
+ RIGHT,
|
|
|
+};
|
|
|
+
|
|
|
+struct Snake
|
|
|
+{
|
|
|
+ int size; //🐍的节数
|
|
|
+ int dir; //🐍的方向
|
|
|
+ int speed; //🐍的速度
|
|
|
+ POINT coor[SNAKE_NUM]; //坐标
|
|
|
+}snake;
|
|
|
+
|
|
|
+//数据的初始化
|
|
|
+void GameInit()
|
|
|
+{
|
|
|
+ //init 初始化 graph 图形化窗口 SHOWCONSOLE 显示控制台
|
|
|
+ initgraph(640, 480);
|
|
|
+ //初始化🐍
|
|
|
+ snake.size = 3;
|
|
|
+ snake.speed = 10;
|
|
|
+ snake.dir = RIGHT; //初始化定义🐍的方向为RIGHT
|
|
|
+
|
|
|
+ for (int i = snake.size - 1; i >= 0; i--)
|
|
|
+ {
|
|
|
+ snake.coor[i].x = 40 - 10 * i;
|
|
|
+ snake.coor[i].y = 10;
|
|
|
+ //printf("?%d %d", snake.coor[i].x, snake.coor[i].y);
|
|
|
+ }
|
|
|
+
|
|
|
+ //snake.coor[0].x = 40;
|
|
|
+ //snake.coor[0].y = 10;
|
|
|
+ //snake.coor[1].x = 30;
|
|
|
+ //snake.coor[1].y = 10;
|
|
|
+ //snake.coor[2].x = 20;
|
|
|
+ //snake.coor[2].y = 10;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void GameDraw()
|
|
|
+{
|
|
|
+ //双缓冲绘图
|
|
|
+ BeginBatchDraw();
|
|
|
+ //设置背景颜色
|
|
|
+ setbkcolor(RGB(85, 0, 255));
|
|
|
+ cleardevice();
|
|
|
+ //绘制🐍
|
|
|
+ //setfillcolor()
|
|
|
+ for (int i = 0; i < snake.size; i++)
|
|
|
+ {
|
|
|
+ solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
|
|
|
+ }
|
|
|
+ EndBatchDraw();
|
|
|
+}
|
|
|
+
|
|
|
+//移动🐍
|
|
|
+void snakeMove()
|
|
|
+{
|
|
|
+ //移动是坐标发生改变
|
|
|
+ //让身体跟着头移动
|
|
|
+ for (int i = snake.size - 1; i > 0; i--)
|
|
|
+ {
|
|
|
+ snake.coor[i] = snake.coor[i - 1];
|
|
|
+ }
|
|
|
+ switch (snake.dir)
|
|
|
+ {
|
|
|
+ case UP:
|
|
|
+ snake.coor[0].y -= snake.speed;
|
|
|
+ if (snake.coor[0].y <= 0)//头跑出了上边界
|
|
|
+ {
|
|
|
+ snake.coor[0].y = 640;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DOWN:
|
|
|
+ snake.coor[0].y += snake.speed;
|
|
|
+ break;
|
|
|
+ case LEFT:
|
|
|
+ snake.coor[0].x -= snake.speed;
|
|
|
+ break;
|
|
|
+ case RIGHT:
|
|
|
+ snake.coor[0].x += snake.speed;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//通过按键盘改变🐍的移动方向
|
|
|
+void keyControl()
|
|
|
+{
|
|
|
+ //判断有没有按键盘,如果有按键,就返回真
|
|
|
+ if (_kbhit())
|
|
|
+ {
|
|
|
+ //72 80 75 77 方向键上下左右键值
|
|
|
+ switch (_getch())
|
|
|
+ {
|
|
|
+ case 'w':
|
|
|
+ case 'W':
|
|
|
+ case 72:
|
|
|
+ if (snake.dir != DOWN)
|
|
|
+ {
|
|
|
+ snake.dir = UP;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 's':
|
|
|
+ case 'S':
|
|
|
+ case 80:
|
|
|
+ if (snake.dir != UP)
|
|
|
+ {
|
|
|
+ snake.dir = DOWN;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 'a':
|
|
|
+ case 'A':
|
|
|
+ case 75:
|
|
|
+ if (snake.dir != RIGHT)
|
|
|
+ {
|
|
|
+ snake.dir = LEFT;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 'd':
|
|
|
+ case 'D':
|
|
|
+ case 77:
|
|
|
+ if (snake.dir != LEFT)
|
|
|
+ {
|
|
|
+ snake.dir = RIGHT;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+int main()
|
|
|
+{
|
|
|
+ GameInit();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ while (1)
|
|
|
+ {
|
|
|
+ GameDraw();
|
|
|
+ snakeMove();
|
|
|
+ keyControl();
|
|
|
+ Sleep(20);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|