//========================================================================================== // ExecHolder::Execute() //========================================================================================== // - Command function override // - Holder "Autohold" state machine //========================================================================================== void ExecHolder::Execute() { Robot::holder->Execute(); switch(state){ case WAIT_FOR_BALL_TO_ENTER: WaitForBallToEnter(); break; case GO_TO_FORWARD_LIMIT: GoToForwardLimit(); break; case WAIT_FOR_PUSH_REQUEST: WaitForPushRequest(); break; case WAIT_FOR_BALL_TO_LEAVE: WaitForBallToLeave(); break; case GO_TO_REVERSE_LIMIT: GoToReverseLimit(); break; case REMOVE_BALL: RemoveBall(); break; case PUSH_ERROR: PushError(); break; } }
void Holder::AutoHold(){ switch(state){ case FIND_ZERO: FindZero(); break; case WAIT_FOR_BALL_TO_ENTER: WaitForBallToEnter(); break; case GO_TO_FORWARD_LIMIT: SetGateToForwardLimit(); break; case WAIT_FOR_PUSH_REQUEST: WaitForPushRequest(); break; case WAIT_FOR_BALL_TO_LEAVE: WaitForBallToLeave(); break; case GO_TO_REVERSE_LIMIT: SetGateToReverseLimit(); break; case BALL_PUSH_ERR: RemoveBall(); break; } }
int main() { int iCaseNum,i,j,k,l,iRemove,iScore,iRemX,iRemY,iCount,iRemain,iTemp; char cRemCol; scanf("%d",&iCaseNum); for(i=0;i<iCaseNum;i++) { for(j=0;j<10;j++) scanf("%s",cMap[j]); iScore=0; iCount=0; iRemain=150; printf("Game %d:\n\n",i+1); while(1) { iRemove=0; for(j=0;j<10;j++) for(k=0;k<15;k++) bVisit[j][k]=false; for(k=0;k<15;k++) for(j=9;j>=0;j--) { if(cMap[j][k]==' ' || bVisit[j][k]) continue; iTemp=CalBall(j,k,cMap[j][k],true); if(iTemp>iRemove) { iRemove=iTemp; iRemX=j; iRemY=k; cRemCol=cMap[j][k]; for(l=0;l<iRemove;l++) { pSame[l].iX=pTemp[l].iX; pSame[l].iY=pTemp[l].iY; } } } if(iRemove<2) break; RemoveBall(iRemX,iRemY,cRemCol,iRemove); iCount++; printf("Move %d at (%d,%d): removed %d balls of color %c, got %d points.\n",iCount,10-iRemX,iRemY+1,iRemove,cRemCol,(iRemove-2)*(iRemove-2)); iScore+=(iRemove-2)*(iRemove-2); iRemain-=iRemove; if(iRemain<2) break; } if(!iRemain) iScore+=1000; printf("Final score: %d, with %d balls remaining.\n\n",iScore,iRemain); } return 0; }