简单的贪吃蛇游戏实现

2023-05-16

贪吃蛇功能实现:


(1)定义贪吃蛇游戏棋盘图

(2)初始化棋盘

(3)输出棋盘所在信息

(3)选择游戏难度

(4)随机产生食物

(5)更新游戏动态

(6)设置游戏相应的操作

(7)打印游戏结果


代码实现:


#include <windows.h>  
#include <stdlib.h>  
#include <conio.h>  
#include <time.h>  
#include <cstring>  
#include <cstdio>  
#include <iostream>   
using namespace std;
const int N = 32;	//定义贪吃蛇地图大小

//定义贪吃蛇的坐标类  
class SnakePosition
{
public:
	int x, y;      //x表示行,y表示列  

	void Initialize(int & j)//初始化坐标
	{
		x = 1;
		y = j;
	}
};

//定义贪吃蛇坐标类数组,有(N-2)*(N-2)个坐标  
SnakePosition position[(N - 2)*(N - 2) + 1]; 

class SnakeMap//定义贪吃蛇的游戏类
{
public:
	SnakeMap(int h = 4, int t = 1, int l = 4, char d = 77, int s = 0)	//构造
		: length(l)
		, direction(d)
		, head(h)
		, tail(t)
		, score(s)
	{}

	void Initialize()   //定义初始化函数,将贪吃蛇的棋盘图进行初始化
	{
		int i, j;
		for (i = 1; i <= 3; i++)
			s[1][i] = '*';
		s[1][4] = '#';
		for (i = 1; i <= N - 2; i++)
		for (j = 1; j <= N - 2; j++)
			s[i][j] = ' '; // 初始化贪吃蛇棋盘中间空白部分  
		for (i = 0; i <= N - 1; i++)
			s[0][i] = s[N - 1][i] = '-'; //初始化贪吃蛇棋盘上下墙壁  
		for (i = 1; i <= N - 2; i++)
			s[i][0] = s[i][N - 1] = '|'; //初始化贪吃蛇棋盘左右墙壁  
	}

	void ShowGame()		//输出贪吃蛇棋盘信息 
	{
		system("cls"); // 清屏  
		int i, j;
		cout << endl;
		for (i = 0; i<N; i++)
		{
			cout << '\t';
			for (j = 0; j<N; j++)
				cout << s[i][j] << ' '; // 输出贪吃蛇棋盘  
			if (i == 2)
				cout << "\t等级:" << grade;
			if (i == 6)
				cout << "\t速度:" << gamespeed;
			if (i == 10)
				cout << "\t得分:" << score << "分";
			if (i == 14)
				cout << "\t暂停:按一下空格键";
			if (i == 18)
				cout << "\t继续:按两下空格键";
			cout << endl;
		}
	}

	int UpdataGame()	//更新当前游戏进度
	{
		P p;
		p.x1 = 0;
		p.y1 = 0;
		int gameover = 1;
		int key = direction;
		long start = clock();
		while ((gameover = (clock() - start <= gamespeed)) && !_kbhit());
		//如果有键按下或时间超过自动前进时间间隔则终止循环  
		if (gameover)
		{
			_getch();
			//_getch()接受任意一个从键盘上输入的字符,
			//转化为对应的ASCII(不需要输入回车就可以接收)
			key = _getch();
		}
		if (key == ' ')
		{
			//按空格键暂停
			//按空格键继续的功能
			while (_getch() != ' ')
			{}
		}
		else
			direction = key;
		switch (direction)
		{
		case 72:// 向上  
			x = position[head].x - 1;
			y = position[head].y;
			break; 
		case 80:// 向下 
			x = position[head].x + 1;
			y = position[head].y;
			break;  
		case 75:// 向左
			x = position[head].x;
			y = position[head].y - 1;
			break;   
		case 77:// 向右
			x = position[head].x;
			y = position[head].y + 1;   
		}
		// 按键非方向键  
		if (!(direction == 72 || direction == 80 || direction == 75 || direction == 77))   
			gameover = 0;

		else if (x == 0 || x == N - 1 || y == 0 || y == N - 1)   // 碰到墙壁  
			gameover = 0;

		else if (s[x][y] != ' ' && !(x == p.x1 && y == p.y1))    // 蛇头碰到蛇身  
			gameover = 0;
		else if (x == p.x1 && y == p.y1)
		{
			// 吃到食物,长度加1  
			length++;
			if (length >= 8 && gameauto)
			{
				length -= 8;
				grade++;
				if (gamespeed >= 200)
					gamespeed -= 200; // 改变贪吃蛇前进速度  
				else
					gamespeed = 100;
			}
			s[x][y] = '#';  //更新蛇头  
			s[position[head].x][position[head].y] = '*'; //吃米后将原先蛇头变为蛇身  
			head = (head + 1) % ((N - 2)*(N - 2));   //取蛇头坐标  
			position[head].x = x;
			position[head].y = y;
			ShowGame();
			gameover = 1;
			score += grade * 20;  //加分  
			SetPoint();   //产生米  
		}
		else
		{
			// 不吃米  
			s[position[tail].x][position[tail].y] = ' ';//将蛇尾置空  
			tail = (tail + 1) % ((N - 2) * (N - 2));//更新蛇尾坐标  
			s[position[head].x][position[head].y] = '*';  //将蛇头更为蛇身  
			head = (head + 1) % ((N - 2) * (N - 2));
			position[head].x = x;
			position[head].y = y;
			s[position[head].x][position[head].y] = '#'; //更新蛇头  
			gameover = 1;
		}
		return gameover;
	}

	void SetPoint()//随机产生食物
	{
		P p;
		srand((unsigned int)time(0));	
		//设置rand()随机序列种子。对于给定的种子seed, rand()会反复产生特定的随机序列
		do
		{
			p.x1 = rand() % (N - 2) + 1;
			p.y1 = rand() % (N - 2) + 1;
		} while (s[p.x1][p.y1] != ' ');

		s[p.x1][p.y1] = '*';
	}

	void GetGrade()//选择游戏等级 
	{
		cin >> grade;
		while (grade>7 || grade<1)
		{
			cout << "请输入数字1-7选择等级,输入其他数字无效" << endl;
			cin >> grade;
		}
		switch (grade)
		{
		case 1:
			gamespeed = 1000;
			gameauto = 0;
			break;
		case 2:
			gamespeed = 800;
			gameauto = 0;
			break;
		case 3:
			gamespeed = 600;
			gameauto = 0;
			break;
		case 4:
			gamespeed = 400;
			gameauto = 0;
			break;
		case 5:
			gamespeed = 200;
			gameauto = 0;
			break;
		case 6:
			gamespeed = 100;
			gameauto = 0;
			break;
		case 7:
			grade = 1;
			gamespeed = 1000;
			gameauto = 1;
			break;
		}
	}

	void Display()//输出等级,得分情况以及称号  
	{
		cout << "\n\t\t\t\t等级:" << grade;
		cout << "\n\n\n\t\t\t\t速度:" << gamespeed;
		cout << "\n\n\n\t\t\t\t得分:" << score << "分";
	}

private:
	char s[N][N];//定义贪吃蛇棋盘,包括墙壁。  
	int grade, length;
	int gamespeed; //前进时间间隔  
	char direction; // 初始情况下,向右运动  
	int head, tail;
	int score;
	bool gameauto;
	struct P
	{
		int x1;
		int y1; // 随机出米  
	};
	int x, y;
}; 


int main()
{
	char ctn = 'y';
	int nodead = 1;
	cout << "\n\n\n\n\n\t\t\t 欢迎进入贪吃蛇游戏!" << endl;//欢迎界面;  
	cout << "\n\n\n\t\t\t 按任意键马上开始。。。" << endl;//准备开始;;  
	_getch();
	while (ctn == 'y')
	{
		system("cls"); // 清屏  
		SnakeMap snake;
		snake.Initialize();
		cout << "\n\n请输入数字选择游戏等级:" << endl;
		cout << "\n\n\n\t\t\t1.等级一:速度 1000 \n\n\t\t\t2.等级二:速度 800\
				\n\n\t\t\t3.等级三:速度 600 \n\n\t\t\t4.等级四:速度 400\
				 \n\n\t\t\t5.等级五:速度 200 \n\n\t\t\t6.等级六:速度 100\
				 \n\n\t\t\t7.自动升级模式" << endl;
		snake.GetGrade();//获取等级  
		for (int i = 1; i <= 4; i++)
		{
			position[i].Initialize(i);//初始化坐标  
		}
		snake.SetPoint();  // 产生第一个米  
		do
		{
			snake.ShowGame();
			nodead = snake.UpdataGame();
		} while (nodead);
		system("cls"); //清屏  
		cout << "\n\n\n\t\t\t\tGameover!\n\n" << endl;
		snake.Display();//输出等级/得分情况  
		cout << "\n\n\n\t\t    是否选择继续游戏?输入 y 继续,n 退出" << endl;
		cin >> ctn;
	}
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的贪吃蛇游戏实现 的相关文章

  • ssh端口转发(之kettle ssh方式连接数据库)

    ssh参数解释 格式 ssh user 64 host command 选项 xff1a 1 xff1a 强制使用ssh协议版本1 xff1b 2 xff1a 强制使用ssh协议版本2 xff1b 4 xff1a 强制使用IPv4地址 xf
  • str库函数模拟实现

    常见str函数功能表 xff1a strcat 将字符串str2连接到str1之后 xff0c 并返回指针str1 strncat 将字符串from 中至多count个字符连接到字符串to中 xff0c 追加空值结束符 返回处理完成的字符串
  • min栈实现

    题目 xff1a 实现一个栈 xff0c 要求实现Push xff08 出栈 xff09 Pop xff08 入栈 xff09 Min xff08 返回最小值的操作 xff09 的时间复杂度为O 1 分析 xff1a 这道题目的主要难点在于
  • 栈实现队列&&队列实现栈

    背景知识 xff1a 动态栈的模拟实现 xff1a http blog csdn net double happiness article details 70170984 队列的模拟实现 xff1a http blog csdn net
  • 一个数组实现两个栈

    分析 xff1a 用一个数组实现两个栈有三种思路 xff1a xff08 1 xff09 将数组按照奇 偶为分成两组 xff08 2 xff09 将数组按照从两边到中间分成两组 xff08 3 xff09 将数组按照从中间到两边分成两组 比
  • 栈的压入弹出序列

    题目描述 xff1a 判断一个栈的输出序列是否是正确的 xff0c 时间复杂度要求O N 示例 xff1a 输入栈 xff1a 1 2 3 4 5 1 输出栈 xff1a 4 5 3 2 1 2 输出栈 xff1a 4 3 5 1 2 分析
  • list模拟实现

    双向链表代码实现 xff1a span style font size 24px pragma once 双向链表 template lt class T gt struct ListNode T data 当前节点中的数据 ListNod
  • C模拟实现静态顺序表

    头文件模块 xff1a span style font size 24px include lt iostream gt typedef int DATATYPE const int MAX 61 5 struct SeqList DATA
  • Mem库函数模拟实现

    本篇视图 xff1a 1 memset 2 memcpy 3 memmove 4 memcmp 5 memchr memset 功能 xff1a 将一段内存初始化为某个值 xff1b 函数拷贝ch 到buffer 从头开始的count 个字
  • Python15_布尔值_break_continue_pass_else

    布尔值 用数据做判断 xff1a 布尔值 计算机利用数据有三种方式 xff1a 1 直接使用数据 xff0c 2 计算和加工数据 xff0c 3 用数据做判断 布尔值 True和False 代码将会无限运行 xff0c 陷入 死循环 xff
  • atexit函数总结

    函数名 xff1a atexit 头文件 xff1a include lt stdlib h gt 函数原型 xff1a int atexit void func void 功能 xff1a 当程序终止执行时 xff0c 函数调用函数指针f
  • 递归问题的处理

    经典问题集锦 xff1a 1 猴子吃桃问题 2 小球落地问题 猴子吃桃问题描述 xff1a 从前有一群群猴从果园里采来了许多桃子 xff0c 第一天吃掉采来桃子的一半之后 xff0c 猴王又多吃了了一个 xff0c 第二天吃掉了剩下的一半之
  • 编程实现求一个整数的二进制中0和1的个数

    声明 xff1a 假定该数是在32位平台的机器上运行 xff0c 在更高或最低平台上的原理相同 核心最优算法 xff1a 求1的个数 xff1a num amp 61 num 43 1 求0的个数 xff1a num 61 num 43 1
  • C语言if语句中的零值比较

    目录 xff1a 布尔变量与零值比较 整型变量与零值比较 浮点变量与零值比较 指针变量与零值比较 布尔变量与零值比较 规则 xff1a 不可将布尔值直接与0 1或者true false比较 代码示例 xff1a span style fon
  • vs下的debug和release版本的区别

    vs下的版本分类 xff1a Debug版本 通常称为调试版本 xff0c 通过编译选项的配合 xff0c 编译的结果通常包含调试信息 xff0c 可以设置断点 单步调试 使用TRACE ASSERT等调试输出语句并且编译器不会对代码进行任
  • 二进制文件与文本文件的区别

    文本文件和二进制文件的定义 xff1a 计算机在物理内存上面存放的都是二进制 xff0c 所以文本文件和二进制文件的 主要 区别是在逻辑上 的而不是物理上的 而从文件的编码方式来看 xff0c 文件可以分为文本文件和二进制文件 文本文件是基
  • 浅析FILE和fd之间的关系

    背景知识 fd 文件描述符 FILE 文件指针 文件描述符fd fd只是一个整数 xff0c 在open时产生 起到一个索引的作用 xff0c 进程通过PCB中的文件描述符表找到该fd所指向的文件指针file 因此在Linux系统下面 xf
  • 面向过程与面向对象的区别与联系

    处理问题方面 面向过程 xff1a 分析解决问题所需要的步骤 xff0c 通过分别去实现对应的函数来完成每一个步骤 xff0c 使用的时候一次去调用对应的函数即可 xff1b 面向对象 xff1a 面向对象的是把所处理的问题先抽象起来 xf
  • fork与vfork创建进程的区别

    进程创建的方式 xff1a 1 fork函数 2 vfork函数 fork函数 头文件 xff1a include lt unistd h gt 函数原型 xff1a pid t fork void 返回值 xff1a 创建成功子进程返回0
  • Linux下的各种id

    分类 用户标识符 xff1a 几个典型进程的ID及其类型和功能 常见标识符的返回值 span style font size 18px include lt sys types h gt include lt unistd h gt pid

随机推荐

  • Ubuntu 18.04开启root账户登陆

    step 1 设置root账户密码 命令 xff1a sudo passwd root step2 修改相关配置 打开 root profile文件 xff0c 将最后一行mesg n true修改为tty s amp amp mesg n
  • 深入理解vector的拷贝构造

    腾讯面试题 xff1a 请问vector的拷贝构造干了些什么 xff1f 拿到这道题可能很多人都已经暗自里庆幸 xff0c 对于学习过过数据结构的人 xff0c 对于vector这个结构体一定不会陌生 xff0c 但是如果在面试的过程中面试
  • 深入理解C++强制类型转换

    C 43 43 四种强制转换类型 static cast reinterpret cast const cast dynamic cast static cast 静态转换 xff0c 用于非多态类型 xff0c 任何标准的转换都可以用它
  • Linux背景设置

    桌面背景设置 对于Linux的CentOs系统 刚进入时系统默认的生成的背景如下 显然对于一些比较有艺术欣赏的人来说 xff0c 这个背景显然是很让人感到很不好受 xff0c 所以下面就来看一下如何更换桌面背景 1 单击鼠标右键 2 双击鼠
  • Linux常用工具安装和vim设置的命令实现

    声明 xff1a 本文是针对centos6 0的版本进行安装和设置的 xff0c 在现在下载的Centos版本上基本上会自带一些基本的工具 xff0c 因此在安装之前需要先进行检查 xff0c 如果不存在 xff0c 在进行下载安装 gcc
  • C实现当前机器模式是大端还是小端

    声明 xff1a 本文是在32位机器 xff0c vs2013下运行无误 大小端背景 xff1a 大小端这一词最早是来自 格列夫游记 xff0c 书中记录有一个村子 xff0c 村子里的人有一个强烈的争议 xff0c 关于吃鸡蛋的时候应该从
  • C模拟实现点分十进制IP转换

    声明 xff1a 本文在32位机器上测试无误 点分十进制 点分十进制是计算机网络中的一个名词 xff0c 是一种网络地址的表示方法 xff0c 每一组数字都是在0 255之间 xff0c 每个组之间都是通过 34 34 来进行分割的 xff
  • C面试常考知识点详解

    小结清单 xff1a 指针与引用区别与联系 指针与数组的区别与联系 结构体内存对齐 指针与引用区别与联系 联系 xff1a 底层实现方式相同 xff0c 都是按照指针的方式实现 区别 xff1a 1 引用必须初始化 xff0c 指针可以不用
  • 【通信方式一】管道

    管道引入原因 xff1a 由于各个进程之间是相互独立的 xff0c 这样虽然有助于程序内部自己的处理 xff0c 同时也避免各个进程之间相互影响 xff0c 但是有时候程序之间就是需要进行一些信息传递 xff0c 这时就需要相办法来实现这些
  • Linux下的管道组织管理与容量测试

    管道通信方式实现 xff1a http blog csdn net double happiness article details 71685414 在学习完管道的通信方式之后 xff0c 我们知道管道是用来实现进程之间的相互通信的机制
  • 九大排序之——冒泡排序

    冒泡排序 原意是说鱼从水底下吐泡泡 xff0c 然后一直漂浮到水面上的过程 xff0c 冒泡排序就是不断的将一个元素不断的与后面的元素进行比较 xff0c 如果大于 xff08 升序 xff09 就叫交换两个元素的位置 xff0c 直到比较
  • Python解决opencv,cv2.xfeatures2d的办法

    本来要调一下surf特征检测的包但是报错了 xff0c 在查询以后发现cv2 xfeatures2d在opencv3 4 2 16之后的版本不能使用了 那么只好装一下之前的版本 经过多重尝试 xff0c 最后还是通过whl文件的方法去安装p
  • 九大排序之——堆排序

    堆排序 xff1a 思想 xff1a 首先清楚一点堆的低层存储是一个静态数组 xff0c 可以将它看成是一棵完全二树 先建立初始堆 xff0c 然后进行堆调整 xff0c 在进行交换和pop操作 xff0c 直至完成堆排序为止 堆的分类 x
  • 九大排序之——选择排序

    选择排序 xff1a 思想 xff1a 首先将给定的序列看成是一个有序序列和一个无序序列 xff0c 选择排序也就是从给定 的 序列中选取一个最大的 xff08 最小的 xff09 元素放到有序序列的对应位置 xff0c 再从剩余的无序 序
  • 九大排序之——插入排序

    直接插入排序 xff1a 思想 xff1a 将要排序的序列看成两个序列 xff0c 一个是有序序列 xff0c 另一个是无序序列 xff0c 每次取无序序列中的元素往有序序列中的合适位置插入 xff0c 直到无序序列为空 xff0c 排序完
  • 九大排序之——快速排序

    快速排序 算法思想 xff1a 快速排序从名字上就可以看出就是为了排序的效率 xff0c 每次先选择一个关键字key xff0c 一般是选择序列的第一个元素或者序列的最后一个元素 xff0c 将比key值小的元素全部放在左边 xff0c 将
  • 九大排序之——归并排序

    归并排序 算法思想 xff1a 归并操作整体上来看是分治法的应用 xff0c 不断的划分缩小区间 xff1b 图示 xff1a 算法执行步骤 xff1a 1 先申请一个和原序列一样大的空间 xff0c 用来存放合并之后的序列 xff1b 2
  • 九大排序之——计数排序

    计数排序 计数排序步骤 xff1a 1 找出待排序的数组中最大和最小的元素 xff1b 2 统计数组中每个值为i的元素的出现的次数 xff0c 存入数组C的第i项 xff1b 3 对所有的计数累加 xff1b 4 反向填充目标数组 xff1
  • 九大常见排序总结

    九种常基本排序 希尔排序 xff1a http blog csdn net double happiness article details 70157030 冒泡排序 xff1a http blog csdn net double hap
  • 简单的贪吃蛇游戏实现

    贪吃蛇功能实现 xff1a 1 定义贪吃蛇游戏棋盘图 2 初始化棋盘 3 输出棋盘所在信息 3 选择游戏难度 4 随机产生食物 5 更新游戏动态 6 设置游戏相应的操作 7 打印游戏结果 代码实现 span style font famil