Exemplo n.º 1
0
signed int evaluateField(char f[SIZEX][SIZEY], char p) {
	unsigned char x,y,owner,otherplayer,otherfields;
	int score = 0;
	otherfields = 0;
	otherplayer = p == 1 ? 2 : 1;
	for(x = 0; x < SIZEX; ++x) {
		for(y = 0; y < SIZEY; ++y) {
			owner = getOwner(f, x, y);
			if(owner == p) {
				 // the more cells, the better, but prefer corners and edges
				score += 4 - getCapacity(x, y);
				// small bonus for fields that are ready to explode
				score += isCritical(f, x, y);
			} else {
				++otherfields;
			}
		}
	}
	 // endangered cells are dangerous...
	score -= (countEndangered(f, p) << 1);
	// ... unless they belong to the other player
	score += countEndangered(f, otherplayer);
	
	// REALLY reward if no cells are left to the other guy
	if(otherfields == 0) {
		score += 1000;
	}
	
	return score;
}
Exemplo n.º 2
0
void Node::markCritical() 
{
  if(!isCritical())
  { 
    mIsCriticalFlag = true; 
    getParentGraph()->addCriticalNode(this);
    if(getOriginalNode() != this)
      getOriginalNode()->markCritical();
  }
}
Exemplo n.º 3
0
static void notifyChFault(uint8_t ch) {
	char *msg = cmdBuff;
	uint8_t len = 0;

	// Format SMS message
	len = ee_getSmsText(msg, MAX_MSG_TEXT);

	len += snprintf(msg+len,
			CMD_BUFFER_SIZE-len,
			"\r\nAnomalia: CH%s(%hd)\r\nSemaforo: ",
			isCritical(ch) ? " CRITICO" : "",
			ch+1);
	if (controlCriticalFaulted()) {
		len += snprintf(cmdBuff+len,
				CMD_BUFFER_SIZE-len,
				"in LAMPEGGIO");
	} else if (controlGetFaultedMask()) {
		len += snprintf(cmdBuff+len,
				CMD_BUFFER_SIZE-len,
				"GUASTO");
	} else {
		// This should never happens
		len += snprintf(cmdBuff+len,
				CMD_BUFFER_SIZE-len,
				"RFN FAULT?");
	}

#if CONFIG_REPORT_FAULT_LEVELS
#warning Reporting FAULTS LEVELS enabled
	if (len+27 < CMD_BUFFER_SIZE) {
		len += snprintf(msg+len,
				CMD_BUFFER_SIZE-len,
				"\r\n"
				"P: %8ld => %8ld\r\n",
				chData[ch].Pmax, chData[ch].Prms);
	}
	if (len+25 < CMD_BUFFER_SIZE) {
		len += snprintf(msg+len,
				CMD_BUFFER_SIZE-len,
				"I: %8ld => %8ld\r\n",
				chData[ch].Imax, chData[ch].Irms);
	}
	if (len+25 < CMD_BUFFER_SIZE) {
		len += snprintf(msg+len,
				CMD_BUFFER_SIZE-len,
				"V: %8ld => %8ld\r\n",
				chData[ch].Vmax, chData[ch].Vrms);
	}
#endif

	// Send message by SMS to all enabled destination
	notifyAllBySMS(msg);

}
Exemplo n.º 4
0
void bustrophedon(int busIndex, robot *r) {
  while (!isCritical(r)) {
    if (canStepUpVirtual(r))
      stepUp(r);
    else if (canStepDownVirtual(r))
      stepDown(r);
    else if (canStepRightVirtual(r))
      stepRight(r);
    else
      stepLeft(r);
    
    r->map->tiles[r->posX][r->posY]->bustrophedonIndex = busIndex;
  }
}
Exemplo n.º 5
0
char computeDanger(char f[SIZEX][SIZEY], char p, char x, char y) {
	char tmp;
	char danger = 0;

	if(x > 0) {
		tmp = x - 1;
		if(getOwner(f, tmp, y) != p) danger += isCritical(f, tmp, y);
	}
	if(y > 0) {
		tmp = y - 1;
		if(getOwner(f, x, tmp) != p) danger += isCritical(f, x, tmp);
	}
	if(x < MAXX) {
		tmp = x + 1;
		if(getOwner(f, tmp, y) != p) danger += isCritical(f, tmp, y);
	}
	if(y < MAXY) {
		tmp = y + 1;
		if(getOwner(f, x, tmp) != p) danger += isCritical(f, x, tmp);
	}

	return danger;
}
Exemplo n.º 6
0
void ValidationMap::log(std::string logger) const {
    for (auto section_it = sections.begin(); section_it != sections.end(); ++section_it) {
        auto messages = section_it->second.getMessages();
        if (messages.empty())
            continue;

        if (isCritical()) {
            LOGN(ERROR, logger) << section_it->first << ":";
            for (auto it = messages.begin(); it != messages.end(); ++it)
                LOGN(ERROR, logger) << " - " << *it;
        } else {
            LOGN(WARNING, logger) << section_it->first << ":";
            for (auto it = messages.begin(); it != messages.end(); ++it)
                LOGN(WARNING, logger) << " - " << *it;
        }
    }
}
Exemplo n.º 7
0
int thinkAI() {
	unsigned char x,y,size,owner;
	signed int tmp,score;
	unsigned int result;
	
	enableTurbo();
	
	size = SIZEX * SIZEY;
	// compute the field score for the opposing player
	score = -32000;
	for(x = 0; x < SIZEX; ++x) {
		for(y = 0; y < SIZEY; ++y) {
			owner = getOwner(field, x, y);
			if(owner == PLAYERAI || owner == 0) {
				// we can use this cell
				memcpy(fieldAI, field, size); // create working copy
				tmp = 0;
				
				// it makes little sense to add atoms to endangered cells
				// unless they can start a chain reaction
				if(computeDanger(fieldAI, PLAYERAI, x, y) > 0 && isCritical(fieldAI, x, y) == 0) {
					tmp -= 10;
				}

				// let the reaction run
				putAtom(fieldAI, PLAYERAI, x, y, 0);
				react(fieldAI, 0);
				
				// evaluate the resulting field constellation
				tmp += evaluateField(fieldAI, PLAYERAI);

				if(tmp > score || (tmp == score && (rand() & 0x01))) {
					score = tmp;
					result = (x << 8) | y;
				}
			}
		}
	}
	
	disableTurbo();
	
	return result;
}