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