1.游戏描述

贪吃蛇可谓是从小玩到大的经典趣味小游戏,蛇每吃到一次食物,身体就会长一节,如果撞到墙或者撞到自身,游戏结束。

2.代码实现

1.首先需要思考的问题是如何指定位置输出字符?这时候就有一个非常强大的函数叫 gotoxy() ,现在库函数里边已经没有了,只能我们自己实现,代码中注释很完整,自行阅读即可。

2.实现了指哪画哪的目标之后,就可以开始游戏内容制作了。首先便是圈地,即画地图,一个简简单单的循环就能安排的明明白白。

3.伟大的圈地运动就结束了,接下来我们就实现画一条蛇,我们选择使用deque双端队列,这个操作更为方便,画好蛇之后就给画一个食物出来,食物的位置坐标使用随机数来实现,简单吧~

4.让蛇动起来。我们默认让蛇往上走,即‘w’方向,之后便是按键响应,这个只要懂点语法,小白都能实现,就不多说了。

5.贪吃蛇的大体框架就这样搭好了,是不是soeasy~

3.装饰环节

只是会跑当然不能满足我们日益增长的精神需求,那就加点料呗,下面的代码中只加入了计分、等级,其他的都没有加,为的是新手能快速上手,你也可以再往里边加吃到食物时“滴~”响一声等元素,这都不是问题。

话不多说,上代码!

#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <deque>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;
HANDLE hOut;
COORD pos;//1.实现gotoxy函数
void gotoxy(short x, short y)
{hOut = GetStdHandle(STD_OUTPUT_HANDLE);    //获取句柄pos = { x, y };SetConsoleCursorPosition(hOut, pos);       //移动光标到指定位置
}
void HideCursor() //隐藏光标
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息CursorInfo.bVisible = false;              //隐藏控制台光标SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}//2.蛇的结构体
struct Snake
{char body;short position_x, position_y;              //蛇的坐标
};//3.游戏运行类
class Game
{private:char image;enum mapSize { width = 60, height = 30 };  //游戏地图deque<Snake> snake;                        //定义一个队列,装蛇的身体int score = 0;                             //游戏分数char hit = 'w';                            //按键输入bool eat_Food = false;                     //是否吃到食物short food_x, food_y;                      //食物坐标int speed = 400;                           //蛇的速度bool snake_state = true;                   //蛇的状态int level = 1;                             //游戏关卡
public:Game();void draw_Frame()     //画边框{for (int i = 0; i < height; i++){gotoxy(0, i);cout << "■";gotoxy(width, i);cout << "■";}for (int i = 0; i <= width; i += 2)  //■ 这个符号占两个字符位置,所以是+2{gotoxy(i, 0);cout << "■";gotoxy(i, height);cout << "■";}}void init_snake()     //初始化蛇{snake.push_back({ '#', width / 2, static_cast<short>(height / 2) });  //添加蛇头for (int i = 0; i < 3; i++) //蛇的初始身体节数,可自定snake.push_back({ char('o'), width / 2, static_cast<short>((height / 2) + 1 + i) });snake.push_back({ ' ', width / 2, static_cast<short>((height / 2) + 4) });  //添加蛇尾,先放空,以便于后面添加节数时操作}void draw_Snake()  //画蛇{for (int k = 0; k < snake.size(); k++){gotoxy(snake[k].position_x, snake[k].position_y);cout << snake[k].body;}}void clear_Tail() //清除蛇尾,不建议使用清屏函数,避免屏闪{int k = snake.size() - 1;gotoxy(snake[k].position_x, snake[k].position_y);cout << " ";  //蛇每移动一次(即一格),就把上一次画出来的蛇尾擦掉}void draw_Food()   //画食物{while (1){food_x = rand() % (width - 4) + 2;  //食物要在地图中,不能再地图边框上,地图的符号在x方向占两个字符位置所以+2,而-4则是减去边框food_y = rand() % (height - 2) + 1;  //与上同理if (wrong_Location() && food_x % 2 == 0)break;}gotoxy(food_x, food_y);cout << "O";}bool wrong_Location()    //判断食物的坐标是否合理{for (auto i : snake)  //c++11的基于范围的循环{if (food_x == i.position_x && food_y == i.position_y)  //食物不能出现在蛇的身体上return 0;}return 1;}void judge_eatFood()  //判断是否吃到食物{if (food_x == snake[0].position_x && food_y == snake[0].position_y)eat_Food = true;}void judge_state()  //判断蛇是否撞墙或撞身体{if (snake.size() >= 2) {deque<Snake>::iterator iter = snake.begin() + 1;  //实际就是把snake容器里第一个(即蛇头)存在iter里int x = (iter - 1)->position_x, y = (iter - 1)->position_y;for (; iter != snake.end(); ++iter) {if (iter->position_x == x && iter->position_y == y)  //蛇头不能撞自身snake_state = false;}}if(snake[0].position_x == 1 ||snake[0].position_x == 59 ||snake[0].position_y == 0 ||snake[0].position_y == 30)  //蛇头不能撞边框snake_state = false;}void key_Down()  //按键响应{char key = hit;if (_kbhit())  //接受按键hit = _getch();     for (int i = snake.size() - 1; i > 0; i--)  //蛇的移动方法,每移动一次,后面一节的身体到了它的前一节身体上{snake[i].position_x = snake[i - 1].position_x;snake[i].position_y = snake[i - 1].position_y;}if ((hit == 'a' || hit == 'A') && hit != 'd'){hit = 'a';  snake[0].position_x--;}else if ((hit == 'd' || hit == 'D') && hit != 'a'){hit = 'd';  snake[0].position_x++;}else if ((hit == 'w' || hit == 'W') && hit != 's'){hit = 'w';  snake[0].position_y--;}else if ((hit == 's' || hit == 'S') && hit != 'w'){hit = 's';  snake[0].position_y++;}}void show(){gotoxy(65, 0);cout << "你的得分是:";gotoxy(71, 1);cout << score;gotoxy(69, 2);cout << "关卡:" << level;}
};
Game::Game()
{HideCursor();srand(static_cast<unsigned int>(time(NULL)));  //随机数种子init_snake();draw_Food();Snake tail;  //蛇尾while (1){draw_Frame();tail = snake.back();if (eat_Food){snake.back().body = 'o';  //把初始化蛇的空尾显示化为o,看到的效果就是加了一节snake.push_back(tail);  //再添加一节空尾,便于下次操作gotoxy(food_x, food_y);cout << "  ";  //食物被吃后要在原来的位置画空,否则光标会退位,导致边框错位draw_Food();score++;if (score % 5 == 0){speed *= 0.8;level++;}eat_Food = false;}if (level == 10)break;key_Down();draw_Snake();judge_state();if (!snake_state)break;judge_eatFood();        Sleep(speed);clear_Tail();show();}
}
int main()
{system("mode con cols=100 lines=40");  //设置打开窗口大小system("color 7C");  //设置背景色和前景色system("title 贪吃蛇 v1.0");  设置窗口标题Game game;gotoxy(0, 32);cout << "Game over!" << endl;
}

本期教程到这里就结束了,欢迎下方评论批评指正呦~~

c++代码轻松实现贪吃蛇小游戏相关推荐

  1. python50行小游戏_50行python代码实现的贪吃蛇小游戏

    50行python代码实现的贪吃蛇小游戏 发布于 2014-09-01 21:26:24 | 1337 次阅读 | 评论: 1 | 来源: 网友投递 Python编程语言Python 是一种面向对象. ...

  2. python100行代码程序-100行python代码,轻松完成贪吃蛇小游戏

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

  3. python100行代码-怎样写贪吃蛇小游戏?用100行python代码轻松解决!

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

  4. bat贪吃蛇游戏代码_100行python代码,轻松完成贪吃蛇小游戏

    来源:DataGo数据狗   链接: https://mp.weixin.qq.com/s/fDcr1SfcbynLzHye7Q7VOg 大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉 ...

  5. python代码,轻松完成贪吃蛇小游戏

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

  6. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  7. 贪吃蛇小游戏代码html,自制贪吃蛇小游戏代码

    package game; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Game_St ...

  8. python程序源码百行_百行python代码,轻松完成贪吃蛇小游戏

    引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...

  9. Pygame实战项目:用300行代码写出贪吃蛇小游戏

    贪吃蛇是一款逻辑清晰.操作简单.老少咸宜.备受欢迎的休闲小游戏. 下面就给大家介绍一下贪吃蛇游戏的基本原理,以及实现贪吃蛇所需要的相关方法. 一.主要思路 我们的贪吃蛇游戏将主要包括三个核心模块,分别 ...

最新文章

  1. 14 类编程题解法总结
  2. decode函数_decode函数的妙用网友的两个问题解答
  3. Codeforces 375D - Tree and Queries(dfs序+莫队)
  4. 鸿蒙安卓哪个app好,可以放下对华为鸿蒙的担忧了,操作和EMUI相似,能兼容安卓APP - 区块网...
  5. MySQL自定义变量的使用
  6. 将php源码修改成存在注入的源码,天融信关于ucms系统存在代码注入漏洞的分析...
  7. 《软件需求》阅读笔记之一
  8. 分布式理论-BASE理论
  9. iframe 与frameset
  10. CSS半透明边框效果
  11. 深测「小度人工智能音箱1S」:加冕的红外控制术,和掀起的一场智能大进化...
  12. 1688商品类目API接口-(item_cat_get-获得1688商品类目接口)
  13. 3文聚焦:RNA m6A甲基化修饰在不同农作物中的研究进展(马铃薯+水稻+玉米+小麦)|易基因
  14. 域名、dns、服务器、IP、主机名(写的好)
  15. 使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和
  16. 2022劳务员-岗位技能(劳务员)考试模拟100题及在线模拟考试
  17. DDD与TDD比较之——TDD
  18. linux远程登录maridb,linux – 无法使用phpMyAdmin登录到远程MariaDB服务器,但在shell中工作...
  19. python入门与提高实践 老男孩_跟老男孩学Linux运维:MySQL入门与提高实践
  20. 请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

热门文章

  1. STP报文格式与端口状态
  2. 股指期货手续费最低也是交易所加一分
  3. 计算机网络八股文背诵版(收藏夹吃灰系列)
  4. 精髓的git stash
  5. excel转置怎么操作_Excel技巧分享:这几个小技巧简单实用,让你效率更高
  6. 一台主机最多能创建多少个 TCP 连接?
  7. 用计算机编辑文档教学建议,用计算机写文章.doc
  8. 上网慢!经常掉线!怎么办?
  9. JBoss技术支持文档
  10. 2023最新在线星座运势网站开源源码+只作为参考