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 = 8;
 s[0].y = 10;
 up = right = left = down = 0;
 }
 ~snake(){}
 void display();  //显示蛇身函数
 void Rightmove();  //右移函数
 void Leftmove();  //左移函数
 void Upmove();   //上移函数
 void Downmove();  //下移函数
 int cheak();   //检查是否撞墙或撞到自身
 void creat_food();  //产生食物
 int eat_food();  //吃食物
private:
 struct Snake s[100]; //先定义蛇身最长100
 int length;   //当前蛇长度
 int x3, y3;   //食物坐标
 int up, down, right, left; //蛇的状态,是上移还是下移或...
};

void make_frame();  //打印框架的函数
void show();   //游戏开始倒计时函数
void gameover();  //游戏结束函数

下面是各个函数的实现的cpp文件:

# include <iostream>
# include <Windows.h>
# include <time.h>
# include "snake.h"
# define MaxLen 20
# define MaxWen 30
using namespace std;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄
void gotoxy(HANDLE hOut, int x, int y)   //输出位置的函数
{
 COORD pos;
 pos.X = x;
 pos.Y = y;
 SetConsoleCursorPosition(hOut, pos);
}

void snake::display()      //打印蛇身
{
 for (int i = length - 1; i >= 0; i--)
 {
 if (i == length - 1)    //打印蛇头
 {
 gotoxy(hOut, s[i].x, s[i].y);
 cout << char(15);
 }
 else        //打印蛇身
 {
 gotoxy(hOut, s[i].x, s[i].y);
 cout << '*';
 }
 }
 gotoxy(hOut, 0, 22);
}
void snake::Rightmove()     //右移
{
 right = 1; up = down = left = 0;
 int x1, x2, y1, y2;
 x1 = x2 = s[length - 1].x;
 y1 = y2 = s[length - 1].y;
 s[length - 1].x++;      //蛇头x坐标自增
 for (int i = length - 2; i >= 0; i--)  //除了蛇头,其他的结点都等于它的上一个结点的坐标
 {
 x2 = s[i].x; y2 = s[i].y;
 s[i].x = x1; s[i].y = y1;
 x1 = x2; y1 = y2;
 }
 gotoxy(hOut, x2, y2);   //消除蛇移动遗留的 ‘*'
 cout << ' ';
}
void snake::Leftmove()    //左移
{
 left = 1; right = up = down = 0;
 int x1, x2, y1, y2;
 x1 = x2 = s[length - 1].x;
 y1 = y2 = s[length - 1].y;
 s[length - 1].x--;      //同上
 for (int i = length - 2; i >= 0; i--)
 {
 x2 = s[i].x; y2 = s[i].y;
 s[i].x = x1; s[i].y = y1;
 x1 = x2; y1 = y2;
 }
 gotoxy(hOut, x2, y2);   //同上
 cout << ' ';
}
void snake::Downmove()   //下移
{
 down = 1; right = up = left = 0;
 int x1, x2, y1, y2;
 x1 = x2 = s[length - 1].x;
 y1 = y2 = s[length - 1].y;
 s[length - 1].y++;      //同上
 for (int i = length - 2; i >= 0; i--)
 {
 x2 = s[i].x; y2 = s[i].y;
 s[i].x = x1; s[i].y = y1;
 x1 = x2; y1 = y2;
 }
 gotoxy(hOut, x2, y2);   //同上
 cout << ' ';
}
void snake::Upmove()    //上移
{
 up = 1; down = right = left = 0;
 int x1, x2, y1, y2;
 x1 = x2 = s[length - 1].x;
 y1 = y2 = s[length - 1].y;
 s[length - 1].y--;      //同上
 for (int i = length - 2; i >= 0; i--)
 {
 x2 = s[i].x; y2 = s[i].y;
 s[i].x = x1; s[i].y = y1;
 x1 = x2; y1 = y2;
 }
 gotoxy(hOut, x2, y2);  //同上
 cout << ' ';
}
int snake::cheak()
{
 int flag = 0;
 for (int i = length - 2; i >= 0; i--)   //是否撞到自身
 {
 if (s[i].x == s[length - 1].x && s[i].y == s[length - 1].y)
 {
 flag = 1;  //是,标识符为1
 break;
 }
 }
 if (flag == 1 || (s[length - 1].x >= 30 + 1 || s[length - 1].x < 4) || (s[length - 1].y <= 1 || s[length - 1].y >= 20))
 {
 return 0;   //检测是否撞自身,或者撞墙
 }
 else
 {
 return 1;
 }
}
void snake::creat_food()   //产生食物坐标
{
xy: x3 = (rand() % (25)) + 3;
 y3 = (rand() % (17)) + 2;
 for (int i = length - 1; i >= 0; i--) //检查食物是否在蛇身上
 {
 if (s[i].x == x3 && s[i].y == y3) //是就重新产生食物坐标
 goto xy;
 }
 gotoxy(hOut, x3, y3);  //显示食物
 cout << '*';
}
int snake::eat_food()
{
 if (s[length - 1].x == x3 && s[length - 1].y == y3) //蛇头碰到食物
 {
 if (up == 1)     //如果蛇是在上移,增加一个结点,为蛇头的上一个结点
 {
 s[length].x = x3;
 s[length].y = y3 - 1;
 }
 else if (down == 1)    //同上
 {
 s[length].x = x3;
 s[length].y = y3 + 1;
 }
 else if (right == 1)   //同上
 {
 s[length].x = x3 + 1;
 s[length].y = y3;
 }
 else if (left == 1)    //同上
 {
 s[length].x = x3 - 1;
 s[length].y = y3;
 }
 length++;      //蛇长加1
 return 1;
 }
 else
 return 0;
}
void make_frame()      //打印框架函数
{
 cout << "   贪吃蛇游戏" << endl;
 gotoxy(hOut, 2, 1);
 cout << "╔";
 for (int i = 4; i < 2 + MaxWen; i++)
 {
 gotoxy(hOut, i, 1);
 printf("=");
 }
 for (int i = 2; i < MaxLen; i++)
 {
 gotoxy(hOut, 2, i);
 printf("║");
 }
 gotoxy(hOut, 2 + MaxWen, 1);
 printf("╗");
 for (int i = 2; i < MaxLen; i++)
 {
 gotoxy(hOut, 2 + MaxWen, i);
 printf("║");
 }
 gotoxy(hOut, 2, MaxLen);
 printf("╚");
 gotoxy(hOut, 2 + MaxWen, MaxLen);
 printf("╝");
 for (int i = 4; i < 2 + MaxWen; i++)
 {
 gotoxy(hOut, i, MaxLen);
 printf("=");
 }
}
void show()   //显示操作方法和游戏开始倒计时
{
 gotoxy(hOut, 35, 5);
 cout << "↑:" << 'w';
 gotoxy(hOut, 35, 6);
 cout << "←:" << 'a';
 gotoxy(hOut, 35, 7);
 cout << "↓:" << 's';
 gotoxy(hOut, 35, 8);
 cout << "→:" << 'd';
 gotoxy(hOut, 16, 5);
 cout << '3';
 Sleep(1000);
 gotoxy(hOut, 16, 5);
 cout << '2';
 Sleep(1000);
 gotoxy(hOut, 16, 5);
 cout << '1';
 Sleep(1000);
 gotoxy(hOut, 16, 5);
 cout << ' ';
}
void gameover()  //游戏结束函数
{
 system("cls");
 system("color 3B");
 gotoxy(hOut, 14, 5);
 cout << "  GAME OVER!";
 gotoxy(hOut, 14, 6);
 cout << "PLAY AGAIN ? Y(yes) \ N(no)";
}

主函数的cpp文件:

# include <iostream>
# include <Windows.h>
# include <conio.h>
# include "snake.h"
using namespace std;
char ch;
int main()
{
 while (1)
 {
 snake sn;    //声明对象
 system("cls");   //清屏
 system("color 3B");  //背景和字体颜色调整
 make_frame();   //打印框架
 sn.display();   //显示蛇
 show();     //游戏开始
 sn.creat_food();   //产生食物
 while (sn.cheak())  //检查是否死亡
 {
 sn.Rightmove();  //右移
 sn.display();  //显示蛇身
 if (sn.eat_food()) //检查是否吃到食物
 {
 sn.creat_food(); //重新产生食物
 sn.display();
 }
 Sleep(500);   //等待500Ms
 p: if (_kbhit())      //是否有按键
 {
 ch = _getch();
 if (ch == 97 || ch == 100)
  goto p;
 if (ch == 115 || ch == 119)
  break;
 }
 }
 pp: switch (ch)   //有按键
 {
 case 119:    //上移的情况
 {
 while (sn.cheak())
 {
  sn.Upmove();
  sn.display();
  if (sn.eat_food())
  {
  sn.creat_food();
  sn.display();
  Sleep(300);
  }
  Sleep(500);
 pw: if (_kbhit())
 {
  ch = _getch();
  if (ch == 119 || ch == 115)
  goto pw;
  if (ch == 97 || ch == 100)
  goto pp;
 }
 }
 }break;
 case 97:    //左移的情况
 {
  while (sn.cheak())
  {
  sn.Leftmove();
  sn.display();
  if (sn.eat_food())
  {
  sn.creat_food();
  sn.display();
  }
  Sleep(500);
  pa: if (_kbhit())
  {
  ch = _getch();
  if (ch == 97 || ch == 100)
   goto pa;
  if (ch == 115 || ch == 119)
   goto pp;
  }
  }
 }break;
 case 115:    //下移的情况
 {
 while (sn.cheak())
 {
  sn.Downmove();
  sn.display();
  if (sn.eat_food())
  {
  sn.creat_food();
  sn.display();
  Sleep(300);
  }
  Sleep(500);
 ps: if (_kbhit())
 {
  ch = _getch();
  if (ch == 115 || ch == 119)
  goto ps;
  if (ch == 97 || ch == 100)
  goto pp;
 }
 }
 }break;
 case 100:     //右移的情况
 {
 while (sn.cheak())
 {
  sn.Rightmove();
  sn.display();
  if (sn.eat_food())
  {
  sn.creat_food();
  sn.display();
  }
  Sleep(500);
 pd: if (_kbhit())
  {
  ch = _getch();
  if (ch == 100 || ch == 97)
  goto pd;
  if (ch == 119 || ch == 115)
  goto pp;
  }
 }
 }break;
 default:
 break;
 }
 gameover();   //显示游戏结束,是否重玩
 py: ch = _getch();
 if (ch == 110)   //否
 {
 system("cls");
 break;
 }
 else if (ch == 121) //是
 continue;
 else
 goto py;
 }
 return 0;
}

下面是游戏的截图:

控制台的实现,不是很美观,主要是由于上下和左右的间隙不一样大,所以看起来不是很好看,但总体还是实现了贪吃蛇!

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

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

(0)

相关推荐

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

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

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

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

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

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

  • 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语言实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 //------------------------------------------problm区------------------------------ //①思考typedef 定义的变量如何利用fwrite进行存储 //②典型可利用sleep()语句类实现控制移动速度 //③BOOL PlaySoundW(LPCWSTR, HMODULE, DWORD)": 无法将参数 1 从"const ch

  • C语言代码链表实现贪吃蛇游戏

    本文实例为大家分享了C语言链表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇设计思路: 屏幕坐标: 拓展功能: 1.F1,F2控制加速减速  空格暂停游戏  Esc退出 2.加速每个食物得分更高 先打印出游戏界面,还有初始化蛇,蛇的节点用字符串★表示,游戏背景用■表示,因为这些字符串占两个字节的宽度,所以每次x,y坐标的对应关系是x=y*2.在相应位置打印出蛇,初始化蛇为五个节点 初始化蛇头的移动方向为右,根据按键来确定蛇的移动状态,要是吃到食物,就让食物为蛇头,然后随机生成食物.

  • java贪吃蛇游戏编写代码

    本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1.采用MVC(model.view.control)框架模式 2.包和类的关系树形图为: 3.源码: package com.huai; import Java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.u

  • 使用Python写一个贪吃蛇游戏实例代码

    我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到最初体型 4.变色食物:吃了会根据食物颜色改变蛇的颜色 #coding=UTF-8 from Tkinter import * from random import randint import tkMessageBox class Grid(object): def __init__(self,

  • js贪吃蛇游戏实现思路和源码

    本文实例为大家分享了js贪吃蛇游戏的相关代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇小游戏</title> <style> *{margin:0; padding:0;} header { display: block; margin: 0 auto;

  • JS写的贪吃蛇游戏(个人练习)

    JS贪吃蛇游戏,个人练习之用,放在这备份一下,   复制代码 代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JS贪吃蛇-练习</t

  • 纯原生js实现贪吃蛇游戏

    本文实例为大家分享了js实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>贪吃蛇游戏</title> <style type="text/css"> * { margin: 0; padding: 0;

随机推荐