C++代码实现贪吃蛇小游戏

本文实例为大家分享了C++实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下

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++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++通过类实现控制台贪吃蛇

    本文实例为大家分享了C++实现控制台贪吃蛇的具体代码,供大家参考,具体内容如下 初学c++,算刚学完类吧,写个贪吃蛇来玩玩. 现是头文件 #pragma once #ifndef SNACK_H #define SNACK_H #define Frame_X 5//边框起点横坐标 #define Frame_Y 5//边框起点纵坐标 #define Frame_width 50//边框长度 #define Frame_height 25//边框高度 struct point//蛇个点坐标 { i

  • C/C++实现贪吃蛇逐步运动效果

    本文实例为大家分享了C/C++实现贪吃蛇逐步运动效果的代码,供大家参考,具体内容如下 主要使用结构数组和结构指针,再用easyx图形库进行的绘图,以供讨论和学习 #include <conio.h> //建立储存蛇身的结构体 struct snack { int x; int y; }; //决定方向 int fangxiang=3;//w=0,s=1,a=2,d=3 // 按键变量 char anjian=0; //调整坐标关系 int tiaozheng(struct snack *a);

  • C++控制台实现贪吃蛇游戏

    本文实例为大家分享了C++实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 刚学完了C语言,便尝试的写了贪吃蛇的代码,但是效果不佳,很多的bug,所以,这个学了C++,便重新的写了这个小游戏,用类来封装! 先是头文件: struct Snake { int x, y; }; class snake { public: snake() //构造函数 { length = 3; s[2].x = 10; s[2].y = 10; s[1].x = 9; s[1].y = 10; s[0].x =

  • C++结构体数组实现贪吃蛇

    本文实例为大家分享了C++结构体数组实现贪吃蛇的具体代码,供大家参考,具体内容如下 代码: #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; const int h=50,w=50,MaxLen=400; void gotoxy(short y,short x)//光标移动函数 { COORD pos={x,y}; SetConsoleCursorPosi

  • C++控制台循环链表实现贪吃蛇

    本文实例为大家分享了C++控制台循环链表实现贪吃蛇的具体代码,供大家参考,具体内容如下 -stdafx.h 为了简化程序定义一些宏和全局变量 #ifndef __STDAFX_H__ #define __STDAFX_H__ // ============上下左右============= const int UP = 72; const int DOWN = 80; const int LEFT = 75; const int RIGHT = 77; // ==============宽高==

  • C++实现简单贪吃蛇游戏

    我大概在一个多月前把自己上学期写的c代码的贪吃蛇游戏push到csdn上,并且说c风格的贪吃蛇写起来有些麻烦(贪吃蛇游戏的c语言实现),准备用面向对象的c++再写一遍.现在我们专业恰好刚教完了c++,学校也布置了一道简单的贪吃蛇的编程题目,实现下来,的确觉得c++的思路清晰很多,所以再次把c++的代码push上来,供大家对比参考:) 直接上代码,c++把整个游戏拆分成几个文件,分开上,有一定的c++基础的同学应该可以很容易看懂. 1.全局头文件(global.hpp) #ifndef _GLOB

  • 利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行.那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动.那么我们就先来实现这个函数. gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用. gotoxy.h #includ

  • C++ vector容器实现贪吃蛇小游戏

    本文实例为大家分享了C++ vector容器 实现贪吃蛇,供大家参考,具体内容如下 使用vector容器实现贪吃蛇简化了很多繁琐操作,且相比之前我的代码已经做到了尽量的简洁 技术环节: 编译环境:windows VS2019 需求: 控制贪吃蛇吃食物,吃到一个食物蛇身变长一节,得分增加,撞墙或撞自己则游戏结束. 思路: 创建一个vector容器,容器内存储蛇的每节身体的结构变量,结构变量中保存蛇身体的xy坐标,通过使用vector成员方法不断添加和删除容器中的数据,实现蛇坐标的规律移动,吃到食物

  • 贪吃蛇游戏C++命令行版实例代码

    本文实例讲述了贪吃蛇游戏C++命令行版的实现代码,是非常经典的游戏.分享给大家供大家参考.具体实现方法如下: 众所周知,贪吃蛇游戏是经典的计算机游戏. 游戏描述如下: 1. 贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格. 2. 贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时: ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时: ③玩家的键盘输入不是方向键时: 命令行显示"Game Over!"并且退出游戏. 3. 贪吃蛇活动的区域内每次随机产生一颗&quo

  • C++基于控制台实现的贪吃蛇小游戏

    本文实例讲述了C++基于控制台实现的贪吃蛇小游戏.分享给大家供大家参考.具体实现方法如下: #include <windows.h> #include <time.h> #include <stdio.h> #define MAX 100 #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define MOVING 5 #define STOP 0 HANDLE hMain_Out = NULL; H

随机推荐