机器人足球仿真第一次作业
機器人足球仿真第一次作業
機器人足球仿真是一門與RoboCup有關的一門課程,講到了有關球員的決策,球隊的開發等知識。
這是老師布置的第一次作業,基本任務就是解析字符串,其功能相當于uva中Prase的功能。
作業內容及要求
要求:編寫程序解析球員所看到和聽到的信息。
示例:(hear 1022 -30 passto(23,24))(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22
40 ) ((goal r) 12 20) ((Line r) -30))
輸出:
在 1022 周期 hear 從 -30 方向 聽到了 passto(23,24); 在 1022 周期 see Ball 距離我的 Direction 是 -20, Distance 是 20,DistChng 是 1,DirChng
是-2;player hfut 2 距離我的 Direction 是 45, Distance 是 23,DistChng 是 0.5,DirChng 是 1,它的 BodyDir 是 22 和 HeadDir 是 44;goal r 距離我的 Direction 是 12,Distance 是 20。
Line r 和我的角度是-30 度
不過這里我覺得示例輸出有些問題,因為信息的格式為
(hear Time Sender Message)
(see Time ObjInfo ObjInfo …)
ObjInfo 表示了可視對象的信息。其格式為:
(ObjName Direction Distance DirChng DistChng BodyDir HeadDir)
所以示例中的(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22 40 ) 其中 1 -2 以及 0.5 1 應分別為方向改變量,距離改變量。
解決思路
球員接收到的信息可分為“聽到的”“看到的”,聽到的信息為:傳來信息的人(即方向),和信息的內容;看到的信息又可以分為:球員信息,球的信息,球門信息,直線的信息。定義類將這些信息封裝,用類的成員函數對信息解析并輸出。
代碼
頭文件:
/*file: robocup2d1st.h brief:各個類的定義(接收到的信息類)*/#include<string> #include<algorithm> #include<vector> using namespace std;class Player{ //有關接收到的球員信息類public:Player(vector<char*> &vecChar);~Player();void showPlayer(); //打印接收到的球員的信息private:string playerName; //判斷是哪邊的球員double dirPlayer; //距離觀察者的相對方向double distPlayer; //距離觀察者的距離double dirChngPlayer; //方向的改變量double distChngPlayer; //距離的改變量double bodyDir; //該球員相對于觀察者身體的角度double headDir; //該球員相對于觀察者頭的角度 };class Ball{ //有關球的信息內容public:Ball(vector<char*> &vecChar);~Ball();void showBall(); //打印接收到的球的信息private:double dirBall; //球距離觀察者的相對方向double distBall; //球距離觀察者的距離double distChngBall; //球方向的改變量double dirChngBall; //球距離的改變量 };class Goal{ //有關球門的信息內容public:Goal(vector<char*> &vecChar);~Goal();void showGoal();private:string typeGoal; //判斷是哪邊的球門r or ldouble dirGoal; //球門與觀察者的相對方向double distGoal; //球門距離觀察者的距離 };class Line{ //有關線的信息內容public:Line(vector<char*> &vecChar);~Line();void showLine();private:string typeLine; //r or ldouble angleLine; //該線相對于觀察者的角度 };.cpp文件
/*file:robocup2d1st.cpp compiler: VS Code function: parsing information */ #include<iostream> #include<stdlib.h> #include"robocup2d1st.h"using namespace std;Player::Player(vector<char*> &vecChar){vector<char*>::iterator it;string s{"player"};it = find(vecChar.begin(), vecChar.end(), s);//若接收到的信息中沒有player的信息if(it == vecChar.end()) { cout<<"No information about player"<<endl;}else {it++;it++;playerName = *(it++);dirPlayer = atof(*(it++));distPlayer = atof(*(it++));dirChngPlayer = atof(*(it++));distChngPlayer = atof(*(it++));bodyDir = atof(*(it++));headDir = atof(*(it++));}}Player::~Player(){}void Player::showPlayer(){cout<<" player hfut "<<playerName<<"距離我的 Direction是 "<<dirPlayer<<",Distance 是"<<distPlayer<<",DirChng 是 "<<dirChngPlayer<<",DistChng 是 "<<distChngPlayer<<",它的 BodyDir 是 "<<bodyDir<<",HeadDir 是 "<<headDir<<";"; }Ball::Ball(vector<char*> &vecChar){vector<char*>::iterator it;string s{"ball"};it = find(vecChar.begin(), vecChar.end(), s);if(it == vecChar.end()){cout<<"No information about ball"<<endl;}else {it++;dirBall = atof(*(it++));distBall = atof(*(it++));dirChngBall = atof(*(it++));distChngBall = atof(*(it++));} }Ball::~Ball(){}void Ball::showBall(){cout<<"Ball 距離我的 Direction是 "<<dirBall<<",Distance 是 "<<distBall<<",DirChng 是 "<<dirChngBall<<",DistChng 是 "<<distChngBall; }Goal::Goal(vector<char*> &vecChar){vector<char*>::iterator it;string s{"goal"};it = find(vecChar.begin(), vecChar.end(), s);if(it == vecChar.end()) {cout<<"No information about goal"<<endl;}else {it++;typeGoal = *(it++);dirGoal = atof(*(it++));distGoal = atof(*(it++));} }void Goal::showGoal(){cout<<" goal "<<typeGoal<<"距離我的 Direction是 "<<dirGoal<<",Distance 是 "<<distGoal<<";"; }Goal::~Goal(){}Line::Line(vector<char*> &vecChar){vector<char*>::iterator it;string s{"Line"};it = find(vecChar.begin(), vecChar.end(), s);if(it == vecChar.end()) {cout<<"No information about Line"<<endl;}else {it++;typeLine = *(it++);angleLine = atof(*(it++));} }Line::~Line(){}void Line::showLine(){cout<<" Line "<<typeLine<<" 和我的角度是 "<<angleLine<<" 度"; }//用特定的分隔符分割字符串,并將分割后的字符串存儲在vector中 void cutString(char *ch, vector<char*> &vecChar){const char *mark = "( )";char *p = strtok(ch, mark);while(p){vecChar.push_back(p);p = strtok(NULL, mark);}return ; }//處理字符串 void dealWithStr(vector<char*> &vecChar){Player p(vecChar); //聲明各個信息類的對象Ball b(vecChar);Goal g(vecChar);Line l(vecChar);vector<char*>::iterator it = vecChar.begin();string s1{"hear"};it = find(vecChar.begin(), vecChar.end(), s1);//聽到的信息if(it == vecChar.end()) {cout<<"Didn't hear anything"<<endl; //若沒有聽到信息}else {it++;cout<<"在"<<*(it++)<<"周期 hear "<<"從"<<*(it++)<<"方向 聽到了 "<<*(it++)<<"("<<*(it++)<<")"<<endl;}string s2{"see"};it = find(vecChar.begin(), vecChar.end(), s2);//看到的信息if(it == vecChar.end()) {cout<<"Didn't see anything"<<endl; //若沒有看到信息}else {it++;cout<<"在"<<*(it++)<<"周期 see ";b.showBall();p.showPlayer();g.showGoal();l.showLine();}return ; }int main(){vector<char*> vecChar;char ch[2000] = "(hear 1022 -30 passto(23,24))(see 1022 ((ball) -20 20 1 -2) ((player hfut1 2) 45 23 0.5 1 22 40 ) ((goal r) 12 20) ((Line r) -30))";cutString(ch, vecChar);dealWithStr(vecChar);return 0; }輸出:(使用VS Code 編譯運行)
我的思路是把信息封裝到類里,這樣對于不同信息的處理方式就會比較相似,但是這種處理辦法也比較麻煩繁瑣,其實也可以直接處理字符串輸出。該思路僅供參考,歡迎大家指正!
總結
以上是生活随笔為你收集整理的机器人足球仿真第一次作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs setup project ,
- 下一篇: 动态网页设计(ASP)期末复习总结01