有限状态机(finite-state machine,缩写FSM),又称有限状态自动机,简称状态机,表示有限个的状态,以及在这些状态之间的动作和行为的数学模型。但我想说的是基于这种思路的组织代码的方式。这样可以让你的对象一直清楚自己的状态并且知道这个状态所能有的操作。这个东西可以用于实现游戏角色的基本逻辑(恩,百度百科)。
状态机的每个状态的代码模块都是分开的,利用各自的判断条件在不同的状态之间切换,这样做一是有利于找到代码中的问题,比如走路状态除了bug就可以直接到走路的模块里去找而不用考虑其他状态,二是有利于添加新的对象状态或功能(策划:加个特殊技能吧,旋转跳跃360回旋攻击)
状态机基本适合所有的游戏项目,做做杂兵啦,做做boss啦,做做菜单啦啥的。当它有超过两个状态,就可以去考虑做个状态机了(要不还是if方便),这样在工程迭代的时候很容易加入新的更新。
#include<stdio.h>
#include <string.h>
#include <ctype.h>
#define INIT_WORD 0 //初始化单词,预编译时被替换
#define IN_WORD 1 //进入单词
#define OUT_WORD 2 //退出单词
#define END_WORD 3 //单词结尾,未实现
#define NO_WORD 4 //未在单词中
#define LINK_WORD 5 //单词中间出现-,'连接符
/*
enum WordState { //枚举类型(受到限制的整型),编译时被替换
INIT_WORDc =0,
IN_WORDc,
OUT_WORDc,
END_WORDc,
NO_WORDc,
LINK_WORDc
};*/
int Count_Word_File(char *szFileName);
int CountWord_Num( char *str);
int main()
{
char name[] = { "E:/xp/test/1.txt" };
printf("%d\n", Count_Word_File(name));
return 0;
}
int CountWord_Num( char *str)
{
int num = 0;
int i = 0;
int tag = INIT_WORD;
if (NULL == str)
{
return num;
}
while (*str != '\0')
{
switch (tag)
{
case INIT_WORD:
if (isalpha(*str))
{
tag = IN_WORD;
}
else
{
tag = OUT_WORD;
}
break;
case OUT_WORD:
if (isalpha(*str))
{
tag = IN_WORD;
}
else if (!isspace(*str) && *str != ',' &&*str != '.'&&*str != '!')
{
tag = NO_WORD;
}
break;
case IN_WORD:
if (isspace(*str) || *str == ',' || *str == '!' || *str == '.' || *(str + 1) == '\0')
{
num++;
tag = OUT_WORD;
}
else if (isalpha(*str))
{
tag = IN_WORD;
}
else if (*str == '-'||*str=='\'')
{
tag = LINK_WORD;
}
else
{
tag = NO_WORD;
}
break;
case NO_WORD:
while (1)
{
if (*str == ',' || *str == '.' || *str == '!' || *(str + 1) == '\0')
{
break;
}
str++;
}
tag = OUT_WORD;
break;
case END_WORD:
if (tag == INIT_WORD)
{
num++;
}
break;
case LINK_WORD:
while (1)
{
if (isspace(*str) || *str == ',' || *str == '!' || *str == '.' || *(str + 1) == '\0')
{
break;
}
if (!isalpha(*str))
{
tag = OUT_WORD;
}
str++;
}
if (tag == LINK_WORD)
{
num++;
tag = OUT_WORD;
}
break;
}
str++;
}
return num;
}
int Count_Word_File(char *szFileName)
{
int nWords = 0;//词计数变量,初始值为0
FILE *fp; //文件指针
char carrBuffer[1024];//每行字符缓冲,每行最多1024个字符
if ((fp = fopen(szFileName, "r")) == NULL) //打开文件
{
return -1; //文件打开不成功是返回-1
}
while (!feof(fp))//如果没有读到文件末尾
{
//从文件中读一行
if (fgets(carrBuffer, sizeof(carrBuffer), fp) != NULL)
//统计每行词数
nWords += CountWord_Num(carrBuffer);
}
//关闭文件
fclose(fp);
return nWords;
}