c++ 贪吃蛇的精英进阶之路 附源码

15PB预科班的结业考试项目,仅仅学了1个月做出来的


前言

作业:用c++ 写一个贪吃蛇的项目


心得:一定要会调试,会调试的程序员才有未来!!!会调试,会调试,会调试!

一、都包含哪些功能

多种食物,自定义地图,8D音效,吃食物音效,游戏存档,游戏重开积分不清0

二、使用步骤

1.首先就要想程序的流程和怎么拆分成对象

比如说:我这里就抽象出了,蛇类,地图类,食物(地图上道具,其实可以生成地图上的自定义道具),数据类(数据,为了方便,适合像我一样的渣渣,我把,蛇的,身长,地图数组,蛇的坐标,食物存在状态,初始模式值等,一系列,可能会在多个类用到的数据,几乎全都放到了数据区,这种发现真的好,不用考虑各种调用bug,比如蛇的坐标,蛇类需要 ,地图上也需要,食物类也需要,等。

废话不多说直接上码

//为方面大家学习,下面我将会1个头文件跟对应的1个.cpp文件放置
//SankeDefine.h----宏定义
#pragma once
#define 上 8
#define 下 2
#define 左 411
#define 右 6

#define MAP_X 30
#define MAP_Y 30//地图尺寸
#define 空地 0
#define 食物 1
#define 加速果 4
#define 障碍物 2
#define 自己 3

#define 模式1 0
#define 模式2 1
#define 模式3 2

#define 普通开始模式 7
#define 读取存档模式 8
#define 自定义地图模式 9

#define 青铜新手 300
#define 黄金统领 250
#define 钻石王者 150//选择模式的速度

//CFood.h----食物类---------
#pragma once
#include"Data.h"
#include"Tool.h"
class CFood:virtual protected Data
{
   
protected:
	void CreatFood();//创建食物
};
//CFood.cpp------------
#include "CFood.h"
//构造函数:当定义出对象的时候,自动调用函数 把食物赋值为0
void CFood::CreatFood()
{
   
	srand(time(NULL));//设置随机种子,不然数值每次顺序都一样
	if (m_nFoodExist == 0)//判断食物在地图上的状态(有、无)
	{
   
		while (m_bLive)
		{
   
			int FoodY = rand() % 27 + 1;
			int foodX = rand() % 27 + 1;//随机函数

			if (m_cMap[FoodY][foodX] == 空地)
			{
   
				
				if (2 == (rand() % (5 - 1 + 1) + 1))//利用这种随机判断,
				//可以保证,地图上每次只随机出现1种食物,而且,食物种类(或道具)可以多样化
				{
   
					m_cMap[FoodY][foodX] = 加速果;
					Tool::WriteChar(FoodY, foodX, "◆",4);	
				}
				else 
				{
   
					m_cMap[FoodY][foodX] = 食物;
					Tool::WriteChar(FoodY, foodX, "★",10);
				}
				m_nFoodExist = 1;
				return;
			}
		}
	}
}
//CMap.h-----地图类---
#pragma once
#include"Sanke.h"
#include"SankeDefine.h"
#include"Data.h"
#include<stdio.h>
#include"Tool.h"

class CMap:virtual protected Data
{
   
protected:
	void initMap();//初始化地图
	void Drawmap();//画地图
	void initDrawMap();初始化屏幕上显示地图框
};
//CMap.cpp-----
#pragma once
#include"Sanke.h"
#include"SankeDefine.h"
#include"Data.h"
#include<stdio.h>
#include"Tool.h"
class CMap:virtual protected Data
{
   
protected:
	void initMap();//初始化地图
	void Drawmap();//画地图
	void initDrawMap();初始化屏幕上显示地图框
};
//CMap.cpp-----
	
#include "CMap.h"
#include"Data.h"
#include "CMap.h"
#include <stdlib.h>
#include <stdio.h>


void CMap::initMap()//初始化地图,写入到地图数组
{
   
	
	
	for (int i = 0;i < MAP_X;i++)
	{
   
		for (int j = 0;j < MAP_Y;j++)
		{
   
			if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1)
			{
   
				m_cMap[i][j] = 障碍物;
			}
			else {
   
				m_cMap[i][j] = 空地;
			}
		}
		
	}
}
//画地图的,只在屏幕上显示出来,并没有写入到地图二维数组
void CMap::initDrawMap()//初始化屏幕上显示地图框
{
   
	for (int i = 0;i < MAP_X;i++)
	{
   
		for (int j = 0;j < MAP_Y;j++)
		{
   
			if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1)
			{
   
				Tool::WriteChar(i, j, "※", 8);
			}
		}
	}
}


void CMap::Drawmap()//画地图的,只在屏幕上显示出来,并没有写入到地图二维数组
{
   
	for (int i = 0;i < MAP_X;i++)//墙
	{
   
		for (int j = 0;j < MAP_Y;j++)
		{
   
			if (m_cMap[i][j] == 障碍物)
			{
   
					
				Tool::WriteChar(i, j, "※",8);
			}
		}
	}
}
//Data.h---数据文件类
#pragma once
#include"SankeDefine.h"
#include<vector>
#include<Windows.h>
#include <time.h>
class Data
{
   
public:
	//void save_game();本来想写个结构体来保存到文件中,感觉有点困难没写
	Data();//结构体
protected:
	//地图的数据
	char m_cMap[MAP_X][MAP_Y];

	//蛇身的数据
	std::vector<COORD> m_Sanke;//蛇的身长
	int m_nScore;//分数
	static int m_nSpeed;//蛇模式初始的速度
	static int m_nspeed;//蛇的变化速度
	bool m_bLive;//蛇是否活着
	int m_nDir;//蛇的方向
	int m_nLenth;//蛇的长度
	//食物
	int m_nFoodExist;//食物是否存在
	COORD m_FoodPos;//食物的坐标
};
//Data.cpp
#include"Data.h"
//地图的数据
Data::Data() :m_nFoodExist(0), m_nScore(0), m_bLive(true),m_cMap{
   }
{
   };
//有兴趣的同学可以做一下,我这最难的就是动态存储有几个m_Sanke
//void Data::save_game()
//{
   
	//save_data.m_nDataScore = m_nScore;//蛇的分数
	//save_data.m_bDataLive = m_bLive;//蛇是否活着
	//save_data.m_nDataDir = m_nDir;//蛇的方向
	//save_data.m_nDatalength = m_nLenth;//存储了几个m_Sanke
	//for (int i = 0;i < MAP_X;i++)//少循环,存储地图
	//	for (int j = 0;j < MAP_Y;j++)//多循环
	//		save_data.m_cDataMap[i][j] = m_cMap[i][j];
	储存蛇的身长
	//for (int i = 0;i < m_Sanke.size();i++)
	//{
   
	//	save_data.m_DataSanke[i].X = m_Sanke[i].X;
	//	save_data.m_DataSanke[i].Y = m_Sanke[i].Y;
	//}
//}
int Data::m_nSpeed 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值