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//蛇个点坐标
{
 int x[100]; //蛇的横坐标,其中x[0]表示蛇尾的横坐标,x[N-1]表示蛇头的横坐标
 int y[100]; //蛇的竖坐标,其中y[0]表示蛇尾的竖坐标,y[N-1]表示蛇头的竖坐标
};
struct Food//食物坐标
{
 int x;
 int y;
};

class snack
{
public:
 snack();
 void init_snack(point *snake);//初始化蛇
 void gotoxy(int x, int y);//光标移动
 void begin_view();//封面
 void frame();//打印边界与游戏说明
 void menu(point *snake,Food *food);//打实时印信息
 void print_snack(point *snake);//打印蛇
 void move(point *snake);//移动蛇
 void get_food(point *snake,Food *food);//随机产生食物
 void eating(point *snake,Food *food);//吃食物
 bool die(point *snake);//判断蛇是否死亡

 void start_game();//主函数
 void end_game();//结束界面

private:
 int length;//蛇长度
 int score;//得分
 int account;//已吃的食物数量
 int difficulty;//难度
 int stage;//关卡
 int life;//生命值

};

#endif

主要的cpp

#include"stdafx.h"
#include"snack.h"
#include<Windows.h>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<conio.h>

using std::cout;
using std::cin;
using std::endl;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
/*************获取按键************/
#define key_number 11//虚拟键数
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
enum keyboard { up_, down_, left_, right_ ,w_,s_,a_,d_,y_,n_,esc_,other_};
int keyboard_list[] = {VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,'W','S','A','D','Y','N',VK_ESCAPE};
keyboard keyboardarray[] = { up_,down_,left_,right_,w_,s_,a_,d_,y_,n_,esc_,other_ };
keyboard get_the_key()
{
 for (int i = 0; i < key_number; i++)
 {
 if (KEYDOWN(keyboard_list[i]))
 return keyboardarray[i];
 }
 return keyboardarray[key_number];
}

int a[2];//记录蛇尾坐标

snack::snack()
{
 length = 3;
 score = 0;
 account = 0;
 difficulty = 1;
 stage = 1;
 life = 3;
}

void snack::init_snack(point *snake)
{
 snake->x[0] = Frame_X + 2;  //初始化蛇的横坐标
 snake->y[0] = Frame_Y + Frame_height / 2; //初始化蛇的竖坐标
 for (int i = 1; i < length; i++)/* 依次得到蛇身、蛇头的坐标 */
 {
 snake->x[i] = snake->x[i - 1] + 2;
 snake->y[i] = snake->y[i - 1];
 }
}

void snack::gotoxy(int x,int y)
{
 COORD pos;
 pos.X = x;
 pos.Y = y;
 SetConsoleCursorPosition(hOut, pos);
}

void snack::begin_view()
{
 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 cout << "\n\n\n\n";
 cout << "   ****  *  *  *   ****  *  *\n";
 cout << "  *   * **  *  *  *  * * *\n";
 cout << "  *   * * *  ***  *   * *\n";
 cout << "   ***  * * *  * *  *   **\n";
 cout << "      *  * * *  * *  *   * *\n";
 cout << "       * * * *  *****  *   * *\n";
 cout << "  *    * *  ** *  *  *   * *  *\n";
 cout << "   ****  *  * **  **   ****  *  *\n";
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 cout << "\n\n\n\n";
 cout << "    /^\\/^\\ "<<endl;
 cout << "    _|__| O|"<<endl;
 cout << " \\/  /~  \_/ \\ "<<endl;
 cout << "  \\____|__________/ \\ "<<endl;
 cout << "   \\_______  \\ "<<endl;
 cout << "     `\\  \\     \\ "<<endl;
 cout << "      |  |     \\ "<<endl;
 cout << "      /  /      \\ "<<endl;
 cout << "     /  /      \\\\ "<<endl;
 cout << "     /  /       \\ \\ "<<endl;
 cout << "     /  /       \\ \\ "<<endl;
 cout << "    /  /    _----_   \\ \\ "<<endl;
 cout << "    /  /   _-~  ~-_   | |"<<endl;
 cout << "    (  (  _-~ _--_ ~-_  _/ |"<<endl;
 cout << "    \\  ~-____-~ _-~ ~-_ ~-_-~ /"<<endl;
 cout << "    ~-_   _-~   ~-_  _-~"<<endl;
 cout << "     ~--______-~    ~-___-~"<<endl;

}

void snack::frame()
{
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
 //打印上边界
 gotoxy(Frame_X, Frame_Y);
 cout << "┏";
 for (int i = 0; i < Frame_width/2-2; i++)
 cout << "━";
 cout << "┓";
 //打印下边界
 gotoxy(Frame_X, Frame_Y + Frame_height);
 cout << "┗";
 for (int i = 0; i < Frame_width/2-2; i++)
 cout << "━";
 cout << "┛";
 //打印左右边界
 for (int i = 0; i < Frame_height-1; i++)
 {
 gotoxy(Frame_X, Frame_Y + 1 + i);
 cout << "┃";
 gotoxy(Frame_X+Frame_width-2, Frame_Y + 1 + i);
 cout << "┃";
 }
 SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 1);
 cout << "按键说明:方向键或WSAD键控制";
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 3);
 cout << " 长按加速";
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 5);
 cout << " 按ESC退出游戏";

}

void snack::menu(point *snake,Food *food)
{
 gotoxy(Frame_X + 3, Frame_Y - 2);
 cout << "分数:" << score;
 gotoxy(Frame_X + Frame_width -11, Frame_Y - 2);
 cout << "生命值:" << life;
 gotoxy(Frame_X + Frame_width - 30, Frame_Y - 2);
 cout << "等级:" << stage;
 /*gotoxy(Frame_X + Frame_width + 3, Frame_Y + 5);
 cout << "横坐标:" << food->x;
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 7);
 cout << "纵坐标:" << food->y;
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 9);
 cout << "X: " << snake->x[length - 1];
 gotoxy(Frame_X + Frame_width + 3, Frame_Y + 11);
 cout << "Y: " << snake->y[length - 1];*/

}

void snack::print_snack(point *snake)
{
 for (int i = 0; i<length; i++)
 {
 gotoxy(snake->x[i], snake->y[i]);
 if (i == 0)
 cout << "○";//打印蛇尾
 else if (i == length - 1)
 cout << "¤";//打印蛇头
 else
 cout << "◎";//打印蛇身
 }
}

void snack::move(point *snake)
{
 gotoxy(snake->x[0], snake->y[0]);
 cout << " ";//清除蛇尾
 for (int i = 1; i < length ; i++)/* 后一节的坐标依次取代前一节的坐标 */
 {
 snake->x[i - 1] = snake->x[i];
 snake->y[i - 1] = snake->y[i];
 }
}

void snack::get_food(point *snake,Food *food)
{
 int i, j;
 srand(static_cast<unsigned int>(time(0)));
 SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);

 /* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */
 while (1)
 {
 j = 0;
 food->x = Frame_X + 2 * (rand() % (Frame_width / 2 - 2)) + 2;//得到食物的横坐标
 food->y = Frame_Y + rand() % (Frame_height - 2) + 1;//得到食物的纵坐标
 for (i = 0; i<length; i++)
 {/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */
 if (food->x == snake->x[i] && food->y == snake->y[i])
 {
 j = 1;
 break;
 }
 }
 if (i == length)
 {
 gotoxy(food->x, food->y);
 cout << "⊙";
 break;
 }
 else
 continue;
 }
 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);//设置蛇颜色
}

void snack::eating(point *snake,Food *food)
{
 if (snake->x[length - 1] == food->x&&snake->y[length - 1] == food->y)
 {
 length++;
 for (int i = length - 1; i > 0; i--)/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */
 {
 snake->x[i] = snake->x[i - 1];
 snake->y[i] = snake->y[i - 1];
 }
 snake->x[0] = a[0];//得到蛇尾移动前的横坐标
 snake->y[0] = a[1];//得到蛇尾移动前的纵坐标
 get_food(snake, food);
 account++;
 score+=difficulty*10;//分数增加
 if (account % 5 == 0)
 {
 difficulty++;
 stage++;
 }
 }
}

bool snack::die(point *snake)
{
 for (int i = 0; i < length-1; i++)
 {
 if (snake->x[length - 1] == snake->x[i] && snake->y[length - 1] == snake->y[i])
 return true;
 }
 if (snake->x[length - 1] == Frame_X || snake->y[length - 1] == Frame_Y || snake->x[length - 1] == Frame_X + Frame_width - 2 || snake->y[length - 1] == Frame_Y + Frame_height - 1)
 return true;
 return false;
}

void snack::start_game()
{
 //光标隐藏
 CONSOLE_CURSOR_INFO Cursorlnfo;
 GetConsoleCursorInfo(hOut, &Cursorlnfo);//获取控制台光标信息
 Cursorlnfo.bVisible = false;//隐藏控制台光标信息
 SetConsoleCursorInfo(hOut, &Cursorlnfo);//设置控制台光标信息
 system("mode con cols=100 lines=40");//设置窗口大小

 point s, *snake = &s; //定义蛇的结构体指针并指向蛇的结构体
 Food f, *food = &f; //定义食物的结构体指针并指向食物的结构体
 keyboard key_state, Key;
 keyboard temp = right_;
 int j = 0;
 char ch=77;

 begin_view();
 gotoxy(12, 34);
 cout << "按任意键继续......";
 while(!_kbhit())
 { }
 system("cls");
 frame();
 init_snack(snake);
 get_food(snake,food);

 while (1)
 {
 j = 0;
 menu(snake,food);
 a[0] = snake->x[0];
 a[1] = snake->y[0];
 key_state = get_the_key();
 if (key_state == temp)//长按加速
 {
 j = 1;
 Sleep(20);
 }
 if(key_state!=other_)
 temp = key_state;
 switch (temp)
 {
 case up_:
 case w_:
 move(snake);
 snake->y[length - 1] -= 1;
 break;
 case down_:
 case s_:
 move(snake);
 snake->y[length - 1] += 1;
 break;
 case left_:
 case a_:
 move(snake);
 snake->x[length - 1] -= 2;
 break;
 case right_:
 case d_:
 move(snake);
 snake->x[length - 1] += 2;
 break;
 case esc_:
 end_game();
 break;
 }

 eating(snake, food);
 print_snack(snake);
 if (die(snake))
 {
 life--;
 if (life == 0)
 end_game();
 else
 {
 length = 3;
 start_game();
 }

 }
 if (j == 0)
 {
 if (difficulty < 10)
 Sleep(200 - difficulty * 20);
 else
 Sleep(10);
 }
 else
 Sleep(10);
 }
}

void snack::end_game()
{
 system("CLS");
 system("color 0D");
 cout << "\n   ***  *   **  **  *********";
 cout << "\n  *  *  *   **  **  *  ";
 cout << "\n *     ***   * * * *  *  ";
 cout << "\n *     * *  * * * *  ******** ";
 cout << "\n *  ***  * *  *  *  * *  ";
 cout << "\n *   *  *****  *  *  * *  ";
 cout << "\n  *  * *  *  *  *  * *  ";
 cout << "\n   **  **  ** *  *  * *********";
 cout << "\n\n\n\n\n\n";
 cout << "\n  ***  **  ** ********** ******  ";
 cout << "\n *   *   *   *   *      *  * ";
 cout << "\n *  *  *  *  *    *  * ";
 cout << "\n *  *  * *  ********  ******  ";
 cout << "\n *  *  * *  *    * *  ";
 cout << "\n *  *  * *  *    *  *  ";
 cout << "\n *  *  ***  *    *  ** ";
 cout << "\n  ***   *  ********** *  ** ";

 SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY);
 gotoxy(Frame_X + Frame_width / 2, 27);
 cout << "总得分:" << score;
 Sleep(200);
 exit(0);

}

然后是main函数

#include "stdafx.h"
#include"snack.h"

int main()
{
 snack a;
 a.start_game();
 return 0;
}

关于C++小游戏的更多精彩内容请点击专题: 《C++经典小游戏》 学习了解

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

(0)

相关推荐

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

  • 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++实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 刚学完了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++ vector容器实现贪吃蛇小游戏

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

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

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

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

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

  • 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++基于控制台实现的贪吃蛇小游戏.分享给大家供大家参考.具体实现方法如下: #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

  • 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语言实现单链表控制台贪吃蛇小游戏 编译环境:vs2019 需求: 统计游戏开始后的时间,控制贪吃蛇:吃到食物蛇身加长,得分加一:碰墙或蛇头碰到身体减一条生命:生命消耗完则结束游戏. 思路: 使用wasd键控制蛇的移动方向,蛇头碰到食物得分加一,并在地图上随机产生一个食物,累加得分,碰墙或碰自己减一条生命,并初始化整条蛇,生命值为0时结束游戏. 做法: 使用单链表控制贪吃蛇移动的核心思想就是:链表存储贪吃蛇所有坐标,每次循环贪吃蛇不断向一个方向插入一个新的结点作为新的蛇头,按下按键控制新蛇头产生

  • Java 实现贪吃蛇游戏的示例

    游戏界面基本布局 贪吃蛇是基于JFrame的一款小游戏.它主要有两部分组成,一个是显示区域,一个是按钮区域.这两个区域都用JPanel来实现. 首先需要创建一个基于JFrame的类,例如创建一个MyFrame,让其继承于JFrame. 然后创建一个显示区域的类MyPanel,一个按钮区域的类Button,当然了这两个类都基于JPanel. 第三步:在MyFrame类中实例化两个JPanel类.并在MyFrame构造方法中设置窗体的logo.窗体的标题.窗体初始位置.窗体的大小.窗体的背景颜色.窗

  • QT实现贪吃蛇游戏代码详解

    目录 一.新建一个Qt项目 二.添加要用到的头文件 三.写类声明信息 四.对类函数的实现 构造函数 界面刷新 随机奖励的生成 移动 绘图 按键事件 判断蛇身是否相撞 五.结束 一.新建一个Qt项目 新建Qt Widgets Application,项目名称为HappySnake,基类选择QWidget,类名默认 二.添加要用到的头文件 #include <QKeyEvent> #include <QRectF> #include <QPainter> #include

  • C语言实现控制台版贪吃蛇游戏

    用c语言写的期末作业:C语言实现控制台版贪吃蛇游戏的具体代码,供大家参考,具体内容如下 /* { conio.h 阻塞式: getch(): 从无回显的控制台获取字符.无缓冲区,只有当按下一个键才会执行后面的程序. 非阻塞式: kbhit() 检测缓冲区中是否有字符:执行该函数后程序不会停下,而是继续执行下面的代码 由于getch()和kbhit()已弃用, 在编译时会产生警告, 可以用_getch()和_kbhit()替换它们, 或者在包含头文件前加上#pragma warning(disab

  • JavaScript贪吃蛇小组件实例代码

    1 写在前面 看来<JavsScript高级编程>,想做一个小demo练练自己的手,选择了贪吃蛇游戏.由于以前都是用c#写的,将贪吃蛇写到一个类里面,然后一个一个小方法的拆分,只向外提供需要提供的方法.这样就可以将贪吃蛇作为一个模块,任何地方都可以复用的.然而,用js进行编写的时候,由于不能很好的利用js语言的特性进行模块化编程,所以第一版的实现完全采用面向过程的方式,将函数中所需要的变量全部声明为全局变量.虽然这样也能够实现功能,但是做不到复用,而且定义非常多的最顶层变量,污染了全局变量.写

随机推荐