c语言链表贪吃蛇脚本之家,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

# include

# include

# 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

# include

# include

# 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;

}

下面是游戏的截图:

56959302919f90b42e998736e694158b.png

760b8538e3c190a3d3b3a0700cbe54a9.png

a0269072c3584a0e318bdf51e03e42ee.png

611d2a013a0e88c745125862e1926298.png

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win8能开发android的sdk么,Win8下Android SDK安装与环境变量配置教程

Win8下Android SDK的安装与环境变量配置&#xff0c;具体内容如下1、下载Android SDK&#xff0c;点击安装&#xff0c;直接默认路径即可&#xff01;进入该网站后往下拉就能找到sdk下载的位置&#xff0c;选择图中红圈的程序进行下载2、安装过程比较简单&#xff0c;按照平时安…

Android公共jar,使用JitPack管理Android项目中公共模块库

随着项目的功能越来越多&#xff0c;代码和模块维护也越来越复杂&#xff0c;为了减少主项目的代码量&#xff0c;一般都会将一些公共使用的类或者功能模块抽离出来&#xff0c;与主项目解耦分离&#xff0c;当主项目中需要使用的时候&#xff0c;直接进行引用即可。现在Androi…

mac android 手机连接打印机,为什么苹果电脑连接打印机打不出来怎么办

1. 为什么苹果笔记本连接打印机打印不了1、您的 Wi-Fi 或本地网络上的 AirPrint 打印机。2、临近的 Wi-Fi 打印机或位于您本地网络且支持 Bonjour 的基于有线网络的打印机。3、连接到家庭网络中 Time Capsule 或 AirPort 基站的 USB 端口的打印机。4、与家庭网络中的其他 Mac 共…

华为正式官宣鸿蒙OS,华为正式官宣,鸿蒙OS 2.0系统即将问世,Mate 40有望首发

由于华为5G技能取得了突破性的领先&#xff0c;美国对其采取了实体清单操持。意图干涉华为的发展速率&#xff0c;但实际上对于华为影响最大的却是软件方面的“断供”。在美国发布实体清单短短数月之后&#xff0c;谷歌公布停止对于华为手机系统的GMS服务授权。间接导致了华为手…

笔记本html连接电视机,详细教您笔记本连接电视

很多时候我们想要通过电视机来在线看电影&#xff0c;而苦于笔记本的屏幕尺寸太小了&#xff0c;心想着要是笔记本能连接上电视该有多好。其实现在的电视提供了很多连接电脑的功能&#xff0c;简单操作一下就可以实现&#xff0c;那笔记本怎么连接电视呢&#xff1f;下面一起来…

计算机网络静态路由大作业 3地互联,计算机网络-静态路由配置

计算机网络综合实习三&#xff1a;路由器基本配置一、实验目的通过实验掌握利用路由器实现网络互联的一般方法&#xff0c;掌握基本的路由器配置命令。二、实验原理不同的计算机网络在技术和工作方式上的差异&#xff0c;是需要进行网络互联的基本原因。在现实的应用中&#xf…

台式机没有显示计算机图标,为什么台式电脑没有喇叭图标

使用电脑的过程中&#xff0c;有时候会遇到电脑的音量图标突然不见的情况&#xff0c;怎么办?下面是学习啦小编为大家整理的关于台式电脑没声音图标的相关资料&#xff0c;希望对您有所帮助!台式电脑没声音图标的解决方法首先点击“开始”按钮&#xff0c;找到“控制面板”选项…

计算机培训开场语,辅导班家长会主持词开场白

【仅供学习参考&#xff0c;切勿通篇使用&#xff01;】等孩子长大了&#xff0c;再想好好教育就没有机会了。这时候前人的方法和经验就显得尤其重要了下面是由76范文网小编为大家整理的“辅导班家长会主持词开场白”&#xff0c;仅供参考&#xff0c;欢迎大家阅读。辅导班家长…

计算机语言由低到高就被分为了什么阶段,2004年4月高等教育自学考试认知心理试题...

第一部分 选择题 (共30分)一、单项选择题(本大题共20小题&#xff0c;每小题1分&#xff0c;共20分)在每小题列出的四个选项中只有一个是符合题目要求的&#xff0c;请将其代码填写在题后的括号内。错选、多选或未选均无分。1.“望梅止渴”从反射论的观点来分析&#xff0c;是(…

ROCKOUT软件测试工程师,具透丨这才是让 iMessage 变得好玩有用的原因:iMessage App Store 详解...

关于栏目苹果、谷歌每年一次大更新的新系统都值得关注&#xff0c;我们始终不建议普通用户提前尝鲜稳定性不佳的测试版&#xff0c;但我们理解想要尝鲜的心情&#xff0c;于是有了「具透」这个栏目。「具透」会挖掘、详解新系统的各个功能细节&#xff0c;并会以长期更新形式&a…

计算机不能辨别汉字wifi,Win10系统连接不上被隐藏的中文Wifi的解决方法

Window10正式版系统 添加了不少新功能&#xff0c;给用户带来了不错的体验。不过&#xff0c;win10系统也有一些不足的地方&#xff0c;比如用户反馈自己的电脑总是无法连接隐身的中文Wifi&#xff0c;这该怎么办呢&#xff1f;接下来&#xff0c;小编就为大家分享下具体解决方…

联想服务器硬盘启动设置方法,教你联想台式机bios设定硬盘启动方法

现在好多家庭的台式电脑使用的都是联想的&#xff0c;不少朋友想用u盘装系统&#xff0c;但是不知道联想台式机bios设定硬盘启动的方式&#xff0c;别着急&#xff0c;今天小编就来分享联想台式机bios设定硬盘启动的方式。当手机出现死机或关机等故障造成手机能够开启平台的之后…

项目七samba服务器,Centos 7 配置Samba服务器

Centos 7配置Samba服务器1、Centos 7版本&#xff0c;内核&#xff1a; Linux 3.10.0-514.el7.x86_64[roottommy /]# hostnamectl #查看版本号Operating System: CentOS Linux 7 (Core)CPE OS Name: cpe:/o:centos:centos:7Kernel: Linux 3.10.0-514.el7.x86_64Architecture: x…

服务器nasjava文件共享,办公室文件共享之如何搭建共享服务器或文件共享服务器nas?...

当前&#xff0c;企事业单位局域网中&#xff0c;经常会有一些文件需要共享给局域网用户访问。而文件共享的实现&#xff0c;一方面可以借助于Windows Server 文件服务器来实现&#xff1b;另一方面也可以借助NAS存储来实现。由于采用Windows文件服务器的设置比较普遍&#xff…

6s有时有信号 有时无服务器,揭秘:iPhone 6S 的没信号没网络维修故障分析

原标题&#xff1a;揭秘&#xff1a;iPhone 6S 的没信号没网络维修故障分析文/维修狮 (FIXHOME)手机不入网(没信号)是一个常见的多发故障(占手机故障的40%以上),对于手机出现不入网(没信号)故障我们首先要区分是接收部份还是发射部份的原因造成的,搞清楚后才可“对症下药”。一…

征途2无法显示服务器列表,解决win10系统玩征途2提示“DriverCommlnit驱动加载失败”的方法...

征途2是一款众所周知的角色扮演类游戏&#xff0c;它在玩法上延续了征途1的总体风格&#xff0c;但是在画面和音效上比征途1的要提高了很多&#xff0c;其独特的玩法吸引了众多的玩家。但是又部分用户反映&#xff0c;在win10系统上运行征途2的游戏时&#xff0c;出现了“Drive…

kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?

一、介绍我们搭建好kafka集群后&#xff0c;对其进行性能测试。遇到这种场景&#xff1a;我搭建好了三台kakfa集群&#xff0c;然后停掉其中一台kafka&#xff0c;然后集群是否能正常工作呢&#xff1f;kafka集群&#xff1a;192.168.183.53 节点1192.168.183.55 节点2192.168.…

DEEPIN教程 - 本地安装Typora

本地安装Typora 一. 下载Typora安装包 访问https://www.typora.io/#linux路径进行下载。 二. 解压下载的tar.gz文件 tar -xvf Typora-linux-x64.tar.gz三. 将解压后的可执行文件添加到dash路径 1. 首先在解压路径下需要关注如下路径文件。 可执行文件Typora 和 2. 文件夹i…

[Deepin - Pycharm] PyQT5安装配置

[Deepin - Pycharm] PyQT5安装配置 1.环境依赖 python3基础环境&#xff0c; pip下载器 pycharm编辑器 2. 从系统环境中安装pyqt5, qtdesigner >>> pip install pyqt5 >>> sudo apt-get install pyqt5* >>> sudo apt-get install qt5-default …

Python学习笔记(5):Python如何忽略warning的输出

告警现象 形如下图文的告警信息都可以使用告警屏蔽 添加代码 源代码添加 import warnings warnings.filterwarnings("ignore")命令行执行 python -W ignore file.py可以避免warnings输出影响我们调试&#xff0c;但是不要盲目设置取消输出。因为告警内容可能包…