basictricks.cc

来自「该文件是包含了机器人足球比赛中的整个系统的代码」· CC 代码 · 共 231 行

CC
231
字号
// Bag of basic tricks
#include <math.h>
#include <iostream>
#include <stdarg.h>

#include "BasicTricks.h"
#include "KickSelecta.h"
#include "../Common/Common.h"
#include "../Globals.h"

using namespace std;

////////////////////////////////////////////////////////////////
// BEGIN KICK
BasicTricks::Kick::Kick(int t) {
  type = t;
  useHead = true;
  doEndKick = false;
  angle = 999;
}
BasicTricks::Kick::Kick(int t, bool uh) {
  type = t;
  useHead = uh;
  doEndKick = false;
  angle = 999;
}

BasicTricks::Kick::Kick(int t, bool uh, double ang) {
  type = t;
  useHead = uh;
  angle = ang;
  doEndKick = false;
}

int BasicTricks::Kick::Start() { 
  if (angle != 999) utils.Kick(type, useHead,angle);
  else utils.Kick(type, useHead);
  return 0;
}
int BasicTricks::Kick::Abort() {
  return 0;
}
int BasicTricks::Kick::Continue() {
  return 0;
}
bool BasicTricks::Kick::IsUsingHead() {
  return useHead;
}
char* BasicTricks::Kick::GetErrorMsg(int msg) {
  if (msg == 0) return "DONE_KICK";
  else if (msg == 1) return "DOING_KICK";
  return "KICK:NO_MESSAGE";
}
char* BasicTricks::Kick::GetName() {
  return "Kick";
}
// END KICK
////////////////////////////////////////////////////////////////
// BEGIN STEP
BasicTricks::Step::Step(int a,double b,double c,double d,double e,double f) {
  type=a;
  frontStrideLength=b;
  backStrideLength=c;
  turn=d;
  strafe=e;
  stepFrequency=f;
}
int BasicTricks::Step::Start() { 
  utils.Step(type, frontStrideLength, backStrideLength, turn, strafe, stepFrequency);
  //cout << "Step - Start" << endl << flush;
  return 0;
}
int BasicTricks::Step::Abort() {
  return 0;
}
int BasicTricks::Step::Continue() {
  return 0;
}
bool BasicTricks::Step::IsUsingHead() {
  return false;
}
char* BasicTricks::Step::GetErrorMsg(int msg) {
  if (msg == 0) return "DOING_STEP";
  return "STEP:NO_MESSAGE";
}
char* BasicTricks::Step::GetName() {
  return "Step";
}
// END STEP
////////////////////////////////////////////////////////////////
// BEGIN MULTITRICK
BasicTricks::MultiTrick::MultiTrick(int c, ...) {
  timer = false;
  count = c;
  tricks = (Trick**)malloc(sizeof(Trick*)*count);
  current = 0;
  previous = 0;
  hasRunStart = false;
  va_list args;
  va_start(args,c);
  for (int i = 0; i < count; i++) {
    tricks[i] = va_arg(args,Trick*);
  }
  va_end(args);
}
BasicTricks::MultiTrick::MultiTrick(bool _timer, int c, ...) {
  timer = _timer;
  count = c;
  tricks = (Trick**)malloc(sizeof(Trick*)*count);
  current = 0;
  previous = 0;
  hasRunStart = false;
  startFrame = frame_;
  va_list args;
  va_start(args,c);
  for (int i = 0; i < count; i++) {
    tricks[i] = va_arg(args,Trick*);
  }
  va_end(args);
}

BasicTricks::MultiTrick::~MultiTrick() {
  for (int i = 0; i < count; i++) {
    delete tricks[i];
  }
  free(tricks);
}
int BasicTricks::MultiTrick::Start() {
  int ret = tricks[current]->Start();
  previous = current;
  hasRunStart = true;

  if (ret < 1) {
    current++;
    hasRunStart = false;
    if (current == count) {
      if (timer) {
        long totalFrames = frame_-startFrame;
        cout << "Timed multiTrick took " << totalFrames << " frames." << endl << flush;
      }
      return ret;
    }
  }
  return (int)(ret+100);
}
int BasicTricks::MultiTrick::Abort() {
  return 0;
}
//FIXME i think we can run Start() earlier ?
int BasicTricks::MultiTrick::Continue() {
  if (hasRunStart == false) return Start();
  int ret = tricks[current]->Continue();
  previous = current;
  if (ret < -9999) { // Force an exit in multitrick !!!
    return ret;
  } 
  if (ret < 1) {
    current++;
    hasRunStart = true;
    if (current == count) {
      // multitrick completed.
      if (timer) {
        long totalFrames = frame_-startFrame;
        cout << "Timed multiTrick took " << totalFrames << " frames." << endl << flush;
      }
      return ret;
    }
    Start();
  }
  return (int)(ret+100);
}
bool BasicTricks::MultiTrick::IsUsingHead() {
  return tricks[current]->IsUsingHead();
}
char* BasicTricks::MultiTrick::GetErrorMsg(int msg) {
  if (msg > 50) {
    return tricks[previous]->GetErrorMsg(msg-100);
  } else {
    return tricks[previous]->GetErrorMsg(msg);
  }
  return "MULTITRICK:NO_MESSAGE";
}
char* BasicTricks::MultiTrick::GetName() {
  return "MultiTrick";
}

Trick* BasicTricks::MultiTrick::GetCurrentTrick() {
  if (current >= 0 && current < count) {
    return tricks[current];
  }
  return NULL;
}
// END MULTITRICK
////////////////////////////////////////////////////////////////

// BEGIN SELECTATRICK
BasicTricks::SelectaTrick::SelectaTrick(int _type) { 
  type = _type;
  currentTrick = NULL;
}
BasicTricks::SelectaTrick::~SelectaTrick() { 
  if (currentTrick != NULL) delete currentTrick;
}
int BasicTricks::SelectaTrick::Start() {
  return 1;
}
int BasicTricks::SelectaTrick::Abort() {
  currentTrick->Abort();
  return 0;
}
int BasicTricks::SelectaTrick::Continue() {
  if (currentTrick == NULL) {
    KickSelecta ks;
    currentTrick = ks.FastSelecta(wo_self_->x_, wo_self_->y_, wo_self_->heading_, type);
    currentTrick->Start();
  }
  int cC = currentTrick->Continue();
  return cC;
}
char* BasicTricks::SelectaTrick::GetErrorMsg(int msg) {
  return "SELECTATRICK:NO_MESSAGE";
}
char* BasicTricks::SelectaTrick::GetName() {
  return "SelectaTrick";
}

Trick* BasicTricks::SelectaTrick::GetCurrentTrick() {
  return currentTrick;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?