赞
踩
easyx库是c语言的一个库,掌握它可以制作很多小游戏和画各种各样的图。
这是本人学习半年c语言所写的小游戏,希望点进来的朋友们能有所收获。
- #include <easyx.h>
- #include <stdio.h>
- #include <conio.h>
- #include <time.h>
-
- #define NODE_WIDTH 40
-
- // 节点
- typedef struct {
- int x;
- int y;
- }node;
-
- // 绘制网格
- // 横线(0, y), (800, y) 0 <= y <= 600
- // 竖线(x, 0),(x, 600) 0 <= x <= 800
- void paintGrid()
- {
- // 横线
- for (int y = 0; y < 600; y += NODE_WIDTH)
- {
- line(0, y, 800, y);
- }
- // 竖线
- for (int x = 0; x < 800; x += NODE_WIDTH)
- {
- line(x, 0, x, 600);
- }
- }
-
- void paintSnake(node* snake, int n)
- {
- int left, top, right, bottom;
- for (int i = 0; i < n; i++)
- {
- // 左上角:【网格x坐标 * 网格宽度, 网格y坐标 * 网格宽度】
- left = snake[i].x * NODE_WIDTH;
- top = snake[i].y * NODE_WIDTH;
- // 右下角:【(网格x坐标 + 1) * 网格宽度, (网格y坐标 + 1) * 网格宽度】
- right = (snake[i].x + 1) * NODE_WIDTH;
- bottom = (snake[i].y + 1) * NODE_WIDTH;
- // 通过左上角与右下角坐标绘制矩形
- solidrectangle(left, top, right, bottom);
- }
- }
-
- // 方向枚举
- enum direction
- {
- eUp,
- eDown,
- eLeft,
- eRight
- };
-
-
- // 蛇身体移动
- node snakeMove(node* snake, int length, int direction)
- {
- //for (int i = 0; i < length; i++)
- // printf("(%d, %d)\n", snake[i].x, snake[i].y);
-
- // 记录尾节点
- node tail = snake[length - 1];
-
- // 从尾结点开始,前一个节点覆盖后一个节点
- // 0 1 2 3 4 0 1 2 3 4
- // E D C B A ---> E E D C B
- for (int i = length - 1; i > 0; i--)
- {
- snake[i] = snake[i - 1];
- }
-
- // 下一个头节点
- node newHead;
- newHead = snake[0];
- if (direction == eUp)
- {
- newHead.y--;
- }
- else if (direction == eDown)
- {
- newHead.y++;
- }
- else if (direction == eLeft)
- {
- newHead.x--;
- }
- else // right
- {
- newHead.x++;
- }
-
- // 更新头节点
- // E D C B A ---> F E D C B
- snake[0] = newHead;
-
- //for (int i = 0; i < length; i++)
- // printf("(%d, %d)\n", snake[i].x, snake[i].y);
-
- // 返回尾节点
- return tail;
- }
-
- // 键盘输入改变direction
- void changeDirection(enum direction* pD)
- {
- // 检查输入缓存区中是否有数据
- if (_kbhit() != 0)
- {
- // _getch函数获取输入缓存区中的数据
- char c = _getch();
- // 判断输入并转向
- switch (c)
- {
- case 'w':
- // 向上移动
- if (*pD != eDown)
- *pD = eUp;
- break;
- case 's':
- // 向下移动
- if (*pD != eUp)
- *pD = eDown;
- break;
- case 'a':
- // 向左移动
- if (*pD != eRight)
- *pD = eLeft;
- break;
- case 'd':
- // 向右移动
- if (*pD != eLeft)
- *pD = eRight;
- break;
- }
- }
- }
-
- // 绘制食物
-
- void paintFood(node food)
- {
- int left, top, right, bottom;
- left = food.x * NODE_WIDTH;
- top = food.y * NODE_WIDTH;
- right = (food.x + 1) * NODE_WIDTH;
- bottom = (food.y + 1) * NODE_WIDTH;
- setfillcolor(RED);
- solidrectangle(left, top, right, bottom);
- setfillcolor(WHITE);
- }
-
-
- // 随机创建食物
- node createFood(node* snake, int length)
- {
- node food;
- while (1)
- {
- food.x = rand() % (800 / NODE_WIDTH);
- food.y = rand() % (600 / NODE_WIDTH);
-
- int i;
- for (i = 0; i < length; i++)
- {
- if (snake[i].x == food.x && snake[i].y == food.y)
- {
- break;
- }
- }
- if (i < length)
- continue;
- else
- break;
- }
- return food;
- }
-
- bool isGameOver(node* snake, int length)
- {
- // 是否撞墙
- if (snake[0].x < 0 || snake[0].x > 800 / NODE_WIDTH)
- return true;
-
- if (snake[0].y < 0 || snake[0].y > 600 / NODE_WIDTH)
- return true;
-
- // 是否吃到蛇身
- for (int i = 1; i < length; i++)
- {
- if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
- return true;
- }
- return false;
- }
-
- void reset(node* snake, int* pLength, enum direction* d)
- {
- snake[0] = node{ 5, 7 };
- snake[1] = node{ 4, 7 };
- snake[2] = node{ 3, 7 };
- snake[3] = node{ 2, 7 };
- snake[4] = node{ 1, 7 };
- *pLength = 5;
- *d = eRight;
- }
-
- int main()
- {
- initgraph(800, 600);
- // 设置背景色
- setbkcolor(RGB(204, 204, 214));
- // 使用背景色清空窗体
- cleardevice();
-
- // 蛇节点坐标
- node snake[100] = { {5, 7}, {4, 7}, {3, 7}, {2, 7}, {1, 7} };
- // 蛇节点长度
- int length = 5;
- enum direction d = eRight;
-
- // 食物
- srand(unsigned int(time(NULL)));
- node food = createFood(snake, length);
-
- while (1)
- {
- // 清空整个窗体
- cleardevice();
- // 绘制网格
- paintGrid();
- // 绘制蛇节点
- paintSnake(snake, length);
- // 绘制食物
- paintFood(food);
- // 休眠150ms
- Sleep(150);
- // 获取键盘输入并将方向存储到变量d
- changeDirection(&d);
-
- node lastTail = snakeMove(snake, length, d);
- // 新的蛇头节点是否与食物节点重合
- if (snake[0].x == food.x && snake[0].y == food.y)
- {
- // 限制snake节点最大长度
- if (length < 100)
- {
- // 已经吃到食物, 长度+1
- snake[length] = lastTail;
- length++;
- }
- // 重新生成新的食物
- food = createFood(snake, length);
- }
-
- // 游戏是否结束
- if (isGameOver(snake, length) == true)
- {
- // 游戏结束,复位设置,重新生成食物
- reset(snake, &length, &d);
- food = createFood(snake, length);
- }
- }
-
- getchar();
- closegraph();
- return 0;
- }
代码见上,自行参考,如有雷同,纯属巧合!
望大佬们纠错,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。