11 c++版本的贪吃蛇

前言

呵呵 这大概是 大学里面的 c++ 贪吃蛇了吧 

有一些 面向对象的理解, 但是不多 

最近 因为想要 在单片机上面移植一下 贪吃蛇, 所以 重新拿出了一下 这份代码 

然后 将它更新为 c 版本, 还是 用了一些时间 

这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 

然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 

 

 

贪吃蛇

#include<iostream>
#include<Windows.h>
#include<ctime>
#include<string>
using namespace std;

void position(int ,int );
class Node	//蛇身的结点
{	
public:
	int x;
	int y;
	Node *next;
	Node(int x=0,int y=0){	this->x=x;this->y=y;next=NULL;	}
};

class hero		//英雄榜的结点
{
public:string name;
	   int score;
	   hero(string s="anonymous",int sc=0){	name=s;score=sc;	}
};

class Snake
{
private:
	Node *head;		//头结点
	Node *food;		//食物结点
	bool flag;		//是否吃到食物
	int grade;		//所得分数
	int level;		//游戏级别
	int tot;		//蛇身节点的个数
	int direction;	//蛇的方向
	int herotot;	//英雄榜人物个数
	hero HERO[11];	//英雄榜数据

public:
	Snake()
	{		head=new Node(20,10);flag=false;direction=2;tot=1;grade=0;level=0;herotot=0;
	}
	void setmap();		  //screen's length = 78 ; width = 24;打印出地图
	void menu();			//菜单
	bool isover();			//是否游戏结束
	void go();				//蛇的行动
	void running();			//运行程序
	void init();			//初始化蛇身
	void createfood();		//创建食物
	bool getfood();			//吃到食物
	bool isfoodcover();		//食物是否出现在蛇体上
	bool issuccess();		//是否是成功退出
	void showinfo();		//看文件信息
	void lookhero();		//看英雄榜
	void print();			//打印蛇体
};

int main()
{	Snake snake;
	char ch;

	system("cls");
	do
	{	snake.menu();
	cin>>ch;
	if(ch=='1')	snake.running();
	if(ch=='2')	snake.showinfo();
	if(ch=='3')	snake.lookhero();
	if(ch=='4')	break;
	}while(true);
	return 0;
}




void position(int x,int y)
{	HANDLE handle;
	handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD position={x,y};								 // position.x=x;position.y=y
	SetConsoleCursorPosition(handle,position);
}
  
void Snake::setmap()	  	// →	←	↑	↓	⊙	□	■	※
{
	int i;
	
	system("cls");
	for(i=0;i<=39;i++)
	{	position(2*i,0);
		cout<<"※";
		position(2*i,24);
		cout<<"※";
		Sleep(10);
	}

	for(i=23;i>0;i--)
	{	position(0,i);
		cout<<"※";
		position(60,i);
		cout<<"※";
		position(78,i);
		cout<<"※";
		Sleep(10);
	}

	position(64,4);	cout<<"grade :"<<grade;
	position(64,6);	cout<<"level :"<<level;
	position(64,8);	cout<<"length :"<<tot;
	position(64,10);	cout<<"pause: right ";
	position(64,12);	cout<<"key of mouse .";
	position(64,16);	cout<<"snake";
	position(64,18);	cout<<"direction:";
	position(68,20);	cout<<"↑";
	position(64,22);	cout<<"←  ↓  →";
	position(0,0);
}  
  
void Snake::menu()	// ∞	○	Θ
{	system("cls");
	for(int i=0;i<=39;i++)
	{	position((2*i),0);	cout<<"※";
		position((2*i),1);	cout<<"№";
		position((2*i),2);	cout<<"∞";
		position((2*i),3);	cout<<"⊙";
		Sleep(20);
		position((2*i),24);	cout<<"○";
		position((2*i),23);	cout<<"∞";
		position((2*i),22);	cout<<"‰";
		position((2*i),21);	cout<<"※";
	}
	position(20,8);	cout<<"GLUTTONOUS SNAKE"<<endl;
	position(18,10);	cout<<"1.START";
	position(40,10);	cout<<"2.ABOUT GAME";
	position(18,14);	cout<<"3.HERO ";
	position(40,14);	cout<<"4.EXIT";
	position(18,18);	cout<<"PLEASE INPUT :  ";
}

void Snake::init()
{	Node *p=head;
	srand((int )time(NULL));
	for(int i=1;i<=3;i++)
	{	p->next=new Node(20-2*i,10);
		tot++;
		p=p->next;
	}
}  
  
bool Snake::isover()
{	Node *p=head->next->next->next;
	if(head->x>58 || head->x<=0 || head->y>23 || head->y<=0 )	return true;
	while(p)
	{	if( head->x==p->x && head->y==p->y )	return true;
		p=p->next;
	}
	if(level>=10)	return true;
	return false;
}  
  
void Snake::createfood()
{	food=new Node;
	do	
	{	food->x=rand()%58+2;
		food->y=rand()%23+1;
	}while(isfoodcover());
	if(food->x%2==1)	food->x=food->x-1;
	position(food->x,food->y);	cout<<"□";
}  
  
bool Snake::getfood()
{	Node *p;

	if(flag==true)
	{	if((direction+2)%2==1)
		{	
			p=new Node(head->x,head->y+direction);
			p->next=head;
			head=p;
		}
		else
		{	p=new Node(head->x+direction,head->y);
			p->next=head;
			head=p;
		}
		flag=false;
	}

	if( head->x == food->x && head->y == food->y )
	{	flag=true;
		if(grade>=100*(level+1)*(level+1))
		{	level++;
			position(71,6);cout<<level;
		}
		grade=grade+5*(level+1);
		position(71,4);cout<<grade;
		position(72,8);cout<<++tot;
		return true;
	}
	return false;
}

bool Snake::isfoodcover()
{	Node *p=head;
	while(p)
	{	if(food->x==p->x && food->y==p->y )	return true;
		p=p->next;
	}
	return false;
}

void Snake::go()
{	if(GetAsyncKeyState(VK_UP) && direction!=1 )	direction=-1;
	else if(GetAsyncKeyState(VK_LEFT) && direction!=2 )	direction=-2;
	else if(GetAsyncKeyState(VK_DOWN) && direction!=-1 )	direction=1;
	else if(GetAsyncKeyState(VK_RIGHT) && direction!=-2 )	direction=2;
	if(GetAsyncKeyState(VK_LBUTTON))
	{	while(true)
		{if(GetAsyncKeyState(VK_LBUTTON))	break;
		}
	}

	Node *p;
	if((direction+2)%2==1)
	{	p=new Node(head->x,head->y+direction);
		p->next=head;
		head=p;
		while(p->next->next)
		{	p=p->next;
		}
		position(p->next->x,p->next->y);	cout<<" ";
		delete p->next;
		p->next=NULL;
		print();
	}
	else 
	{	p=new Node(head->x+direction,head->y);
		p->next=head;
		head=p;
		while(p->next->next)
		{	p=p->next;
		}
		position(p->next->x,p->next->y);	cout<<" ";
		delete p->next;
		p->next=NULL;
		print();
	}
	Sleep(300-30*level);
}    

void Snake::running()
{	Node *p;
	system("cls");
	init();
	setmap();
	createfood();
	int num=0;
	  while(true)
	  {
		print();
		go();
	  	if(isover())	break;
	  	if(getfood())
		{	delete food;
			createfood();
		}
	  }
	position(0,25);
	if(issuccess())	cout<<"CONGRATULATIONS YOU WIN !"<<endl;
	else cout<<"SORRY YOU LOSE"<<endl;
	cout<<"YOU GOT "<<grade<<" POINT"<<endl;
	cout<<"PLEASE INPUT YOUR BIG NAME: ";
	if(herotot<10)
	{	cin>>HERO[herotot].name;HERO[herotot].score=grade;	herotot++;
	}
	else	{	cin>>HERO[10].name;HERO[10].score=grade;	}
	hero temp=HERO[herotot-1];
	for(int j=herotot-2;j>=0;j--)
	{	if(HERO[herotot-1].score>HERO[j].score)	num++;
		else break;
	}
	for(j=0;j<num;j++)
		HERO[herotot-j-1]=HERO[herotot-j-2];
	HERO[herotot-num-1]=temp;

							// 还回原状
	  p=head->next;
	  while(p)
	  {	p=p->next;
		delete head->next;
		head->next=p;
	  }
	  head->x=20;head->y=10;head->next=NULL;
	direction=2;tot=1;grade=0;level=0;
}

bool Snake::issuccess()
{	if(level>=10)	return true;
	return false;
}

void Snake::showinfo()
{	system("cls");
	position(16,8);	cout<<"WELCOME TO GLUTTONOUS SNAKE";
	position(12,12);	cout<<"THIS IS MADE BY JERRY "<<endl<<"	  AT 2013-11-08	FRIDAY AFTERNOON";
	position(12,16);	system("pause");
}

void Snake::lookhero()
{	system("cls");
	position(25,3);	cout<<"HERO BANG ";
	for(int i=0;i<herotot;i++)
	{	position(12,i+7);
		cout<<"THE  "<<i+1<<"  TH"<<"   NAME :"<<HERO[i].name; position(47,i+7); cout<<"	SCORE :"<<HERO[i].score<<endl;
	}
	position(25,20);	system("pause");
}

void Snake::print()
{
	Node *p=head;
	while(p)
	{	position(p->x,p->y);	cout<<"■";
		p=p->next;
	}
}
  

 

 

程序截图

 首页

470631a91777471daeeb2ecbc707d396.png

 

 

程序执行之后如下  

c798887ae8ec4f85ac461c5c4bef1eca.png

 

 

以前在 win7 上面的截图 

a29938fe50014ccf996661df3817445d.png

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解,配21张彩图)

NXP恩智浦 S32G电源管理芯片 VR5510 安全概念 Safety Concept (万字长文详解&#xff0c;配21张彩图) 1. 简介 本应用笔记描述了与S32G处理器和VR5510 PMIC相关的安全概念。该文档涵盖了S32G和VR5510的安全功能以及它们如何相互作用&#xff0c;以确保对ASIL D安全完整性级别…

Leetcode-轮转数字

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 目录 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/rotate-array/ 题目 解题 第一种方法 第二种方法 题目 给定一个整数数组 …

【深度学习(1)】研0和研1如何上手深度学习及定方向

深度学习&#xff08;1&#xff09; 基础部分书籍鱼书 (理论部分) 视频课程我是土堆&#xff08;代码部分&#xff09; 提升部分李沐的动手学深度学习李沐老师的书 定方向网站&#xff1a; paperwithcode谷歌学术找论文 基础部分 书籍 鱼书 (理论部分) 适合入门&#xff0c;…

Java项目:基于SSM框架实现的汽车推荐系统分前后台(源码+数据库)

一、项目简介 本项目是一套基于SSM框架实现的汽车推荐系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐全…

Servlet和Tomcat运作过程

记录一下前后端请求交互过程&#xff08;不涉及Spring框架&#xff09;&#xff1a; 编写一个UserServlet 在web.xml文件中编写映射路径 编写前端

linux系统-FTP服务配置

目录 一、FTP简介 1.什么是FTP&#xff1f;&#xff1f;&#xff1f; 2.FTP的两种模式 二、安装配置FTP服务 1.关闭防火墙和核心防护 2.安装VSFTPD 3.修改配置文件 4.黑白名单设置 一、FTP简介 1.什么是FTP&#xff1f;&…

jvm中的引用类型

Java中的引用类型 1.强引用 一个对象A被局部变量、静态变量引用了就产生了强引用。因为局部变量、静态变量都是被GC Root对象关联上的&#xff0c;所以被引用的对象A&#xff0c;就在GC Root的引用链上了。只要这一层关系存在&#xff0c;对象A就不会被垃圾回收器回收。所以只要…

Linux---自定义协议

应用层协议 一、协议定制---以网络计算器为例 网络计算机功能---进行-*/^&|的运算并返回结果 请求和响应的结构体如下 // Protocol.hpp #pragma once #include <iostream> #include <memory> class Request { public:Request(){}Request(int data_x, int da…

无人机探测技术,无人机侦测频谱仪技术实现详解

频谱仪&#xff0c;又称为频谱分析仪&#xff0c;是一种用于测量电信号频谱特性的仪器。其基本原理是通过将时域信号转换为频域信号&#xff0c;进而分析信号的频率成分、功率分布、谐波失真等参数。频谱仪利用快速傅里叶变换&#xff08;FFT&#xff09;算法&#xff0c;将采集…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

安规电容定义和应用

安规电容 定义 失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的电容器&#xff0c;称之为安规电容 分类 分为X电容和Y电容 X电容–跨接在电力线&#xff08;L-N&#xff09;之间的电容&#xff0c;一般选用金属薄膜电容&#xff0c;X电容有多种颜色&#xff…

VUE3----Swiper滑动切换图片

Swiper滑动切换图片 可以切换焦点图&#xff0c;兼容小程序 <template><view class"cc-swiper-container" v-if"imageList.length > 0"><swiper class"swiper":class"swiperClassName" :circular"circular&q…

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

C语言 | Leetcode C语言题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1));for (int j 0; j < n; j) board[i][…

Spring Cloud学习笔记(Feigh):简介,实战简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Netflix Feign简介2、Open Feign的简单样例2.1、dependency2.2、代码样例 1、Netflix Feign简介 Netfilx Feign是用来帮助发送远程服务的&#xff0c;它让开发者觉得调用远程服务就像是调用本地方法一样&…

服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?

服务器数据恢复环境&#xff1a; 一台某品牌服务器&#xff0c;通过FreeNAS来做iSCSI&#xff0c;然后使用两台同品牌服务器做ESXi虚拟化系统。 FreeNAS层为UFS2文件系统&#xff0c;使用整个存储建一个稀疏模式的文件&#xff0c;挂载到ESXi虚拟化系统。ESXi虚拟化系统中有3台…

怎样通过HTTP协议实现远程控制两路开关

怎样通过HTTP协议实现远程控制两路开关呢&#xff1f; 本文描述了使用HTTP协议调用HTTP接口&#xff0c;实现控制两路开关&#xff0c;两路开关可控制两路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能Wi…

flutter开发实战-build apk名称及指令abiFilters常用gradle设置

flutter开发实战-build apk名称及指令abiFilters常用gradle设置 最近通过打包flutter build apk lib/main.dart --release&#xff0c;发现apk命名规则需要在build.gradle设置。这里记录一下。 一、apk命名规则 在android/app/build.gradle中需要设置 android.applicationVa…

OpenWrt上的docker容器无法访问外网解决

容器里能ping通OpenWrt的管理地址和wan口地址&#xff0c;但ping外网别的ip或域名就无法访问 简单修改设置就可以&#xff1a; Luci>网络>防火墙>转发&#xff1a;接受 ->保存应用

俩招解决vs code中文编译乱码现象

如下图所示 输出会出现乱码,引起这个情况的原因是什么呢? 本页面的编码形式可能不是 utf-8 的形式。 解决方法一 可以尝试使用命令 system("chcp 65001"); system("chcp 65001"); system("chcp 65001"); 这条命令在C程序中用于解决中文乱码问…