安徽建设厅网站首页,wordpress网站如何播放视频,下载软件用哪个软件好,响应式网站 产品轮播代码由于蛇是由多块蛇身组成的#xff0c;机构体数组或者链表来存储蛇 蛇在运行过程中#xff0c;如果吃了食物#xff0c;那么这块食物就可以看作是新的蛇头了#xff0c;
数组存储 存储新蛇身#xff0c;在数组的第一个位置插入一个元素。 链表 插入和删除元素效率很高机构体数组或者链表来存储蛇 蛇在运行过程中如果吃了食物那么这块食物就可以看作是新的蛇头了
数组存储 存储新蛇身在数组的第一个位置插入一个元素。 链表 插入和删除元素效率很高访问指定元素位置元素 中和上述两种结构的缺点 可以考虑使用队列或者双端队列的方式去存储蛇身 此处我们使用双端队列。
在窗口中绘制出蛇的身子。 函数分析 ·参数 将蛇作为函数的参数用矩形框来代替蛇身的每一块同时用绿色来表示蛇身。以引用方式传递。 避免函数值传递过程中对函数参数进行拷贝造成不必要的开销。 ·返回值无
游戏结束 游戏结束标志蛇头碰撞到窗口边界或者蛇头撞到了自己的身体。 函数分析 · 参数蛇一方面要获取到蛇头位置判断蛇头是否与窗口边界碰撞另一方面也要获取蛇身判断蛇头是否碰撞到蛇身。 · 返回值可以不需要返回值如果游戏结束直接在该函数中结束程序即可。 蛇移动 整个蛇放在双端队列中由于蛇每次超某个方向移动一步其蛇身位置信息都要改变。不妨将蛇头移动反向的下一个位置的坐标作为新的蛇头蛇尾部最后一个元素是否需要删除取决于蛇是否迟到了食物如果没有迟到则将蛇尾从蛇身中删除如果吃到了那么食物的位置就是新的蛇头由于蛇身长度要加1则不需要删除蛇尾。然后再重新绘制蛇身。这样一来蛇就完成了一次移动。
函数分析 ·参数 ·将蛇作为函数的参数 ·用一个标记来标记蛇是否迟到了食物。 ·返回值无
更改蛇的移动方向 从键盘获取输入的按键完成轮梗概运动的方向 键盘的W、w、上键均可使蛇向上移动 键盘的S、s、下键均可使蛇向下移动 键盘的A、a、左键均可使蛇向左移动 键盘的D、d、右键均可使蛇向右移动
捕获键盘按键消息
如果捕获到了上述的按键消息则更改蛇的移动方向但是注意不可以反方向更改 函数分析 · 参数蛇 ·返回值无
生成食物 在屏种随机位置生成一个食物但注意不应该生成在蛇身上。 函数分析 ·参数 ·食物 ·蛇 ·返回值无 在屏幕左上角显示得分 检测是否迟到了食物 及判断蛇头是否与食物重合。 函数分析 · 参数蛇食物。 · 返回值 bool类型迟到了返回true否则返回false
代码如下
#includeeasyx.h #includedeque
using namespace std;
#define Wide 640 #define High 480
#define size 20//边长为20的正方形
#define Delay 200//延迟时间
//蛇移动方向 enum Direction { Up, Down, Left, Right };
//蛇身 struct Snake { int x, y; Direction dir;//移动方向 };
//食物 struct Food { int x, y; }; //绘制蛇身 void drawSnake(dequeSnake snake) { //绿色表示设置填充颜色为绿色 setfillcolor(GREEN); //遍历蛇身绘制 for (const auto body : snake) { //绘制一个矩形框,四个参数分别是左上角和右下角的横纵坐标 //用20*20的矩形框表示蛇身 fillrectangle(body.x*size,body.y*size,(body.x1)*size,(body.y1)*size); } //控制蛇移动的速度 Sleep(Delay); }
//判断游戏是否结束 void isOver(dequeSnake snake) { //检测碰撞 //遍历蛇身使用迭代器遍历从蛇头后面一个元素开始遍历 for (auto iter snake.begin() 1; iter ! snake.end(); iter) { if ((snake.front().x iter-x snake.front().y iter-y)//蛇头撞到了自己游戏结束 ||(snake.front().x 0)||(snake.front().x Wide/size) //越界游戏结束 || (snake.front().y 0) || (snake.front().y High / size) ) { //设置当前文字颜色为白色 settextcolor(RED); //设置当前文字样式指定高度100宽度0表示自适应。_T支持Unicode编码C settextstyle(100,0,_T(楷体)); TCHAR str[100]; _stprintf_s(str, _T(游戏结束!!!)); //在指定位置输出字符串。 outtextxy(Wide / size, High / size, str); //停留三秒 Sleep(3000); closegraph();//关闭窗口 //直接结束程序 exit(0); } } }
//蛇移动 grow表示是否迟到了食物该参数用来区分蛇普通移动和吃到食物 void moveSnake(dequeSnake snake,bool growfalse) { //获取蛇头 Snake newHead snake.front(); //判断蛇移动方向 switch (newHead.dir) { case Up: newHead.y--; break; case Down: newHead.y; break; case Left: newHead.x--; break; case Right: newHead.x; break; } //将新位置作为新蛇头 snake.push_front(newHead); //每移动一次都要判断游戏是否结束了 isOver(snake); if (!grow) { //没吃到食物 //growtrue表示吃到了食物 growfalse表示普通移动 clearrectangle(snake.back().x * size, snake.back().y * size, (snake.back().x 1) * size, (snake.back().y 1) * size); //将双端队列最后一个元素去除 snake.pop_back(); } //绘制蛇身 drawSnake(snake); }
//更改蛇移动方向 void changeDirection(dequeSnake snake) { ExMessage msg { 0 }; //捕获按键消息 peekmessage(msg, EX_KEY); //当某个键被按下 if (msg.message WM_KEYDOWN) { //判断输入的按键 switch (msg.vkcode) { casew: caseW: case VK_UP: if (snake.front().dir ! Down) snake.front().dir Up; break; cases: caseS: case VK_DOWN: if (snake.front().dir ! Up) snake.front().dir Down; break; case a: caseA: case VK_LEFT: if (snake.front().dir ! Right) snake.front().dir Left; break; case d: caseD: case VK_RIGHT: if (snake.front().dir ! Left) snake.front().dir Right; break; } } }
//生成食物不能生成在蛇身上 void generateFood(Food food, dequeSnake snake) { //一直生成知道生成的食物为止不在蛇身上 while (true) { //随机生成 //将整个窗口看做一个是数组每个数组元素占的空间大小为20*20个像素点 food.x rand() % (Wide / size); food.y rand() % (High / size); //用一个变量存储生成的位置是否重合 bool overlapfalse; //遍历蛇身范围for循环 for (const auto body : snake) { //食物位置与蛇身重合 if (food.x body.x food.y body.y) { //已经与蛇身重合了不必再遍历跳出for循环再while循环中重新生成 overlap true; break; } } //如果不重合则食物生成成功可以结束while循环了 if (!overlap) { break; } } }
//检测是否与食物重合 bool checkCollision(dequeSnake snake, Food food) { //蛇头与食物重合 if (snake.front().x food.x snake.front().y food.y) { return true; } //检测是否与蛇身的位置重叠可以不用因为蛇头没经过的位置蛇身必然不会经过 for (auto iter snake.begin() 1; iter ! snake.end(); iter) { if (iter-x food.x iter-y food.y) { return true; } } return false; } int main() { initgraph(Wide, High);//绘制窗口两个参数分别为窗口的宽度和长度 //定义一条蛇 dequeSnake snake; //初始化蛇 //双端队列头部插入一个元素作为蛇头 snake.push_front(Snake{ Wide/size/2,High/size/2,Right }); Food food; generateFood(food, snake); //绘制食物 setfillcolor(RED); fillrectangle(food.x * size, food.y * size, (food.x 1) * size, (food.y 1) * size); drawSnake(snake); //分数初始为0 int score 0; while (true) { //蛇移动 moveSnake(snake); //更改蛇移动方向 changeDirection(snake); //检测是否与食物重合 if (checkCollision(snake, food)) { //蛇吃到食物 score; //生成新的食物 generateFood(food, snake); //true,增加蛇的长度 moveSnake(snake, true); } //绘制食物 红色表示食物 setfillcolor(WHITE); fillrectangle(food.x*size, food.y*size, (food.x 1)* size, (food.y1)* size); //设置当前文字颜色 settextcolor(GREEN); //设置当前文字样式指定高度20宽度0表示自适应。_T支持Unicode编码Consolas表示字体 settextstyle(20,0,_T(楷体)); TCHAR strScore[16]; _stprintf_s(strScore, _T(得分:%d), score); //在指定位置输出字符串。 outtextxy(10, 10, strScore); } system(pause);//防止窗口打开即关闭一闪而过让其先停一会 closegraph();//关闭窗口 return 0; }