上周看代码的时候发现自己把机器学习的代码写了个开头,然后就烂尾了,想着既然开了个头,干脆就花一些时间写下去得了,反正是使用OpenCV去做一个封装,想必也没有多难,所以就开始写了。其实关于模式识别和机器学习的东西很早就开始做了,但是总是觉得做的并不太好,所以感觉有点遗憾,也没有能够留下一点什么东西。
总的来说以前主要做的东西是关于MNIST手写数字识别库的一些东西,手写数字识别库是一个用于机器学习的开源库,在机器学习中这个库使用得很广泛,其中包含了60000个训练样本和1000预测样本,这个库的格式很简单,首先是4字节的int型变量,表示样本的个数,然后是两个四字节的变量表示每个手写数字的大小,实际上训练样本是60000个,每个样本影像的大小为28*28,在读取数据头的时候注意,需要字节取反,所以整个读取存在一个字节取反的问题,字节取反的代码如下:
void mnistFile::swapBuffer(char* buf)
{
char temp;
temp = *(buf);
*buf = *(buf+3);
*(buf+3) = temp;
temp = *(buf+1);
*(buf+1) = *(buf+2);
*(buf+2) = temp;
}
由于是通过OpenCV进行机器学习,所以我们最后数据都要转换为OpenCV的Mat格式,实际上在数据构造的时候可以直接讲数据转换为Mat就好了
void CVMachineLearningTrain::CV_GetMnistTrainData(const char* pathMnist, const char* pathLabel, Mat &trianMat, Mat &labelMat)
{
ifstream ifs(pathMnist, ios_base::binary);
char magicNum[4], ccount[4], crows[4], ccols[4];
ifs.read(magicNum, sizeof(magicNum)); ifs.read(ccount, sizeof(ccount));
ifs.read(crows, sizeof(crows)); ifs.read(ccols, sizeof(ccols));
mnistFile tmp;
int count, rows, cols;
tmp.swapBuffer(ccount); tmp.swapBuffer(crows); tmp.swapBuffer(ccols);
memcpy(&count, ccount, sizeof(count));
memcpy(&rows, crows, sizeof(rows));
memcpy(&cols, ccols, sizeof(cols));
ifstream lab_ifs(pathLabel, ios_base::binary);
lab_ifs.read(magicNum, sizeof(char) * 4);
lab_ifs.read(ccount, sizeof(char) * 4);
int intmagicNum, ccountint;
tmp.swapBuffer(magicNum);
tmp.swapBuffer(ccount);
memcpy(&intmagicNum, magicNum, sizeof(magicNum));
memcpy(&ccountint, ccount, sizeof(ccount));
unsigned char* imgData = new unsigned char[rows*cols];
float* imgDataf = new float[rows*cols];
float* label = new float[10];
int num = 0;
double totalNormal = 0;
Mat tmp1(count, rows*cols, CV_32FC1);
Mat labelsMat(count, 10, CV_32FC1);
char tmpLabel;
for (int j = 0; j < count; ++j)
{
ifs.read((char*)imgData, rows * cols);
for (int i = 0; i < rows * cols; ++i)
imgDataf[i]= float(imgData[i])/255.f;
memset(label, 0, sizeof(float) * 10);
lab_ifs.read(&tmpLabel, sizeof(tmpLabel));
int tlabel = tmpLabel;
label[tlabel] = 1.0f;
memcpy(tmp1.data + j*rows*cols*sizeof(float), imgDataf, rows*cols*sizeof(float));
memcpy(labelsMat.data + j*10*sizeof(float), label, 10*sizeof(float));
}
trianMat = tmp1.clone();
labelMat = labelsMat.clone();
float* p = (float*)labelsMat.data;
lab_ifs.close();
ifs.close();
delete[]imgData; imgData = NULL;
delete[]label; label = NULL;
delete[]imgDataf; imgDataf = NULL;
}
获取数据之后保存在Mat之中,从以上代码我们可以看到,实际上我们获取了28*28的数据,一共60000个,组成了一个60000*784的矩阵,而训练结果我们使用一个60000*10的矩阵表示,0-9数字,为哪个数字则一个10维的向量对应的一项为1其他项都为0,对于不同的训练数据类型应该采取不同的转换样式,如果为BP神经网络训练,则Label可以为10维的向量;若训练方式为SVM则结果为1维int类型的结果向量。
则使用OpenCV进行分类的代码为:
void CVMachineLearningTrain::CV_ANN_BP_Train(const char* pathDataset, const char* pathLabelSet, const char* pathNet, DatasetTypes datasetType)
{
Ptr<ANN_MLP> ann = ANN_MLP::create();
int layers[3] = { 28 * 28,15,10 };
Mat_<int> layerSize(1, 3);
memcpy(layerSize.data, layers, sizeof(int) * 3);
ann->setLayerSizes(layerSize);
ann->setActivationFunction(ANN_MLP::SIGMOID_SYM, 1, 1);
ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 300, FLT_EPSILON));
ann->setTrainMethod(ANN_MLP::BACKPROP, 0.001);
Mat trainMat, labelMat;
if (datasetType == DATASET_MNIST)
CV_GetMnistTrainData(pathDataset, pathLabelSet, trainMat, labelMat);
Ptr<TrainData> tData = TrainData::create(trainMat, ROW_SAMPLE, labelMat);
printf("BP Netural Network train~ing...\n");
ann->train(tData);
printf("-done\n");
ann->save(pathNet);
}
void CVMachineLearningTrain::CV_SVM_Train(const char* pathDataset,double C ,const char* pathLabelSet, const char* pathSVM, DatasetTypes datasetType)
{
Mat trainData;
Mat labelsMat;
if(datasetType== DATASET_MNIST)
CV_GetMnistTrainData(pathDataset, pathLabelSet, trainData, labelsMat);
float* labelf =(float*)labelsMat.data;
Mat labelsMatAdapter=Mat::zeros(labelsMat.rows, 1, CV_32SC1);
for (int i = 0; i < labelsMat.rows; ++i)
{
int j = 0;
for (j = 0; j < labelsMat.cols; ++j)
{
if (abs(labelf[i*labelsMat.cols +j] - 1) < 0.0001)
break;
}
labelsMatAdapter.at<int>(i, 0) = j;
}
Ptr<TrainData> tData = TrainData::create(trainData, ml::ROW_SAMPLE, labelsMatAdapter);
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::POLY); //SVM::LINEAR;
svm->setDegree(1);
svm->setGamma(0.3);
svm->setCoef0(1.0);
svm->setNu(1);
svm->setP(0.5);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 10000, 0.01));
svm->setC(C);
printf("SVM train~ing...\n");
svm->train(tData);
printf("-done\n");
svm->save(pathSVM);
///////////////////////////////////////////////////////////
}
void CVMachineLearningTrain::CV_LogisticRegression_Train(const char* pathDataset, const char* pathLabelSet, const char* pathLogisticRegression, DatasetTypes datasetType)
{
Mat trainData;
Mat labelsMat;
if (datasetType == DATASET_MNIST)
CV_GetMnistTrainData(pathDataset, pathLabelSet, trainData, labelsMat);
float* labelf = (float*)labelsMat.data;
Mat labelsMatAdapter = Mat::zeros(labelsMat.rows, 1, CV_32FC1);
for (int i = 0; i < labelsMat.rows; ++i)
{
int j = 0;
for (j = 0; j < labelsMat.cols; ++j)
{
if (abs(labelf[i*labelsMat.cols + j] - 1) < 0.0001)
break;
}
labelsMatAdapter.at<float>(i, 0) = j;
}
float* data = (float*)labelsMatAdapter.data;
Ptr<LogisticRegression> lr1 = LogisticRegression::create();
lr1->setLearningRate(0.001);
lr1->setIterations(10);
lr1->setRegularization(LogisticRegression::REG_L2);
lr1->setTrainMethod(LogisticRegression::BATCH);
lr1->setMiniBatchSize(1);
printf("logistic regression train~ing...\n");
lr1->train(trainData, ROW_SAMPLE, labelsMatAdapter);
printf("-done\n");
lr1->save(pathLogisticRegression);
}
训练得到训练好了的分类库输出到文件中,在进行判别的时候直接从文件中读取训练结果进行判别。
则进行判别的代码比较简单,在这里不进行详细描述,详细代码在Git上可以获取:https://github.com/wuweiFrank/rsProcess/tree/master/rsProcess/machineLearning 关于相关算法的具体描述,以后有时间会陆续进行记录和描述。
标签: 机器学习, BP, logistic regression, OpenCV实现, SVM
前面讲到了下地洞的攻略,下面我们要说说在地洞一层遇到的一些怪物了,地洞一层还是比较简单的,不太容易死的。前提是你有一些装备的话,好了,闲话就不多说了,直接上一些怪物图鉴,最多的几种应该就是蝙蝠,蜘蛛,还有兔子和龙虾了,其中国兔子和龙虾是中立生物,如果身上没有肉兔子就不会打你,龙虾是可以通过石头收买的,所以下地洞的时候最好先准备这几块石头,这样比较方便。
我们先上几张图:


第一张图是我已经探索到的地图的情况,我们看到其实地底世界是挺大的,我应该只打探清楚了一小部分,还有很大一部分没有探明白,第二张图是石虾,我发现石虾有一个很大的特点就是打不死,每次受到攻击石虾就会化身为石头,然后过一会又变成石虾。所以带着石虾当小弟是很好的事情。然后我就看着石虾和蜘蛛女王互殴,自己只要在边上吃瓜就好了。这些是一些比较平常的怪,下面介绍一个地面上看不到的怪——地龙,地龙这个怪就比较有意思,跟地鼠一样躲在洞里,你经过的时候就会伺机上来咬一口,打死地龙可以得到发光浆果,发光浆果除了吃了自己能发光似乎没有发现别的什么作用了。


上面两张图是地龙和触手怪互殴的场景,这个场景看着特别爽是不是,其中还有几个蜘蛛在卖萌,我作为一个围观群众,忠实的记录下了这一次的斗殴事件,结果当然是地龙和触手怪两败俱伤,然后我上去收割了一只地龙,完成了最后的收尾工作。
大家注意一下就可以发现,我头上带的是一顶高礼帽,为什么要带高礼帽呢,因为我拿的武器是暗影剑,暗影剑的攻击力很高,但是缺点同样明显,会降san值,而高礼帽有回san的作用,所以我会带上高礼帽,还有另外一点就是在地洞中同样会降san值,所以带上高礼帽还是有点作用的。当然高礼帽的防御不太够,所以在遇到怪我准备干的时候一定要换上铠甲,换上头盔。好了,由于我对地洞也不是很熟,所以也处于摸索阶段,如果各位已经在地洞探索,那就祝大家好运了。
好了,说了一百次下次写攻略要下地道这次终于下了地道,为什么等了这么长的时间才下地道呢,这里主要因为在下地道的过程中需要做一些准备工作,所以耽搁了一点时间,好吧相信各位玩家能够坚持到现在或多或少也下过几回地洞了,当然我以前也下过几次地洞,但是每次不是san没有了死了,就是被地下的各种怪我干死了,所以提起地洞就有一点点恐惧,因此这次下地洞准备会比较多,首先要准备的是一个矿工帽,矿工帽是一个好东西,可以戴在头上当照明,但是矿工帽需要一个比较少的资源那就是萤火虫,萤火虫智能通过虫网去捉了,为了捉萤火虫还是花了我一番功夫的,捉到萤火虫之后我就下地洞了,可是毕竟萤火虫的寿命是有限的,很快就会消耗完,所以我第一次下地洞的主要目的是采集,采集萤光果,荧光果是制作提灯的必备工具,而提灯是一个十分方便的工具,提灯的主要作用在于拿在手里可以进行照明,同时还可以放在地上进行照明,是一个不可多得的神器,当然咯,提灯与矿工帽各有优劣,不管大家喜欢哪一个,反正好好准备这些东西下地洞总是没有差的。
此外还有一个东西是挺重要的,那就是吃的东西和治疗药膏,至于其他的东西可以适量的带一些,我一般会带上一个盔甲,一把武器,然后带上几块石头,一些树枝和一些干草,为什么要带这些基本的东西呢,主要是因为提灯有可能没有电了,当然咯我带了两个提灯,但是为了保险起见还是带一些生火的物品,这样安全一点。

这是第一次带上矿工帽下地洞的截图,由于下地洞时间比较紧,所以没有截很多图,从图上我们可以看到其实由于准备不太充分,所以带了很多乱七八糟的物品,以至于后来有东西没有办法捡。
下面是从洞穴中顺上来的好东西:



上面第一张图是一个兔子窝,兔子窝很好做就是要兔子毛,兔子毛只能到地下通过杀兔子,获取锤兔子窝获取到了,实际上我锤了几个兔子窝,然后搞到了一些兔子毛,建了第一个兔子巢穴,但是我认为兔子还是不如猪人好,兔子会攻击自己,如果你身上带了肉的话,我就是这样被兔子打死过一次,说起来都是类,另外下了洞穴之后还获取了一些有意思的东西,比如荧光果,提灯等等。
好了第一次下地洞就介绍到这里,下次介绍一下洞穴中的怪怪物以及其打法,敬请期待~~
曲率驱动扩散模型的影像修复
数学基础
基于TV模型影像修复的局限性
在TV模型1中,扩散强度只取决于对比度或等照度线的强度,在表达式中表现为:
根据上式2,扩散强度并不取决于等照线的集合信息,对于一个曲面,其几何形状通过一个标量,曲率来描述,对于文章3中图2TV模型失效的原因在于,在四个交点,其曲率为相反门根据心理学校正在图中的校正结果,所有等照度线应该被处理的尽可能伸展和平整,因此曲率应该尽可能的小才对。
曲率扩散校正模型的数学基础
正是由于基于全局变差模型的校正方法存在以上问题,因此需要对模型进行改进将原始TV模型求的方法:
修改为:
其中是一个去除曲率极大值,稳定曲率极小值的函数,通过此函数,在曲率具有较大值的时候有比较强的扩散作用。因此对于文章图2中所示模型,能够更好的符合人类感知。在文章中函数为:
而在点上的曲率为等照线的量化曲率方向通过如下公式获取:
因此CDD模型为:
则求解时间进行的方程,初始值满足:则曲率驱动的扩散场流为:
在大多数情况下原始影像是存在噪声的,因此如果直接使用公式(7)进行修复,则对噪声比较敏感,文章提出了两种方式解决噪声的问题:
1.在使用CDD模型进行修复之前,先进行去噪处理;
2.在实用CDD模型的过程中进行去噪,对于此过程分为两个自然阶段,在修复区域内部使用公式(7)所示的CDD影像修复模型,而在正常的区域采用如下模型:
数值解法
同样是以公式(7)为例,其数值解法为:
则
- Shen J, Chan T F. Mathematical models for local nontexture inpaintings[J]. SIAM Journal on Applied Mathematics, 2002, 62(3): 1019-1043. ↩
- http://wuwei-cug.blogspot.com/2016/05/tv.html ↩
- Chan T F, Shen J. Nontexture inpainting by curvature-driven diffusions[J]. Journal of Visual Communication and Image Representation, 2001, 12(4): 436-449. ↩
记得曾经写过一篇关于EM算法的博客,在新浪博客上,不知道是因为是没有仔细学习还是别的什么原因,突然发现自己又不太理解这个算法了,所以在这里又详细进行了一番思考和记录。
准备知识
1.贝叶斯公式:
相信学过统计的同学们对这个公式都不会陌生,贝叶斯公式是表示在确定事件A发生的条件下事件B发生的概率,因而我们将此概率称为最大后验概率,公式表示为:
其中为事件A出现的先验概率,为在B发生的条件下A发生的概率。
2.高斯分布:
高斯分布相对来说比较简单也比较熟悉,高斯分布主要有两个参数,1.确定高斯分布位置的参数,2.确定高斯分布离散度的参数, 这两个参数确定了之后高斯分布也就确定了,高斯分布的标准形式为:
高斯分布的主要特征为:
1.集中性,正态分布的高峰位于正中央,即均数所在的位置;
2,对称性:正态曲线以均数为中心,左右对称,曲线两端永远不与横轴相交。
3,均匀变动性:正态曲线由均数所在处开始,分别向左右两侧逐渐均匀下降。
4,正态分布有两个参数,即期望和标准差,可记作:期望决定正态曲线的中心位置,标准差决定正态曲线的陡峭或扁平程度。越小,曲线越陡峭;越大,曲线越扁平。
3.相对熵:
相对熵又称KL散度,相对熵是两个概率分布非对称性的度量。设和为随机变量的两个不同的分布密度,则他们的相对熵定义为:
相对熵的性质有:1.相对熵是不对称的;2.相对熵不满足三角距离公式。
EM算法介绍
EM算法是一种经典的最大似然算法,主要用于解决样本数目不足或似然函数中含有参数的方法,从有限的样本数据中准确求取模型的参数是EM算法的主要目的。
现在给定训练样本样本间相互独立,现在假设样本都来自同一个高斯分布,则我们要找到高斯分布的参数使得取出这些样本的概率最大,则可以表示为:
对于上式求解极大值,由于对于累乘的求解比较困难,取对数化为累加,然后对于求偏导等于0,求解出最优参数,上面描述的问题是一个简单的高斯分布的参数求取问题,而实际上我们面临的问题要复杂得多,我们假设从一个高斯混合模型中取得了样本样本相互独立但是我们不知道取出的样本属于哪个高斯分布,那么现在我们的问题是根据这些样本估计各个高斯分布的参数。
首先如果我们知道哪些样本属于同一高斯分布,则我们就可以通过这些样本求取各个高斯分布的参数,另外,如果我们知道各个高斯分布的参数,那么我们就可以通过高斯分布的参数确定各个样本的归属。也就是说高斯分布的参数和各个样本的归属类别其实是相互影响的。对于这样的情况就比较适用EM方法进行求解了。(什么你跟我说这个跟K均值算法很相似,好吧确实有点相似,我们等一下会分析他们之间的联系和区别的)
对于上面那个混合高斯模型的问题,实际上在各个变量中隐藏了一个参数就是各个变量的归属,我们假设这个参数为,则公式(4)的最大似然估计可以被描述为:
相信在看过了上面的解释后大家对这个变量的出现就不以为然了。现在我们所要做的就是对公式(5)进行求解,但是由于有着隐藏变量的存在,求解比较困难,所以我们想呀,如果确定了,那就跟最大似然是一样的了,好了这里我们留一个悬念,下面直接进入EM环节,在EM算法中分为两个步骤:E步骤,建立函数的下界,M步骤,对函数的下界进行优化,这两个步骤看起来比较抽象,下面我们将进入具体的公式环节,
对于每一个给定的样本我们假设为隐藏变量的分布,满足:。这个跟的表示相关。
则对于公式(5)我们对公式进行变形得:
好了我们可以看到,公式(5)和公式(6)比较起来只是乘了一个,可是依旧没有什么帮助,但是最重要的部分为公式(6)的等式可以转换为
由(6)到(7)的变换为Jensen不等式,这个不等式可以参考:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html
好了根据以上推导我们可疑总结一下EM算法流程了:
E步骤:根据参数的初始值或上一次迭代结果记为:,通过迭代结果来求解一个分布使得最大化;
q(z)\theta\theta^{n+1}l(q,\theta)$
EM算法与K-Means算法的区别:
其实EM算法和k均值算法很类似,都是分配然后调整的过程,只是在k均值算法过程中采用的调整策略是距离策略,而EM算法采用的调整策略是概率策略,当然,对于正太分布的对象来说他们之间的区别在这里,而对于EM算法来说它是一种广义的调整算法,类别可以为各种分布形式而不仅仅局限于高斯分布。
基函数的字典为:
常用的基函数文Gabor基,LoG(高斯拉普拉斯基)和其他小波基函数,假设有表示基函数的平移,旋转和尺度变化,为正交转换空间,然后我们获取影像基的数据集
则根据影像基元的影像成像模型可以表示为:
在公式(1)是基的数目,是第个基元的系数。由于是过完备的字典,变量集可以唯一标识一个基所有的隐藏变量通过一个基础映射表现:
在影像编码的过程中,我们认为影像基是独立同分布的,位置,分辨率,方向都假设是均匀分布:
其中可以选择为拉普拉斯分布或两个标准差接近于0高斯混合的分布,对于任何
由于具有很高的丰度,因此的具体形式并不是很重要,在以上影像模型中,影像映射包括隐含变量和字典的参数。
在特征空间的K均值聚类
在区分方法中,基函数可以被认为是滤波器,通过对滤波器进行旋转和尺度变换可以获取一系列的滤波器则对于在位置指示滤波响应为:
与上一个模型相比,此模型为影像的确定性的转换,如果影像结构具有重复的特征,则我们有理由相信可以以聚类的形式得到,通过K均值聚类的方法可以得到纹理单元。聚类中心可以被视为从特征向量到影像标识转换的伪逆矩阵,则令是聚类中心,则影像标识可以通过最小二乘得到:

上图为k均值聚类方法得到的纹理单元的结果。
对于以上两种方法有两个结论,首先以上两种方法的基础不同,在影像生成方法中影像可以通过确定的方程生成,通过一些基向量求和得到。另外此两种方法都会面临一个问题,同一个影像结构平移、旋转和尺度变化会有多个结构,这是由于在分割影像快的时候都是以固定的位置和方向进行分割的。
根据点击量来看还是饥荒攻略比较受欢迎呀,既然这样那我就咬咬牙再更新一篇攻略吧!我们知道在饥荒中除了一些常见的物品以外还有许许多度的魔法装备比如冰魔杖,火魔杖等,除了这些呢还有一些比如暗夜灯,暗影剑等,当然,使用这些魔法装备是要耗费san值的,当然在后期我们制作一个高礼帽是可以回复san值的,所以也不需要太担心san值的问题。
但是呢,这些魔法装备的制造是一个很麻烦的事情,起码对于许多新手玩家来说是一件比较麻烦的事情,其实别的资源都比较好获取,但是制作魔法装备有一个必备的资源,那就是噩梦燃料,噩梦燃料的获取想必对于所有新手玩家来说都是一个很头疼的问题,为什么呢!因为噩梦燃料获取的几种方式都是有损san值的,总的来说噩梦燃料的获取有以下几种方式:1.在san值很低的时候会出现噩梦怪,相信很多新手玩家都是被噩梦怪杀死的,所以对于噩梦怪有阴影了。2.在san值很低的时候兔子会变成黑色的兔子,此时杀死黑色的兔子会获取噩梦燃料,当然此时如果san值不够低,则会变成怪物肉,这种方法挺不划算的,兔子肉还是留着做肉球比较划算;3.采集恶魔之花,每采集一朵恶魔之花会降低五点san值,而每四朵恶魔之花才能合成一个噩梦燃料,所以挺损san值的,不过也没有关系,睡一觉会恢复很多的san值,所以在制作噩梦燃料的时候一个帐篷是必不可少的装备了。
上面介绍了几种制作制作噩梦燃料的方法,下面我们就每一种方法分别讲解一下,首先是揍噩梦怪刷噩梦燃料的方法,这个方法总的来说就是要想办法降低自己的san值,然后等待噩梦怪出现然后往死里揍,就会爆出噩梦燃料,一般快速降低san值的方法就是爬虫洞了,来来回回爬几次san值就低了,揍噩梦怪的方法有一个缺陷,那就是每揍死一个噩梦怪会恢复san值,这样噩梦怪又会消失,这其实挺烦的…..我个人认为捡恶魔之花是最好的方式了,既省时省力有省心,还不浪费资源,所以强烈推荐使用检恶魔之花的方式获取噩梦燃料,当然,如果各位玩家想锤炼自己的刷怪水平去刷刷噩梦怪也是挺好玩的,下面这张图是我带恶魔兔子的截图,为什么步推荐逮恶魔兔子,因为划不来,血泪的教训,划不来,太划不来了,简直是亏大了!!

通过以上说明想必大家都能够获取不少噩梦燃料了,那我们就开始升级魔法了:

上面这张图是造出来的魔杖,这个魔杖的作用是可以通过其反应强度来知道恶魔零件的位置,这是它最大的作用,不过似乎也没有什么太大的作用,反正资源比较多,做一个出来玩玩而已,实际上目前我也用不上所以在这里只是截一个图让各位玩家看一看魔杖长什么样而已。

上面这张图是一个比较重要的东西,在右边,一个高礼帽魔法放大器,通过这个可以制造出很多魔法装备比如冰杖,火杖等,这个东西的制作原理也不是一件多么复杂的事情,主要是要获取一个紫宝石,紫宝石是一个比较难获取的物品,因为紫宝石是通过一个蓝宝石和一个红宝石合成的,而红蓝宝石目前发现只能通过杀死冰狗和火狗得到,且爆出率比较低,所以是一件比较麻烦的事情,当然好像挖墓也可以挖到没有试过,以后可以去挖挖试试。

下面介绍最后一个物品,复活人偶,这个东西好像只有威尔逊能造,因为需要威尔逊的胡子,别的角色好像都没有胡子,复活人偶的作用就是复活一次吧好像,跟复活石的作用应该差不多,不过复活人偶可以放在基地里,这样复活后马上就拥有足够的资源,如果在野外冬天或夏天复活身上又没有豹纹或降温的装备,恐怕就是一个死了。其实我还做出了一个冰杖,这个也不是什么特别的东西,有玩家也能够在游戏中捡到,在这里我就不赘述了,最后提一提,魔法装备的制作过程中我已经捕捉到了萤火虫,随时可以准备下地洞了。
今年的端午特别有意思恰逢高考完,其实高考离我已经很远很远了,很多人的在文章中写到自己的高考恐惧,说自己到了多年之后在高考的时候依然会在晚上做恶梦,好像自己并没没有这样的恐惧,可能是跟自己高中的环境比较宽松有关系吧,很多人在回忆高中的时候恐怕都是满满的奋斗和习题册吧,其实对我来说奋斗和习题并不是全部,由于学校一直离家比较近,,直到高中,特意挑选了一个离家比较远的地方上学好让自己离开家。这对于我来说是一个全新的体验了,总之高中第一次的集体生活还是让我有很多回忆的,同时我想高中的生活对自己的性格也有一个改变和塑造吧。
考完之后估计有很多写高考的文章了吧,高考大过天的也有,说高考只是人生一项选择的也有,说它重要也罢,说它不重要也罢,总之不管什么文章想必都会让各位考生心烦意乱,不知所措!其实作为一个从这个过程中熬过来的人不管他们说什么恐怕都不会作为你们的参考吧。小时候会因为一块糖、一个小玩具变得难过,一点也不愿意让着同龄的小朋友,这时大人会跟我们说让我们让着别人一点。长大了很多朋友会因为成绩的好坏变得郁郁寡欢,这时总有人站出来说成绩并不是最重要的。后来渐渐情窦初开,沉浸在甜蜜或悲伤中无法自拔,这时又会有过来给我们指手划脚,对我们说爱情不过是昙花一现不要沉浸其中。随着自己一点点的成长我们渐渐明白,原来玩具和糖果真的是那么不值一提,原来成绩的作用真的仅仅代表过去在学习上的努力,原来爱情真的没有我们想象中的那么重要,可是谁又能够不经历这些事情就明白了呢!我其实很讨厌突然有人在我们生活中跳出来跟我们说我们在意的这些不重要,我们在意的那些不重要,是呀!如果你垂垂老矣了,时刻不知道能不能见到明天的太阳,所有一切都不重要了!可是没有经历过的人永远也不会明白,没有人能够像圣人一样一出生就明白这一生的一切,那些所谓的过来人也不不过是因为熬过了最初的痛苦而已。
在这里我并没有说过来人给我们的经验不对,他们的经验确实可以给我们作为参考,可是他们并不能替我们去承受,他们所说的我们都会认同,但是我们他们面对我们所经历的事情的时候那种不在意与风淡云轻并不是我们能够装的出来的。曾经作为学校吉他协会的负责人之一,我们也曾举行过许多活动,我也曾见到一位同学在选拔的时候在我们几个负责人面前弹琴时手都在抖,后来慢慢的他能够自信的在各种舞台上参与演出且丝毫看不出他会有过这么青涩的曾经,想我自己第一次上台的时候,恐怕不止手在抖连脚也在抖。我能理解他,我也能在他第一次上台演出的时候告诉他们不要紧张,即使偶尔的出错观众也是很难体会到的,可是这是多次经历之后的淡定和从容,并不是与生俱来的天赋,所以希望所有今年高考的考生不要被别人的文章,想法所左右,你们所经历的一切,不管是难过也好喜悦也罢,你们觉得重要也要不重要也罢,这些都是那些所谓的过来人曾经经过的,不要羡慕,好好体会这些情绪,有一天你也会跟他们一样回首向来萧瑟处,也无风雨也无晴!
这次端午没有回家,一方面是家里没人,另一方面是家里没网,总觉得没有网会缺少些什么,让我这样习惯了在网上挂着的人有点不知所措。不过说句实在话,其实一个人呆在宿舍也是不错的,没有人打扰的情况下会更容易思考,一个人听听音乐,一个人弹弹琴、看看书、一个人写些东西也挺好的,前天晚上去买了几个粽子,味道还不错,就当第二天的中餐吃了,毕竟是端午节怎么能少了粽子呢,其实往年这个时候都应该在大姑家吃粽子的,因为老爸的几个兄弟姊妹估计只有大姑包的粽子最好吃了。可是大姑去年就去世了……
本来端午佳节,不应该说这个,不过一旦提起来就没有不继续下去的理由了,其实生命在上帝看来是多么脆弱,随时可能逝去不是么?昨天翻完了一本鸡汤口水书,总觉的是空洞的说教而已,并没有什么实际的意义,这样的空洞说理的书看得多了可是依然没有什么帮助……我只能说道理毕竟只存在于书上,生活还得自己去经历,最近在看《耶路撒冷三千年》,虽然老外些历史的角度很奇怪,感觉是以一个个历史事件将历史串起来的,不过不管怎么样总是觉得看历史书还是比较有收获的,穿越历史的尘埃看到的是曾经的圣城,看到耶路撒冷在血与火中倒塌,然后又在血与火中重生,看到大卫、看到所罗门,看到尼布甲尼撒,看到希律王,看到那些在历史上叱咤风云的人物一个个站起来,然后又倒下去,看到那些伟大的王国一个个被建立然后又被摧毁,我看到的是时间伟大,同样伟大的还有人们的的信念。
在这里不得不提犹太民族,这个民族的命运如同他们的圣城——耶路撒冷一样经历了无数次的刀剑的蜂鸣,还有血与火的淬炼,然后无数次的摧毁再重建!然而现实的耶稣撒冷可以被摧毁,但是心中的耶鲁撒冷却没有办法被摧毁,总有人以生命为代价点燃那信念传承的圣火,让故事在人们血液中流传,所以才有了犹太民族的信仰——《圣经》因为妈妈是一个基督徒所以我对这本书应该比大多数人都要熟悉吧,曾经我不明白什么一本书会有如此大的力量,可是看到耶鲁撒冷的历史后我明白了,这也许不仅仅是一本书而已,这是一个民族的血脉它记载了这个民族的荣耀、屈辱还有希望,我想这也许就是犹太民族与众不同之处吧,我们华夏民族从一开始有许多记载,我们的历史一直是连贯的我们有着很多文化的传承,而犹太民族不一样,他们经历过太多的摧毁与重建,而他们几千年来所有的历史都被浓缩在了这么一本不算太厚的圣经之中,所以才说这本书是他们移动的国家吧。
好了,趁着端午节放假又更新一篇饥荒攻略吧,话说不知不觉攻略都更新到第五篇了,前面四篇基本讲述的是如何在饥荒游戏中安然度过这么些天的方法,当然如果一直对于出现的怪物都避而不见的话也是可以的,但是这样玩到后期就会出现一些问题,比如在后期猎狗出现的个数会越来越多,同时还会有冰猎狗和火猎狗的出现,其实冰猎狗倒还比较好解决,毕竟冰冻之后解冻就没有事了,但是火猎狗是一个比较麻烦的事情,一不留神就会将家毁于一旦,此外还有树人、蜘蛛女王等一系列的巨人怪会来找我们的麻烦,好吧,鉴于许多新手玩家都没有见过这些巨人怪,所以我会首先上几张图来说明一下这些巨怪:

上图是蜘蛛女王,蜘蛛女王是三级蜘蛛巢穴生出来的,三级蜘蛛巢穴到了一定的时间就会出现蜘蛛女王,女王的特点在于每隔15s可以生出一只蜘蛛,不知道有没有上限,所以绞杀蜘蛛女王的方法为首先消灭其小弟,如果是一只落单的蜘蛛女王,穿上盔甲打就好了,不要给它时间生产小蜘蛛,不然再杀起来会比较麻烦,另外可以带上猪人一起帮忙杀,由于早我的地图上有猪人火炬彩蛋,所以我将蜘蛛女王引到火炬边上的时候守护的猪人就会上去围殴蜘蛛女王,这样的情况下只要在边上看着他们互殴,然后上去收割就好了,杀死蜘蛛女王可以获取一个蜘蛛女王帽,带上这个帽子蜘蛛就不会打你(有没有特别爽!),相对来说蜘蛛女王是比较容易杀的,毕竟女王的血量比较少,容易就打死了。

介绍过蜘蛛女王我们再来介绍一下树人,不知道大家能不能看清,几个猪人在围殴一个树人,树人是有松树生成,桦树也可以生成,但是桦树生成的树人不能移动但是可以生成小的桦树怪特别烦,以后有机会再介绍,首先我们还是来介绍一下上图的树人,树人的特点为:血厚,攻击力高;当然树人也有其缺点,那就是行动缓慢,所以树人也不算难打,带二师兄打树人不太靠谱白白牺牲二师兄而已,上图是在带着二师兄砍树的时候突然出现的树人,树人行动迟缓每两次攻击之间有2s-3s的时间间隔,利用这个时间间隔我们在树人两次攻击的间隙可以攻击树人3-4下,新手建议打三下往后撤。一直循环直到打死树人,树人算是一个比较难打的巨怪,但是也不算太难,因为树人毕竟行动迟缓,只要花时间慢慢打还是能够打死的。

上面这个图是火蜻蜓,是夏天的大BOSS,理论上每个夏天都会出现,饥荒巨人统治冬夏的巨怪都很有特点,火蜻蜓可以点火,通过点火来摧毁建筑,说句实话小编对于巨怪也没有什么很好的手段,上图是通过巨眼炮塔打死的,使用了修改代码,实在打不过,当然如果准备得比较早的话可以制造炸药炸死他。

上图上部为狗牙陷阱,对付突然出现的疯狗有很好的效果,但是狗牙陷阱攻击力不是很高,所以要堆很多才能起到效果,狗牙陷阱也比较容易做,布置好狗牙陷阱后通在疯狗来了之后将疯狗引到狗牙陷阱大阵中就好了。好了由于时间的原因这个号也只玩到了这里,同时为下地洞做准备,估计到下下期我们就会下地洞了,敬请期待!!
上几次讲到了如何在饥荒中最基本的谋生,想必大家都能顺利过冬了,然后春天其实比较好过的,只要有一把雨伞就能安然过完整个春天,下面我们的攻略要讲的是如何顺利过完一整个夏天,顺利玩过冬天的玩家一般都在夏天死像很凄凉,为什么会这样?主要是因为夏天有两个比较难玩的地方,首先夏天温度比较高,就如同冬天会冻死一样,夏天体温身高后会热死,所以我我们随时要想到的是如何降温,有朋友们抱怨说在玩的时候看不到自己的温度,其实小编在刚开始玩的时候也是这样,可是怎么办呢?在这里就要给大家推荐一个MOD,其实我是不建议大家用MOD的会影响游戏平衡,使得游戏失去了应有的乐趣(虽然我在刚开始的时候也是各种希望使用变态MOD来玩,可是还是忍住了@_@,哈哈哈~ing)。好了回到正题,我们今天的主题是在饥荒中如何安然惬意的度过一整个夏天。
这个时候我们就要回顾一下我们教程中关于过冬的攻略了,如果大家严格的按照过冬的攻略游戏的话基本上大家夏天就只有等死了,所以考虑到整个季节的变化,我们需要在夏天到来之前获取如下物件:齿轮:至少两个,金子:至少15块,岩石:一组,硝石:20块。这些东西都是过夏天必备的物品,我们下面来说明一下这些东西:
上面三种物品分别是齿轮,金子和岩石,硝石的图片找不到了……
齿轮有比较大的作用是制作冰箱、灭火器的主要工具,金子不用说,各种物品的制造都可能用到金子。其他两种材料比较常见这里就不加以说明了,齿轮是比较难获取的,墓地中挖墓会有一定的几率掉落齿轮,杀死齿轮怪如炼金术士、齿轮骑士等可以获得齿轮。遇到了千万别放过,有了齿轮我们可以制造灭火器。
我们知道夏天很多东西都会自燃,万一我们的农场或者草场或者其他东西自燃了,那所有的努力可就白费了,所以灭火器是很重要的,另外需要金子和硝石制作冷火焰,冷火焰与石头火堆的作用相同,都是可以照明的,火堆可以在冬天升温,而冷火焰可以在夏天提供降温,在夏天的时候是比较有用的。好了造好了这些东西后我们夏天基本就可以安然度过了,剩下的最主要的问题就在于不断的给灭火器添加燃料了,这个是十分重要的,如果忘记添加燃料到时候自燃了就不太好办了。以上所有必备的东西建造好了之后剩下的就只有获取食物了,还是一样获取大肉,然后种植水果蔬菜。这个时候会比较烦的是离开一小会就会温度升高得很厉害,可以通过打遮阳伞来降低温度升高的速度,但是不能使得温度下降,这个时候当然要在冬天和春天就开始准备,做一块大冰块,在温度实在升高得厉害之后可以顶在头上降温,这样带着冰块就可以去到比较远的地方逛逛了。
下面是我玩的图:

从图上可以看到我已经造好了冷火焰,和灭火器等物品,这个时候春天垮掉的兔子洞又会重新出现兔子,我们又多了一个食物来源那就是吃兔子肉了,好了,本次的饥荒攻略就讲到这里了,希望大家看完之后顺利度过游戏中的春夏秋冬四季。相信大家在做到上面几个工作后很容易的就能够在四季中坚持下来了,以后的章节中我们会慢慢讲解饥荒中各种怪物的打法,尽请期待。
聚餐完毕,喝了一点点酒,脑袋混混沉沉,默默的穿过华科走了回来。回到宿舍就扑倒在床上,默默的翻来覆去,然后慢慢进入了梦乡。可是今天的梦似乎和以前有所不同,今天的梦是那么真实,那么具体,似乎那一都切有具体的触感。慢慢的我就开始习惯,不过是做梦嘛,有什么了不起的,然后我就在梦境中开始闲逛,我看到了云彩,我看到了天空,还有不知名的高山,从未见过的宏伟建筑!
我走在空旷的城市,这儿仿佛一座死城,安静得只有自己的心跳和呼吸,不对呀!我不是在梦中么?怎么会有心跳和呼吸声,赶快醒来,赶快醒来逃离这个梦境,惊恐的我开始大声叫喊,一种莫名得到恐惧涌上心头,为什么这次梦里的一切都是那么清晰,用力的掐了掐自己的脸,居然感觉到了疼痛!不可能呀,这不是梦么,怎么会在梦里也能感觉到疼呢?难道这不是我的梦,恐惧的种植一旦种下就变得不可抑止的生长起来,我开始在这个陌生的位置疯跑,我开始感觉到疲惫,开始不知所措,时间渐减过去了,我开始变得疲惫,可是周围依旧是那些灰蒙蒙的街道,陌生的宏伟建筑,还有远处那不知名的高山和云彩。可是这究竟是怎么回事,为什么为什么我会感觉疼痛,为什么我会疲惫,我坐在街边的椅子上喘着粗气,街上的路灯亮着,似乎已经亮了千年,这个鬼地方没有太阳、没有月亮;没有人烟,也没有时间。我感觉过了好长好长时间,我已经不知道来到这里多久了,也许是一两个小时,也许是一两天也许更长,我脑袋开始变得沉重,变得无法思考。我想我需要睡会了。所以我躺在街边的长椅上睡去了。
过了不知多久,我睁开眼睛,看到自己正躺在一张床上,周围一切都变了,我记得我躺在街边的长椅上的,怎么突然到了这个地方,我起来打量着这周围,只有一张的床和椅子,还有一张简单的书桌,桌上有个关着的笔记本和一个烛台,烛台看起来光亮如新,那似乎是一个日记本,好奇心驱使我走到烛台边上拿起那本日记本,房间没有窗户、也没有灯,可是一切都能够看的清楚,那是一个看起来很精致的本子,黑色的封皮上什么字都没有,我正准备翻开时突然门被打开了!我手一哆嗦,本子掉在地上,进来的是一个姑娘,深色的长发扎成马尾,她的眼睛似乎有种魔力,看得我有些不知所措。
“对不起,我…”我想解释些什么,可是又不知道怎么说,只好保持沉默。
她只是默默的走来捡起地上的本子放进了书桌的屉子。
“我叫L,你好!”她坐在椅子上看着我。
“我叫W,我第一次来到这个地方….”我有很多话想说,可是此时她已经转身在书桌的屉子里找些什么了。我只好把所有的话憋回心里了。我默默的走到床边坐下,L是我在这里见到的第一个活人,我翻遍了记忆的每一个角落哦也不记得曾经认识过这样一个人。
“你是不是有很多问题想问,不要着急,慢慢你就会知道了,我来到这个地方的时间也并不长,这个地方是似乎是一个神秘的梦境。”
“梦境?不可能的,我从来不认识你,你怎么可能出现在我的梦中。更何况这里一切都太真实了,根本不像梦境。”
“这是梦境,只是不是你的梦境,也不是我的梦境,这里就是一个梦境的城市,我们都在这个梦境之中!”她的语气果断而坚决,我也无意反驳,我需要好好消化这些东西。
这一篇是我的第三篇攻略,本攻略主要是告诉大家如何刷猪肉,相信大家在经过上一个攻略之后已经能够顺利的渡过残酷的冬天了,不过天天吃兔子肉想必大家也吃的想吐了,可是大肉还是比较难大的,有时候好不容易打死一个猪人还没有肉,那如何快速的获取大肉呢?下面这个攻略就是饥荒中刷大肉的方法。
想必大家大家也很好奇为什么大家都能够大口吃肉,而自己只能天天逮兔子,而且冬天过去,春天到来之后兔子洞就垮了,毕竟兔子也要繁殖嘛,这个时候逮兔子就不太靠谱了,想吃肉怎么办呢,就只能杀猪了,而杀猪也是一个技术活,如何快速杀猪并获取大肉也并不容易,因为我们辛辛苦苦杀了一只猪后还不一定能够获得大肉。但是饥荒里面有一点就是杀死一个疯猪可以得到两个大肉和一个猪皮。所以我们可以让普通猪变成疯猪,然后干死疯猪就好了。
我们知道喂猪吃四块怪物肉就可以让猪变成疯猪,此时再杀死疯猪就可以得到两块猪肉和一块猪皮,猪皮可以用来建猪房,又可以得到长期猪肉。好了闲话不多说了下面我们来说说如何获取猪肉,首先我们要做的事情是拿我们逮到的兔子肉去收买猪,得到很多猪小弟,这个任务轻松就能够完成,然后我们找到森林里面,里面一般会有很多蜘蛛巢穴,然后我们就去刷蜘蛛,不停地刷蜘蛛得到很多蜘蛛肉,我们看看地图,猪村里面假设有个猪屋,则我们收集个怪物肉,然后去刷猪肉了。

好吧,上面是带猪刷木头的截图,毕竟收买了这么多猪,刷肉是很快的,在刷肉之前还可以充分榨取猪猪们的剩余价值,砍几个木头。
刷疯猪肉有技巧,我们不能够一次单独给一只猪吃四块,而是先给每一头猪一块,这样猪猪们会聚集起来,然后我们再一块一块的给,然后一头猪变成疯猪了其他所有猪就会群起而攻の,这样我们只用在边上看着,然后及时把掉落的肉抢到手就大功告成。就这样一只一只的杀,可以杀死所有的猪得到大肉和猪皮。最后只有一只疯猪了,我们只要穿上木甲拿起长矛,没有别的想法了,干之!!!