diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07f138c --- /dev/null +++ b/.gitignore @@ -0,0 +1,98 @@ +# Visual Studio Build Results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio Cache/Options +.vs/ +*.suo +*.user +*.userosscache +*.sln.docstates +*.vcxproj.user + +# Visual Studio Profiler +*.psess +*.vsp +*.vspx +*.sap + +# ReSharper +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# Build Results +[Bb]uild[Ll]og.* +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Visual C++ Cache Files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio Code +.vscode/ +*.code-workspace + +# Old Visual Studio Files +*.dsp +*.dsw +*.clw + +# Windows Image File Caches +Thumbs.db +ehthumbs.db + +# Folder Config File +Desktop.ini + +# Recycle Bin +$RECYCLE.BIN/ + +# Mac +.DS_Store + +# Temporary Files +*.swp +*~ diff --git a/MicroClient.aps b/MicroClient.aps deleted file mode 100644 index da3a2ec..0000000 Binary files a/MicroClient.aps and /dev/null differ diff --git a/MicroClient.clw b/MicroClient.clw deleted file mode 100644 index 229b6ab..0000000 --- a/MicroClient.clw +++ /dev/null @@ -1,154 +0,0 @@ -; CLW file contains information for the MFC ClassWizard - -[General Info] -Version=1 -LastClass=CMicroClientDoc -LastTemplate=CDialog -NewFileInclude1=#include "stdafx.h" -NewFileInclude2=#include "MicroClient.h" -LastPage=0 - -ClassCount=6 -Class1=CMicroClientApp -Class2=CMicroClientDoc -Class3=CMicroClientView -Class4=CMainFrame - -ResourceCount=5 -Resource1=IDD_DIALOG1 -Resource2=IDD_ABOUTBOX -Class5=CAboutDlg -Class6=DSetupDlg -Resource3=IDD_DIALOG1 (Chinese (P.R.C.)) -Resource4=IDD_ABOUTBOX (Chinese (P.R.C.)) -Resource5=IDR_MAINFRAME (English (U.S.)) - -[CLS:CMicroClientApp] -Type=0 -HeaderFile=MicroClient.h -ImplementationFile=MicroClient.cpp -Filter=N - -[CLS:CMicroClientDoc] -Type=0 -HeaderFile=MicroClientDoc.h -ImplementationFile=MicroClientDoc.cpp -Filter=N -BaseClass=CDocument -VirtualFilter=DC -LastObject=ID_CONNECT - -[CLS:CMicroClientView] -Type=0 -HeaderFile=MicroClientView.h -ImplementationFile=MicroClientView.cpp -Filter=C - - -[CLS:CMainFrame] -Type=0 -HeaderFile=MainFrm.h -ImplementationFile=MainFrm.cpp -Filter=T -LastObject=ID_DISCONNECT - - - - -[CLS:CAboutDlg] -Type=0 -HeaderFile=MicroClient.cpp -ImplementationFile=MicroClient.cpp -Filter=D -LastObject=CAboutDlg - -[DLG:IDD_ABOUTBOX] -Type=1 -Class=CAboutDlg -ControlCount=4 -Control1=IDC_STATIC,static,1342177283 -Control2=IDC_STATIC,static,1342308480 -Control3=IDC_STATIC,static,1342308352 -Control4=IDOK,button,1342373889 - -[DLG:IDD_DIALOG1] -Type=1 -Class=DSetupDlg -ControlCount=8 -Control1=IDOK,button,1342242817 -Control2=IDCANCEL,button,1342242816 -Control3=IDC_STATIC,static,1342308352 -Control4=IDC_TEAM,edit,1350631552 -Control5=IDC_STATIC,static,1342308352 -Control6=IDC_SERVER,edit,1350631552 -Control7=IDC_STATIC,static,1342308352 -Control8=IDC_CHANNEL,edit,1350631552 - -[CLS:DSetupDlg] -Type=0 -HeaderFile=DSetupDlg.h -ImplementationFile=DSetupDlg.cpp -BaseClass=CDialog -Filter=D -LastObject=DSetupDlg -VirtualFilter=dWC - -[MNU:IDR_MAINFRAME (English (U.S.))] -Type=1 -Class=CMainFrame -Command1=ID_FILE_NEW -Command2=ID_FILE_OPEN -Command3=ID_FILE_SAVE -Command4=ID_FILE_SAVE_AS -Command5=ID_APP_EXIT -Command6=ID_APP_ABOUT -CommandCount=6 - -[TB:IDR_MAINFRAME (English (U.S.))] -Type=1 -Class=CMainFrame -Command1=ID_CONNECT -Command2=ID_DISCONNECT -Command3=ID_APP_ABOUT -CommandCount=3 - -[ACL:IDR_MAINFRAME (English (U.S.))] -Type=1 -Class=CMainFrame -Command1=ID_FILE_NEW -Command2=ID_FILE_OPEN -Command3=ID_FILE_SAVE -Command4=ID_EDIT_UNDO -Command5=ID_EDIT_CUT -Command6=ID_EDIT_COPY -Command7=ID_EDIT_PASTE -Command8=ID_EDIT_UNDO -Command9=ID_EDIT_CUT -Command10=ID_EDIT_COPY -Command11=ID_EDIT_PASTE -Command12=ID_NEXT_PANE -Command13=ID_PREV_PANE -CommandCount=13 - -[DLG:IDD_DIALOG1 (Chinese (P.R.C.))] -Type=1 -Class=? -ControlCount=8 -Control1=IDOK,button,1342242817 -Control2=IDCANCEL,button,1342242816 -Control3=IDC_STATIC,static,1342308352 -Control4=IDC_TEAM,edit,1350631552 -Control5=IDC_STATIC,static,1342308352 -Control6=IDC_SERVER,edit,1350631552 -Control7=IDC_STATIC,static,1342308352 -Control8=IDC_CHANNEL,edit,1350631552 - -[DLG:IDD_ABOUTBOX (Chinese (P.R.C.))] -Type=1 -Class=? -ControlCount=4 -Control1=IDC_STATIC,static,1342177283 -Control2=IDC_STATIC,static,1342308480 -Control3=IDC_STATIC,static,1342308352 -Control4=IDOK,button,1342373889 - diff --git a/MicroClient.ncb b/MicroClient.ncb deleted file mode 100644 index de70b03..0000000 Binary files a/MicroClient.ncb and /dev/null differ diff --git a/MicroClient.suo b/MicroClient.suo deleted file mode 100644 index 675022b..0000000 Binary files a/MicroClient.suo and /dev/null differ diff --git a/MicroClient.vcproj b/MicroClient.vcproj index 4014913..c7e32b1 100644 --- a/MicroClient.vcproj +++ b/MicroClient.vcproj @@ -9,7 +9,7 @@ Keyword="MFCProj"> + Name="Win32" /> + DebugInformationFormat="4" /> + Name="VCCustomBuildTool" /> + TargetMachine="1" /> + HeaderFileName="" /> + Name="VCPostBuildEventTool" /> + Name="VCPreBuildEventTool" /> + Name="VCPreLinkEventTool" /> + Culture="2052" /> + Name="VCWebServiceProxyGeneratorTool" /> + Name="VCXMLDataGeneratorTool" /> + Name="VCWebDeploymentTool" /> + Name="VCManagedWrapperGeneratorTool" /> + Name="VCAuxiliaryManagedWrapperGeneratorTool" /> + SuppressStartupBanner="TRUE" /> + Name="VCCustomBuildTool" /> + TargetMachine="1" /> + HeaderFileName="" /> + Name="VCPostBuildEventTool" /> + Name="VCPreBuildEventTool" /> + Name="VCPreLinkEventTool" /> + Culture="2052" /> + Name="VCWebServiceProxyGeneratorTool" /> + Name="VCXMLDataGeneratorTool" /> + Name="VCWebDeploymentTool" /> + Name="VCManagedWrapperGeneratorTool" /> + Name="VCAuxiliaryManagedWrapperGeneratorTool" /> @@ -154,7 +154,7 @@ Name="VCCLCompilerTool" Optimization="0" PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> + BasicRuntimeChecks="3" /> @@ -162,7 +162,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -181,7 +181,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -200,7 +200,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -219,7 +219,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -238,7 +238,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -260,7 +260,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -279,7 +279,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + UsePrecompiledHeader="1" /> @@ -300,7 +300,7 @@ Optimization="2" PreprocessorDefinitions="" UsePrecompiledHeader="1" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -319,7 +319,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> + BasicRuntimeChecks="3" /> @@ -338,7 +338,7 @@ Name="VCCLCompilerTool" Optimization="2" PreprocessorDefinitions="" - BrowseInformation="1"/> + BrowseInformation="1" /> @@ -405,6 +405,6 @@ + Value="MicroClient.rc" /> - + \ No newline at end of file diff --git a/MicroClient.vcxproj b/MicroClient.vcxproj index 81d28bf..4053921 100644 --- a/MicroClient.vcxproj +++ b/MicroClient.vcxproj @@ -1,5 +1,6 @@  - + Debug @@ -41,10 +42,14 @@ - + - + @@ -58,16 +63,19 @@ AllRules.ruleset - AllRules.ruleset + + AllRules.ruleset - AllRules.ruleset + + AllRules.ruleset Disabled + $(ProjectDir)include;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -107,6 +115,7 @@ MaxSpeed OnlyExplicitInline + $(ProjectDir)include;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) true MultiThreadedDebug @@ -144,86 +153,106 @@ - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks Create MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) Create true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true - + Disabled - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) EnableFastChecks MaxSpeed - %(PreprocessorDefinitions) + + %(PreprocessorDefinitions) true @@ -231,18 +260,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/MicroClient.vcxproj.filters b/MicroClient.vcxproj.filters index 7b01e0d..61dc87e 100644 --- a/MicroClient.vcxproj.filters +++ b/MicroClient.vcxproj.filters @@ -15,34 +15,34 @@ - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files - + Source Files @@ -52,40 +52,40 @@ - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files diff --git a/MicroClient.vcxproj.user b/MicroClient.vcxproj.user deleted file mode 100644 index 695b5c7..0000000 --- a/MicroClient.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Contest-Rules-2024.pdf b/docs/Contest-Rules-2024.pdf similarity index 100% rename from Contest-Rules-2024.pdf rename to docs/Contest-Rules-2024.pdf diff --git a/Field Coordinates.jpg b/docs/Field Coordinates.jpg similarity index 100% rename from Field Coordinates.jpg rename to docs/Field Coordinates.jpg diff --git a/docs/STRUCTURE.md b/docs/STRUCTURE.md new file mode 100644 index 0000000..b600186 --- /dev/null +++ b/docs/STRUCTURE.md @@ -0,0 +1,178 @@ +# ATRI-2024 Repository Structure + +This document describes the reorganized file structure for the ATRI-2024 FIRA SimuroSot 11vs11 client repository. + +## Directory Structure + +``` +ATRI-2024/ +├── src/ # Source code files (.cpp) +│ ├── Agentsock.cpp # Socket communication implementation +│ ├── BaseAgent.cpp # Base agent class implementation +│ ├── DSetupDlg.cpp # Setup dialog implementation +│ ├── MainFrm.cpp # Main frame window implementation +│ ├── MicroClient.cpp # Main application implementation +│ ├── MicroClientDoc.cpp # Document class implementation +│ ├── MicroClientView.cpp # View class implementation +│ ├── StdAfx.cpp # Precompiled header source +│ ├── StrategySystem.cpp # Core strategy system implementation +│ └── TParseString.cpp # String parsing utilities +│ +├── include/ # Header files (.h) +│ ├── Agentsock.h # Socket communication interface +│ ├── BaseAgent.h # Base agent class interface +│ ├── DSetupDlg.h # Setup dialog interface +│ ├── General.h # General definitions and structures +│ ├── MainFrm.h # Main frame window interface +│ ├── MicroClient.h # Main application interface +│ ├── MicroClientDoc.h # Document class interface +│ ├── MicroClientView.h # View class interface +│ ├── Resource.h # Resource IDs +│ ├── StdAfx.h # Precompiled header +│ ├── StrategySystem.h # Strategy system interface +│ └── TParseString.h # String parsing utilities interface +│ +├── res/ # Resource files +│ ├── MicroClient.ico # Application icon +│ ├── MicroClient.rc2 # Additional resources +│ ├── MicroClientDoc.ico # Document icon +│ └── Toolbar.bmp # Toolbar bitmap +│ +├── docs/ # Documentation +│ ├── Contest-Rules-2024.pdf # Competition rules +│ └── Field Coordinates.jpg # Field coordinate system reference +│ +├── MicroClient.sln # Visual Studio solution file +├── MicroClient.vcxproj # Visual Studio project file (VS 2010+) +├── MicroClient.vcxproj.filters # Project filters +├── MicroClient.rc # Resource script +├── MicroClient.dsp # Legacy project file (VS 6.0) +├── MicroClient.dsw # Legacy workspace file (VS 6.0) +├── MicroClient.vcproj # Legacy project file (VS 2008) +├── .gitignore # Git ignore rules +├── README.md # Main documentation (English) +└── LICENSE # License file + +``` + +## Key Changes from Original Structure + +### Organization + +- **Source files** moved from root to `src/` directory +- **Header files** moved from root to `include/` directory +- **Documentation** moved to `docs/` directory +- **Resources** reorganized in `res/` directory (lowercase) + +### Project Configuration + +- Updated `MicroClient.vcxproj` to reference new file locations +- Added `include` directory to Additional Include Directories +- Updated `MicroClient.vcxproj.filters` to match new structure + +### New Files + +- **README.md**: Comprehensive English documentation +- **.gitignore**: Excludes build artifacts and temporary files +- **docs/STRUCTURE.md**: This file - documents repository organization + +### Removed from Git + +Build artifacts and temporary files (via .gitignore): + +- `*.suo`, `*.user` - User-specific Visual Studio files +- `*.aps`, `*.clw`, `*.ncb` - Build cache files +- `Debug/`, `Release/` - Build output directories + +## Building the Project + +The project can still be built using: + +- **Visual Studio 2010 or later**: Open `MicroClient.sln` +- **Visual Studio 6.0** (legacy): Open `MicroClient.dsw` + +The project files have been updated to automatically find source and header files in their new locations. + +## Core Components + +### Strategy System (`StrategySystem.cpp/h`) + +Main decision-making logic for the robot team: + +- Penalty kicks handling +- Free ball (争球) strategy +- Ball possession/offensive play +- Goalkeeper logic +- Dynamic formation management + +### Agent System (`BaseAgent.cpp/h`, `Agentsock.cpp/h`) + +Robot agent framework: + +- Base agent class for robot behavior +- Socket communication with simulation server +- Real-time data exchange + +### User Interface (`MicroClientView.cpp/h`, `MainFrm.cpp/h`) + +MFC-based graphical interface: + +- Game visualization +- Real-time monitoring +- Control panel + +### Configuration (`DSetupDlg.cpp/h`) + +Setup and configuration: + +- Connection settings +- Team configuration +- Strategy parameters + +## Development Guidelines + +### Adding New Files + +**Source files (.cpp)**: + +- Place in `src/` directory +- Add to `MicroClient.vcxproj` under `` +- Add to `MicroClient.vcxproj.filters` under Source Files filter + +**Header files (.h)**: + +- Place in `include/` directory +- Add to `MicroClient.vcxproj` under `` +- Add to `MicroClient.vcxproj.filters` under Header Files filter +- Include in source files as: `#include "filename.h"` (include directory is in path) + +**Resources**: + +- Place in `res/` directory +- Reference in `MicroClient.rc` as needed + +### Include Path + +The `include/` directory is automatically added to the compiler's include path, so headers can be included directly: + +```cpp +#include "StrategySystem.h" // Not #include "include/StrategySystem.h" +``` + +## License + +This project uses a custom Noncommercial No-Derivatives Software License (NCND-Software-1.0). + +- ✅ Free for non-commercial use (education, research, personal) +- ✅ Can use and distribute unmodified code +- ❌ No commercial use allowed +- ❌ No distribution of modified versions + +See [LICENSE](../LICENSE) file for complete terms. + +## Team + +Developed by ATRI (Ace Team of Robotics Intelligence) for the 2024 China Robot Competition & RoboCup China Open. + +- Team Leader: @xixu-me +- Members: @XIAOLingQ, @Wx-debug, @moxun333, @song-yaya, @huaxiaoshi, @biqianq, @isWorldEdit diff --git a/Agentsock.h b/include/Agentsock.h similarity index 96% rename from Agentsock.h rename to include/Agentsock.h index a920d75..4643fdd 100644 --- a/Agentsock.h +++ b/include/Agentsock.h @@ -1,27 +1,27 @@ -#ifndef __AGENTSOCK_H__ -#define __AGENTSOCK_H__ -class CAgentSocket : public CAsyncSocket { - DECLARE_DYNAMIC(CAgentSocket); - -public: - CAgentSocket(); - BOOL Create(UINT nSocketPort, LPCTSTR lpszSocketAddress); - BOOL Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress); - BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort); - int ReceiveFrom(void *lpBuf, int nBufLen, CString &rSocketAddress, UINT &rSocketPort, int nFlags); - int SendTo(const void *lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags); - - void SetPort(UINT port) { m_uiPort = port; }; - UINT GetPort(void) { return m_uiPort; }; - CString GetAddress(void) { return m_sSocketAddress; }; - -protected: - virtual void OnReceive(int nErrorCode); - -private: - SOCKADDR_IN sockAddr; - UINT m_uiPort; - CString m_sSocketAddress; -}; - -#endif // __AGENTSOCK_H__ +#ifndef __AGENTSOCK_H__ +#define __AGENTSOCK_H__ +class CAgentSocket : public CAsyncSocket { + DECLARE_DYNAMIC(CAgentSocket); + +public: + CAgentSocket(); + BOOL Create(UINT nSocketPort, LPCTSTR lpszSocketAddress); + BOOL Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress); + BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort); + int ReceiveFrom(void *lpBuf, int nBufLen, CString &rSocketAddress, UINT &rSocketPort, int nFlags); + int SendTo(const void *lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags); + + void SetPort(UINT port) { m_uiPort = port; }; + UINT GetPort(void) { return m_uiPort; }; + CString GetAddress(void) { return m_sSocketAddress; }; + +protected: + virtual void OnReceive(int nErrorCode); + +private: + SOCKADDR_IN sockAddr; + UINT m_uiPort; + CString m_sSocketAddress; +}; + +#endif // __AGENTSOCK_H__ diff --git a/BaseAgent.h b/include/BaseAgent.h similarity index 83% rename from BaseAgent.h rename to include/BaseAgent.h index 77f073a..3be2401 100644 --- a/BaseAgent.h +++ b/include/BaseAgent.h @@ -1,59 +1,59 @@ -// BaseAgent.h: interface for the CBaseAgent class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_) -#define AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 - -#include "Agentsock.h" -class CMicroClientDoc; -class CBaseAgent : public CAgentSocket { -public: - CBaseAgent(); - CBaseAgent(CMicroClientDoc *m_pDoc); - virtual ~CBaseAgent(); - BOOL ConnectAgent(LPCTSTR lpszTeam, LPCTSTR lpszServer, UINT nPort); - void DisconnectAgent(void); - - // communication functions - virtual void OnReceive(int nErrorCode); - void SendMsg(CString &strText); - - // overridables - virtual void OnCreatedSocket(); - virtual void OnSentMessage(LPCTSTR message){}; - virtual void OnReceivedMessage(LPCTSTR message){}; - - virtual void OnErrorCreatingSocket(){}; - virtual void OnErrorSendingMessage(){}; - virtual void OnErrorReceivingMessage(){}; - // the agents actions - - // attribute fuctions - BOOL IsConnected() { return m_bConnected; }; - void SetSide(int side) { m_iSide = side; }; - -protected: - CString m_strTeam; // name of the team the player is in - int m_iSide; // side on which playing - int m_iNumber; // number of the player - - BOOL m_bConnected; // true, if the agent is currently connected -public: - void SendCommand(); - CString teamname; - BOOL ParseObject(LPCTSTR str); - int m_iTime; - void ParseSee(LPCTSTR str); - int m_iPlayMode; - void ParseInit(LPCTSTR str); - void ParseMessage(LPCTSTR str); - CMicroClientDoc *m_pDoc; - send_to_team teaminfo; -}; - -#endif // !defined(AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_) +// BaseAgent.h: interface for the CBaseAgent class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_) +#define AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include "Agentsock.h" +class CMicroClientDoc; +class CBaseAgent : public CAgentSocket { +public: + CBaseAgent(); + CBaseAgent(CMicroClientDoc *m_pDoc); + virtual ~CBaseAgent(); + BOOL ConnectAgent(LPCTSTR lpszTeam, LPCTSTR lpszServer, UINT nPort); + void DisconnectAgent(void); + + // communication functions + virtual void OnReceive(int nErrorCode); + void SendMsg(CString &strText); + + // overridables + virtual void OnCreatedSocket(); + virtual void OnSentMessage(LPCTSTR message) {}; + virtual void OnReceivedMessage(LPCTSTR message) {}; + + virtual void OnErrorCreatingSocket() {}; + virtual void OnErrorSendingMessage() {}; + virtual void OnErrorReceivingMessage() {}; + // the agents actions + + // attribute fuctions + BOOL IsConnected() { return m_bConnected; }; + void SetSide(int side) { m_iSide = side; }; + +protected: + CString m_strTeam; // name of the team the player is in + int m_iSide; // side on which playing + int m_iNumber; // number of the player + + BOOL m_bConnected; // true, if the agent is currently connected +public: + void SendCommand(); + CString teamname; + BOOL ParseObject(LPCTSTR str); + int m_iTime; + void ParseSee(LPCTSTR str); + int m_iPlayMode; + void ParseInit(LPCTSTR str); + void ParseMessage(LPCTSTR str); + CMicroClientDoc *m_pDoc; + send_to_team teaminfo; +}; + +#endif // !defined(AFX_BASEAGENT_H__7FCEA561_5114_11D1_B242_0000C09B5CBE__INCLUDED_) diff --git a/DSetupDlg.h b/include/DSetupDlg.h similarity index 96% rename from DSetupDlg.h rename to include/DSetupDlg.h index 695f156..38a1b81 100644 --- a/DSetupDlg.h +++ b/include/DSetupDlg.h @@ -1,46 +1,46 @@ -#if !defined(AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_) -#define AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -// DSetupDlg.h : header file -// - -///////////////////////////////////////////////////////////////////////////// -// DSetupDlg dialog - -class DSetupDlg : public CDialog { - // Construction -public: - DSetupDlg(CWnd *pParent = NULL); // standard constructor - - // Dialog Data - //{{AFX_DATA(DSetupDlg) - enum { IDD = IDD_DIALOG1 }; - - //}}AFX_DATA - - // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(DSetupDlg) -protected: - virtual void DoDataExchange(CDataExchange *pDX); // DDX/DDV support - //}}AFX_VIRTUAL -public: - CString m_TeamName; - CString m_ServerName; - UINT m_Channel; - // Implementation -protected: - // Generated message map functions - //{{AFX_MSG(DSetupDlg) - // NOTE: the ClassWizard will add member functions here - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_) +#if !defined(AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_) +#define AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +// DSetupDlg.h : header file +// + +///////////////////////////////////////////////////////////////////////////// +// DSetupDlg dialog + +class DSetupDlg : public CDialog { + // Construction +public: + DSetupDlg(CWnd *pParent = NULL); // standard constructor + + // Dialog Data + //{{AFX_DATA(DSetupDlg) + enum { IDD = IDD_DIALOG1 }; + + //}}AFX_DATA + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(DSetupDlg) +protected: + virtual void DoDataExchange(CDataExchange *pDX); // DDX/DDV support + //}}AFX_VIRTUAL +public: + CString m_TeamName; + CString m_ServerName; + UINT m_Channel; + // Implementation +protected: + // Generated message map functions + //{{AFX_MSG(DSetupDlg) + // NOTE: the ClassWizard will add member functions here + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_DSETUPDLG_H__AF3ADFE0_2D54_11D4_8C19_000021D262EF__INCLUDED_) diff --git a/General.h b/include/General.h similarity index 95% rename from General.h rename to include/General.h index 0886979..5fcc5b2 100644 --- a/General.h +++ b/include/General.h @@ -1,145 +1,145 @@ -///////////////////////////////////////////////////////////////// -#define BORDERNUM 18 -///////////////////////////////////////////////////////////////// -#define HIT_LEFTGOAL 0 -#define HIT_RIGHTGOAL 1 -#define HIT_UPBORDER 2 -#define HIT_DOWNBORDER 3 -#define HIT_LEFT_GOAL_UPBORDER 4 -#define HIT_LEFT_GOAL_DOWNBORDER 5 -#define HIT_RIGHT_GOAL_UPBORDER 6 -#define HIT_RIGHT_GOAL_DOWNBORDER 7 -#define HIT_LEFT_UPBORDER 8 -#define HIT_LEFT_DOWNBORDER 9 -#define HIT_RIGHT_UPBORDER 10 -#define HIT_RIGHT_DOWNBORDER 11 -#define HIT_LEFT_GOALBORDER 12 -#define HIT_RIGHT_GOALBORDER 13 -#define HIT_LEFTUPCORNER 14 -#define HIT_LEFTDOWNCORNER 15 -#define HIT_RIGHTDOWNCORNER 16 -#define HIT_RIGHTUPCORNER 17 -#define HIT_YH1 18 -#define HIT_YH2 19 -#define HIT_YHG 20 -#define HIT_BH1 21 -#define HIT_BH2 22 -#define HIT_BHG 23 -#define HIT_BALL 24 -///////////////////////////////////////////////////////////////// -#define FRONT 0 -#define RIGHT 1 -#define BACK 2 -#define LEFT 3 -/////////////////////////////////////////////////////////////////// -#define BALL 0 -#define HOME1 1 -#define HOME2 2 -#define HOME3 3 -#define HOME4 4 -#define HOME5 5 -#define HOME6 6 -#define HOME7 7 -#define HOME8 8 -#define HOME9 9 -#define HOME10 10 -#define HGOALIE 11 -#define C_GO 0xaa -#define C_STOP 0x55 -#define G_OFFSET 20 // 15 -#define G_ANGLE_BOUND 60 -#define G_BOUND_BOUND 10 -/////////////////////////////////////////////////////////////////// -// 所在半场 -#define GAME_RIGHT 0 -#define GAME_LEFT 1 -//////////////////////////////////////////////////////////////////// - -#define PI 3.14 -#define M_PI PI -#define square(a) ((a) * (a)) -#define leng(a, b, c, d) sqrt(square((a) - (c)) + square((b) - (d))) -#define pleng(a, b) sqrt(square((a.x) - (b.x)) + square((a.y) - (b.y))) -////////////////////////////////////////// -#define Atan(y, x) ((x == 0.0 && y == 0.0) ? (0.0) : atan2(y, x)) -#define RAD2DEG (180.0 / PI) -#define DEG2RAD (PI / 180.0) -#define Rad2Deg(a) ((double)a * RAD2DEG) -#define Deg2Rad(a) ((double)a * DED2RAD) -#define ABS(a) ((a) < 0 ? -(a) : (a)) -///////////////////////////////////////////////////////////// -union CCommand { - BYTE Stream[3]; - struct tagData { - char Lv; - char Rv; - char Command; - } Data; - CCommand &operator=(CCommand &r) { - Data.Lv = r.Data.Lv; - Data.Rv = r.Data.Rv; - Data.Command = r.Data.Command; - return *this; - } -}; - -struct Robot1 { - int angle; - int sAngle; - CPoint angleRef; - CPoint sAngleRef; - CPoint position, oldPosition; - CPoint sPosition, sOldPosition; - int nMethod; - BYTE color[6]; - BOOL bAlive; - - Robot1(){}; - BOOL find() { return TRUE; }; - BOOL entireFind() { return TRUE; }; - BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; }; -}; - -struct Robot2 { - int angle; - int sAngle; - CPoint position, oldPosition; - CPoint sPosition, sOldPosition; - CPoint pos, oldPos, pos1, oldPos1; - int nMethod; - BYTE color[6]; - BOOL bAlive; - BYTE teamColor[6]; - - Robot2(){}; - BOOL find() { return TRUE; }; - BOOL entireFind() { return TRUE; }; - BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; }; -}; - -struct Robot3 { - CPoint position1, oldPosition1; - CPoint sPosition1, sOldPosition1; - CPoint position2, oldPosition2; - CPoint sPosition2, sOldPosition2; - CPoint position3, oldPosition3; - CPoint position4, oldPosition4; - CPoint position5, oldPosition5; - CPoint sPosition3, sOldPosition3; - CPoint position6, oldPosition6; - CPoint position7, oldPosition7; - CPoint position8, oldPosition8; - CPoint position9, oldPosition9; - CPoint position10, oldPosition10; - CPoint position11, oldPosition11; - int nMethod; - BYTE color[6]; - BOOL bAlive; - - Robot3(){}; - BOOL find1() { return TRUE; } - BOOL find2() { return TRUE; } - BOOL find3() { return TRUE; } - BOOL entireFind() { return TRUE; } - BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; } -}; +///////////////////////////////////////////////////////////////// +#define BORDERNUM 18 +///////////////////////////////////////////////////////////////// +#define HIT_LEFTGOAL 0 +#define HIT_RIGHTGOAL 1 +#define HIT_UPBORDER 2 +#define HIT_DOWNBORDER 3 +#define HIT_LEFT_GOAL_UPBORDER 4 +#define HIT_LEFT_GOAL_DOWNBORDER 5 +#define HIT_RIGHT_GOAL_UPBORDER 6 +#define HIT_RIGHT_GOAL_DOWNBORDER 7 +#define HIT_LEFT_UPBORDER 8 +#define HIT_LEFT_DOWNBORDER 9 +#define HIT_RIGHT_UPBORDER 10 +#define HIT_RIGHT_DOWNBORDER 11 +#define HIT_LEFT_GOALBORDER 12 +#define HIT_RIGHT_GOALBORDER 13 +#define HIT_LEFTUPCORNER 14 +#define HIT_LEFTDOWNCORNER 15 +#define HIT_RIGHTDOWNCORNER 16 +#define HIT_RIGHTUPCORNER 17 +#define HIT_YH1 18 +#define HIT_YH2 19 +#define HIT_YHG 20 +#define HIT_BH1 21 +#define HIT_BH2 22 +#define HIT_BHG 23 +#define HIT_BALL 24 +///////////////////////////////////////////////////////////////// +#define FRONT 0 +#define RIGHT 1 +#define BACK 2 +#define LEFT 3 +/////////////////////////////////////////////////////////////////// +#define BALL 0 +#define HOME1 1 +#define HOME2 2 +#define HOME3 3 +#define HOME4 4 +#define HOME5 5 +#define HOME6 6 +#define HOME7 7 +#define HOME8 8 +#define HOME9 9 +#define HOME10 10 +#define HGOALIE 11 +#define C_GO 0xaa +#define C_STOP 0x55 +#define G_OFFSET 20 // 15 +#define G_ANGLE_BOUND 60 +#define G_BOUND_BOUND 10 +/////////////////////////////////////////////////////////////////// +// 所在半场 +#define GAME_RIGHT 0 +#define GAME_LEFT 1 +//////////////////////////////////////////////////////////////////// + +#define PI 3.14 +#define M_PI PI +#define square(a) ((a) * (a)) +#define leng(a, b, c, d) sqrt(square((a) - (c)) + square((b) - (d))) +#define pleng(a, b) sqrt(square((a.x) - (b.x)) + square((a.y) - (b.y))) +////////////////////////////////////////// +#define Atan(y, x) ((x == 0.0 && y == 0.0) ? (0.0) : atan2(y, x)) +#define RAD2DEG (180.0 / PI) +#define DEG2RAD (PI / 180.0) +#define Rad2Deg(a) ((double)a * RAD2DEG) +#define Deg2Rad(a) ((double)a * DED2RAD) +#define ABS(a) ((a) < 0 ? -(a) : (a)) +///////////////////////////////////////////////////////////// +union CCommand { + BYTE Stream[3]; + struct tagData { + char Lv; + char Rv; + char Command; + } Data; + CCommand &operator=(CCommand &r) { + Data.Lv = r.Data.Lv; + Data.Rv = r.Data.Rv; + Data.Command = r.Data.Command; + return *this; + } +}; + +struct Robot1 { + int angle; + int sAngle; + CPoint angleRef; + CPoint sAngleRef; + CPoint position, oldPosition; + CPoint sPosition, sOldPosition; + int nMethod; + BYTE color[6]; + BOOL bAlive; + + Robot1() {}; + BOOL find() { return TRUE; }; + BOOL entireFind() { return TRUE; }; + BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; }; +}; + +struct Robot2 { + int angle; + int sAngle; + CPoint position, oldPosition; + CPoint sPosition, sOldPosition; + CPoint pos, oldPos, pos1, oldPos1; + int nMethod; + BYTE color[6]; + BOOL bAlive; + BYTE teamColor[6]; + + Robot2() {}; + BOOL find() { return TRUE; }; + BOOL entireFind() { return TRUE; }; + BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; }; +}; + +struct Robot3 { + CPoint position1, oldPosition1; + CPoint sPosition1, sOldPosition1; + CPoint position2, oldPosition2; + CPoint sPosition2, sOldPosition2; + CPoint position3, oldPosition3; + CPoint position4, oldPosition4; + CPoint position5, oldPosition5; + CPoint sPosition3, sOldPosition3; + CPoint position6, oldPosition6; + CPoint position7, oldPosition7; + CPoint position8, oldPosition8; + CPoint position9, oldPosition9; + CPoint position10, oldPosition10; + CPoint position11, oldPosition11; + int nMethod; + BYTE color[6]; + BOOL bAlive; + + Robot3() {}; + BOOL find1() { return TRUE; } + BOOL find2() { return TRUE; } + BOOL find3() { return TRUE; } + BOOL entireFind() { return TRUE; } + BOOL entireFind(BYTE *lpY, BYTE *lpU, BYTE *lpV) { return TRUE; } +}; diff --git a/MainFrm.h b/include/MainFrm.h similarity index 96% rename from MainFrm.h rename to include/MainFrm.h index a682bb0..418b5d0 100644 --- a/MainFrm.h +++ b/include/MainFrm.h @@ -1,55 +1,55 @@ -// MainFrm.h : interface of the CMainFrame class -// -///////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_) -#define AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -class CMainFrame : public CFrameWnd { - -protected: // create from serialization only - CMainFrame(); - DECLARE_DYNCREATE(CMainFrame) - - // Attributes -public: - // Operations -public: - // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMainFrame) - virtual BOOL PreCreateWindow(CREATESTRUCT &cs); - //}}AFX_VIRTUAL - - // Implementation -public: - virtual ~CMainFrame(); -#ifdef _DEBUG - virtual void AssertValid() const; - virtual void Dump(CDumpContext &dc) const; -#endif - -protected: // control bar embedded members - CStatusBar m_wndStatusBar; - CToolBar m_wndToolBar; - - // Generated message map functions -protected: - //{{AFX_MSG(CMainFrame) - afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_) +// MainFrm.h : interface of the CMainFrame class +// +///////////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_) +#define AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +class CMainFrame : public CFrameWnd { + +protected: // create from serialization only + CMainFrame(); + DECLARE_DYNCREATE(CMainFrame) + + // Attributes +public: + // Operations +public: + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMainFrame) + virtual BOOL PreCreateWindow(CREATESTRUCT &cs); + //}}AFX_VIRTUAL + + // Implementation +public: + virtual ~CMainFrame(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext &dc) const; +#endif + +protected: // control bar embedded members + CStatusBar m_wndStatusBar; + CToolBar m_wndToolBar; + + // Generated message map functions +protected: + //{{AFX_MSG(CMainFrame) + afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_MAINFRM_H__801AABE9_2D67_11D4_A201_00400564C758__INCLUDED_) diff --git a/MicroClient.h b/include/MicroClient.h similarity index 96% rename from MicroClient.h rename to include/MicroClient.h index 7fa3ae5..4c06085 100644 --- a/MicroClient.h +++ b/include/MicroClient.h @@ -1,47 +1,47 @@ -// MicroClient.h : main header file for the MICROCLIENT application -// - -#if !defined(AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_) -#define AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#ifndef __AFXWIN_H__ -#error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientApp: -// See MicroClient.cpp for the implementation of this class -// - -class CMicroClientApp : public CWinApp { -public: - CMicroClientApp(); - - // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMicroClientApp) -public: - virtual BOOL InitInstance(); - //}}AFX_VIRTUAL - - // Implementation - //{{AFX_MSG(CMicroClientApp) - afx_msg void OnAppAbout(); - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_) +// MicroClient.h : main header file for the MICROCLIENT application +// + +#if !defined(AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_) +#define AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#ifndef __AFXWIN_H__ +#error include 'stdafx.h' before including this file for PCH +#endif + +#include "resource.h" // main symbols + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientApp: +// See MicroClient.cpp for the implementation of this class +// + +class CMicroClientApp : public CWinApp { +public: + CMicroClientApp(); + + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMicroClientApp) +public: + virtual BOOL InitInstance(); + //}}AFX_VIRTUAL + + // Implementation + //{{AFX_MSG(CMicroClientApp) + afx_msg void OnAppAbout(); + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code ! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_MICROCLIENT_H__801AABE5_2D67_11D4_A201_00400564C758__INCLUDED_) diff --git a/MicroClientDoc.h b/include/MicroClientDoc.h similarity index 96% rename from MicroClientDoc.h rename to include/MicroClientDoc.h index 10a0e85..f383bd0 100644 --- a/MicroClientDoc.h +++ b/include/MicroClientDoc.h @@ -1,56 +1,56 @@ -// MicroClientDoc.h : interface of the CMicroClientDoc class -// -///////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_) -#define AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 -class CBaseAgent; -class CMicroClientDoc : public CDocument { -protected: // create from serialization only - CMicroClientDoc(); - DECLARE_DYNCREATE(CMicroClientDoc) - - // Attributes -public: - CBaseAgent *m_pAgent; - - // Operations -public: - // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMicroClientDoc) -public: - virtual BOOL OnNewDocument(); - virtual void Serialize(CArchive &ar); - //}}AFX_VIRTUAL - - // Implementation -public: - virtual ~CMicroClientDoc(); -#ifdef _DEBUG - virtual void AssertValid() const; - virtual void Dump(CDumpContext &dc) const; -#endif - -protected: - // Generated message map functions -protected: - //{{AFX_MSG(CMicroClientDoc) - afx_msg void OnConnect(); - afx_msg void OnUpdateConnect(CCmdUI *pCmdUI); - afx_msg void OnDisconnect(); - afx_msg void OnUpdateDisconnect(CCmdUI *pCmdUI); - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_) +// MicroClientDoc.h : interface of the CMicroClientDoc class +// +///////////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_) +#define AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 +class CBaseAgent; +class CMicroClientDoc : public CDocument { +protected: // create from serialization only + CMicroClientDoc(); + DECLARE_DYNCREATE(CMicroClientDoc) + + // Attributes +public: + CBaseAgent *m_pAgent; + + // Operations +public: + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMicroClientDoc) +public: + virtual BOOL OnNewDocument(); + virtual void Serialize(CArchive &ar); + //}}AFX_VIRTUAL + + // Implementation +public: + virtual ~CMicroClientDoc(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext &dc) const; +#endif + +protected: + // Generated message map functions +protected: + //{{AFX_MSG(CMicroClientDoc) + afx_msg void OnConnect(); + afx_msg void OnUpdateConnect(CCmdUI *pCmdUI); + afx_msg void OnDisconnect(); + afx_msg void OnUpdateDisconnect(CCmdUI *pCmdUI); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_MICROCLIENTDOC_H__801AABEB_2D67_11D4_A201_00400564C758__INCLUDED_) diff --git a/MicroClientView.h b/include/MicroClientView.h similarity index 96% rename from MicroClientView.h rename to include/MicroClientView.h index 6656688..f449a65 100644 --- a/MicroClientView.h +++ b/include/MicroClientView.h @@ -1,60 +1,60 @@ -// MicroClientView.h : interface of the CMicroClientView class -// -///////////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_) -#define AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -class CMicroClientView : public CView { -protected: // create from serialization only - CMicroClientView(); - DECLARE_DYNCREATE(CMicroClientView) - - // Attributes -public: - CMicroClientDoc *GetDocument(); - - // Operations -public: - // Overrides - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CMicroClientView) -public: - virtual void OnDraw(CDC *pDC); // overridden to draw this view - virtual BOOL PreCreateWindow(CREATESTRUCT &cs); - -protected: - //}}AFX_VIRTUAL - - // Implementation -public: - virtual ~CMicroClientView(); -#ifdef _DEBUG - virtual void AssertValid() const; - virtual void Dump(CDumpContext &dc) const; -#endif - -protected: - // Generated message map functions -protected: - //{{AFX_MSG(CMicroClientView) - // NOTE - the ClassWizard will add and remove member functions here. - // DO NOT EDIT what you see in these blocks of generated code ! - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -#ifndef _DEBUG // debug version in MicroClientView.cpp -inline CMicroClientDoc *CMicroClientView::GetDocument() { return (CMicroClientDoc *)m_pDocument; } -#endif - -///////////////////////////////////////////////////////////////////////////// - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_) +// MicroClientView.h : interface of the CMicroClientView class +// +///////////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_) +#define AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +class CMicroClientView : public CView { +protected: // create from serialization only + CMicroClientView(); + DECLARE_DYNCREATE(CMicroClientView) + + // Attributes +public: + CMicroClientDoc *GetDocument(); + + // Operations +public: + // Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CMicroClientView) +public: + virtual void OnDraw(CDC *pDC); // overridden to draw this view + virtual BOOL PreCreateWindow(CREATESTRUCT &cs); + +protected: + //}}AFX_VIRTUAL + + // Implementation +public: + virtual ~CMicroClientView(); +#ifdef _DEBUG + virtual void AssertValid() const; + virtual void Dump(CDumpContext &dc) const; +#endif + +protected: + // Generated message map functions +protected: + //{{AFX_MSG(CMicroClientView) + // NOTE - the ClassWizard will add and remove member functions here. + // DO NOT EDIT what you see in these blocks of generated code ! + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +#ifndef _DEBUG // debug version in MicroClientView.cpp +inline CMicroClientDoc *CMicroClientView::GetDocument() { return (CMicroClientDoc *)m_pDocument; } +#endif + +///////////////////////////////////////////////////////////////////////////// + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_MICROCLIENTVIEW_H__801AABED_2D67_11D4_A201_00400564C758__INCLUDED_) diff --git a/RESOURCE.H b/include/RESOURCE.H similarity index 96% rename from RESOURCE.H rename to include/RESOURCE.H index f0601b1..7b57996 100644 --- a/RESOURCE.H +++ b/include/RESOURCE.H @@ -1,26 +1,26 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by MicroClient.rc -// -#define IDD_ABOUTBOX 100 -#define IDP_SOCKETS_INIT_FAILED 104 -#define IDR_MAINFRAME 128 -#define IDR_MICROCTYPE 129 -#define IDD_DIALOG1 130 -#define IDC_TEAM 1000 -#define IDC_SERVER 1001 -#define IDC_CHANNEL 1002 -#define ID_CONNECT 32771 -#define ID_DISCONNECT 32772 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 131 -#define _APS_NEXT_COMMAND_VALUE 32773 -#define _APS_NEXT_CONTROL_VALUE 1003 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by MicroClient.rc +// +#define IDD_ABOUTBOX 100 +#define IDP_SOCKETS_INIT_FAILED 104 +#define IDR_MAINFRAME 128 +#define IDR_MICROCTYPE 129 +#define IDD_DIALOG1 130 +#define IDC_TEAM 1000 +#define IDC_SERVER 1001 +#define IDC_CHANNEL 1002 +#define ID_CONNECT 32771 +#define ID_DISCONNECT 32772 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_3D_CONTROLS 1 +#define _APS_NEXT_RESOURCE_VALUE 131 +#define _APS_NEXT_COMMAND_VALUE 32773 +#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/StdAfx.h b/include/StdAfx.h similarity index 96% rename from StdAfx.h rename to include/StdAfx.h index ab7f791..455ef0f 100644 --- a/StdAfx.h +++ b/include/StdAfx.h @@ -1,49 +1,49 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_) -#define AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#include // MFC core and standard components -#include // MFC extensions -#include // MFC Automation classes -#include // MFC support for Internet Explorer 4 Common Controls -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - -#include // MFC socket extensions -#include - -#define LEFT_TO_RIGHT 0 -#define RIGHT_TO_LEFT 1 -#define MAX_PLAYER 3 -#define OWN_TEAM 0 -#define OTHER_TEAM 1 - -typedef struct pos_t { - short enable; - short side; - short unum; - short angle; - short x; - short y; -} pos_t; - -typedef struct send_to_team { - pos_t pos[MAX_PLAYER * 2]; - -} send_to_team; - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_) +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_) +#define AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers + +#include // MFC core and standard components +#include // MFC extensions +#include // MFC Automation classes +#include // MFC support for Internet Explorer 4 Common Controls +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // MFC socket extensions +#include + +#define LEFT_TO_RIGHT 0 +#define RIGHT_TO_LEFT 1 +#define MAX_PLAYER 3 +#define OWN_TEAM 0 +#define OTHER_TEAM 1 + +typedef struct pos_t { + short enable; + short side; + short unum; + short angle; + short x; + short y; +} pos_t; + +typedef struct send_to_team { + pos_t pos[MAX_PLAYER * 2]; + +} send_to_team; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__801AABE7_2D67_11D4_A201_00400564C758__INCLUDED_) diff --git a/StrategySystem.h b/include/StrategySystem.h similarity index 85% rename from StrategySystem.h rename to include/StrategySystem.h index 0feb2a2..dd52157 100644 --- a/StrategySystem.h +++ b/include/StrategySystem.h @@ -1,109 +1,109 @@ -#include "general.h" - -#ifndef _INSIDE_VISUAL_CPP_STRATEGYSYSTEM -#define _INSIDE_VISUAL_CPP_STRATEGYSYSTEM - -// 阵型球员相对中央球员的位置结构体 -struct RelPos { - int id; - double dis; - double ang; -}; - -class CStrategySystem : public CObject { - DECLARE_DYNAMIC(CStrategySystem) -public: - void Action(); - // ~CStrategySystem(); - CStrategySystem(int id); - void ReceiveData(Robot1 bal, Robot2 ho1, Robot2 ho2, Robot2 ho3, Robot2 ho4, - Robot2 ho5, Robot2 ho6, Robot2 ho7, Robot2 ho8, Robot2 ho9, - Robot2 ho10, Robot2 hgo, Robot3 opp); - -#ifdef _DEBUG -#endif // _DEBUG -private: - void Penalty(); // 罚球 - void Freeball(); // 争球 - void Possession(); // 控球 - void Goalie(); // 守门 - - CPoint *pos; // 球员位置 - RelPos *rp; // 阵型球员相对中央球员的位置 - - int cp_id(); // 中央球员 ID - void fp_sort(RelPos *rp, int h = 0, int t = 0); // 阵型球员排序,h 为该层前的球员数量,t 为包含该层后的球员数量 - int fm_id(); // 阵型 ID - CPoint coor(int which); // 返回机器人的位置 - - // void spin(int which, bool isClockwise); // 自旋 - void shot1(int which, double o, CPoint t); // 直射 - bool canshot(); // 射? - int search1(); // 查找在大区里的机器人 - int search2(); // 查找在小区里的机器人 - //CPoint searchNear(int which); // 查找最近的机器人 - // void control(int which); - // void ccd(int which, double d, double j); // 曲线行驶 - double atwo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); // 两直线间夹角 - // void navigate(); - void shot(int which); // 射门; - void shot(int which,CPoint t); // 把球向 t 点射,de 向上还是向下射,de = 0从上向下射 - CPoint shooter_pos(); // 对方射门者位置 - - double Distance(CPoint point1, CPoint point2); // 计算两点之间的距离 - double Angle(CPoint point1, CPoint point2); // 计算两点之间的角度 - void Direction(int which, CPoint point); - // void DirectionSE(int which, CPoint point); // 不进禁区版 Direction - void PositionSE(int which, CPoint point); // 不进禁区版 Position - void Rush(int which, CPoint point); // 冲向某点 - - int Status(); // 判断状态 - - void Stop(int which); - void Position(int which, CPoint point); - void Velocity(int which, int vL, int vR); - void Angle(int which, int desired_angle); - - CRect boundRect; - int m_nStrategy; - int m_OurTeam; - int m_nGameArea; - double ShootLen; - int nShoot; - int nSweep; - int nKick2; - CPoint ShootVar; - CPoint KickVar; - double KickLen; - CCommand C_Home3; - CCommand C_Home2; - CCommand C_Home1; - CCommand C_Home4; - CCommand C_Home5; - CCommand C_Home6; - CCommand C_Home7; - CCommand C_Home8; - CCommand C_Home9; - CCommand C_Home10; - CCommand C_Home11; - Robot1 ball; - Robot2 home1, home2, home3, home4, home5, home6, home7, home8, home9, home10, hgoalie; - Robot3 opponent; - - bool start; // 是否刚开始 - int T; // 时间,即周期数 - struct infor { - int num; // 球员编号 - double dis; // 球员到球的距离 - }; - bool flag; - - // std::vector Navigation; - - // void Think(); - -public: - int command[35]; -}; - -#endif // _INSIDE_VISUAL_CPP_STRATEGYSYSTEM +#include "general.h" + +#ifndef _INSIDE_VISUAL_CPP_STRATEGYSYSTEM +#define _INSIDE_VISUAL_CPP_STRATEGYSYSTEM + +// 阵型球员相对中央球员的位置结构体 +struct RelPos { + int id; + double dis; + double ang; +}; + +class CStrategySystem : public CObject { + DECLARE_DYNAMIC(CStrategySystem) +public: + void Action(); + // ~CStrategySystem(); + CStrategySystem(int id); + void ReceiveData(Robot1 bal, Robot2 ho1, Robot2 ho2, Robot2 ho3, Robot2 ho4, + Robot2 ho5, Robot2 ho6, Robot2 ho7, Robot2 ho8, Robot2 ho9, + Robot2 ho10, Robot2 hgo, Robot3 opp); + +#ifdef _DEBUG +#endif // _DEBUG +private: + void Penalty(); // 罚球 + void Freeball(); // 争球 + void Possession(); // 控球 + void Goalie(); // 守门 + + CPoint *pos; // 球员位置 + RelPos *rp; // 阵型球员相对中央球员的位置 + + int cp_id(); // 中央球员 ID + void fp_sort(RelPos *rp, int h = 0, int t = 0); // 阵型球员排序,h 为该层前的球员数量,t 为包含该层后的球员数量 + int fm_id(); // 阵型 ID + CPoint coor(int which); // 返回机器人的位置 + + // void spin(int which, bool isClockwise); // 自旋 + void shot1(int which, double o, CPoint t); // 直射 + bool canshot(); // 射? + int search1(); // 查找在大区里的机器人 + int search2(); // 查找在小区里的机器人 + // CPoint searchNear(int which); // 查找最近的机器人 + // void control(int which); + // void ccd(int which, double d, double j); // 曲线行驶 + double atwo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4); // 两直线间夹角 + // void navigate(); + void shot(int which); // 射门; + void shot(int which, CPoint t); // 把球向 t 点射,de 向上还是向下射,de = 0从上向下射 + CPoint shooter_pos(); // 对方射门者位置 + + double Distance(CPoint point1, CPoint point2); // 计算两点之间的距离 + double Angle(CPoint point1, CPoint point2); // 计算两点之间的角度 + void Direction(int which, CPoint point); + // void DirectionSE(int which, CPoint point); // 不进禁区版 Direction + void PositionSE(int which, CPoint point); // 不进禁区版 Position + void Rush(int which, CPoint point); // 冲向某点 + + int Status(); // 判断状态 + + void Stop(int which); + void Position(int which, CPoint point); + void Velocity(int which, int vL, int vR); + void Angle(int which, int desired_angle); + + CRect boundRect; + int m_nStrategy; + int m_OurTeam; + int m_nGameArea; + double ShootLen; + int nShoot; + int nSweep; + int nKick2; + CPoint ShootVar; + CPoint KickVar; + double KickLen; + CCommand C_Home3; + CCommand C_Home2; + CCommand C_Home1; + CCommand C_Home4; + CCommand C_Home5; + CCommand C_Home6; + CCommand C_Home7; + CCommand C_Home8; + CCommand C_Home9; + CCommand C_Home10; + CCommand C_Home11; + Robot1 ball; + Robot2 home1, home2, home3, home4, home5, home6, home7, home8, home9, home10, hgoalie; + Robot3 opponent; + + bool start; // 是否刚开始 + int T; // 时间,即周期数 + struct infor { + int num; // 球员编号 + double dis; // 球员到球的距离 + }; + bool flag; + + // std::vector Navigation; + + // void Think(); + +public: + int command[35]; +}; + +#endif // _INSIDE_VISUAL_CPP_STRATEGYSYSTEM diff --git a/TParseString.h b/include/TParseString.h similarity index 96% rename from TParseString.h rename to include/TParseString.h index 3faf9f7..78c7bef 100644 --- a/TParseString.h +++ b/include/TParseString.h @@ -1,31 +1,31 @@ -// TParseString.h: interface for the TParseString class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_) -#define AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_ - -#if _MSC_VER >= 1000 -#pragma once -#endif // _MSC_VER >= 1000 -class TParseString : public CString { -public: - TParseString() { m_iPosition = 0; }; - TParseString(LPCTSTR name) : CString(name) { m_iPosition = 0; }; - - BOOL ParseBracket(TParseString &str); - BOOL ParseString(CString &str); - int ParseInteger(); - double ParseDouble(); - void OverreadLeadingSpaces(); - - BOOL HasErrorOccured() const { return m_bErrorOccured; }; - int GetPosition() const { return m_iPosition; }; - void SetPosition(int pos); - -private: - int m_iPosition; - BOOL m_bErrorOccured; -}; - -#endif // !defined(AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_) +// TParseString.h: interface for the TParseString class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_) +#define AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 +class TParseString : public CString { +public: + TParseString() { m_iPosition = 0; }; + TParseString(LPCTSTR name) : CString(name) { m_iPosition = 0; }; + + BOOL ParseBracket(TParseString &str); + BOOL ParseString(CString &str); + int ParseInteger(); + double ParseDouble(); + void OverreadLeadingSpaces(); + + BOOL HasErrorOccured() const { return m_bErrorOccured; }; + int GetPosition() const { return m_iPosition; }; + void SetPosition(int pos); + +private: + int m_iPosition; + BOOL m_bErrorOccured; +}; + +#endif // !defined(AFX_TPARSESTRING_H__B6B1C1C4_8CBF_11D1_B242_0000C09B5CBE__INCLUDED_) diff --git a/Agentsock.cpp b/src/Agentsock.cpp similarity index 96% rename from Agentsock.cpp rename to src/Agentsock.cpp index 87aef82..e1fbc17 100644 --- a/Agentsock.cpp +++ b/src/Agentsock.cpp @@ -1,87 +1,87 @@ - -#include "stdafx.h" -#include "Agentsock.h" -#ifdef _DEBUG -#undef THIS_FILE -static char BASED_CODE THIS_FILE[] = __FILE__; -#endif - -IMPLEMENT_DYNAMIC(CAgentSocket, CAsyncSocket) - -CAgentSocket::CAgentSocket() { - m_uiPort = 0; - m_sSocketAddress = _T(""); -} - -void CAgentSocket::OnReceive(int nErrorCode) { - CAsyncSocket::OnReceive(nErrorCode); -} - -BOOL CAgentSocket::Create(UINT nSocketPort, LPCTSTR lpszSocketAddress) { - int nSocketType = SOCK_DGRAM; - long lEvent = FD_READ | FD_WRITE | FD_ACCEPT | FD_CONNECT | FD_CLOSE; - - // create the socket - if (Socket(nSocketType, lEvent)) { - // try to bind the socket to any address - if (Bind(nSocketPort, lpszSocketAddress)) - return TRUE; - - // an error occured - int nResult = GetLastError(); - Close(); - WSASetLastError(nResult); - } - return FALSE; -} - -BOOL CAgentSocket::Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress) { - int result; - - // bind to INADDR_ANY - memset(&sockAddr, 0, sizeof(sockAddr)); - sockAddr.sin_family = AF_INET; - sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); - sockAddr.sin_port = htons(0); - result = CAsyncSocket::Bind((SOCKADDR *)&sockAddr, sizeof(sockAddr)); - - // set the proper values of port and address for the following SendTo commands - memset(&sockAddr, 0, sizeof(sockAddr)); - LPSTR lpszAscii = (LPTSTR)lpszSocketAddress; - sockAddr.sin_family = AF_INET; - sockAddr.sin_addr.s_addr = inet_addr(lpszAscii); - if (sockAddr.sin_addr.s_addr == INADDR_NONE) { - // get the address from a nameserver - LPHOSTENT lphost; - lphost = gethostbyname(lpszAscii); - if (lphost != NULL) - sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr; - else { - WSASetLastError(WSAEINVAL); - return FALSE; - } - } - sockAddr.sin_port = htons((u_short)nSocketPort); - - // return the result of the Bind command - return result; -} - -int CAgentSocket::ReceiveFrom(void *lpBuf, int nBufLen, CString &rSocketAddress, UINT &rSocketPort, int nFlags) { - // try to receive data - memset(&sockAddr, 0, sizeof(sockAddr)); - int nSockAddrLen = sizeof(sockAddr); - int nResult = CAsyncSocket::ReceiveFrom(lpBuf, nBufLen, (SOCKADDR *)&sockAddr, &nSockAddrLen, nFlags); - if (nResult != SOCKET_ERROR) { - // succesfull - rSocketPort = ntohs(sockAddr.sin_port); - rSocketAddress = inet_ntoa(sockAddr.sin_addr); - } - - return nResult; -} - -int CAgentSocket::SendTo(const void *lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags) { - // send the buffer - return CAsyncSocket::SendTo(lpBuf, nBufLen, (SOCKADDR *)&sockAddr, sizeof(sockAddr), nFlags); -} + +#include "stdafx.h" +#include "Agentsock.h" +#ifdef _DEBUG +#undef THIS_FILE +static char BASED_CODE THIS_FILE[] = __FILE__; +#endif + +IMPLEMENT_DYNAMIC(CAgentSocket, CAsyncSocket) + +CAgentSocket::CAgentSocket() { + m_uiPort = 0; + m_sSocketAddress = _T(""); +} + +void CAgentSocket::OnReceive(int nErrorCode) { + CAsyncSocket::OnReceive(nErrorCode); +} + +BOOL CAgentSocket::Create(UINT nSocketPort, LPCTSTR lpszSocketAddress) { + int nSocketType = SOCK_DGRAM; + long lEvent = FD_READ | FD_WRITE | FD_ACCEPT | FD_CONNECT | FD_CLOSE; + + // create the socket + if (Socket(nSocketType, lEvent)) { + // try to bind the socket to any address + if (Bind(nSocketPort, lpszSocketAddress)) + return TRUE; + + // an error occured + int nResult = GetLastError(); + Close(); + WSASetLastError(nResult); + } + return FALSE; +} + +BOOL CAgentSocket::Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress) { + int result; + + // bind to INADDR_ANY + memset(&sockAddr, 0, sizeof(sockAddr)); + sockAddr.sin_family = AF_INET; + sockAddr.sin_addr.s_addr = htonl(INADDR_ANY); + sockAddr.sin_port = htons(0); + result = CAsyncSocket::Bind((SOCKADDR *)&sockAddr, sizeof(sockAddr)); + + // set the proper values of port and address for the following SendTo commands + memset(&sockAddr, 0, sizeof(sockAddr)); + LPSTR lpszAscii = (LPTSTR)lpszSocketAddress; + sockAddr.sin_family = AF_INET; + sockAddr.sin_addr.s_addr = inet_addr(lpszAscii); + if (sockAddr.sin_addr.s_addr == INADDR_NONE) { + // get the address from a nameserver + LPHOSTENT lphost; + lphost = gethostbyname(lpszAscii); + if (lphost != NULL) + sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr; + else { + WSASetLastError(WSAEINVAL); + return FALSE; + } + } + sockAddr.sin_port = htons((u_short)nSocketPort); + + // return the result of the Bind command + return result; +} + +int CAgentSocket::ReceiveFrom(void *lpBuf, int nBufLen, CString &rSocketAddress, UINT &rSocketPort, int nFlags) { + // try to receive data + memset(&sockAddr, 0, sizeof(sockAddr)); + int nSockAddrLen = sizeof(sockAddr); + int nResult = CAsyncSocket::ReceiveFrom(lpBuf, nBufLen, (SOCKADDR *)&sockAddr, &nSockAddrLen, nFlags); + if (nResult != SOCKET_ERROR) { + // succesfull + rSocketPort = ntohs(sockAddr.sin_port); + rSocketAddress = inet_ntoa(sockAddr.sin_addr); + } + + return nResult; +} + +int CAgentSocket::SendTo(const void *lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags) { + // send the buffer + return CAsyncSocket::SendTo(lpBuf, nBufLen, (SOCKADDR *)&sockAddr, sizeof(sockAddr), nFlags); +} diff --git a/BaseAgent.cpp b/src/BaseAgent.cpp similarity index 96% rename from BaseAgent.cpp rename to src/BaseAgent.cpp index 20f56e9..3716a16 100644 --- a/BaseAgent.cpp +++ b/src/BaseAgent.cpp @@ -1,513 +1,513 @@ - -#include "stdafx.h" -#include "Agentsock.h" -#include -#include "MicroClientDoc.h" -#include "TParseString.h" -#include "StrategySystem.h" -#include "BaseAgent.h" -#ifdef _DEBUG -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#define new DEBUG_NEW -#endif -extern Robot2 r[2][11]; -extern Robot3 op; -extern Robot1 theball; -extern CStrategySystem *thePlannerR; -extern CStrategySystem *thePlannerL; - -// extern FILE* fp; -#define MAX_MSG_LENGTH 1500 -CBaseAgent::CBaseAgent() { - m_bConnected = FALSE; - m_iSide = LEFT_TO_RIGHT; - m_iNumber = 0; -} - -CBaseAgent::CBaseAgent(CMicroClientDoc *m_Doc) { - m_pDoc = m_Doc; - m_bConnected = FALSE; - m_iSide = LEFT_TO_RIGHT; - m_iNumber = 0; -} -CBaseAgent::~CBaseAgent() { - DisconnectAgent(); -} - -BOOL CBaseAgent::ConnectAgent(LPCTSTR lpszTeam, LPCTSTR lpszServer, UINT nPort) { - // is the agent already connected (should not happen) - if (m_bConnected) - return FALSE; - - // create the datagram socket - if (!Create(nPort, lpszServer)) { - // socket could not be created - OnErrorCreatingSocket(); - return FALSE; - } - else { - m_bConnected = TRUE; - m_strTeam = lpszTeam; - OnCreatedSocket(); - Sleep(100); - return TRUE; - } -} -void CBaseAgent::OnCreatedSocket() { - CString message; - - // send the (init team) command - message.Format("(init %s (version 4.00))", (LPCTSTR)m_strTeam); - SendMsg(message); -} - -void CBaseAgent::DisconnectAgent() { - // is the socket active ? - if (m_bConnected) { - BYTE Buffer[50]; - - ShutDown(); - while (Receive(Buffer, 50) > 0) - ; - Close(); - } - m_bConnected = FALSE; -} - -void CBaseAgent::SendMsg(CString &strText) { - int iLength; - - // send the buffer - iLength = SendTo(strText, strText.GetLength(), GetPort(), GetAddress(), 0); - if (iLength == strText.GetLength()) - OnSentMessage((LPCTSTR)strText); - else { -// an error occured -#ifdef _DEBUG - afxDump << "error writing to socket\n"; -#endif - OnErrorSendingMessage(); - } -} - -void CBaseAgent::OnReceive(int iError) { - char buffer[MAX_MSG_LENGTH]; - int iLength = 0; - UINT iPort = GetPort(); - int iPosition = 0; - - // first call base classes method - CAgentSocket::OnReceive(iError); - - // read a message from the socket - iLength = ReceiveFrom(buffer, MAX_MSG_LENGTH, GetAddress(), iPort, 0); - // the port may have changed - SetPort(iPort); - - if (iLength > 0) { - // OnReceivedMessage((LPCTSTR) buffer); - ParseMessage((LPCTSTR)buffer); - if (m_iSide == LEFT_TO_RIGHT) { - thePlannerL->ReceiveData(theball, r[0][0], r[0][1], r[0][2], r[0][3], r[0][4], - r[0][5], r[0][6], r[0][7], r[0][8], r[0][9], r[0][10], op); - thePlannerL->Action(); - } - else if (m_iSide == RIGHT_TO_LEFT) { - thePlannerR->ReceiveData(theball, r[0][0], r[0][1], r[0][2], r[0][3], r[0][4], - r[0][5], r[0][6], r[0][7], r[0][8], r[0][9], r[0][10], op); - thePlannerR->Action(); - } - SendCommand(); - } - else { -// an error occured -#ifdef _DEBUG - afxDump << "error reading socket\n"; -#endif - OnErrorReceivingMessage(); - } -} - -void CBaseAgent::ParseMessage(LPCTSTR str) { - switch (str[1]) { - case 's': - if (str[3] == 'e') - - ParseSee(str); - break; - case 'i': - AfxMessageBox("Init successful"); - ParseInit(str); - break; - } - // return TRUE; -} - -void CBaseAgent::ParseInit(LPCTSTR str) { - - TParseString msg(str); - CString tmp; - // int number; - - // get the side - if ((msg.GetLength() > 6) && (msg.GetAt(6) == 'r')) { - AfxMessageBox("right right"); - SetSide(RIGHT_TO_LEFT); - } - else { - SetSide(LEFT_TO_RIGHT); - } - - // return TRUE; -} - -void CBaseAgent::ParseSee(LPCTSTR str) { - TParseString msg(str); - TParseString strObject; - - msg.SetPosition(5); - m_iTime = msg.ParseInteger(); - if (msg.HasErrorOccured()) - return; - - while (msg.ParseBracket(strObject)) { - if (!ParseObject(strObject)) { -#ifdef _DEBUG - CString error; - error.Format(" : error parsing object info at position %d !\n", strObject.GetPosition()); - afxDump << error << strObject; -#endif - } - } -} - -BOOL CBaseAgent::ParseObject(LPCTSTR str) { - TParseString msg(str); - TParseString name; - CString teamname; - int team; - int iNum; - int x; - int y; - double angle; - - // read the objects name bracket - if (!msg.ParseBracket(name)) // name="player TeamName TeamNum" - return FALSE; - x = msg.ParseInteger(); - if (msg.HasErrorOccured()) { - } - y = msg.ParseInteger(); - if (msg.HasErrorOccured()) { - } - angle = msg.ParseDouble(); - if (msg.HasErrorOccured()) { - } - switch (name.GetAt(0)) { - // it is a player - case 'P': - case 'p': - name.SetPosition(7); - // read the teamname - if (name.ParseString(teamname)) { - // ist it my team ? - if (teamname.Compare(_T(name)) == 0) - team = OWN_TEAM; - else - team = OTHER_TEAM; - - // read player number - iNum = name.ParseInteger(); - if (msg.HasErrorOccured()) { - } - } - switch (iNum) { - case 1: - if (m_iSide == LEFT_TO_RIGHT) { - r[0][0].position.x = x; - r[0][0].position.y = y; - r[0][0].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position1.x = x; - op.position1.y = y; - } - break; - case 2: // ×󷽶þºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][1].position.x = x; - r[0][1].position.y = y; - r[0][1].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position2.x = x; - op.position2.y = y; - } - break; - case 3: // ×ó·½ÈýºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][2].position.x = x; - r[0][2].position.y = y; - r[0][2].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position3.x = x; - op.position3.y = y; - } - break; - case 4: // ×ó·½ËĺŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][3].position.x = x; - r[0][3].position.y = y; - r[0][3].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position4.x = x; - op.position4.y = y; - } - break; - case 5: // ×ó·½ÎåºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][4].position.x = x; - r[0][4].position.y = y; - r[0][4].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position5.x = x; - op.position5.y = y; - } - break; - case 6: // ×ó·½ÁùºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][5].position.x = x; - r[0][5].position.y = y; - r[0][5].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position6.x = x; - op.position6.y = y; - } - break; - case 7: // ×󷽯ߺŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][6].position.x = x; - r[0][6].position.y = y; - r[0][6].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position7.x = x; - op.position7.y = y; - } - break; - case 8: // ×󷽰˺ŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][7].position.x = x; - r[0][7].position.y = y; - r[0][7].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position8.x = x; - op.position8.y = y; - } - break; - case 9: // ×󷽾źŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][8].position.x = x; - r[0][8].position.y = y; - r[0][8].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position9.x = x; - op.position9.y = y; - } - break; - case 10: // ×ó·½ʮºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][9].position.x = x; - r[0][9].position.y = y; - r[0][9].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position10.x = x; - op.position10.y = y; - } - break; - case 11: // ×ó·½ʮһºŶÓԱµÄ×ø±ê - if (m_iSide == LEFT_TO_RIGHT) { - r[0][10].position.x = x; - r[0][10].position.y = y; - r[0][10].angle = (int)angle; - } - else if (m_iSide == RIGHT_TO_LEFT) { - op.position11.x = x; - op.position11.y = y; - } - break; - // ÏÂÃæµÄÊǴÓÓÒÏò×ó½ø¹¥µĶÓԱµÄ×ø±괦Àí - case 12: - if (m_iSide == LEFT_TO_RIGHT) { - op.position1.x = x; - op.position1.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) // Óҷ½һºŶÓԱ×ø±ê - { - r[0][0].position.x = x; - r[0][0].position.y = y; - r[0][0].angle = (int)angle; - } - break; - case 13: - if (m_iSide == LEFT_TO_RIGHT) { - op.position2.x = x; - op.position2.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][1].position.x = x; - r[0][1].position.y = y; - r[0][1].angle = (int)angle; - } - break; - case 14: - if (m_iSide == LEFT_TO_RIGHT) { - op.position3.x = x; - op.position3.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][2].position.x = x; - r[0][2].position.y = y; - r[0][2].angle = (int)angle; - } - break; - case 15: - if (m_iSide == LEFT_TO_RIGHT) { - op.position4.x = x; - op.position4.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][3].position.x = x; - r[0][3].position.y = y; - r[0][3].angle = (int)angle; - } - break; - case 16: - if (m_iSide == LEFT_TO_RIGHT) { - op.position5.x = x; - op.position5.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][4].position.x = x; - r[0][4].position.y = y; - r[0][4].angle = (int)angle; - } - break; - case 17: - if (m_iSide == LEFT_TO_RIGHT) { - op.position6.x = x; - op.position6.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][5].position.x = x; - r[0][5].position.y = y; - r[0][5].angle = (int)angle; - } - break; - case 18: - if (m_iSide == LEFT_TO_RIGHT) { - op.position7.x = x; - op.position7.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][6].position.x = x; - r[0][6].position.y = y; - r[0][6].angle = (int)angle; - } - break; - case 19: - if (m_iSide == LEFT_TO_RIGHT) { - op.position8.x = x; - op.position8.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][7].position.x = x; - r[0][7].position.y = y; - r[0][7].angle = (int)angle; - } - break; - case 20: - if (m_iSide == LEFT_TO_RIGHT) { - op.position9.x = x; - op.position9.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][8].position.x = x; - r[0][8].position.y = y; - r[0][8].angle = (int)angle; - } - break; - case 21: - if (m_iSide == LEFT_TO_RIGHT) { - op.position10.x = x; - op.position10.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][9].position.x = x; - r[0][9].position.y = y; - r[0][9].angle = (int)angle; - } - break; - case 22: - if (m_iSide == LEFT_TO_RIGHT) { - op.position11.x = x; - op.position11.y = y; - } - else if (m_iSide == RIGHT_TO_LEFT) { - r[0][10].position.x = x; - r[0][10].position.y = y; - r[0][10].angle = (int)angle; - } - break; - } - break; - case 'b': - case 'B': - theball.position.x = x; - theball.position.y = y; - break; - } - return TRUE; -} - -void CBaseAgent::SendCommand() { - CString msg; - if (m_iSide == LEFT_TO_RIGHT) { - msg.Format("((player left 1) %d %d) ((player left 2) %d %d) ((player left 3) %d %d) ((player left 4) %d %d) ((player left 5) %d %d) ((player left 6) %d %d) ((player left 7) %d %d) ((player left 8) %d %d) ((player left 9) %d %d) ((player left 10) %d %d) ((player left 11) %d %d)", - thePlannerL->command[2], thePlannerL->command[3], - thePlannerL->command[5], thePlannerL->command[6], - thePlannerL->command[8], thePlannerL->command[9], - thePlannerL->command[11], thePlannerL->command[12], - thePlannerL->command[14], thePlannerL->command[15], - thePlannerL->command[17], thePlannerL->command[18], - thePlannerL->command[20], thePlannerL->command[21], - thePlannerL->command[23], thePlannerL->command[24], - thePlannerL->command[26], thePlannerL->command[27], - thePlannerL->command[29], thePlannerL->command[30], - thePlannerL->command[32], thePlannerL->command[33]); - } - else if (m_iSide == RIGHT_TO_LEFT) { - msg.Format("((player right 1) %d %d) ((player right 2) %d %d) ((player right 3) %d %d) ((player right 4) %d %d) ((player right 5) %d %d) ((player right 6) %d %d) ((player right 7) %d %d) ((player right 8) %d %d) ((player right 9) %d %d) ((player right 10) %d %d) ((player right 11) %d %d)", - thePlannerR->command[2], thePlannerR->command[3], - thePlannerR->command[5], thePlannerR->command[6], - thePlannerR->command[8], thePlannerR->command[9], - thePlannerR->command[11], thePlannerR->command[12], - thePlannerR->command[14], thePlannerR->command[15], - thePlannerR->command[17], thePlannerR->command[18], - thePlannerR->command[20], thePlannerR->command[21], - thePlannerR->command[23], thePlannerR->command[24], - thePlannerR->command[26], thePlannerR->command[27], - thePlannerR->command[29], thePlannerR->command[30], - thePlannerR->command[32], thePlannerR->command[33]); - } - - SendMsg(msg); -} + +#include "stdafx.h" +#include "Agentsock.h" +#include +#include "MicroClientDoc.h" +#include "TParseString.h" +#include "StrategySystem.h" +#include "BaseAgent.h" +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#define new DEBUG_NEW +#endif +extern Robot2 r[2][11]; +extern Robot3 op; +extern Robot1 theball; +extern CStrategySystem *thePlannerR; +extern CStrategySystem *thePlannerL; + +// extern FILE* fp; +#define MAX_MSG_LENGTH 1500 +CBaseAgent::CBaseAgent() { + m_bConnected = FALSE; + m_iSide = LEFT_TO_RIGHT; + m_iNumber = 0; +} + +CBaseAgent::CBaseAgent(CMicroClientDoc *m_Doc) { + m_pDoc = m_Doc; + m_bConnected = FALSE; + m_iSide = LEFT_TO_RIGHT; + m_iNumber = 0; +} +CBaseAgent::~CBaseAgent() { + DisconnectAgent(); +} + +BOOL CBaseAgent::ConnectAgent(LPCTSTR lpszTeam, LPCTSTR lpszServer, UINT nPort) { + // is the agent already connected (should not happen) + if (m_bConnected) + return FALSE; + + // create the datagram socket + if (!Create(nPort, lpszServer)) { + // socket could not be created + OnErrorCreatingSocket(); + return FALSE; + } + else { + m_bConnected = TRUE; + m_strTeam = lpszTeam; + OnCreatedSocket(); + Sleep(100); + return TRUE; + } +} +void CBaseAgent::OnCreatedSocket() { + CString message; + + // send the (init team) command + message.Format("(init %s (version 4.00))", (LPCTSTR)m_strTeam); + SendMsg(message); +} + +void CBaseAgent::DisconnectAgent() { + // is the socket active ? + if (m_bConnected) { + BYTE Buffer[50]; + + ShutDown(); + while (Receive(Buffer, 50) > 0) + ; + Close(); + } + m_bConnected = FALSE; +} + +void CBaseAgent::SendMsg(CString &strText) { + int iLength; + + // send the buffer + iLength = SendTo(strText, strText.GetLength(), GetPort(), GetAddress(), 0); + if (iLength == strText.GetLength()) + OnSentMessage((LPCTSTR)strText); + else { +// an error occured +#ifdef _DEBUG + afxDump << "error writing to socket\n"; +#endif + OnErrorSendingMessage(); + } +} + +void CBaseAgent::OnReceive(int iError) { + char buffer[MAX_MSG_LENGTH]; + int iLength = 0; + UINT iPort = GetPort(); + int iPosition = 0; + + // first call base classes method + CAgentSocket::OnReceive(iError); + + // read a message from the socket + iLength = ReceiveFrom(buffer, MAX_MSG_LENGTH, GetAddress(), iPort, 0); + // the port may have changed + SetPort(iPort); + + if (iLength > 0) { + // OnReceivedMessage((LPCTSTR) buffer); + ParseMessage((LPCTSTR)buffer); + if (m_iSide == LEFT_TO_RIGHT) { + thePlannerL->ReceiveData(theball, r[0][0], r[0][1], r[0][2], r[0][3], r[0][4], + r[0][5], r[0][6], r[0][7], r[0][8], r[0][9], r[0][10], op); + thePlannerL->Action(); + } + else if (m_iSide == RIGHT_TO_LEFT) { + thePlannerR->ReceiveData(theball, r[0][0], r[0][1], r[0][2], r[0][3], r[0][4], + r[0][5], r[0][6], r[0][7], r[0][8], r[0][9], r[0][10], op); + thePlannerR->Action(); + } + SendCommand(); + } + else { +// an error occured +#ifdef _DEBUG + afxDump << "error reading socket\n"; +#endif + OnErrorReceivingMessage(); + } +} + +void CBaseAgent::ParseMessage(LPCTSTR str) { + switch (str[1]) { + case 's': + if (str[3] == 'e') + + ParseSee(str); + break; + case 'i': + AfxMessageBox("Init successful"); + ParseInit(str); + break; + } + // return TRUE; +} + +void CBaseAgent::ParseInit(LPCTSTR str) { + + TParseString msg(str); + CString tmp; + // int number; + + // get the side + if ((msg.GetLength() > 6) && (msg.GetAt(6) == 'r')) { + AfxMessageBox("right right"); + SetSide(RIGHT_TO_LEFT); + } + else { + SetSide(LEFT_TO_RIGHT); + } + + // return TRUE; +} + +void CBaseAgent::ParseSee(LPCTSTR str) { + TParseString msg(str); + TParseString strObject; + + msg.SetPosition(5); + m_iTime = msg.ParseInteger(); + if (msg.HasErrorOccured()) + return; + + while (msg.ParseBracket(strObject)) { + if (!ParseObject(strObject)) { +#ifdef _DEBUG + CString error; + error.Format(" : error parsing object info at position %d !\n", strObject.GetPosition()); + afxDump << error << strObject; +#endif + } + } +} + +BOOL CBaseAgent::ParseObject(LPCTSTR str) { + TParseString msg(str); + TParseString name; + CString teamname; + int team; + int iNum; + int x; + int y; + double angle; + + // read the objects name bracket + if (!msg.ParseBracket(name)) // name="player TeamName TeamNum" + return FALSE; + x = msg.ParseInteger(); + if (msg.HasErrorOccured()) { + } + y = msg.ParseInteger(); + if (msg.HasErrorOccured()) { + } + angle = msg.ParseDouble(); + if (msg.HasErrorOccured()) { + } + switch (name.GetAt(0)) { + // it is a player + case 'P': + case 'p': + name.SetPosition(7); + // read the teamname + if (name.ParseString(teamname)) { + // ist it my team ? + if (teamname.Compare(_T(name)) == 0) + team = OWN_TEAM; + else + team = OTHER_TEAM; + + // read player number + iNum = name.ParseInteger(); + if (msg.HasErrorOccured()) { + } + } + switch (iNum) { + case 1: + if (m_iSide == LEFT_TO_RIGHT) { + r[0][0].position.x = x; + r[0][0].position.y = y; + r[0][0].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position1.x = x; + op.position1.y = y; + } + break; + case 2: // ×󷽶þºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][1].position.x = x; + r[0][1].position.y = y; + r[0][1].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position2.x = x; + op.position2.y = y; + } + break; + case 3: // ×ó·½ÈýºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][2].position.x = x; + r[0][2].position.y = y; + r[0][2].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position3.x = x; + op.position3.y = y; + } + break; + case 4: // ×ó·½ËĺŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][3].position.x = x; + r[0][3].position.y = y; + r[0][3].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position4.x = x; + op.position4.y = y; + } + break; + case 5: // ×ó·½ÎåºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][4].position.x = x; + r[0][4].position.y = y; + r[0][4].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position5.x = x; + op.position5.y = y; + } + break; + case 6: // ×ó·½ÁùºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][5].position.x = x; + r[0][5].position.y = y; + r[0][5].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position6.x = x; + op.position6.y = y; + } + break; + case 7: // ×󷽯ߺŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][6].position.x = x; + r[0][6].position.y = y; + r[0][6].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position7.x = x; + op.position7.y = y; + } + break; + case 8: // ×󷽰˺ŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][7].position.x = x; + r[0][7].position.y = y; + r[0][7].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position8.x = x; + op.position8.y = y; + } + break; + case 9: // ×󷽾źŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][8].position.x = x; + r[0][8].position.y = y; + r[0][8].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position9.x = x; + op.position9.y = y; + } + break; + case 10: // ×ó·½ʮºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][9].position.x = x; + r[0][9].position.y = y; + r[0][9].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position10.x = x; + op.position10.y = y; + } + break; + case 11: // ×ó·½ʮһºŶÓԱµÄ×ø±ê + if (m_iSide == LEFT_TO_RIGHT) { + r[0][10].position.x = x; + r[0][10].position.y = y; + r[0][10].angle = (int)angle; + } + else if (m_iSide == RIGHT_TO_LEFT) { + op.position11.x = x; + op.position11.y = y; + } + break; + // ÏÂÃæµÄÊǴÓÓÒÏò×ó½ø¹¥µĶÓԱµÄ×ø±괦Àí + case 12: + if (m_iSide == LEFT_TO_RIGHT) { + op.position1.x = x; + op.position1.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) // Óҷ½һºŶÓԱ×ø±ê + { + r[0][0].position.x = x; + r[0][0].position.y = y; + r[0][0].angle = (int)angle; + } + break; + case 13: + if (m_iSide == LEFT_TO_RIGHT) { + op.position2.x = x; + op.position2.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][1].position.x = x; + r[0][1].position.y = y; + r[0][1].angle = (int)angle; + } + break; + case 14: + if (m_iSide == LEFT_TO_RIGHT) { + op.position3.x = x; + op.position3.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][2].position.x = x; + r[0][2].position.y = y; + r[0][2].angle = (int)angle; + } + break; + case 15: + if (m_iSide == LEFT_TO_RIGHT) { + op.position4.x = x; + op.position4.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][3].position.x = x; + r[0][3].position.y = y; + r[0][3].angle = (int)angle; + } + break; + case 16: + if (m_iSide == LEFT_TO_RIGHT) { + op.position5.x = x; + op.position5.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][4].position.x = x; + r[0][4].position.y = y; + r[0][4].angle = (int)angle; + } + break; + case 17: + if (m_iSide == LEFT_TO_RIGHT) { + op.position6.x = x; + op.position6.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][5].position.x = x; + r[0][5].position.y = y; + r[0][5].angle = (int)angle; + } + break; + case 18: + if (m_iSide == LEFT_TO_RIGHT) { + op.position7.x = x; + op.position7.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][6].position.x = x; + r[0][6].position.y = y; + r[0][6].angle = (int)angle; + } + break; + case 19: + if (m_iSide == LEFT_TO_RIGHT) { + op.position8.x = x; + op.position8.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][7].position.x = x; + r[0][7].position.y = y; + r[0][7].angle = (int)angle; + } + break; + case 20: + if (m_iSide == LEFT_TO_RIGHT) { + op.position9.x = x; + op.position9.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][8].position.x = x; + r[0][8].position.y = y; + r[0][8].angle = (int)angle; + } + break; + case 21: + if (m_iSide == LEFT_TO_RIGHT) { + op.position10.x = x; + op.position10.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][9].position.x = x; + r[0][9].position.y = y; + r[0][9].angle = (int)angle; + } + break; + case 22: + if (m_iSide == LEFT_TO_RIGHT) { + op.position11.x = x; + op.position11.y = y; + } + else if (m_iSide == RIGHT_TO_LEFT) { + r[0][10].position.x = x; + r[0][10].position.y = y; + r[0][10].angle = (int)angle; + } + break; + } + break; + case 'b': + case 'B': + theball.position.x = x; + theball.position.y = y; + break; + } + return TRUE; +} + +void CBaseAgent::SendCommand() { + CString msg; + if (m_iSide == LEFT_TO_RIGHT) { + msg.Format("((player left 1) %d %d) ((player left 2) %d %d) ((player left 3) %d %d) ((player left 4) %d %d) ((player left 5) %d %d) ((player left 6) %d %d) ((player left 7) %d %d) ((player left 8) %d %d) ((player left 9) %d %d) ((player left 10) %d %d) ((player left 11) %d %d)", + thePlannerL->command[2], thePlannerL->command[3], + thePlannerL->command[5], thePlannerL->command[6], + thePlannerL->command[8], thePlannerL->command[9], + thePlannerL->command[11], thePlannerL->command[12], + thePlannerL->command[14], thePlannerL->command[15], + thePlannerL->command[17], thePlannerL->command[18], + thePlannerL->command[20], thePlannerL->command[21], + thePlannerL->command[23], thePlannerL->command[24], + thePlannerL->command[26], thePlannerL->command[27], + thePlannerL->command[29], thePlannerL->command[30], + thePlannerL->command[32], thePlannerL->command[33]); + } + else if (m_iSide == RIGHT_TO_LEFT) { + msg.Format("((player right 1) %d %d) ((player right 2) %d %d) ((player right 3) %d %d) ((player right 4) %d %d) ((player right 5) %d %d) ((player right 6) %d %d) ((player right 7) %d %d) ((player right 8) %d %d) ((player right 9) %d %d) ((player right 10) %d %d) ((player right 11) %d %d)", + thePlannerR->command[2], thePlannerR->command[3], + thePlannerR->command[5], thePlannerR->command[6], + thePlannerR->command[8], thePlannerR->command[9], + thePlannerR->command[11], thePlannerR->command[12], + thePlannerR->command[14], thePlannerR->command[15], + thePlannerR->command[17], thePlannerR->command[18], + thePlannerR->command[20], thePlannerR->command[21], + thePlannerR->command[23], thePlannerR->command[24], + thePlannerR->command[26], thePlannerR->command[27], + thePlannerR->command[29], thePlannerR->command[30], + thePlannerR->command[32], thePlannerR->command[33]); + } + + SendMsg(msg); +} diff --git a/DSetupDlg.cpp b/src/DSetupDlg.cpp similarity index 96% rename from DSetupDlg.cpp rename to src/DSetupDlg.cpp index 6b09a1a..5b85ae3 100644 --- a/DSetupDlg.cpp +++ b/src/DSetupDlg.cpp @@ -1,44 +1,44 @@ -// DSetupDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "MicroClient.h" -#include "DSetupDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// DSetupDlg dialog - -DSetupDlg::DSetupDlg(CWnd *pParent /*=NULL*/) - : CDialog(DSetupDlg::IDD, pParent) { - //{{AFX_DATA_INIT(DSetupDlg) - - //}}AFX_DATA_INIT - m_TeamName = _T("WTU-ATRI"); - m_ServerName = _T("127.0.0.1"); - m_Channel = 6000; -} - -void DSetupDlg::DoDataExchange(CDataExchange *pDX) { - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(DSetupDlg) - - //}}AFX_DATA_MAP - // DDX_Text(pDX, IDC_TEAM, m_TeamName); - // DDX_Text(pDX, IDC_SERVER, m_ServerName); - // DDX_Text(pDX, IDC_CHANNEL, m_Channel); -} - -BEGIN_MESSAGE_MAP(DSetupDlg, CDialog) -//{{AFX_MSG_MAP(DSetupDlg) -// NOTE: the ClassWizard will add message map macros here -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// DSetupDlg message handlers +// DSetupDlg.cpp : implementation file +// + +#include "stdafx.h" +#include "MicroClient.h" +#include "DSetupDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// DSetupDlg dialog + +DSetupDlg::DSetupDlg(CWnd *pParent /*=NULL*/) + : CDialog(DSetupDlg::IDD, pParent) { + //{{AFX_DATA_INIT(DSetupDlg) + + //}}AFX_DATA_INIT + m_TeamName = _T("WTU-ATRI"); + m_ServerName = _T("127.0.0.1"); + m_Channel = 6000; +} + +void DSetupDlg::DoDataExchange(CDataExchange *pDX) { + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(DSetupDlg) + + //}}AFX_DATA_MAP + // DDX_Text(pDX, IDC_TEAM, m_TeamName); + // DDX_Text(pDX, IDC_SERVER, m_ServerName); + // DDX_Text(pDX, IDC_CHANNEL, m_Channel); +} + +BEGIN_MESSAGE_MAP(DSetupDlg, CDialog) +//{{AFX_MSG_MAP(DSetupDlg) +// NOTE: the ClassWizard will add message map macros here +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// DSetupDlg message handlers diff --git a/MainFrm.cpp b/src/MainFrm.cpp similarity index 96% rename from MainFrm.cpp rename to src/MainFrm.cpp index 7e8db14..945d8ec 100644 --- a/MainFrm.cpp +++ b/src/MainFrm.cpp @@ -1,96 +1,96 @@ -// MainFrm.cpp : implementation of the CMainFrame class -// - -#include "stdafx.h" -#include "MicroClient.h" - -#include "MainFrm.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame - -IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) - -BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) -//{{AFX_MSG_MAP(CMainFrame) -// NOTE - the ClassWizard will add and remove mapping macros here. -// DO NOT EDIT what you see in these blocks of generated code ! -ON_WM_CREATE() -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -static UINT indicators[] = { - ID_SEPARATOR, // status line indicator - ID_INDICATOR_CAPS, - ID_INDICATOR_NUM, - ID_INDICATOR_SCRL, -}; - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame construction/destruction - -CMainFrame::CMainFrame() { - // TODO: add member initialization code here -} - -CMainFrame::~CMainFrame() { -} - -int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { - if (CFrameWnd::OnCreate(lpCreateStruct) == -1) - return -1; - - if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || - !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { - TRACE0("Failed to create toolbar\n"); - return -1; // fail to create - } - - /* if (!m_wndStatusBar.Create(this) || - !m_wndStatusBar.SetIndicators(indicators, - sizeof(indicators)/sizeof(UINT))) - { - TRACE0("Failed to create status bar\n"); - return -1; // fail to create - }*/ - - // TODO: Delete these three lines if you don't want the toolbar to - // be dockable - m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); - EnableDocking(CBRS_ALIGN_ANY); - DockControlBar(&m_wndToolBar); - - return 0; -} - -BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs) { - if (!CFrameWnd::PreCreateWindow(cs)) - return FALSE; - // TODO: Modify the Window class or styles here by modifying - // the CREATESTRUCT cs - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame diagnostics - -#ifdef _DEBUG -void CMainFrame::AssertValid() const { - CFrameWnd::AssertValid(); -} - -void CMainFrame::Dump(CDumpContext &dc) const { - CFrameWnd::Dump(dc); -} - -#endif //_DEBUG - -///////////////////////////////////////////////////////////////////////////// -// CMainFrame message handlers +// MainFrm.cpp : implementation of the CMainFrame class +// + +#include "stdafx.h" +#include "MicroClient.h" + +#include "MainFrm.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMainFrame + +IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) + +BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) +//{{AFX_MSG_MAP(CMainFrame) +// NOTE - the ClassWizard will add and remove mapping macros here. +// DO NOT EDIT what you see in these blocks of generated code ! +ON_WM_CREATE() +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +static UINT indicators[] = { + ID_SEPARATOR, // status line indicator + ID_INDICATOR_CAPS, + ID_INDICATOR_NUM, + ID_INDICATOR_SCRL, +}; + +///////////////////////////////////////////////////////////////////////////// +// CMainFrame construction/destruction + +CMainFrame::CMainFrame() { + // TODO: add member initialization code here +} + +CMainFrame::~CMainFrame() { +} + +int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { + if (CFrameWnd::OnCreate(lpCreateStruct) == -1) + return -1; + + if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || + !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { + TRACE0("Failed to create toolbar\n"); + return -1; // fail to create + } + + /* if (!m_wndStatusBar.Create(this) || + !m_wndStatusBar.SetIndicators(indicators, + sizeof(indicators)/sizeof(UINT))) + { + TRACE0("Failed to create status bar\n"); + return -1; // fail to create + }*/ + + // TODO: Delete these three lines if you don't want the toolbar to + // be dockable + m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); + EnableDocking(CBRS_ALIGN_ANY); + DockControlBar(&m_wndToolBar); + + return 0; +} + +BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs) { + if (!CFrameWnd::PreCreateWindow(cs)) + return FALSE; + // TODO: Modify the Window class or styles here by modifying + // the CREATESTRUCT cs + + return TRUE; +} + +///////////////////////////////////////////////////////////////////////////// +// CMainFrame diagnostics + +#ifdef _DEBUG +void CMainFrame::AssertValid() const { + CFrameWnd::AssertValid(); +} + +void CMainFrame::Dump(CDumpContext &dc) const { + CFrameWnd::Dump(dc); +} + +#endif //_DEBUG + +///////////////////////////////////////////////////////////////////////////// +// CMainFrame message handlers diff --git a/MicroClient.cpp b/src/MicroClient.cpp similarity index 96% rename from MicroClient.cpp rename to src/MicroClient.cpp index 9f51d3d..ee63731 100644 --- a/MicroClient.cpp +++ b/src/MicroClient.cpp @@ -1,150 +1,150 @@ -// MicroClient.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "MicroClient.h" - -#include "MainFrm.h" -#include "MicroClientDoc.h" -#include "MicroClientView.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientApp - -BEGIN_MESSAGE_MAP(CMicroClientApp, CWinApp) -//{{AFX_MSG_MAP(CMicroClientApp) -ON_COMMAND(ID_APP_ABOUT, OnAppAbout) -// NOTE - the ClassWizard will add and remove mapping macros here. -// DO NOT EDIT what you see in these blocks of generated code! -//}}AFX_MSG_MAP -// Standard file based document commands -ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) -ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientApp construction - -CMicroClientApp::CMicroClientApp() { - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - -///////////////////////////////////////////////////////////////////////////// -// The one and only CMicroClientApp object - -CMicroClientApp theApp; - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientApp initialization - -BOOL CMicroClientApp::InitInstance() { - if (!AfxSocketInit()) { - AfxMessageBox(IDP_SOCKETS_INIT_FAILED); - return FALSE; - } - - AfxEnableControlContainer(); - - // Standard initialization - // If you are not using these features and wish to reduce the size - // of your final executable, you should remove from the following - // the specific initialization routines you do not need. - -#ifdef _AFXDLL - Enable3dControls(); // Call this when using MFC in a shared DLL -#else - Enable3dControlsStatic(); // Call this when linking to MFC statically -#endif - - // Change the registry key under which our settings are stored. - // TODO: You should modify this string to be something appropriate - // such as the name of your company or organization. - SetRegistryKey(_T("Local AppWizard-Generated Applications")); - - LoadStdProfileSettings(); // Load standard INI file options (including MRU) - - // Register the application's document templates. Document templates - // serve as the connection between documents, frame windows and views. - - CSingleDocTemplate *pDocTemplate; - pDocTemplate = new CSingleDocTemplate( - IDR_MAINFRAME, - RUNTIME_CLASS(CMicroClientDoc), - RUNTIME_CLASS(CMainFrame), // main SDI frame window - RUNTIME_CLASS(CMicroClientView)); - AddDocTemplate(pDocTemplate); - - // Parse command line for standard shell commands, DDE, file open - CCommandLineInfo cmdInfo; - ParseCommandLine(cmdInfo); - - // Dispatch commands specified on the command line - if (!ProcessShellCommand(cmdInfo)) - return FALSE; - - // The one and only window has been initialized, so show and update it. - m_pMainWnd->ShowWindow(SW_SHOW); - m_pMainWnd->SetWindowText("WTU-ATRI"); - m_pMainWnd->UpdateWindow(); - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// CAboutDlg dialog used for App About - -class CAboutDlg : public CDialog { -public: - CAboutDlg(); - - // Dialog Data - //{{AFX_DATA(CAboutDlg) - enum { IDD = IDD_ABOUTBOX }; - //}}AFX_DATA - - // ClassWizard generated virtual function overrides - //{{AFX_VIRTUAL(CAboutDlg) -protected: - virtual void DoDataExchange(CDataExchange *pDX); // DDX/DDV support - //}}AFX_VIRTUAL - - // Implementation -protected: - //{{AFX_MSG(CAboutDlg) - // No message handlers - //}}AFX_MSG - DECLARE_MESSAGE_MAP() -}; - -CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { - //{{AFX_DATA_INIT(CAboutDlg) - //}}AFX_DATA_INIT -} - -void CAboutDlg::DoDataExchange(CDataExchange *pDX) { - CDialog::DoDataExchange(pDX); - //{{AFX_DATA_MAP(CAboutDlg) - //}}AFX_DATA_MAP -} - -BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) -//{{AFX_MSG_MAP(CAboutDlg) -// No message handlers -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -// App command to run the dialog -void CMicroClientApp::OnAppAbout() { - CAboutDlg aboutDlg; - aboutDlg.DoModal(); -} - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientApp message handlers +// MicroClient.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "MicroClient.h" + +#include "MainFrm.h" +#include "MicroClientDoc.h" +#include "MicroClientView.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientApp + +BEGIN_MESSAGE_MAP(CMicroClientApp, CWinApp) +//{{AFX_MSG_MAP(CMicroClientApp) +ON_COMMAND(ID_APP_ABOUT, OnAppAbout) +// NOTE - the ClassWizard will add and remove mapping macros here. +// DO NOT EDIT what you see in these blocks of generated code! +//}}AFX_MSG_MAP +// Standard file based document commands +ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) +ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientApp construction + +CMicroClientApp::CMicroClientApp() { + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + +///////////////////////////////////////////////////////////////////////////// +// The one and only CMicroClientApp object + +CMicroClientApp theApp; + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientApp initialization + +BOOL CMicroClientApp::InitInstance() { + if (!AfxSocketInit()) { + AfxMessageBox(IDP_SOCKETS_INIT_FAILED); + return FALSE; + } + + AfxEnableControlContainer(); + + // Standard initialization + // If you are not using these features and wish to reduce the size + // of your final executable, you should remove from the following + // the specific initialization routines you do not need. + +#ifdef _AFXDLL + Enable3dControls(); // Call this when using MFC in a shared DLL +#else + Enable3dControlsStatic(); // Call this when linking to MFC statically +#endif + + // Change the registry key under which our settings are stored. + // TODO: You should modify this string to be something appropriate + // such as the name of your company or organization. + SetRegistryKey(_T("Local AppWizard-Generated Applications")); + + LoadStdProfileSettings(); // Load standard INI file options (including MRU) + + // Register the application's document templates. Document templates + // serve as the connection between documents, frame windows and views. + + CSingleDocTemplate *pDocTemplate; + pDocTemplate = new CSingleDocTemplate( + IDR_MAINFRAME, + RUNTIME_CLASS(CMicroClientDoc), + RUNTIME_CLASS(CMainFrame), // main SDI frame window + RUNTIME_CLASS(CMicroClientView)); + AddDocTemplate(pDocTemplate); + + // Parse command line for standard shell commands, DDE, file open + CCommandLineInfo cmdInfo; + ParseCommandLine(cmdInfo); + + // Dispatch commands specified on the command line + if (!ProcessShellCommand(cmdInfo)) + return FALSE; + + // The one and only window has been initialized, so show and update it. + m_pMainWnd->ShowWindow(SW_SHOW); + m_pMainWnd->SetWindowText("WTU-ATRI"); + m_pMainWnd->UpdateWindow(); + + return TRUE; +} + +///////////////////////////////////////////////////////////////////////////// +// CAboutDlg dialog used for App About + +class CAboutDlg : public CDialog { +public: + CAboutDlg(); + + // Dialog Data + //{{AFX_DATA(CAboutDlg) + enum { IDD = IDD_ABOUTBOX }; + //}}AFX_DATA + + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CAboutDlg) +protected: + virtual void DoDataExchange(CDataExchange *pDX); // DDX/DDV support + //}}AFX_VIRTUAL + + // Implementation +protected: + //{{AFX_MSG(CAboutDlg) + // No message handlers + //}}AFX_MSG + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { + //{{AFX_DATA_INIT(CAboutDlg) + //}}AFX_DATA_INIT +} + +void CAboutDlg::DoDataExchange(CDataExchange *pDX) { + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CAboutDlg) + //}}AFX_DATA_MAP +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) +//{{AFX_MSG_MAP(CAboutDlg) +// No message handlers +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +// App command to run the dialog +void CMicroClientApp::OnAppAbout() { + CAboutDlg aboutDlg; + aboutDlg.DoModal(); +} + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientApp message handlers diff --git a/MicroClientDoc.cpp b/src/MicroClientDoc.cpp similarity index 96% rename from MicroClientDoc.cpp rename to src/MicroClientDoc.cpp index 79ed5ef..9a77532 100644 --- a/MicroClientDoc.cpp +++ b/src/MicroClientDoc.cpp @@ -1,116 +1,116 @@ -// MicroClientDoc.cpp : implementation of the CMicroClientDoc class -// - -#include "stdafx.h" -#include "MicroClient.h" -#include "BaseAgent.h" -#include "DSetupDlg.h" -#include "MicroClientDoc.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientDoc - -IMPLEMENT_DYNCREATE(CMicroClientDoc, CDocument) - -BEGIN_MESSAGE_MAP(CMicroClientDoc, CDocument) -//{{AFX_MSG_MAP(CMicroClientDoc) -ON_COMMAND(ID_CONNECT, OnConnect) -ON_UPDATE_COMMAND_UI(ID_CONNECT, OnUpdateConnect) -ON_COMMAND(ID_DISCONNECT, OnDisconnect) -ON_UPDATE_COMMAND_UI(ID_DISCONNECT, OnUpdateDisconnect) -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientDoc construction/destruction - -CMicroClientDoc::CMicroClientDoc() { - // TODO: add one-time construction code here -} - -CMicroClientDoc::~CMicroClientDoc() { - if (m_pAgent) - delete m_pAgent; -} - -BOOL CMicroClientDoc::OnNewDocument() { - if (!CDocument::OnNewDocument()) - return FALSE; - - // TODO: add reinitialization code here - // (SDI documents will reuse this document) - m_pAgent = new CBaseAgent(this); - - return TRUE; -} - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientDoc serialization - -void CMicroClientDoc::Serialize(CArchive &ar) { - if (ar.IsStoring()) { - // TODO: add storing code here - } - else { - // TODO: add loading code here - } -} - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientDoc diagnostics - -#ifdef _DEBUG -void CMicroClientDoc::AssertValid() const { - CDocument::AssertValid(); -} - -void CMicroClientDoc::Dump(CDumpContext &dc) const { - CDocument::Dump(dc); -} -#endif //_DEBUG - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientDoc commands - -void CMicroClientDoc::OnConnect() { - // TODO: Add your command handler code here - // m_pAgent->Connect(); - DSetupDlg Dialog; - - // ask the user for the name of the team and the server - Dialog.m_TeamName = _T("WTU-ATRI"); - Dialog.m_ServerName = _T("127.0.0.1"); - Dialog.m_Channel = 6000; - - // user can repeat with a different address while(TRUE) - { - - // try to connect - if (m_pAgent->ConnectAgent(Dialog.m_TeamName, Dialog.m_ServerName, Dialog.m_Channel)) - return; // TRUE; - if (Dialog.DoModal() != IDOK) - return; // FALSE; - } - m_pAgent->teamname = Dialog.m_TeamName; -} - -void CMicroClientDoc::OnUpdateConnect(CCmdUI *pCmdUI) { - // TODO: Add your command update UI handler code here - // pCmdUI-> -} - -void CMicroClientDoc::OnDisconnect() { - // TODO: Add your command handler code here - // fclose(fp); -} - -void CMicroClientDoc::OnUpdateDisconnect(CCmdUI *pCmdUI) { - // TODO: Add your command update UI handler code here - // pCmdUI-> -} +// MicroClientDoc.cpp : implementation of the CMicroClientDoc class +// + +#include "stdafx.h" +#include "MicroClient.h" +#include "BaseAgent.h" +#include "DSetupDlg.h" +#include "MicroClientDoc.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientDoc + +IMPLEMENT_DYNCREATE(CMicroClientDoc, CDocument) + +BEGIN_MESSAGE_MAP(CMicroClientDoc, CDocument) +//{{AFX_MSG_MAP(CMicroClientDoc) +ON_COMMAND(ID_CONNECT, OnConnect) +ON_UPDATE_COMMAND_UI(ID_CONNECT, OnUpdateConnect) +ON_COMMAND(ID_DISCONNECT, OnDisconnect) +ON_UPDATE_COMMAND_UI(ID_DISCONNECT, OnUpdateDisconnect) +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientDoc construction/destruction + +CMicroClientDoc::CMicroClientDoc() { + // TODO: add one-time construction code here +} + +CMicroClientDoc::~CMicroClientDoc() { + if (m_pAgent) + delete m_pAgent; +} + +BOOL CMicroClientDoc::OnNewDocument() { + if (!CDocument::OnNewDocument()) + return FALSE; + + // TODO: add reinitialization code here + // (SDI documents will reuse this document) + m_pAgent = new CBaseAgent(this); + + return TRUE; +} + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientDoc serialization + +void CMicroClientDoc::Serialize(CArchive &ar) { + if (ar.IsStoring()) { + // TODO: add storing code here + } + else { + // TODO: add loading code here + } +} + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientDoc diagnostics + +#ifdef _DEBUG +void CMicroClientDoc::AssertValid() const { + CDocument::AssertValid(); +} + +void CMicroClientDoc::Dump(CDumpContext &dc) const { + CDocument::Dump(dc); +} +#endif //_DEBUG + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientDoc commands + +void CMicroClientDoc::OnConnect() { + // TODO: Add your command handler code here + // m_pAgent->Connect(); + DSetupDlg Dialog; + + // ask the user for the name of the team and the server + Dialog.m_TeamName = _T("WTU-ATRI"); + Dialog.m_ServerName = _T("127.0.0.1"); + Dialog.m_Channel = 6000; + + // user can repeat with a different address while(TRUE) + { + + // try to connect + if (m_pAgent->ConnectAgent(Dialog.m_TeamName, Dialog.m_ServerName, Dialog.m_Channel)) + return; // TRUE; + if (Dialog.DoModal() != IDOK) + return; // FALSE; + } + m_pAgent->teamname = Dialog.m_TeamName; +} + +void CMicroClientDoc::OnUpdateConnect(CCmdUI *pCmdUI) { + // TODO: Add your command update UI handler code here + // pCmdUI-> +} + +void CMicroClientDoc::OnDisconnect() { + // TODO: Add your command handler code here + // fclose(fp); +} + +void CMicroClientDoc::OnUpdateDisconnect(CCmdUI *pCmdUI) { + // TODO: Add your command update UI handler code here + // pCmdUI-> +} diff --git a/MicroClientView.cpp b/src/MicroClientView.cpp similarity index 96% rename from MicroClientView.cpp rename to src/MicroClientView.cpp index e38ddd9..dfb895e 100644 --- a/MicroClientView.cpp +++ b/src/MicroClientView.cpp @@ -1,74 +1,74 @@ -// MicroClientView.cpp : implementation of the CMicroClientView class -// - -#include "stdafx.h" -#include "MicroClient.h" - -#include "MicroClientDoc.h" -#include "MicroClientView.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientView - -IMPLEMENT_DYNCREATE(CMicroClientView, CView) - -BEGIN_MESSAGE_MAP(CMicroClientView, CView) -//{{AFX_MSG_MAP(CMicroClientView) -// NOTE - the ClassWizard will add and remove mapping macros here. -// DO NOT EDIT what you see in these blocks of generated code! -//}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientView construction/destruction - -CMicroClientView::CMicroClientView() { - // TODO: add construction code here -} - -CMicroClientView::~CMicroClientView() { -} - -BOOL CMicroClientView::PreCreateWindow(CREATESTRUCT &cs) { - // TODO: Modify the Window class or styles here by modifying - // the CREATESTRUCT cs - - return CView::PreCreateWindow(cs); -} - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientView drawing - -void CMicroClientView::OnDraw(CDC *pDC) { - CMicroClientDoc *pDoc = GetDocument(); - ASSERT_VALID(pDoc); - // TODO: add draw code for native data here -} - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientView diagnostics - -#ifdef _DEBUG -void CMicroClientView::AssertValid() const { - CView::AssertValid(); -} - -void CMicroClientView::Dump(CDumpContext &dc) const { - CView::Dump(dc); -} - -CMicroClientDoc *CMicroClientView::GetDocument() // non-debug version is inline -{ - ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMicroClientDoc))); - return (CMicroClientDoc *)m_pDocument; -} -#endif //_DEBUG - -///////////////////////////////////////////////////////////////////////////// -// CMicroClientView message handlers +// MicroClientView.cpp : implementation of the CMicroClientView class +// + +#include "stdafx.h" +#include "MicroClient.h" + +#include "MicroClientDoc.h" +#include "MicroClientView.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientView + +IMPLEMENT_DYNCREATE(CMicroClientView, CView) + +BEGIN_MESSAGE_MAP(CMicroClientView, CView) +//{{AFX_MSG_MAP(CMicroClientView) +// NOTE - the ClassWizard will add and remove mapping macros here. +// DO NOT EDIT what you see in these blocks of generated code! +//}}AFX_MSG_MAP +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientView construction/destruction + +CMicroClientView::CMicroClientView() { + // TODO: add construction code here +} + +CMicroClientView::~CMicroClientView() { +} + +BOOL CMicroClientView::PreCreateWindow(CREATESTRUCT &cs) { + // TODO: Modify the Window class or styles here by modifying + // the CREATESTRUCT cs + + return CView::PreCreateWindow(cs); +} + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientView drawing + +void CMicroClientView::OnDraw(CDC *pDC) { + CMicroClientDoc *pDoc = GetDocument(); + ASSERT_VALID(pDoc); + // TODO: add draw code for native data here +} + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientView diagnostics + +#ifdef _DEBUG +void CMicroClientView::AssertValid() const { + CView::AssertValid(); +} + +void CMicroClientView::Dump(CDumpContext &dc) const { + CView::Dump(dc); +} + +CMicroClientDoc *CMicroClientView::GetDocument() // non-debug version is inline +{ + ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMicroClientDoc))); + return (CMicroClientDoc *)m_pDocument; +} +#endif //_DEBUG + +///////////////////////////////////////////////////////////////////////////// +// CMicroClientView message handlers diff --git a/StdAfx.cpp b/src/StdAfx.cpp similarity index 91% rename from StdAfx.cpp rename to src/StdAfx.cpp index c48cd86..f4d3a78 100644 --- a/StdAfx.cpp +++ b/src/StdAfx.cpp @@ -1,17 +1,17 @@ -// stdafx.cpp : source file that includes just the standard includes -// MicroClient.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" -#include "StrategySystem.h" - -// °ѽÓÊյ½µĶÓԱµÄ×ø±êºͽǶȷÅÈër[0][i]ÀïÃ棬¶Է½¶ÓԱµÄ×ø±ê -// ·ÅÈëopÀïÃæ -// ȡÿ¸ö¶ÓԱµÄÂÖË٣¬ÔÚVelocityº¯Êý¼ÆËãÀïÃæÒѾ­»ñµÃÁËÈý -// ¸ö¶ÓԱµÄÂÖËÙ -int nKick; -CStrategySystem *thePlannerR = new CStrategySystem(0); -CStrategySystem *thePlannerL = new CStrategySystem(1); -Robot2 r[2][11]; -Robot3 op; // ´æ·ŶԷ½¶ÓԱµÄ×ø±êÊý¾Ý +// stdafx.cpp : source file that includes just the standard includes +// MicroClient.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" +#include "StrategySystem.h" + +// °ѽÓÊյ½µĶÓԱµÄ×ø±êºͽǶȷÅÈër[0][i]ÀïÃ棬¶Է½¶ÓԱµÄ×ø±ê +// ·ÅÈëopÀïÃæ +// ȡÿ¸ö¶ÓԱµÄÂÖË٣¬ÔÚVelocityº¯Êý¼ÆËãÀïÃæÒѾ­»ñµÃÁËÈý +// ¸ö¶ÓԱµÄÂÖËÙ +int nKick; +CStrategySystem *thePlannerR = new CStrategySystem(0); +CStrategySystem *thePlannerL = new CStrategySystem(1); +Robot2 r[2][11]; +Robot3 op; // ´æ·ŶԷ½¶ÓԱµÄ×ø±êÊý¾Ý Robot1 theball; // ´æ·ÅÇòµÄ×ø±êÊý¾Ý. \ No newline at end of file diff --git a/StrategySystem.cpp b/src/StrategySystem.cpp similarity index 96% rename from StrategySystem.cpp rename to src/StrategySystem.cpp index 675f9eb..551f42f 100644 --- a/StrategySystem.cpp +++ b/src/StrategySystem.cpp @@ -1,3104 +1,3104 @@ -#include "StdAfx.h" -#include "StrategySystem.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -IMPLEMENT_DYNAMIC(CStrategySystem, CObject) - -extern int nKick; -#define BALL_WIDTH 78 -#define BALL_LENGTH 156 -#define BALL_DIS 26 -#define CORNER 115 - -#define ANGLE_BOUND 60 -#define BOUND_BOUND 12 -#define G_OFFSET 20 -#define G_ANGLE_BOUND 60 -#define G_BOUND_BOUND 10 - -// 罚球 -void CStrategySystem::Penalty() { - srand(time(nullptr)); - int x = rand() % 2; - int d = 21; - static bool faceR; // 角度 - if (x) { - if (Distance(home1.position, ball.position) > d) { - Direction(HOME1, ball.position); - faceR = fabs(home1.angle) > 90; - } - else { - double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 505)))); // 求曲线行驶时轨迹的半径 - int lw = r / (r + 6) * 127; - if (faceR) - Velocity(1, lw, 127); - else - Velocity(1, -127, -lw); - } - } - else { - if (Distance(home1.position, ball.position) > d) { - Direction(HOME1, ball.position); - faceR = fabs(home1.angle) > 90; - } - else { - double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 313)))); - int rw = r / (r + 6) * 127; - if (!faceR) - Velocity(1, -rw, -127); - else - Velocity(1, 127, rw); - } - } - Direction(HOME2, ball.position); - Direction(HOME3, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME7, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - Direction(HOME10, ball.position); -} - -// 争球 -void CStrategySystem::Freeball() { - // 要实现先直冲,在曲线的话,就要加一个标识符标识此时的状态,当距离不足时标识符为1,距离够时标识符变为0,并且在争球结束后变为1 - // 感觉防御的话就直冲判断比较简单粗暴,毕竟目标是拦截,而不是射门, - static bool faceR; - int d = 25; - if (Status() == 2) { // 左上 - Direction(HOME3, ball.position); - Direction(HOME1, ball.position); - Direction(HOME2, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME7, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - Direction(HOME10, ball.position); - } - else if (Status() == 3) { // 左下 - Direction(HOME1, ball.position); - } - /* if (Status() == 2) { // 左上 - if (Distance(home3.position, ball.position) > d && flag) { - Direction(HOME3, CPoint(ball.position.x,ball.position.y-6)); - faceR = fabs(home3.angle) > 90; - } - else { - flag = false; - double r = Distance(home3.position, ball.position) / (2 * (sin(atwo(home3.pos.x, home3.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 605)))); // 求曲线行驶时轨迹的半径 - int lw = (r-5) / (r +8) * 127; - if (faceR) - Velocity(3, lw, 127); - else - Velocity(3, -127, -lw); - } - Direction(HOME1, ball.position); - Direction(HOME2, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME7, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - Direction(HOME10, ball.position); - } - - else if (Status() == 3) { // 左下 - if (Distance(home1.position, ball.position) > d && flag) { - Direction(HOME1, ball.position); - faceR = fabs(home1.angle) > 90; - } - else { - flag = false; - double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 213)))); - int rw = (r - 5) / (r + 8) * 127; - if (!faceR) - Velocity(1, -rw, -127); - else - Velocity(1, 127, rw); - } - Direction(HOME2, ball.position); - Direction(HOME3, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME7, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - Direction(HOME10, ball.position); - }*/ - else if (Status() == 4) { // 右上 - Direction(HOME10, ball.position); - } - /*else if (Status() == 4) { // 右上 - if (Distance(home10.position, ball.position) > d && flag) { - Direction(HOME10, ball.position); - faceR = fabs(home10.angle) > 90; - } - else { - flag = false; - double r = Distance(home10.position, ball.position) / (2 * (sin(atwo(home10.pos.x, home10.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 515, 95)))); - int rw = (r - 5) / (r + 5) * 127; - if (faceR) - Velocity(10, -rw, -127); - else - Velocity(10, 127, rw); - } - Direction(HOME1, ball.position); - Direction(HOME2, ball.position); - Direction(HOME3, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME7, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - } */ - /* else if (Status() == 5) { // 右下 - if (Distance(home7.position, ball.position) > d && flag) { - Direction(HOME7, ball.position); - faceR = fabs(home7.angle) > 90; - } - else { - flag = false; - double r = Distance(home7.position, ball.position) / (2 * (sin(atwo(home7.pos.x, home7.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 515, 723)))); - int lw = (r - 8) / (r + 5) * 127; - if (faceR) - Velocity(7, -127, -lw); - else - Velocity(7, lw, 127); - } - Direction(HOME1, ball.position); - Direction(HOME2, ball.position); - Direction(HOME3, ball.position); - Direction(HOME4, ball.position); - Direction(HOME5, ball.position); - Direction(HOME6, ball.position); - Direction(HOME8, ball.position); - Direction(HOME9, ball.position); - Direction(HOME10, ball.position); - }*/ - else if (Status() == 5) { // 右下//也许还有其它改进的思路,但实在南蚌 - Direction(HOME7, ball.position); - } - else // 这个标识符判断的问题到底咋搞,放在这的话应该是要在action函数里把freeball函数一直调用,如果要把还原放在action函数的话就要再不是争球的情况下都还原 - flag = 1; -} - -// 两直线间夹角 -double CStrategySystem::atwo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { - double j = 0; - double k1 = (y1 - y2) / (x1 - x2); - double k2 = (y3 - y4) / (x3 - x4); - j = atan(fabs((k2 - k1) / (1 + k1 * k2))); - return j; -} - -// void CStrategySystem::spin(int which, bool isClockwise) { // 自旋 -// if (isClockwise) -// Velocity(which, 127, -127); -// else -// Velocity(which, -127, 127); -// } - -// 控球 -// void CStrategySystem::Possession() { -// navigate(); -/*for(int i=1;i<11;i++) -{ - Navigation[i]=ball.position; -}*/ - -// if (ball.position.x < 290) { -// Canshot(); -// for (int i = 1; i < 9; i++) { -// control(i); -// } -// } -// else -// for (int i = 1; i < 11; i++) { -// control(i); -// } - -// bool a, b; -// if (ball.position.y >= 337 && ball.position.x < 290) // 球在敌方下半 -// { -// if ((ball.position.y >= 481 && ball.position.y <= 607) || (ball.position.x - ball.oldPosition.x <= 5 && ball.position.y - ball.oldPosition.y <= 5) && search1() < 4) // 7可射 -// shot(7, 1); // 7射 -// else -// control(7); - -// if (Distance(ball.position, home2.position) <= 75) // 2可射 -// { -// control(1); // 1 -// if (search1() < 4) -// shot(HOME2, 1); // 2射 -// else -// control(2); -// for (int i = 3; i < 7; i++) // 3-6 -// control(i); -// control(1); // 8 -// if (!canshot()) // 9,10 -// { -// control(9); -// control(10); -// } -// } -// else if (Distance(ball.position, home3.position) <= 75 && ball.position.y <= 481 && ball.position.y >= 505) // 3可射 -// { -// control(1); // 1 -// control(2); // 2 -// if (search1() < 4) -// shot(HOME3, 0); // 3射 -// else -// control(3); -// for (int i = 4; i < 7; i++) // 4-6 -// control(i); -// control(8); // 8 -// if (!canshot()) // 9,10 -// { -// control(9); -// control(10); -// } -// } -// else // 其它情况 -// for (int i = 1; i < 11; i++) // 1-10 -// control(i); -// } -// else if (ball.position.y < 481 && ball.position.x < 290) // 球在敌方上半 -// { -// if ((ball.position.y >= 217 && ball.position.y <= 337) || (ball.position.x - ball.oldPosition.x <= 5 && ball.position.y - ball.oldPosition.y <= 5) && search1() < 4) // 8可射 -// shot(8, 0); -// else -// control(8); -// if (Distance(ball.position, home3.position) <= 75) // 3可射 -// { -// control(1); // 1 -// control(2); // 2 -// if (search1() < 4) -// shot(HOME3, 0); // 3射 -// else -// control(3); -// for (int i = 4; i < 7; i++) // 4-6 -// control(i); -// control(HOME7); // 7 -// if (!canshot()) // 9,10 -// { -// control(9); -// control(10); -// } -// } -// else if (Distance(ball.position, home2.position) <= 75 && ball.position.y >= 313 && ball.position.y <= 337) // 2可射 -// { - -// control(1); // 1 -// if (search1() < 4) -// shot(2, 0); // 2射 -// else -// control(2); -// control(HOME3); // 3 -// for (int i = 4; i < 7; i++) // 4-6 -// control(i); -// control(HOME7); // 7 -// if (!canshot()) // 9,10 -// { -// control(9); -// control(10); -// } -// } -// else // 其它情况 -// for (int i = 1; i < 11; i++) // 1-10 -// control(i); -// } -// else // 其它情况 -// for (int i = 1; i < 11; i++) // 1-10 -// control(i); -//} - -// 控球具体实现 -void CStrategySystem::Possession() { - CPoint pos[10]; // pos[0] 中央球员;p[1:9] 阵型球员 - - RelPos rp[10]; // 阵型球员相对中央球员的位置 - for (int i = 0; i < 10; i++) - rp[i].id = i + 1; - - CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; - if (cp_id()) { - pos[0] = cur_pos[cp_id() - 1]; - - for (int i = 0; i < 10; i++) { - if (rp[i].id == cp_id()) { - rp[i].ang = 0; - rp[i].dis = 0; - } - else { - rp[i].ang = atan2(cur_pos[i].y - pos[0].y, cur_pos[i].x - pos[0].x); - rp[i].dis = Distance(cur_pos[i], pos[0]); - } - } - - RelPos r; - - // 孙徐 - if (fm_id() == 1) { - Direction(cp_id(), ball.position); - - pos[1] = CPoint(pos[0].x, pos[0].y - 20); - pos[2] = CPoint(pos[0].x + 20, pos[0].y - 20); - pos[3] = CPoint(pos[0].x + 20, pos[0].y); - pos[6] = CPoint(pos[0].x + 40, pos[0].y); - pos[4] = CPoint(pos[0].x + 20, pos[0].y + 20); - pos[7] = CPoint(pos[0].x + 40, pos[0].y + 20); - pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); - pos[8] = CPoint(170, 409); - pos[9] = CPoint(170, 556); - - fp_sort(rp); - fp_sort(rp, 0, 5); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - fp_sort(rp, 5, 7); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (fm_id() == 2) { - Direction(cp_id(), ball.position); - - pos[1] = CPoint(pos[0].x, pos[0].y + 20); - pos[2] = CPoint(pos[0].x + 20, pos[0].y + 20); - pos[3] = CPoint(pos[0].x + 20, pos[0].y); - pos[6] = CPoint(pos[0].x + 40, pos[0].y); - pos[4] = CPoint(pos[0].x + 20, pos[0].y - 20); - pos[7] = CPoint(pos[0].x + 40, pos[0].y - 20); - pos[5] = CPoint(pos[0].x + 20, pos[0].y - 40); - pos[8] = CPoint(170, 409); - pos[9] = CPoint(170, 265); - - fp_sort(rp); - fp_sort(rp, 0, 5); - Direction(rp[5].id, pos[1]); - Direction(rp[4].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[2].id, pos[4]); - Direction(rp[1].id, pos[5]); - fp_sort(rp, 5, 7); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (fm_id() == 3) { - if (ball.position.x >= 157 && ball.position.x <= 290 && ball.position.y <= 409) { - // 内圈 - pos[1] = CPoint(pos[0].x - 20, pos[0].y - 40); - pos[2] = CPoint(pos[0].x + 20, pos[0].y - 40); - pos[3] = CPoint(pos[0].x + 40 * cos(30), pos[0].y - 40 * sin(30)); - pos[4] = CPoint(pos[0].x + 40 * cos(30), pos[0].y + 40 * sin(40)); - pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); - pos[6] = CPoint(pos[0].x - 20, pos[0].y + 40); - // 内圈 - pos[7] = CPoint(pos[0].x + 120 * cos(67.5), pos[0].y - 120 * sin(67.5)); - pos[8] = CPoint(pos[0].x + 120 * cos(45), pos[0].y - 120 * sin(45)); - pos[9] = CPoint(pos[0].x + 120 * cos(22.5), pos[0].y - 120 * sin(22.5)); - shot(cp_id(), CPoint(45, 361)); - fp_sort(rp); - fp_sort(rp, 0, 6); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 5, 8); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (ball.position.x >= 157 && ball.position.x <= 290 && ball.position.y > 409) { - // 内圈 - pos[1] = CPoint(pos[0].x - 20, pos[0].y - 40); - pos[2] = CPoint(pos[0].x + 20, pos[0].y - 40); - pos[3] = CPoint(pos[0].x + 40 * cos(30), pos[0].y - 40 * sin(30)); - pos[4] = CPoint(pos[0].x + 40 * cos(30), pos[0].y + 40 * sin(40)); - pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); - pos[6] = CPoint(pos[0].x - 20, pos[0].y + 40); - // 内圈 - pos[7] = CPoint(pos[0].x + 120 * cos(67.5), pos[0].y + 120 * sin(67.5)); - pos[8] = CPoint(pos[0].x + 120 * cos(45), pos[0].y + 120 * sin(45)); - pos[9] = CPoint(pos[0].x + 120 * cos(22.5), pos[0].y + 120 * sin(22.5)); - shot(cp_id(), CPoint(45, 457)); - fp_sort(rp); - fp_sort(rp, 0, 6); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 5, 8); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (ball.position.x < 157 && ball.position.y >= 217 && ball.position.y <= 409) // 球在上半 - { - pos[1] = CPoint(142, pos[0].y - 20); - pos[2] = CPoint(142, pos[0].y + 20); - - pos[3] = CPoint(170, pos[0].y - 20); - pos[4] = CPoint(170, pos[0].y + 20); - pos[5] = CPoint(185, pos[0].y - 12); - if (pos[0].y - 50 < 157) - pos[6] = CPoint(ball.position.x + 12, 225); - else - pos[6] = CPoint(170, pos[0].y - 50); - pos[7] = CPoint(ball.position.x, 225); - pos[8] = CPoint(170, pos[0].y + 45); - pos[9] = CPoint(170, pos[0].y + 405); - shot(cp_id()); - fp_sort(rp, 0, 8); - Direction(rp[7].id, pos[1]); - Direction(rp[8].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[1].id, pos[6]); - Direction(rp[2].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (ball.position.x < 157 && ball.position.y >= 217 && ball.position.y > 409) // 球在下半 - { - pos[1] = CPoint(142, pos[0].y - 20); - pos[2] = CPoint(142, pos[0].y + 20); - - pos[3] = CPoint(170, pos[0].y - 20); - pos[4] = CPoint(170, pos[0].y + 20); - pos[5] = CPoint(185, pos[0].y + 12); - if (pos[0].y + 50 > 607) - pos[6] = CPoint(ball.position.x + 12, 615); - else - pos[6] = CPoint(170, pos[0].y + 50); - pos[7] = CPoint(ball.position.x, 615); - pos[8] = CPoint(170, pos[0].y - 45); - pos[9] = CPoint(170, pos[0].y - 405); - shot(cp_id()); - fp_sort(rp, 0, 8); - Direction(rp[7].id, pos[1]); - Direction(rp[8].id, pos[2]); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[1].id, pos[6]); - Direction(rp[2].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - } - - // 王徐 - else if (fm_id() == 4) { - Direction(cp_id(), ball.position); - - pos[1] = CPoint(ball.position.x + (int)cos(45.0 * PI / 180.0) * 20, ball.position.y + (int)sin(45.0 * PI / 180.0) * 20); - pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); - pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); - pos[4] = CPoint(pos[0].x + (int)cos(15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(15.0 * PI / 180.0) * 40); - pos[5] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(30.0 * PI / 180.0) * 40); - pos[6] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); - pos[7] = CPoint(pos[0].x + (int)cos(50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(50.0 * PI / 180.0) * 60); - pos[8] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); - pos[9] = CPoint(pos[0].x + (int)cos(75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(75.0 * PI / 180.0) * 60); - - fp_sort(rp); - fp_sort(rp, 0, 2); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 2, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 6, 9); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - - /*double d[10], dy[10]; - CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; - for (int i = 0; i <= 9; i++) { - if (i == cp_id() - 1) { - d[i] = 1e5; - } - else { - d[i] = Distance(cur_pos[i], cur_pos[cp_id() - 1]); - } - } - int p1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - for (int i = 1; i <= 10; i++) { - for (int j = 0; j < 10 - i; j++) { - if (d[j] > d[j + 1]) { - int tmp = d[j]; - d[j] = d[j + 1]; - d[j + 1] = tmp; - tmp = p1[j]; - p1[j] = p1[j + 1]; - p1[j + 1] = tmp; - } - } - } - Direction(p1[0], pos[0]); - Direction(p1[1], pos[1]); - for (int i = 0; i <= 9; i++) { - if (i == cp_id() - 1) { - dy[i] = 1e5; - } - else { - dy[p1[i]] = 217 - cur_pos[i].y; - } - } - dy[p1[0]] = 1e5; - dy[p1[1]] = 1e5; - int p2[10] = { p1[0], p1[1], p1[2], p1[3], p1[4], p1[5], p1[6], p1[7], p1[8], p1[9] }; - for (int i = 1; i <= 10; i++) { - for (int j = 0; j < 10 - i; j++) { - if (dy[j] > dy[j + 1]) { - int tmp = d[j]; - dy[j] = dy[j + 1]; - dy[j + 1] = tmp; - tmp = p2[j]; - p2[j] = p2[j + 1]; - p2[j + 1] = tmp; - } - } - } - Direction(p2[0], pos[9]); - Direction(p2[1], pos[8]); - Direction(p2[2], pos[7]); - Direction(p2[3], pos[6]); - Direction(p2[4], pos[5]); - Direction(p2[5], pos[4]); - Direction(p2[6], pos[3]);*/ - } - else if (fm_id() == 5) { - Direction(cp_id(), ball.position); - - pos[2] = CPoint(ball.position.x + (int)cos(0.0 * PI / 180.0) * 20, ball.position.y + (int)sin(0.0 * PI / 180.0) * 20); - pos[1] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); - pos[6] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); - pos[5] = CPoint(pos[0].x + (int)cos(-15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-15.0 * PI / 180.0) * 40); - pos[4] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 40); - pos[3] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(6 - 45.0 * PI / 180.0) * 40); - pos[9] = CPoint(pos[0].x + (int)cos(-50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-50.0 * PI / 180.0) * 60); - pos[8] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); - pos[7] = CPoint(pos[0].x + (int)cos(-75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-75.0 * PI / 180.0) * 60); - - fp_sort(rp); - fp_sort(rp, 0, 2); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 2, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 6, 9); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - - // double d[10], dy[10]; // dy是球员新的 - // CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; - // for (int i = 0; i <= 9; i++) { - // if (i == cp_id() - 1) { - // d[i] = 1e5; - // } - // else { - // d[i] = Distance(cur_pos[i], cur_pos[cp_id() - 1]); - // } - // } - // int p1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // p1是球员新下标 - // for (int i = 1; i <= 10; i++) { - // for (int j = 0; j < 10 - i; j++) { - // if (d[j] > d[j + 1]) { - // // 根据球员与中心球员距离,按从小到大排列距离 - // int tmp = d[j]; - // d[j] = d[j + 1]; - // d[j + 1] = tmp; - - // // 距离交换后,下标同时交换 - // tmp = p1[j]; - // p1[j] = p1[j + 1]; - // p1[j + 1] = tmp; - // } - // } - //} - // Direction(p1[0], pos[0]); - // Direction(p1[1], pos[1]); - // for (int i = 0; i <= 9; i++) { - // if (i == cp_id() - 1) { - // dy[i] = 1e5; - // } - // else { - // dy[p1[i]] = cur_pos[i].y - 607; - // } - //} - // dy[p1[0]] = 1e5; - // dy[p1[1]] = 1e5; - //// p2 - // int p2[10] = { p1[0], p1[1], p1[2], p1[3], p1[4], p1[5], p1[6], p1[7], p1[8], p1[9] }; - // for (int i = 1; i <= 10; i++) { - // for (int j = 0; j < 10 - i; j++) { - // if (dy[j] > dy[j + 1]) { - // int tmp = d[j]; - // dy[j] = dy[j + 1]; - // dy[j + 1] = tmp; - - // // 距离交换后,下标同时交换 - // tmp = p2[j]; - // p2[j] = p2[j + 1]; - // p2[j + 1] = tmp; - // } - // } - //} - // Direction(p2[0], pos[9]); - // Direction(p2[1], pos[8]); - // Direction(p2[2], pos[7]); - // Direction(p2[3], pos[6]); - // Direction(p2[4], pos[5]); - // Direction(p2[5], pos[4]); - // Direction(p2[6], pos[3]); - } - else if (fm_id() == 6) { - Direction(cp_id(), ball.position); - - pos[1] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); - pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); - pos[5] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); - pos[3] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-45.0 * PI / 180.0) * 40); - pos[4] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); - pos[9] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); - pos[6] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); - pos[8] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 60, pos[0].y + (int)sin(30.0 * PI / 180.0) * 60); - pos[7] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 60); - - fp_sort(rp); - fp_sort(rp, 0, 2); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 2, 5); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - fp_sort(rp, 5, 9); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - - /*int d[10]; - CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; - for (int i = 0; i <= 9; i++) { - if (i == cp_id() - 1) { - d[i] = 1e5; - } - d[i] = cur_pos[i].x - cur_pos[cp_id() - 1].x; - } - int p[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - for (int i = 1; i <= 10; i++) { - int j; - for (j = 0; j < 10 - i; j++) { - if (d[j] > d[j + 1]) { - int tmp = d[j]; - d[j] = d[j + 1]; - d[j + 1] = tmp; - tmp = p[j]; - p[j] = p[j + 1]; - p[j + 1] = tmp; - } - } - } - for (int i = 0; i <= 9; i++) { - if (p[i] = cp_id() - 1) - continue; - Direction(p[i], pos[i + 1]); - }*/ - } - // 景缪 - else if (fm_id() == 7) { - Direction(cp_id(), ball.position); - - if (ball.position.x > 873) { - pos[1] = CPoint(pos[0].x + 20, pos[0].y - 15); - pos[2] = CPoint(pos[0].x + 20, pos[0].y + 15); - pos[3] = CPoint(pos[0].x + 10, pos[0].y + 30); - pos[4] = CPoint(pos[0].x - 20, pos[0].y + 20); - pos[5] = CPoint(pos[0].x + 20, pos[0].y - 30); - pos[6] = CPoint(pos[0].x - 40, pos[0].y + 20); - pos[7] = CPoint(896, 217); - pos[8] = CPoint(919, 217); - pos[9] = CPoint(942, 217); - } - else { - pos[1] = CPoint(pos[0].x, pos[0].y - 20); - pos[2] = CPoint(pos[0].x + 10, pos[0].y + 20); - pos[3] = CPoint(pos[0].x - 25, pos[0].y + 30); - pos[4] = CPoint(pos[0].x - 40, pos[0].y + 30); - pos[5] = CPoint(pos[0].x + 10, pos[0].y + 50); - pos[6] = CPoint(pos[0].x + 50, pos[0].y - 10); - int n1 = 643 > ball.position.x ? 623 : ball.position.x; - int n2 = 733 > ball.position.x ? 733 : ball.position.x; - pos[7] = CPoint(n1, 217); - pos[8] = CPoint(n2, 217); - pos[9] = CPoint(939, 217); - } - - fp_sort(rp); - fp_sort(rp, 0, 2); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 2, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 6, 9); - PositionSE(rp[7].id, pos[7]); - PositionSE(rp[8].id, pos[8]); - PositionSE(rp[9].id, pos[9]); - - // double adou[15]; - // int xz[15]; - // int n = 1; - // xz[n] = cp_id(); - // int pp[15]; - // for (int i = 1; i <= 9; i++) // 按角度从小到大排序,然后最小的占据点位,并且后续将已分配的记名,不参与接下来的分配 - // { - // for (int u = 1; u <= 10; u++) { - // Robot2 *robot; - // switch (u) { - // case HOME1: - // robot = &home1; - // break; - // case HOME2: - // robot = &home2; - // break; - // case HOME3: - // robot = &home3; - // break; - // case HOME4: - // robot = &home4; - // break; - // case HOME5: - // robot = &home5; - // break; - // case HOME6: - // robot = &home6; - // break; - // case HOME7: - // robot = &home7; - // break; - // case HOME8: - // robot = &home8; - // break; - // case HOME9: - // robot = &home9; - // break; - // case HOME10: - // robot = &home10; - // break; - // } - // adou[u] = atwo(robot->position.x, robot->position.y, ball.position.x, ball.position.y, pos[i].x, pos[i].y, ball.position.x, ball.position.y); // 先将值赋给adou - // pp[u] = u; - // } - - // // 然后求adou里最小的,给pos[1]的坐标,并将球员号计入xz中 - // for (int u = 1; u <= 10; u++) - // for (int j = u + 1; j <= 10; j++) - // if (adou[u] > adou[j]) { - // double t; - // int m; - // m = pp[u]; - // pp[u] = pp[j]; - // pp[j] = m; - // t = adou[u]; - // adou[u] = adou[j]; - // adou[j] = t; - // } - // for (int u = 1; u <= 10; u++) { - // int o = 0; - // for (int j = 1; j <= n; j++) { - // if (pp[u] == xz[j]) // 是记录人员 - // { - // break; - // } - // if (j == n) // 不是记录人员 - // { - // Direction(pp[u], pos[i]); - // n++; - // xz[n] = pp[u]; - // o = 1; - // } - // } - // if (o == 1) - // break; - // } - // } - // // if (Distance(pos[i], ball.position)<5) - // // PositionSE(pos[i], ball.position); // 在这个阵型这个点位处的球员就击球 - // // 否则就保持一定速度在点位待机 - } - else if (fm_id() == 8) { - Direction(cp_id(), ball.position); - - if (ball.position.x > 873) { - pos[1] = CPoint(pos[0].x + 20, pos[0].y + 15); - pos[2] = CPoint(pos[0].x + 20, pos[0].y - 15); - pos[3] = CPoint(pos[0].x + 20, pos[0].y - 30); - pos[4] = CPoint(pos[0].x - 20, pos[0].y - 20); - pos[5] = CPoint(pos[0].x + 20, pos[0].y + 30); - pos[6] = CPoint(pos[0].x - 40, pos[0].y - 20); - pos[7] = CPoint(896, 608); - pos[8] = CPoint(919, 608); - pos[9] = CPoint(942, 608); - } - else { - pos[1] = CPoint(pos[0].x, pos[0].y + 20); - pos[2] = CPoint(pos[0].x + 10, pos[0].y - 20); - pos[6] = CPoint(pos[0].x - 25, pos[0].y - 30); - pos[5] = CPoint(pos[0].x - 40, pos[0].y - 30); - pos[4] = CPoint(pos[0].x + 10, pos[0].y - 50); - pos[3] = CPoint(pos[0].x + 50, pos[0].y + 10); - int n1 = 643 > ball.position.x ? 643 : ball.position.x; - int n2 = 733 > ball.position.x ? 733 : ball.position.x; - pos[7] = CPoint(n1, 608); - pos[8] = CPoint(n2, 608); - pos[9] = CPoint(939, 608); - } - - fp_sort(rp); - fp_sort(rp, 0, 2); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 2, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - fp_sort(rp, 6, 9); - PositionSE(rp[7].id, pos[7]); - PositionSE(rp[8].id, pos[8]); - PositionSE(rp[9].id, pos[9]); - // double adou[15]; - // int xz[15]; - // int n = 1; - // xz[n] = cp_id(); - // int pp[15]; - // for (int i = 1; i <= 9; i++) // 按角度从小到大排序,然后最小的占据点位,并且后续将已分配的记名,不参与接下来的分配 - // { - - // for (int u = 1; u <= 10; u++) { - // Robot2 *robot; - // switch (u) { - // case HOME1: - // robot = &home1; - // break; - // case HOME2: - // robot = &home2; - // break; - // case HOME3: - // robot = &home3; - // break; - // case HOME4: - // robot = &home4; - // break; - // case HOME5: - // robot = &home5; - // break; - // case HOME6: - // robot = &home6; - // break; - // case HOME7: - // robot = &home7; - // break; - // case HOME8: - // robot = &home8; - // break; - // case HOME9: - // robot = &home9; - // break; - // case HOME10: - // robot = &home10; - // break; - // } - // adou[u] = atwo(robot->position.x, robot->position.y, ball.position.x, ball.position.y, pos[i].x, pos[i].y, ball.position.x, ball.position.y); // 先将值赋给adou - // pp[u] = u; - // } - // // 然后求adou里最小的,给pos[1]的坐标,并将球员号计入xz中 - // for (int u = 1; u <= 10; u++) - // for (int j = u + 1; j <= 10; j++) - // if (adou[u] > adou[j]) { - // double t; - // int m; - // m = pp[u]; - // pp[u] = pp[j]; - // pp[j] = m; - // t = adou[u]; - // adou[u] = adou[j]; - // adou[j] = t; - // } - // for (int u = 1; u <= 10; u++) { - // int o = 0; - // for (int j = 1; j <= n; j++) { - // if (pp[u] == xz[j]) // 是记录人员 - // { - // break; - // } - // if (j == n) // 不是记录人员 - // { - // Direction(pp[u], pos[i]); - // n++; - // xz[n] = pp[u]; - // o = 1; - // } - // } - // if (o == 1) - // break; - // } - // } - // // if (Distance(pos[i], ball.position)<5) - // // PositionSE(pos[i], ball.position);//在这个阵型这个点位处的球员就击球 - // // 否则就保持一定速度在点位待机 - } - else if (fm_id() == 9) { - Direction(cp_id(), ball.position); - if (ball.position.y > 409) { - pos[1].y = pos[0].y - 35; - pos[1].x = pos[0].x - 10; - pos[2].y = pos[0].y - 25; - pos[2].x = pos[0].x + 30; - pos[3].y = pos[0].y; - pos[3].x = pos[0].x + 30; - pos[4].y = pos[0].y - 65; - pos[4].x = pos[0].x; - pos[5].y = pos[0].y - 75; - pos[5].x = pos[0].x + 60; - pos[6].y = pos[0].y - 60; - pos[6].x = pos[0].x + 70; - pos[7].y = pos[0].y + 20; - pos[7].x = pos[0].x + 70; - pos[8].y = pos[0].y + 60; - pos[8].x = pos[0].x + 70; - pos[9].y = pos[0].y - 90; - pos[9].x = pos[0].x + 07; - } - else if (ball.position.y <= 409) { - pos[1].y = pos[0].y; - pos[1].x = pos[0].x + 30; - pos[2].y = pos[0].y + 35; - pos[2].x = pos[0].x - 40; - pos[3].y = pos[0].y + 25; - pos[3].x = pos[0].x; - pos[4].y = pos[0].y + 65; - pos[4].x = pos[0].x + 70; - pos[5].y = pos[0].y + 75; - pos[5].x = pos[0].x + 60; - pos[6].y = pos[0].y + 65; - pos[6].x = pos[0].x + 70; - pos[7].y = pos[0].y + 20; - pos[7].x = pos[0].x + 70; - pos[8].y = pos[0].y - 20; - pos[8].x = pos[0].x + 70; - pos[9].y = pos[0].y + 90; - pos[9].x = pos[0].x + 70; - } - if (ball.position.x >= 800) { // 球临近禁区 - fp_sort(rp); - fp_sort(rp, 0, 3); - PositionSE(rp[1].id, pos[1]); - PositionSE(rp[2].id, pos[2]); - PositionSE(rp[3].id, pos[3]); - fp_sort(rp, 3, 8); - PositionSE(rp[4].id, pos[4]); - PositionSE(rp[5].id, pos[5]); - PositionSE(rp[6].id, pos[6]); - PositionSE(rp[7].id, pos[7]); - PositionSE(rp[8].id, pos[8]); - fp_sort(rp, 8, 9); - PositionSE(rp[9].id, pos[9]); - } - else { - fp_sort(rp); - fp_sort(rp, 0, 3); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - Direction(rp[3].id, pos[3]); - fp_sort(rp, 3, 8); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - fp_sort(rp, 8, 9); - Direction(rp[9].id, pos[9]); - } - } - } - else { // TODO 无中央球员 - if (fm_id() == 4 || fm_id() == 6) { - pos[0] = CPoint(ball.position.x + (int)cos(0 * PI / 180) * 40, ball.position.y + (int)sin(20 * PI / 180) * 40); - pos[1] = CPoint(ball.position.x + (int)cos(45.0 * PI / 180.0) * 20, ball.position.y + (int)sin(45.0 * PI / 180.0) * 20); - pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); - pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); - pos[4] = CPoint(pos[0].x + (int)cos(15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(15.0 * PI / 180.0) * 40); - pos[5] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(30.0 * PI / 180.0) * 40); - pos[6] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); - pos[7] = CPoint(pos[0].x + (int)cos(50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(50.0 * PI / 180.0) * 60); - pos[8] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); - pos[9] = CPoint(pos[0].x + (int)cos(75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(75.0 * PI / 180.0) * 60); - - fp_sort(rp); - fp_sort(rp, 0, 3); - Direction(rp[0].id, pos[0]); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 3, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - fp_sort(rp, 6, 10); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - else if (fm_id() == 5) { - pos[0] = CPoint(ball.position.x + (int)cos(0 * PI / 180) * 40, ball.position.y - (int)sin(20 * PI / 180) * 40); - pos[1] = CPoint(ball.position.x + (int)cos(0.0 * PI / 180.0) * 20, ball.position.y + (int)sin(0.0 * PI / 180.0) * 20); - pos[2] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); - pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); - pos[4] = CPoint(pos[0].x + (int)cos(-15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-15.0 * PI / 180.0) * 40); - pos[5] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 40); - pos[6] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-45.0 * PI / 180.0) * 40); - pos[7] = CPoint(pos[0].x + (int)cos(-50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-50.0 * PI / 180.0) * 60); - pos[8] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); - pos[9] = CPoint(pos[0].x + (int)cos(-75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-75.0 * PI / 180.0) * 60); - - fp_sort(rp); - fp_sort(rp, 0, 3); - Direction(rp[0].id, pos[0]); - Direction(rp[1].id, pos[1]); - Direction(rp[2].id, pos[2]); - fp_sort(rp, 3, 6); - Direction(rp[3].id, pos[3]); - Direction(rp[4].id, pos[4]); - Direction(rp[5].id, pos[5]); - fp_sort(rp, 6, 10); - Direction(rp[6].id, pos[6]); - Direction(rp[7].id, pos[7]); - Direction(rp[8].id, pos[8]); - Direction(rp[9].id, pos[9]); - } - } -} - -// 搜索最近球员位置 -// CPoint CStrategySystem::searchNear(int which) { -// CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; -// double ddd = 10000; -// CPoint near; -// for (int i = 0; i < 10; i++) { -// if (Distance(cur_pos[i], ball.position) < ddd) { -// ddd = Distance(cur_pos[i], ball.position); -// near = cur_pos[i]; -// } -// } -// return near; -// } - -// 中央球员 ID -int CStrategySystem::cp_id() { - int id = 0; - CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; - if (fm_id() == 1) { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].y >= ball.position.y) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - else if (fm_id() == 2) { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].y <= ball.position.y) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - else if (fm_id() == 7) { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].y <= ball.position.y) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - else if (fm_id() == 8) { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].y >= ball.position.y) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - else if (fm_id() == 3) { - if (ball.position.x >= 157 && ball.position.x <= 290) { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].x < ball.position.x) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - else if (ball.position.x >= 65 && ball.position.x < 157) // 球在禁区用y轴最近 - { - double min = 10000; - for (int i = 0; i < 10; i++) { - if (cur_pos[i].x < ball.position.x) - cur_pos[i] = CPoint(-965, -723); - } - for (int i = 0; i < 10; i++) { - if (fabs(ball.position.y - cur_pos[i].y) < min) { - min = fabs(ball.position.y - cur_pos[i].y); - id = i + 1; - } - } - } - } - else { - for (int i = 0; i < 10; i++) { - if (cur_pos[i].x <= ball.position.x) - cur_pos[i] = CPoint(-965, -723); - } - double min = 10000; - for (int i = 0; i < 10; i++) { - if (Distance(cur_pos[i], ball.position) < min) { - min = Distance(cur_pos[i], ball.position); - id = i + 1; - } - } - } - return id; -} - -// 阵型 ID -int CStrategySystem::fm_id() { - if (ball.position.x < 290) { - if (ball.position.y < 217) - return 1; - else if (ball.position.y <= 607) - return 3; - else - return 2; - } - else if (ball.position.x < 740) { - if (ball.position.y < 217) - return 4; - else if (ball.position.y <= 607) - return 6; - else - return 5; - } - else { - if (ball.position.y < 217) - return 7; - else if (ball.position.y <= 607) - return 9; - else - return 8; - } -} - -// 阵型球员相对中央球员的位置结构体 -// struct RelPos { -// int id; -// double dis; -// double ang; // (-π, π] -// }; - -// 阵型球员排序,h 为该层前的球员数量,t 为包含该层后的球员数量 -void CStrategySystem::fp_sort(RelPos *rp, int h, int t) { - RelPos r; - if (!h && !t) { - for (int i = 1; i < 10; i++) { - for (int j = 0; j < 10 - i; j++) { - if (rp[j].dis > rp[j + 1].dis) { - r = rp[j], rp[j] = rp[j + 1], rp[j + 1] = r; - } - } - } - } - else { - for (int i = h + 1; i < t; i++) { - for (int j = h; j < t - i; j++) { - if (rp[j].ang > rp[j + 1].ang) { - r = rp[j], rp[j] = rp[j + 1], rp[j + 1] = r; - } - } - } - } -} - -// 返回机器人的位置 -CPoint CStrategySystem::coor(int which) { - Robot2 *robot; - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - return robot->position; -} - -// 0向下门框射 -void CStrategySystem::shot(int which) { - Robot2 *robot; - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - bool de; - if (ball.position.y > robot->position.y) - de = 0; - else - de = 1; - double O, O1; - CPoint t1, t2, t3, t4; // t1球,t2机器人,t3机器人要移动到的点,t4门 - t1.x = ball.position.x; - t1.y = ball.position.y; - if (de == 0) { - t4.x = 33.0; - t4.y = 505.0; - O = atan(fabs(ball.position.y - t4.y) / fabs(ball.position.x - t4.x)); // fabs(Angle(,t4)); - O1 = 180 - O; - t3.x = t1.x + cos(O) * 34; - t3.y = t1.y - sin(O) * 34; - } - else if (de == 1) { - t4.x = 33.0; - t4.y = 313.0; - O = atan(fabs(ball.position.y - t4.y) / fabs(ball.position.x - t4.x)); // fabs(Angle(ball.position,t4)); - O1 = 180 + O; - t3.x = t1.x + cos(O) * 34; - t3.y = t1.y + sin(O) * 34; - } - if (Distance(robot->position, ball.position) <= 35 && (fabs(Angle(ball.position, t3) - Angle(robot->position, t3))) <= 2) { - if (de == 1) { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y - sin(O) * 34; - Direction(which, t3); - } - else if (de == 0) { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y + sin(O) * 34; - Direction(which, t3); - } - } - else - Position(which, t3); // 机器人到足够近的点t3 -} - -// 射? -bool CStrategySystem::canshot() { - bool t; // 判断球在敌方上半还是下半;0为下半 - CPoint D1, D2, t4; - Robot2 *robot9, *robot10; - robot9 = &home9; - robot10 = &home10; - // if (ball.position.y >= 409 && ball.position.x <= 290&&ball.position.y<=607) // 球在敌方下半 - // { - // t = 0; - // D1.x = 170; - // D1.y = 265; - // Position(HOME10, D1); - // D2.x = 170; - // D2.y = 409; - // Position(HOME9, D2); - // } - // else if (ball.position.y < 409 && ball.position.x < 290 && ball.position.y >= 217 && Distance(ball.position, home10.position) > 168) // 球在敌方上半 - // { - // t = 1; - // D1.x = 170; - // D1.y = 556; - // Position(HOME10, D1); - // D2.x = 170; - // D2.y = 409; - // Position(HOME9, D2); - // if (ball.position.x >= 104 && ball.position.x <= 170 && ball.position.y >= 313 && ball.position.y <= 449 && (ball.oldPosition.y - ball.oldPosition.y) <= 0) - // Shot(HOME9, 1); - // if (ball.position.x >= 104 && ball.position.x <= 170 && ball.position.y > 449 && ball.position.y <= 607 && (ball.oldPosition.y - ball.oldPosition.y) <= 0) - // Shot(HOME10, 1); - // } - if (ball.position.y <= 481) // 敌方框上半场 - { - D1.x = 170; - D1.y = 265; - D2.x = 170; - D2.y = 409; - if (Distance(ball.position, home9.position) <= 116 && ball.position.y >= 409 && ball.position.y <= 481) // 9可射 - { - shot(HOME9, 0); - Direction(HOME10, D1); - } - else if (Distance(ball.position, home10.position) <= 168 && ball.position.y < 409 && ball.position.y >= 265) // 10可射 - { - Direction(HOME9, D2); - shot(HOME10, 0); - } - else { // 9,10到预定位置 - Direction(HOME10, D1); - Direction(HOME9, D2); - } - return 1; - } - else if (ball.position.y >= 337) // 敌方框下半场 - { - D1.x = 170; - D1.y = 556; - D2.x = 170; - D2.y = 409; - if (Distance(ball.position, home9.position) <= 116 && ball.position.y <= 409 && ball.position.y >= 337) // 9可射 - { - shot(HOME9, 1); - Direction(HOME10, D1); - } - else if (Distance(ball.position, home10.position) <= 164 && ball.position.y > 409 && ball.position.y <= 556) // 10可射 - { - Direction(HOME9, D2); - shot(HOME10, 1); - } - else { // 9,10到预定位置 - Direction(HOME10, D1); - Direction(HOME9, D2); - } - return 1; - } - return 0; - // if () - // { - // if (ball.position.y <= 170) { - // Position(HOME10, D1); - // Shot(HOME9, 0); - // } - // else if (ball.position.y >= 170) { - // Position(HOME9, D2); - // Shot(HOME10, 0); - // } - // } - // else { - // Position(HOME10, D1); - // Position(HOME9, D2); - // } -} - -// 把球向t点射,de向上还是向下射 -void CStrategySystem::shot(int which, CPoint t) { - Robot2 *robot; - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - bool de; - if (ball.position.y > robot->position.y) - de = 0; - else - de = 1; - double O; - CPoint t1, t2, t3; // t1球,t2机器人,t3机器人要移动到的点 - t1.x = ball.position.x; - t1.y = ball.position.y; - if (de == 0) { - O = atan(fabs(ball.position.y - t.y) / fabs(ball.position.x - t.x)); - if (ball.position.x <= 515) { - t3.x = t1.x + cos(O) * 34; - t3.y = t1.y - sin(O) * 34; - } - else { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y - sin(O) * 34; - } - } - else if (de == 1) { - O = atan(fabs(ball.position.y - t.y) / fabs(ball.position.x - t.x)); // fabs(Angle(ball.position,t4)); - if (ball.position.x <= 515) { - t3.x = t1.x + cos(O) * 34; - t3.y = t1.y + sin(O) * 34; - } - else { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y + sin(O) * 34; - } - } - if (Distance(robot->position, ball.position) <= 35 && (fabs(Angle(ball.position, t3) - Angle(robot->position, t3))) <= 2) { - if (de == 1) { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y - sin(O) * 34; - Direction(which, t3); - } - else if (de == 0) { - t3.x = t1.x - cos(O) * 34; - t3.y = t1.y + sin(O) * 34; - Direction(which, t3); - } - } - else - Position(which, t3); // 机器人到足够近的点t3 -} - -// 直射 -void CStrategySystem::shot1(int which, double o, CPoint t) { - Robot2 *robot; - switch (which) { - case HOME9: - robot = &home9; - break; - case HOME1: - robot = &home1; - break; - } - bool a = 0; - /*if((fabs(Angle(ball.position, t) - Angle(robot->position, t))) > 5)*/ - Angle(which, o); - Velocity(which, 127, 127); // which全速前进 -} - -/*void banarea(int which) //让9,10不进禁区 -{ - Robot2 *robot; - switch (which) { - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - } - CPoint t1, t2;//t1球 - t1.x = ball.position.x; - t1.y = ball.position.y; - t2.x = robot->position.x; - t2.y = robot->position.y; - if((t1.x>=65&&1.x<=103&&t1.y>=247&&t1.y<=577)||(t2.x+1==)) -}*/ - -// void CStrategySystem::navigate() // 给人要去的位置坐标导航(预判) -// { -// CPoint robot[11]; -// robot[1] = home1.position; -// robot[2] = home2.position; -// robot[3] = home3.position; -// robot[4] = home4.position; -// robot[5] = home5.position; -// robot[6] = home6.position; -// robot[7] = home7.position; -// robot[8] = home8.position; -// robot[9] = home9.position; -// robot[10] = home10.position; -// /*double d[11]; -// d[1] = Distance(ball.position, home1.position); -// d[2] = Distance(ball.position, home2.position); -// d[3] = Distance(ball.position, home3.position); -// d[4] = Distance(ball.position, home4.position); -// d[5] = Distance(ball.position, home5.position); -// d[6] = Distance(ball.position, home6.position); -// d[7] = Distance(ball.position, home7.position); -// d[8] = Distance(ball.position, home8.position); -// d[9] = Distance(ball.position, home9.position); -// d[10] = Distance(ball.position, home10.position);*/ -// if (65 < ball.position.x && ball.position.x <= 515) { - -// // 对方罚球区内,包围门框 -// if (ball.position.x <= 160 && ball.position.y <= 600 && ball.position.y >= 210) { - -// Navigation[1] = CPoint(175, ball.position.y); -// Navigation[2] = CPoint(175, ball.position.y + 20); -// Navigation[3] = CPoint(175, ball.position.y - 20); -// Navigation[4] = CPoint(200, ball.position.y); -// Navigation[5] = CPoint(175, ball.position.y + 30); -// Navigation[6] = CPoint(200, ball.position.y - 30); -// Navigation[7] = CPoint(ball.position.x, 610); -// Navigation[8] = CPoint(ball.position.x, 210); -// Navigation[9] = CPoint(220, ball.position.y + 50); -// Navigation[10] = CPoint(220, ball.position.y - 50); -// } -// // 对方下半场 -// else if (ball.position.y >= 607) { -// if (home1.position.x > ball.position.x) { // 球员在右 -// if (home1.position.y > ball.position.y) { // 球员在右下 -// Navigation[1] = ball.position; -// } -// else { // 球员在右下 -// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y + 10); -// } -// } -// else { // 球员在左 -// if (home1.position.y > ball.position.y) { // 左下 -// Navigation[1] = ball.position; -// } -// else { // 左上 -// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y + 10); -// } -// } -// if (home2.position.x > ball.position.x) { -// if (home2.position.y > ball.position.y) { -// Navigation[2] = ball.position; -// } -// else { -// Navigation[2] = CPoint(ball.position.x + 10, ball.position.y + 20); -// } -// } -// else { -// if (home2.position.y > ball.position.y) { -// Navigation[2] = ball.position; -// } -// else { -// Navigation[2] = CPoint(ball.position.x - 10, ball.position.y - 20); -// } -// } -// if (home3.position.x > ball.position.x) { -// if (home3.position.y > ball.position.y) { -// Navigation[3] = ball.position; -// } -// else { -// Navigation[3] = CPoint(ball.position.x + 20, ball.position.y + 10); -// } -// } -// else { -// if (home3.position.y > ball.position.y) { -// Navigation[3] = ball.position; -// } -// else { -// Navigation[3] = CPoint(ball.position.x - 20, ball.position.y - 10); -// } -// } -// Navigation[4] = CPoint(ball.position.x + 50, ball.position.y + 50); -// Navigation[5] = CPoint(ball.position.x + 50, ball.position.y); -// Navigation[6] = CPoint(ball.position.x + 50, ball.position.y - 50); -// Navigation[7] = CPoint(ball.position.x, ball.position.y + 50); -// Navigation[8] = CPoint(ball.position.x - 50, ball.position.y + 50); -// Navigation[9] = CPoint(ball.position.x + 80, ball.position.y); -// Navigation[10] = CPoint(ball.position.x + 80, ball.position.y + 50); -// //// Navigate(ball.position); -// //// 机器人在球右下 -// // if (robot->position.y <= ball.position.y && robot->position.x >= ball.position.x) { -// // Direction(which, ball.position); -// // // Velocity(which, 127, 127); -// // } -// //// 机器人在球右上 -// // else if (robot->position.y > ball.position.y && robot->position.x > ball.position.x) { -// // Direction(which, CPoint(ball.position.x + 10, ball.position.y)); -// // // Velocity(which, vL, vR); -// // } -// //// 机器人在球左上 -// // else if (robot->position.y < ball.position.y && robot->position.x < ball.position.x) { -// // // Position(which, CPoint(ball.)); -// // } -// //// 机器人在球左下 -// // else { -// // Direction(which, CPoint(ball.position.x - 20, ball.position.y)); -// // } -// } -// // 对方中场 -// else if (ball.position.y >= 217 && ball.position.y < 607) { -// if (home1.position.x > ball.position.x) { -// if (home1.position.y < ball.position.y) { -// Navigation[1] = ball.position; -// } -// else { -// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 10); -// } -// } -// else { -// if (home1.position.y < ball.position.y) { -// Navigation[1] = CPoint(ball.position.x, ball.position.y - 10); -// } -// else { -// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 10); -// } -// } -// if (home2.position.x > ball.position.x) { -// if (home2.position.y < ball.position.y) { -// Navigation[2] = ball.position; -// } -// else { -// Navigation[2] = CPoint(ball.position.x + 20, ball.position.y + 10); -// } -// } -// else { -// if (home2.position.y < ball.position.y) { -// Navigation[1] = CPoint(ball.position.x, ball.position.y - 15); -// } -// else { -// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 15); -// } -// } -// if (home3.position.x > ball.position.x) { -// if (home3.position.y < ball.position.y) { -// Navigation[3] = ball.position; -// } -// else { -// Navigation[3] = CPoint(ball.position.x + 10, ball.position.y + 20); -// } -// } -// else { -// if (home3.position.y < ball.position.y) { -// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 15); -// } -// else { -// Navigation[1] = CPoint(ball.position.x - 15, ball.position.y - 10); -// } -// } -// Navigation[4] = CPoint(ball.position.x, ball.position.y - 60); -// Navigation[5] = CPoint(ball.position.x + 50, ball.position.y - 60); -// Navigation[6] = CPoint(ball.position.x + 60, ball.position.y - 50); -// Navigation[7] = CPoint(ball.position.x + 60, ball.position.y + 50); -// Navigation[8] = CPoint(ball.position.x + 60, ball.position.y + 70); -// Navigation[9] = CPoint(ball.position.x + 70, ball.position.y - 60); -// Navigation[10] = CPoint(ball.position.x + 70, ball.position.y - 60); -// //// 机器人在球的右下 -// // if (robot->position.x >= ball.position.x && robot->position.y <= ball.position.y) { -// // Direction(which, ball.position); -// // } -// //// 机器人在球右上 -// // else if (robot->position.x > ball.position.x && robot->position.y > ball.position.y) { -// // // 右上且距离较远 -// // if (robot->position.y >= ball.position.y + 100) { -// // Direction(which, CPoint(ball.position.x + 20, ball.position.y + 20)); -// // } -// // // 距离较近 -// // else { -// // Direction(which, CPoint(ball.position.x + 10, ball.position.y)); -// // } -// // } -// //// 机器人在球左下 -// // else if (robot->position.x <= ball.position.x && robot->position.y >= ball.position.y) { -// // Direction(which, CPoint(ball.position.x - 20, ball.position.y + 20)); -// // } -// //// 机器人在球左上 -// // else { -// // Direction(which, CPoint(ball.position.x - 20, ball.position.y - 20)); -// // } -// } -// // 上场 -// else { -// if (home1.position.x > ball.position.x) { -// if (home1.position.y < ball.position.y) { -// Navigation[1] = ball.position; -// } -// else { -// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 10); -// } -// } -// else { -// if (home1.position.y < ball.position.y) { -// Navigation[1] = CPoint(ball.position.x, ball.position.y - 10); -// } -// else { -// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 10); -// } -// } -// if (home2.position.x > ball.position.x) { -// if (home2.position.y < ball.position.y) { -// Navigation[2] = ball.position; -// } -// else { -// Navigation[2] = CPoint(ball.position.x + 10, ball.position.y); -// } -// } -// else { -// if (home2.position.y < ball.position.y) { -// Navigation[2] = CPoint(ball.position.x - 5, ball.position.y - 10); -// } -// else { -// Navigation[2] = CPoint(ball.position.x - 10, ball.position.y - 10); -// } -// } -// if (home3.position.x > ball.position.x) { -// if (home3.position.y < ball.position.y) { -// Navigation[3] = ball.position; -// } -// else { -// Navigation[3] = CPoint(ball.position.x + 10, ball.position.y - 15); -// } -// } -// else { -// if (home2.position.y < ball.position.y) { -// Navigation[3] = CPoint(ball.position.x - 5, ball.position.y - 10); -// } -// else { -// Navigation[3] = CPoint(ball.position.x - 10, ball.position.y - 10); -// } -// } -// Navigation[4] = CPoint(ball.position.x - 50, ball.position.y - 50); -// Navigation[5] = CPoint(ball.position.x, ball.position.y - 50); -// Navigation[6] = CPoint(ball.position.x + 50, ball.position.y - 50); -// Navigation[7] = CPoint(ball.position.x + 50, ball.position.y); -// Navigation[8] = CPoint(ball.position.x + 60, ball.position.y + 50); -// Navigation[9] = CPoint(ball.position.x + 70, ball.position.y + 60); -// Navigation[10] = CPoint(ball.position.x + 70, ball.position.y + 70); -// // 机器人在球右上 -// // if (robot->position.x >= ball.position.x && robot->position.y <= ball.position.y) { -// // Direction(which, ball.position); -// //} -// //// 机器人在球右下 -// // else if (robot->position.x >= ball.position.x && robot->position.y > ball.position.y) { -// // Direction(which, CPoint(ball.position.x + 20, ball.position.y)); -// // } -// //// 机器人在球左上 -// // else if (robot->position.x < ball.position.x && robot->position.y >= ball.position.y) { -// // Direction(which, CPoint(ball.position.x - 20, ball.position.y)); -// // } -// //// 机器人在左下 -// // else { -// // } -// } -// } -// // 防守区域(在己方罚球区外) -// else if (ball.position.x > 515 && ball.position.x < 965) { -// CPoint goal; -// double l; - -// // 己方上半场 -// goal.x = ball.position.x; -// goal.y = 95; -// l = Distance(ball.position, goal); -// if (ball.position.y < 217 && ball.position.y >= 95) { -// Navigation[1].x = ball.position.x; -// Navigation[1].y = 95 + (int)l + 5; -// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[2].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[4].x = ball.position.x; -// Navigation[4].y = 95 + (int)l + 15; -// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[5].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[9].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// } -// // 己方中场 -// else if (ball.position.y > 217 && ball.position.y <= 607) { -// // 球在中场上侧,要把球往上压 -// if (ball.position.y < 409) { -// Navigation[1].x = ball.position.x; -// Navigation[1].y = 95 + (int)l + 5; -// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[2].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[4].x = ball.position.x; -// Navigation[4].y = 95 + (int)l + 15; -// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[5].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[9].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// } -// // 球在中场下侧,要把球往下压 - -// else { -// goal.x = ball.position.x; -// goal.y = 723; -// l = Distance(ball.position, goal); -// Navigation[1].x = ball.position.x; -// Navigation[1].y = 723 - (int)l - 5; -// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[2].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[4].x = ball.position.x; -// Navigation[4].y = 723 - (int)l - 15; -// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[5].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[9].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// } -// } -// // 己方下半场 - -// else if (ball.position.y > 607) { -// goal.x = ball.position.x; -// goal.y = 723; -// l = Distance(ball.position, goal); -// Navigation[1].x = ball.position.x; -// Navigation[1].y = 723 - (int)l - 5; -// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[2].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[3].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); -// Navigation[4].x = ball.position.x; -// Navigation[4].y = 723 - (int)l - 15; -// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[5].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[6].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[7].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[8].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); -// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[9].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); -// Navigation[10].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); -// } -// } -// for (int i = 1; i < 11; i++) // 己方禁区处理 -// { -// int kx, ky, x1, x2; -// if (Navigation[i].x > 873 && Navigation[i].y < 607 && Navigation[i].y > 217) // 导航定位不进禁区 -// { -// if (ball.position.x > 873) { -// if (ball.position.y > 607) -// Navigation[i].y = 607; -// if (ball.position.y < 217) -// Navigation[i].y = 217; -// } -// else { -// Navigation[i].x = 873; -// } -// } -// else if (Navigation[i].x > 873 && Navigation[i].y > 607) // 行走路径不进禁区 -// { -// if (robot[i].x < 873 && robot[i].y < 607 && robot[i].y > 217) { -// ky = abs((Navigation[i].y - robot[i].y) / (Navigation[i].x - robot[i].x)); -// x1 = abs((873 - robot[i].x) * ky); -// x2 = abs(607 - robot[i].y); -// if (x2 > x1) { -// Navigation[i].y = robot[i].y + x1; -// Navigation[i].x = 873; -// } -// } -// } -// else if (Navigation[i].x > 873 && Navigation[i].y < 217) { -// if (robot[i].x < 873 && robot[i].y < 607 && robot[i].y > 217) { -// ky = abs((Navigation[i].y - robot[i].y) / (Navigation[i].x - robot[i].x)); -// x1 = abs((873 - robot[i].x) * ky); -// x2 = abs(217 - robot[i].y); -// if (x2 > x1) { -// Navigation[i].y = robot[i].y - x1; -// Navigation[i].x = 873; -// } -// } -// } -// else if (Navigation[i].x < 873 && Navigation[i].y > 217) { -// if (robot[i].x > 873 && robot[i].y < 217) { -// kx = abs((Navigation[i].x - robot[i].x) / (Navigation[i].y - robot[i].y)); -// x1 = abs((217 - robot[i].y) * kx); -// x2 = abs(873 - robot[i].x); -// if (x2 > x1) { -// Navigation[i].y = 217; -// Navigation[i].x = robot[i].x - x1; -// } -// } -// } -// else if (Navigation[i].x < 873 && Navigation[i].y < 607) { -// if (robot[i].x > 873 && robot[i].y > 607) { -// kx = abs((Navigation[i].x - robot[i].x) / (Navigation[i].y - robot[i].y)); -// x1 = abs((607 - robot[i].y) * kx); -// x2 = abs(873 - robot[i].x); -// if (x2 > x1) { -// Navigation[i].y = 607; -// Navigation[i].x = robot[i].x - x1; -// } -// } -// } -// } -// } - -// void CStrategySystem::control(int which) { -// Robot2 *robot; -// // switch (which) { -// // case HOME1: -// // robot = &home1; -// // break; -// // case HOME2: -// // robot = &home2; -// // break; -// // case HOME3: -// // robot = &home3; -// // break; -// // case HOME4: -// // robot = &home4; -// // break; -// // case HOME5: -// // robot = &home5; -// // break; -// // case HOME6: -// // robot = &home6; -// // break; -// // case HOME7: -// // robot = &home7; -// // break; -// // case HOME8: -// // robot = &home8; -// // break; -// // case HOME9: -// // robot = &home9; -// // break; -// // case HOME10: -// // robot = &home10; -// // break; -// // case HGOALIE: -// // robot = &hgoalie; -// // break; -// // } -// PositionSE(which, Navigation[which]); -// } - -// 查找在大区里的机器人 -int CStrategySystem::search1() { - int sum = 0; - if ((home1.position.x >= 105 && home1.position.x <= 157 && home1.position.y >= 247 && home1.position.y <= 577) || (home1.position.x >= 65 && home1.position.x <= 157 && home1.position.y >= 217 && home1.position.y <= 247) || (home1.position.x >= 65 && home1.position.x <= 157 && home1.position.y >= 577 && home1.position.y <= 607)) - sum++; - if ((home2.position.x >= 105 && home2.position.x <= 157 && home2.position.y >= 247 && home2.position.y <= 577) || (home2.position.x >= 65 && home2.position.x <= 157 && home2.position.y >= 217 && home2.position.y <= 247) || (home2.position.x >= 65 && home2.position.x <= 157 && home2.position.y >= 577 && home2.position.y <= 607)) - sum++; - if ((home3.position.x >= 105 && home3.position.x <= 157 && home3.position.y >= 247 && home3.position.y <= 577) || (home3.position.x >= 65 && home3.position.x <= 157 && home3.position.y >= 217 && home3.position.y <= 247) || (home3.position.x >= 65 && home3.position.x <= 157 && home3.position.y >= 577 && home3.position.y <= 607)) - sum++; - if ((home4.position.x >= 105 && home4.position.x <= 157 && home4.position.y >= 247 && home4.position.y <= 577) || (home4.position.x >= 65 && home4.position.x <= 157 && home4.position.y >= 217 && home4.position.y <= 247) || (home4.position.x >= 65 && home4.position.x <= 157 && home4.position.y >= 577 && home4.position.y <= 607)) - sum++; - if ((home5.position.x >= 105 && home5.position.x <= 157 && home5.position.y >= 247 && home5.position.y <= 577) || (home5.position.x >= 65 && home5.position.x <= 157 && home5.position.y >= 217 && home5.position.y <= 247) || (home5.position.x >= 65 && home5.position.x <= 157 && home5.position.y >= 577 && home5.position.y <= 607)) - sum++; - if ((home6.position.x >= 105 && home6.position.x <= 157 && home6.position.y >= 247 && home6.position.y <= 577) || (home6.position.x >= 65 && home6.position.x <= 157 && home6.position.y >= 217 && home6.position.y <= 247) || (home6.position.x >= 65 && home6.position.x <= 157 && home6.position.y >= 577 && home6.position.y <= 607)) - sum++; - if ((home7.position.x >= 105 && home7.position.x <= 157 && home7.position.y >= 247 && home7.position.y <= 577) || (home7.position.x >= 65 && home7.position.x <= 157 && home7.position.y >= 217 && home7.position.y <= 247) || (home7.position.x >= 65 && home7.position.x <= 157 && home7.position.y >= 577 && home7.position.y <= 607)) - sum++; - if ((home8.position.x >= 105 && home8.position.x <= 157 && home8.position.y >= 247 && home8.position.y <= 577) || (home8.position.x >= 65 && home8.position.x <= 157 && home8.position.y >= 217 && home8.position.y <= 247) || (home8.position.x >= 65 && home8.position.x <= 157 && home8.position.y >= 577 && home8.position.y <= 607)) - sum++; - if ((home9.position.x >= 105 && home9.position.x <= 157 && home9.position.y >= 247 && home9.position.y <= 577) || (home9.position.x >= 65 && home9.position.x <= 157 && home9.position.y >= 217 && home9.position.y <= 247) || (home9.position.x >= 65 && home9.position.x <= 157 && home9.position.y >= 577 && home9.position.y <= 607)) - sum++; - if ((home10.position.x >= 105 && home10.position.x <= 157 && home10.position.y >= 247 && home10.position.y <= 577) || (home10.position.x >= 65 && home10.position.x <= 157 && home10.position.y >= 217 && home10.position.y <= 247) || (home10.position.x >= 65 && home10.position.x <= 157 && home10.position.y >= 577 && home10.position.y <= 607)) - sum++; - return sum; -} - -// 查找在小区里的机器人 -int CStrategySystem::search2() { - int sum = 0; - if (home1.position.x >= 65 && home1.position.x < 105 && home1.position.y >= 247 && home1.position.y <= 577) - sum++; - if (home2.position.x >= 65 && home2.position.x < 105 && home2.position.y >= 247 && home2.position.y <= 577) - sum++; - if (home3.position.x >= 65 && home3.position.x < 105 && home3.position.y >= 247 && home3.position.y <= 577) - sum++; - if (home4.position.x >= 65 && home4.position.x < 105 && home4.position.y >= 247 && home4.position.y <= 577) - sum++; - if (home5.position.x >= 65 && home5.position.x < 105 && home5.position.y >= 247 && home5.position.y <= 577) - sum++; - if (home6.position.x >= 65 && home6.position.x < 105 && home6.position.y >= 247 && home6.position.y <= 577) - sum++; - if (home7.position.x >= 65 && home7.position.x < 105 && home7.position.y >= 247 && home7.position.y <= 577) - sum++; - if (home8.position.x >= 65 && home8.position.x < 105 && home8.position.y >= 247 && home8.position.y <= 577) - sum++; - if (home9.position.x >= 65 && home9.position.x < 105 && home9.position.y >= 247 && home9.position.y <= 577) - sum++; - if (home10.position.x >= 65 && home10.position.x < 105 && home10.position.y >= 247 && home10.position.y <= 577) - sum++; - return sum; -} - -// 守门 -void CStrategySystem::Goalie() { // TODO 两侧卡顿 - if (start) - ball.oldPosition = ball.position; - // static int xit; - // if (ball.position != ball.oldPosition) - // xit = 0; - // else - // xit++; - if (ball.position.x <= hgoalie.position.x) { - int xix = ball.position.x > 950 ? 965 : 950, xiy, xii = int((double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * 965 + (ball.oldPosition.y - (double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * ball.oldPosition.x) + 0.5), xid = 2; - if (Distance(ball.position, ball.oldPosition) < 1 || ball.position.x <= ball.oldPosition.x || xii < 313 || xii > 505) { - // if (ball.position.x >= 927 && ball.position.y >= 313 && ball.position.y <= 505) { - // xiy = ball.position.y; - // if (xiy < 343 || xiy > 475) - // xix = 965; - // } - // else { - xii = int((double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * 965 + (shooter_pos().y - (double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * shooter_pos().x) + 0.5); - if (xii < 313 || xii > 505) { - xiy = int((Distance(ball.position, CPoint(863, 313)) * 192 / (Distance(ball.position, CPoint(863, 313)) + Distance(ball.position, CPoint(863, 505)))) + 313.5); - if (xiy < 343 || xiy > 475) - xix = 965; - } - else { - if (xii < 343 || xii > 475) - xix = 965; - xiy = int((double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * (xix - xid) + (shooter_pos().y - (double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * shooter_pos().x) + 0.5); - } - if (ball.position.x <= 900 || ball.position.y < 313 || ball.position.y > 505) - if ((T / 4) % 2) - xiy += 30; - else - xiy -= 30; - // } - } - else { - if (xii < 343 || xii > 475) - xix = 965; - xiy = int((double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * (xix - xid) + (ball.oldPosition.y - (double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * ball.oldPosition.x) + 0.5); - } - // if (ball.position.x >= 900 && ball.position.y >= 313 && ball.position.y <= 505 && xit >= 10) // TODO 旋球 - // if (shooter_pos().y > ball.position.y) - // Direction(HGOALIE, CPoint(ball.position.x + 1, ball.position.y + 1)); - // else - // Direction(HGOALIE, CPoint(ball.position.x + 1, ball.position.y - 1)); - // else - Direction(HGOALIE, CPoint(xix, xiy)); - } - else - Stop(HGOALIE); - ball.oldPosition = ball.position; -} - -// 对方射门者位置 -CPoint CStrategySystem::shooter_pos() { - CPoint cur_pos[11]{ opponent.position1, opponent.position2, opponent.position3, opponent.position4, opponent.position5, opponent.position6, opponent.position7, opponent.position8, opponent.position9, opponent.position10, opponent.position11 }; - for (int i = 0; i < 11; i++) { - if (cur_pos[i].x >= ball.position.x) - cur_pos[i] = CPoint(-965, -723); - } - int xii = 0; - double xid = Distance(cur_pos[0], ball.position); - for (int i = 1; i < 11; i++) { - if (Distance(cur_pos[i], ball.position) < xid) { - xid = Distance(cur_pos[i], ball.position); - xii = i; - } - } - return cur_pos[xii]; -} - -double CStrategySystem::Distance(CPoint point1, CPoint point2) { - return sqrt(1.0 * (point1.x - point2.x) * (point1.x - point2.x) + 1.0 * (point1.y - point2.y) * (point1.y - point2.y)); -} - -double CStrategySystem::Angle(CPoint point1, CPoint point2) { - return atan2(1.0 * (point1.y - point2.y), 1.0 * (point1.x - point2.x)); -} - -void CStrategySystem::Direction(int which, CPoint point) { - Robot2 *robot; - double distance_e; - int dx, dy, desired_angle, theta_e, vL, vR; - - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - - point.x = 2 * point.x - robot->position.x; - point.y = 2 * point.y - robot->position.y; - - point.x = point.x < boundRect.left ? boundRect.left : point.x; - point.x = point.x > boundRect.right ? boundRect.right : point.x; - point.y = point.y < boundRect.top ? boundRect.top : point.y; - point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; - - dx = point.x - robot->position.x; - dy = point.y - robot->position.y; - - distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); - - if (dx == 0 && dy == 0) - desired_angle = 90; - else - desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); - - theta_e = desired_angle - robot->angle; - - while (theta_e > 180) - theta_e -= 360; - while (theta_e < -180) - theta_e += 360; - - if (theta_e < -90) { - theta_e += 180; - distance_e = -distance_e; - } - else if (theta_e > 90) { - theta_e -= 180; - distance_e = -distance_e; - } - - vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); - vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); - - Velocity(which, vL, vR); -} - -void CStrategySystem::PositionSE(int which, CPoint point) { - Robot2 *robot; - double distance_e; - int dx, dy, desired_angle, theta_e, vL, vR; - - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - - if (point.x >= 873 && point.y >= 217 && point.y <= 607) - if (robot->position.x >= 873) { - if (robot->position.y <= 217) { - point.x = robot->position.x - (robot->position.x - point.x) * (217 - robot->position.y) / (point.y - robot->position.y); - point.y = 217; - } - else if (robot->position.y >= 607) { - point.x = robot->position.x - (robot->position.x - point.x) * (607 - robot->position.y) / (point.y - robot->position.y); - point.y = 607; - } - } - else { - point.x = 873; - point.y = robot->position.y - (robot->position.y - point.y) * (873 - robot->position.x) / (point.x - robot->position.x); - } - - point.x = point.x < boundRect.left ? boundRect.left : point.x; - point.x = point.x > boundRect.right ? boundRect.right : point.x; - point.y = point.y < boundRect.top ? boundRect.top : point.y; - point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; - - dx = point.x - robot->position.x; - dy = point.y - robot->position.y; - - distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); - - if (dx == 0 && dy == 0) - desired_angle = 90; - else - desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); - - theta_e = desired_angle - robot->angle; - - while (theta_e > 180) - theta_e -= 360; - while (theta_e < -180) - theta_e += 360; - - if (theta_e < -90) { - theta_e += 180; - distance_e = -distance_e; - } - else if (theta_e > 90) { - theta_e -= 180; - distance_e = -distance_e; - } - - vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); - vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); - - Velocity(which, vL, vR); -} - -void CStrategySystem::Rush(int which, CPoint point) { - Robot2 *robot; - double distance_e; - int dx, dy, desired_angle, theta_e, vL, vR; - - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - - CPoint p3; - - // 计算射线的斜率和截距 - double k = (double)(point.y - robot->position.y) / (point.x - robot->position.x); - double b = robot->position.y - k * robot->position.x; - // 判断射线的方向 - bool right = point.x > robot->position.x; // 是否向右 - bool up = point.y < robot->position.y; // 是否向上 - // 根据方向和斜率判断相交边 - if (right && up) { // 右上方 - if (k > 0) { // 斜率大于 0 - // 右边或上边 - if (k * boundRect.right + b < boundRect.top) { - // 右边 - p3.x = boundRect.right; - p3.y = k * boundRect.right + b; - } - else { - // 上边 - p3.x = (boundRect.top - b) / k; - p3.y = boundRect.top; - } - } - else { // 斜率小于等于 0 - // 上边或右边 - if ((boundRect.top - b) / k > boundRect.right) { - // 上边 - p3.x = (boundRect.top - b) / k; - p3.y = boundRect.top; - } - else { - // 右边 - p3.x = boundRect.right; - p3.y = k * boundRect.right + b; - } - } - } - else if (right && !up) { // 右下方 - if (k > 0) { // 斜率大于 0 - // 下边或右边 - if ((boundRect.bottom - b) / k < boundRect.right) { - // 下边 - p3.x = (boundRect.bottom - b) / k; - p3.y = boundRect.bottom; - } - else { - // 右边 - p3.x = boundRect.right; - p3.y = k * boundRect.right + b; - } - } - else { // 斜率小于等于 0 - // 右边或下边 - if (k * boundRect.right + b > boundRect.bottom) { - // 右边 - p3.x = boundRect.right; - p3.y = k * boundRect.right + b; - } - else { - // 下边 - p3.x = (boundRect.bottom - b) / k; - p3.y = boundRect.bottom; - } - } - } - else if (!right && up) { // 左上方 - if (k > 0) { // 斜率大于 0 - // 上边或左边 - if ((boundRect.top - b) / k < boundRect.left) { - // 上边 - p3.x = (boundRect.top - b) / k; - p3.y = boundRect.top; - } - else { - // 左边 - p3.x = boundRect.left; - p3.y = k * boundRect.left + b; - } - } - else { // 斜率小于等于 0 - // 左边或上边 - if (k * boundRect.left + b < boundRect.top) { - // 左边 - p3.x = boundRect.left; - p3.y = k * boundRect.left + b; - } - else { - // 上边 - p3.x = (boundRect.top - b) / k; - p3.y = boundRect.top; - } - } - } - else { // 左下方 - if (k > 0) { // 斜率大于 0 - // 左边或下边 - if (k * boundRect.left + b > boundRect.bottom) { - // 左边 - p3.x = boundRect.left; - p3.y = k * boundRect.left + b; - } - else { - // 下边 - p3.x = (boundRect.bottom - b) / k; - p3.y = boundRect.bottom; - } - } - else { // 斜率小于等于 0 - // 下边或左边 - if ((boundRect.bottom - b) / k > boundRect.left) { - // 下边 - p3.x = (boundRect.bottom - b) / k; - p3.y = boundRect.bottom; - } - else { - // 左边 - p3.x = boundRect.left; - p3.y = k * boundRect.left + b; - } - } - } - - point = p3; - - point.x = point.x < boundRect.left ? boundRect.left : point.x; - point.x = point.x > boundRect.right ? boundRect.right : point.x; - point.y = point.y < boundRect.top ? boundRect.top : point.y; - point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; - - dx = point.x - robot->position.x; - dy = point.y - robot->position.y; - - distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); - - if (dx == 0 && dy == 0) - desired_angle = 90; - else - desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); - - theta_e = desired_angle - robot->angle; - - while (theta_e > 180) - theta_e -= 360; - while (theta_e < -180) - theta_e += 360; - - if (theta_e < -90) { - theta_e += 180; - distance_e = -distance_e; - } - else if (theta_e > 90) { - theta_e -= 180; - distance_e = -distance_e; - } - - vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); - vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); - - Velocity(which, vL, vR); -} - -// 判断状态,1 为罚球,0 为正常, 其他为争球 -int CStrategySystem::Status() { - if (ball.position.x <= 309 && ball.position.x >= 279) { - if (ball.position.y >= 394 && ball.position.y <= 424) - return 1; // 罚球 - if (ball.position.y <= 193 && ball.position.y >= 173) - return 2; // 左上争球点 - if (ball.position.y <= 648 && ball.position.y >= 628) - return 3; // 左下争球点 - } - if (ball.position.x <= 753 && ball.position.x >= 733) { - if (ball.position.y <= 193 && ball.position.y >= 173) - return 4; // 右上争球点 - if (ball.position.y <= 648 && ball.position.y >= 628) - return 5; // 右下争球点 - } - return 0; -} - -void CStrategySystem::Action() { - T++; - Goalie(); - switch (Status()) { - case 1: - flag = true; - Penalty(); - break; - // case 2: - // case 3: - // case 4: - // case 5: - // Freeball(); - // break; - default: - flag = true; - Possession(); - break; - } - if (start) - start = false; -} - -void CStrategySystem::Angle(int which, int desired_angle) { - Robot2 *robot; - int theta_e, vL, vR; - - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - - theta_e = desired_angle - robot->angle; - while (theta_e > 180) - theta_e -= 360; - while (theta_e < -180) - theta_e += 360; - if (theta_e < -90) - theta_e += 180; - else if (theta_e > 90) - theta_e -= 180; - vL = (int)(60.0 / 90.0 * theta_e); - vR = (int)(-60.0 / 90.0 * theta_e); - Velocity(which, vL, vR); -} - -void CStrategySystem::Velocity(int which, int vL, int vR) { - if (vL < -127) - vL = -127; - if (vL > 127) - vL = 127; - - if (vR < -127) - vR = -127; - if (vR > 127) - vR = 127; - - switch (which) { - case HOME1: - command[2] = vL; - command[3] = vR; - command[4] = C_GO; - break; - case HOME2: - command[5] = vL; - command[6] = vR; - command[7] = C_GO; - break; - case HOME3: - command[8] = vL; - command[9] = vR; - command[10] = C_GO; - break; - case HOME4: - command[11] = vL; - command[12] = vR; - command[13] = C_GO; - break; - case HOME5: - command[14] = vL; - command[15] = vR; - command[16] = C_GO; - break; - case HOME6: - command[17] = vL; - command[18] = vR; - command[19] = C_GO; - break; - case HOME7: - command[20] = vL; - command[21] = vR; - command[22] = C_GO; - break; - case HOME8: - command[23] = vL; - command[24] = vR; - command[25] = C_GO; - break; - case HOME9: - command[26] = vL; - command[27] = vR; - command[28] = C_GO; - break; - case HOME10: - command[29] = vL; - command[30] = vR; - command[31] = C_GO; - break; - case HGOALIE: - command[32] = vL; - command[33] = vR; - command[34] = C_GO; - break; - } -} - -void CStrategySystem::Position(int which, CPoint point) { - Robot2 *robot; - double distance_e; - int dx, dy, desired_angle, theta_e, vL, vR; - - switch (which) { - case HOME1: - robot = &home1; - break; - case HOME2: - robot = &home2; - break; - case HOME3: - robot = &home3; - break; - case HOME4: - robot = &home4; - break; - case HOME5: - robot = &home5; - break; - case HOME6: - robot = &home6; - break; - case HOME7: - robot = &home7; - break; - case HOME8: - robot = &home8; - break; - case HOME9: - robot = &home9; - break; - case HOME10: - robot = &home10; - break; - case HGOALIE: - robot = &hgoalie; - break; - } - - point.x = point.x < boundRect.left ? boundRect.left : point.x; - point.x = point.x > boundRect.right ? boundRect.right : point.x; - point.y = point.y < boundRect.top ? boundRect.top : point.y; - point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; - - dx = point.x - robot->position.x; - dy = point.y - robot->position.y; - - distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); - - if (dx == 0 && dy == 0) - desired_angle = 90; - else - desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); - - theta_e = desired_angle - robot->angle; - - while (theta_e > 180) - theta_e -= 360; - while (theta_e < -180) - theta_e += 360; - - if (theta_e < -90) { - theta_e += 180; - distance_e = -distance_e; - } - else if (theta_e > 90) { - theta_e -= 180; - distance_e = -distance_e; - } - - vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); - vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); - - Velocity(which, vL, vR); -} - -void CStrategySystem::Stop(int which) { - int vL, vR; - vL = vR = 0; - Velocity(which, vL, vR); -} - -void CStrategySystem::ReceiveData(Robot1 bal, Robot2 ho1, Robot2 ho2, Robot2 ho3, Robot2 ho4, - Robot2 ho5, Robot2 ho6, Robot2 ho7, Robot2 ho8, Robot2 ho9, - Robot2 ho10, Robot2 hgo, Robot3 opp) { - if (m_nGameArea == GAME_RIGHT) { - ball.position = bal.position; - ball.angle = bal.angle; - - home1.position = ho1.position; - home1.angle = ho1.angle; - - home2.position = ho2.position; - home2.angle = ho2.angle; - - home3.position = ho3.position; - home3.angle = ho3.angle; - - home4.position = ho4.position; - home4.angle = ho4.angle; - - home5.position = ho5.position; - home5.angle = ho5.angle; - - home6.position = ho6.position; - home6.angle = ho6.angle; - - home7.position = ho7.position; - home7.angle = ho7.angle; - - home8.position = ho8.position; - home8.angle = ho8.angle; - - home9.position = ho9.position; - home9.angle = ho9.angle; - - home10.position = ho10.position; - home10.angle = ho10.angle; - - hgoalie.position = hgo.position; - hgoalie.angle = hgo.angle; - - opponent.position1 = opp.position1; - opponent.position2 = opp.position2; - opponent.position3 = opp.position3; - opponent.position4 = opp.position4; - opponent.position5 = opp.position5; - opponent.position6 = opp.position6; - opponent.position7 = opp.position7; - opponent.position8 = opp.position8; - opponent.position9 = opp.position9; - opponent.position10 = opp.position10; - opponent.position11 = opp.position11; - } - else { - ball.position.x = 1030 - bal.position.x; - ball.position.y = 818 - bal.position.y; - if (ball.angle > 0) - ball.angle = bal.angle - 180; - else - ball.angle = 180 + bal.angle; - - home1.position.x = 1030 - ho1.position.x; - home1.position.y = 818 - ho1.position.y; - if (home1.angle > 0) - home1.angle = ho1.angle - 180; - else - home1.angle = 180 + ho1.angle; - home2.position.x = 1030 - ho2.position.x; - home2.position.y = 818 - ho2.position.y; - if (home2.angle > 0) - home2.angle = ho2.angle - 180; - else - home2.angle = 180 + ho2.angle; - home3.position.x = 1030 - ho3.position.x; - home3.position.y = 818 - ho3.position.y; - if (home3.angle > 0) - home3.angle = ho3.angle - 180; - else - home3.angle = 180 + ho3.angle; - home4.position.x = 1030 - ho4.position.x; - home4.position.y = 818 - ho4.position.y; - if (home4.angle > 0) - home4.angle = ho4.angle - 180; - else - home4.angle = 180 + ho4.angle; - home5.position.x = 1030 - ho5.position.x; - home5.position.y = 818 - ho5.position.y; - if (home5.angle > 0) - home5.angle = ho5.angle - 180; - else - home5.angle = 180 + ho5.angle; - //*/ - home6.position.x = 1030 - ho6.position.x; - home6.position.y = 818 - ho6.position.y; - ///* - if (home6.angle > 0) - home6.angle = ho6.angle - 180; - else - home6.angle = 180 + ho6.angle; - //*/ - home7.position.x = 1030 - ho7.position.x; - home7.position.y = 818 - ho7.position.y; - ///* - if (home7.angle > 0) - home7.angle = ho7.angle - 180; - else - home7.angle = 180 + ho7.angle; - //*/ - home8.position.x = 1030 - ho8.position.x; - home8.position.y = 818 - ho8.position.y; - ///* - if (home8.angle > 0) - home8.angle = ho8.angle - 180; - else - home8.angle = 180 + ho8.angle; - //*/ - home9.position.x = 1030 - ho9.position.x; - home9.position.y = 818 - ho9.position.y; - ///* - if (home9.angle > 0) - home9.angle = ho9.angle - 180; - else - home9.angle = 180 + ho9.angle; - //*/ - home10.position.x = 1030 - ho10.position.x; - home10.position.y = 818 - ho10.position.y; - ///* - if (home10.angle > 0) - home10.angle = ho10.angle - 180; - else - home10.angle = 180 + ho10.angle; - //*/ - hgoalie.position.x = 1030 - hgo.position.x; - hgoalie.position.y = 818 - hgo.position.y; - ///* - if (hgoalie.angle > 0) - hgoalie.angle = hgo.angle - 180; - else - hgoalie.angle = 180 + hgo.angle; - //*/ - opponent.position1.x = 1030 - opp.position1.x; - opponent.position2.x = 1030 - opp.position2.x; - opponent.position3.x = 1030 - opp.position3.x; - opponent.position4.x = 1030 - opp.position4.x; - opponent.position5.x = 1030 - opp.position5.x; - opponent.position6.x = 1030 - opp.position6.x; - opponent.position7.x = 1030 - opp.position7.x; - opponent.position8.x = 1030 - opp.position8.x; - opponent.position9.x = 1030 - opp.position9.x; - opponent.position10.x = 1030 - opp.position10.x; - opponent.position11.x = 1030 - opp.position11.x; - - opponent.position1.y = 818 - opp.position1.y; - opponent.position2.y = 818 - opp.position2.y; - opponent.position3.y = 818 - opp.position3.y; - opponent.position4.y = 818 - opp.position4.y; - opponent.position5.y = 818 - opp.position5.y; - opponent.position6.y = 818 - opp.position6.y; - opponent.position7.y = 818 - opp.position7.y; - opponent.position8.y = 818 - opp.position8.y; - opponent.position9.y = 818 - opp.position9.y; - opponent.position10.y = 818 - opp.position10.y; - opponent.position11.y = 818 - opp.position11.y; - } -} - -CStrategySystem::CStrategySystem(int id) { - T = 0; - - start = true; - - pos = new CPoint[10]; - rp = new RelPos[10]; - - for (int i = 0; i < 10; i++) { - rp[i].ang = 0; - rp[i].dis = 0; - rp[i].id = i + 1; - } - - flag = true; - - m_OurTeam = id; - boundRect.SetRect(65, 95, 965, 723); - if (id) - m_nGameArea = GAME_LEFT; - else - m_nGameArea = GAME_RIGHT; - for (int i = 0; i < 35; i++) - command[i] = 0; - C_Home1.Data.Lv = 0; - C_Home1.Data.Rv = 0; - C_Home1.Data.Command = C_STOP; - C_Home2.Data.Lv = 0; - C_Home2.Data.Rv = 0; - C_Home2.Data.Command = C_STOP; - C_Home3.Data.Lv = 0; - C_Home3.Data.Rv = 0; - C_Home3.Data.Command = C_STOP; - C_Home4.Data.Lv = 0; - C_Home4.Data.Rv = 0; - C_Home4.Data.Command = C_STOP; - C_Home5.Data.Lv = 0; - C_Home5.Data.Rv = 0; - C_Home5.Data.Command = C_STOP; - C_Home6.Data.Lv = 0; - C_Home6.Data.Rv = 0; - C_Home6.Data.Command = C_STOP; - C_Home7.Data.Lv = 0; - C_Home7.Data.Rv = 0; - C_Home7.Data.Command = C_STOP; - C_Home8.Data.Lv = 0; - C_Home8.Data.Rv = 0; - C_Home8.Data.Command = C_STOP; - C_Home9.Data.Lv = 0; - C_Home9.Data.Rv = 0; - C_Home9.Data.Command = C_STOP; - C_Home10.Data.Lv = 0; - C_Home10.Data.Rv = 0; - C_Home10.Data.Command = C_STOP; - C_Home11.Data.Lv = 0; - C_Home11.Data.Rv = 0; - C_Home11.Data.Command = C_STOP; - - m_nStrategy = id; // left = 0, right = 1 - nKick = 0; - nKick2 = 0; - nShoot = 0; - nSweep = 0; -} - -// CStrategySystem::~CStrategySystem() { -// } +#include "StdAfx.h" +#include "StrategySystem.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +IMPLEMENT_DYNAMIC(CStrategySystem, CObject) + +extern int nKick; +#define BALL_WIDTH 78 +#define BALL_LENGTH 156 +#define BALL_DIS 26 +#define CORNER 115 + +#define ANGLE_BOUND 60 +#define BOUND_BOUND 12 +#define G_OFFSET 20 +#define G_ANGLE_BOUND 60 +#define G_BOUND_BOUND 10 + +// 罚球 +void CStrategySystem::Penalty() { + srand(time(nullptr)); + int x = rand() % 2; + int d = 21; + static bool faceR; // 角度 + if (x) { + if (Distance(home1.position, ball.position) > d) { + Direction(HOME1, ball.position); + faceR = fabs(home1.angle) > 90; + } + else { + double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 505)))); // 求曲线行驶时轨迹的半径 + int lw = r / (r + 6) * 127; + if (faceR) + Velocity(1, lw, 127); + else + Velocity(1, -127, -lw); + } + } + else { + if (Distance(home1.position, ball.position) > d) { + Direction(HOME1, ball.position); + faceR = fabs(home1.angle) > 90; + } + else { + double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 313)))); + int rw = r / (r + 6) * 127; + if (!faceR) + Velocity(1, -rw, -127); + else + Velocity(1, 127, rw); + } + } + Direction(HOME2, ball.position); + Direction(HOME3, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME7, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + Direction(HOME10, ball.position); +} + +// 争球 +void CStrategySystem::Freeball() { + // 要实现先直冲,在曲线的话,就要加一个标识符标识此时的状态,当距离不足时标识符为1,距离够时标识符变为0,并且在争球结束后变为1 + // 感觉防御的话就直冲判断比较简单粗暴,毕竟目标是拦截,而不是射门, + static bool faceR; + int d = 25; + if (Status() == 2) { // 左上 + Direction(HOME3, ball.position); + Direction(HOME1, ball.position); + Direction(HOME2, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME7, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + Direction(HOME10, ball.position); + } + else if (Status() == 3) { // 左下 + Direction(HOME1, ball.position); + } + /* if (Status() == 2) { // 左上 + if (Distance(home3.position, ball.position) > d && flag) { + Direction(HOME3, CPoint(ball.position.x,ball.position.y-6)); + faceR = fabs(home3.angle) > 90; + } + else { + flag = false; + double r = Distance(home3.position, ball.position) / (2 * (sin(atwo(home3.pos.x, home3.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 605)))); // 求曲线行驶时轨迹的半径 + int lw = (r-5) / (r +8) * 127; + if (faceR) + Velocity(3, lw, 127); + else + Velocity(3, -127, -lw); + } + Direction(HOME1, ball.position); + Direction(HOME2, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME7, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + Direction(HOME10, ball.position); + } + + else if (Status() == 3) { // 左下 + if (Distance(home1.position, ball.position) > d && flag) { + Direction(HOME1, ball.position); + faceR = fabs(home1.angle) > 90; + } + else { + flag = false; + double r = Distance(home1.position, ball.position) / (2 * (sin(atwo(home1.pos.x, home1.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 28, 213)))); + int rw = (r - 5) / (r + 8) * 127; + if (!faceR) + Velocity(1, -rw, -127); + else + Velocity(1, 127, rw); + } + Direction(HOME2, ball.position); + Direction(HOME3, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME7, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + Direction(HOME10, ball.position); + }*/ + else if (Status() == 4) { // 右上 + Direction(HOME10, ball.position); + } + /*else if (Status() == 4) { // 右上 + if (Distance(home10.position, ball.position) > d && flag) { + Direction(HOME10, ball.position); + faceR = fabs(home10.angle) > 90; + } + else { + flag = false; + double r = Distance(home10.position, ball.position) / (2 * (sin(atwo(home10.pos.x, home10.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 515, 95)))); + int rw = (r - 5) / (r + 5) * 127; + if (faceR) + Velocity(10, -rw, -127); + else + Velocity(10, 127, rw); + } + Direction(HOME1, ball.position); + Direction(HOME2, ball.position); + Direction(HOME3, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME7, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + } */ + /* else if (Status() == 5) { // 右下 + if (Distance(home7.position, ball.position) > d && flag) { + Direction(HOME7, ball.position); + faceR = fabs(home7.angle) > 90; + } + else { + flag = false; + double r = Distance(home7.position, ball.position) / (2 * (sin(atwo(home7.pos.x, home7.pos.y, ball.position.x, ball.position.y, ball.position.x, ball.position.y, 515, 723)))); + int lw = (r - 8) / (r + 5) * 127; + if (faceR) + Velocity(7, -127, -lw); + else + Velocity(7, lw, 127); + } + Direction(HOME1, ball.position); + Direction(HOME2, ball.position); + Direction(HOME3, ball.position); + Direction(HOME4, ball.position); + Direction(HOME5, ball.position); + Direction(HOME6, ball.position); + Direction(HOME8, ball.position); + Direction(HOME9, ball.position); + Direction(HOME10, ball.position); + }*/ + else if (Status() == 5) { // 右下//也许还有其它改进的思路,但实在南蚌 + Direction(HOME7, ball.position); + } + else // 这个标识符判断的问题到底咋搞,放在这的话应该是要在action函数里把freeball函数一直调用,如果要把还原放在action函数的话就要再不是争球的情况下都还原 + flag = 1; +} + +// 两直线间夹角 +double CStrategySystem::atwo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { + double j = 0; + double k1 = (y1 - y2) / (x1 - x2); + double k2 = (y3 - y4) / (x3 - x4); + j = atan(fabs((k2 - k1) / (1 + k1 * k2))); + return j; +} + +// void CStrategySystem::spin(int which, bool isClockwise) { // 自旋 +// if (isClockwise) +// Velocity(which, 127, -127); +// else +// Velocity(which, -127, 127); +// } + +// 控球 +// void CStrategySystem::Possession() { +// navigate(); +/*for(int i=1;i<11;i++) +{ + Navigation[i]=ball.position; +}*/ + +// if (ball.position.x < 290) { +// Canshot(); +// for (int i = 1; i < 9; i++) { +// control(i); +// } +// } +// else +// for (int i = 1; i < 11; i++) { +// control(i); +// } + +// bool a, b; +// if (ball.position.y >= 337 && ball.position.x < 290) // 球在敌方下半 +// { +// if ((ball.position.y >= 481 && ball.position.y <= 607) || (ball.position.x - ball.oldPosition.x <= 5 && ball.position.y - ball.oldPosition.y <= 5) && search1() < 4) // 7可射 +// shot(7, 1); // 7射 +// else +// control(7); + +// if (Distance(ball.position, home2.position) <= 75) // 2可射 +// { +// control(1); // 1 +// if (search1() < 4) +// shot(HOME2, 1); // 2射 +// else +// control(2); +// for (int i = 3; i < 7; i++) // 3-6 +// control(i); +// control(1); // 8 +// if (!canshot()) // 9,10 +// { +// control(9); +// control(10); +// } +// } +// else if (Distance(ball.position, home3.position) <= 75 && ball.position.y <= 481 && ball.position.y >= 505) // 3可射 +// { +// control(1); // 1 +// control(2); // 2 +// if (search1() < 4) +// shot(HOME3, 0); // 3射 +// else +// control(3); +// for (int i = 4; i < 7; i++) // 4-6 +// control(i); +// control(8); // 8 +// if (!canshot()) // 9,10 +// { +// control(9); +// control(10); +// } +// } +// else // 其它情况 +// for (int i = 1; i < 11; i++) // 1-10 +// control(i); +// } +// else if (ball.position.y < 481 && ball.position.x < 290) // 球在敌方上半 +// { +// if ((ball.position.y >= 217 && ball.position.y <= 337) || (ball.position.x - ball.oldPosition.x <= 5 && ball.position.y - ball.oldPosition.y <= 5) && search1() < 4) // 8可射 +// shot(8, 0); +// else +// control(8); +// if (Distance(ball.position, home3.position) <= 75) // 3可射 +// { +// control(1); // 1 +// control(2); // 2 +// if (search1() < 4) +// shot(HOME3, 0); // 3射 +// else +// control(3); +// for (int i = 4; i < 7; i++) // 4-6 +// control(i); +// control(HOME7); // 7 +// if (!canshot()) // 9,10 +// { +// control(9); +// control(10); +// } +// } +// else if (Distance(ball.position, home2.position) <= 75 && ball.position.y >= 313 && ball.position.y <= 337) // 2可射 +// { + +// control(1); // 1 +// if (search1() < 4) +// shot(2, 0); // 2射 +// else +// control(2); +// control(HOME3); // 3 +// for (int i = 4; i < 7; i++) // 4-6 +// control(i); +// control(HOME7); // 7 +// if (!canshot()) // 9,10 +// { +// control(9); +// control(10); +// } +// } +// else // 其它情况 +// for (int i = 1; i < 11; i++) // 1-10 +// control(i); +// } +// else // 其它情况 +// for (int i = 1; i < 11; i++) // 1-10 +// control(i); +//} + +// 控球具体实现 +void CStrategySystem::Possession() { + CPoint pos[10]; // pos[0] 中央球员;p[1:9] 阵型球员 + + RelPos rp[10]; // 阵型球员相对中央球员的位置 + for (int i = 0; i < 10; i++) + rp[i].id = i + 1; + + CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; + if (cp_id()) { + pos[0] = cur_pos[cp_id() - 1]; + + for (int i = 0; i < 10; i++) { + if (rp[i].id == cp_id()) { + rp[i].ang = 0; + rp[i].dis = 0; + } + else { + rp[i].ang = atan2(cur_pos[i].y - pos[0].y, cur_pos[i].x - pos[0].x); + rp[i].dis = Distance(cur_pos[i], pos[0]); + } + } + + RelPos r; + + // 孙徐 + if (fm_id() == 1) { + Direction(cp_id(), ball.position); + + pos[1] = CPoint(pos[0].x, pos[0].y - 20); + pos[2] = CPoint(pos[0].x + 20, pos[0].y - 20); + pos[3] = CPoint(pos[0].x + 20, pos[0].y); + pos[6] = CPoint(pos[0].x + 40, pos[0].y); + pos[4] = CPoint(pos[0].x + 20, pos[0].y + 20); + pos[7] = CPoint(pos[0].x + 40, pos[0].y + 20); + pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); + pos[8] = CPoint(170, 409); + pos[9] = CPoint(170, 556); + + fp_sort(rp); + fp_sort(rp, 0, 5); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + fp_sort(rp, 5, 7); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (fm_id() == 2) { + Direction(cp_id(), ball.position); + + pos[1] = CPoint(pos[0].x, pos[0].y + 20); + pos[2] = CPoint(pos[0].x + 20, pos[0].y + 20); + pos[3] = CPoint(pos[0].x + 20, pos[0].y); + pos[6] = CPoint(pos[0].x + 40, pos[0].y); + pos[4] = CPoint(pos[0].x + 20, pos[0].y - 20); + pos[7] = CPoint(pos[0].x + 40, pos[0].y - 20); + pos[5] = CPoint(pos[0].x + 20, pos[0].y - 40); + pos[8] = CPoint(170, 409); + pos[9] = CPoint(170, 265); + + fp_sort(rp); + fp_sort(rp, 0, 5); + Direction(rp[5].id, pos[1]); + Direction(rp[4].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[2].id, pos[4]); + Direction(rp[1].id, pos[5]); + fp_sort(rp, 5, 7); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (fm_id() == 3) { + if (ball.position.x >= 157 && ball.position.x <= 290 && ball.position.y <= 409) { + // 内圈 + pos[1] = CPoint(pos[0].x - 20, pos[0].y - 40); + pos[2] = CPoint(pos[0].x + 20, pos[0].y - 40); + pos[3] = CPoint(pos[0].x + 40 * cos(30), pos[0].y - 40 * sin(30)); + pos[4] = CPoint(pos[0].x + 40 * cos(30), pos[0].y + 40 * sin(40)); + pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); + pos[6] = CPoint(pos[0].x - 20, pos[0].y + 40); + // 内圈 + pos[7] = CPoint(pos[0].x + 120 * cos(67.5), pos[0].y - 120 * sin(67.5)); + pos[8] = CPoint(pos[0].x + 120 * cos(45), pos[0].y - 120 * sin(45)); + pos[9] = CPoint(pos[0].x + 120 * cos(22.5), pos[0].y - 120 * sin(22.5)); + shot(cp_id(), CPoint(45, 361)); + fp_sort(rp); + fp_sort(rp, 0, 6); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 5, 8); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (ball.position.x >= 157 && ball.position.x <= 290 && ball.position.y > 409) { + // 内圈 + pos[1] = CPoint(pos[0].x - 20, pos[0].y - 40); + pos[2] = CPoint(pos[0].x + 20, pos[0].y - 40); + pos[3] = CPoint(pos[0].x + 40 * cos(30), pos[0].y - 40 * sin(30)); + pos[4] = CPoint(pos[0].x + 40 * cos(30), pos[0].y + 40 * sin(40)); + pos[5] = CPoint(pos[0].x + 20, pos[0].y + 40); + pos[6] = CPoint(pos[0].x - 20, pos[0].y + 40); + // 内圈 + pos[7] = CPoint(pos[0].x + 120 * cos(67.5), pos[0].y + 120 * sin(67.5)); + pos[8] = CPoint(pos[0].x + 120 * cos(45), pos[0].y + 120 * sin(45)); + pos[9] = CPoint(pos[0].x + 120 * cos(22.5), pos[0].y + 120 * sin(22.5)); + shot(cp_id(), CPoint(45, 457)); + fp_sort(rp); + fp_sort(rp, 0, 6); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 5, 8); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (ball.position.x < 157 && ball.position.y >= 217 && ball.position.y <= 409) // 球在上半 + { + pos[1] = CPoint(142, pos[0].y - 20); + pos[2] = CPoint(142, pos[0].y + 20); + + pos[3] = CPoint(170, pos[0].y - 20); + pos[4] = CPoint(170, pos[0].y + 20); + pos[5] = CPoint(185, pos[0].y - 12); + if (pos[0].y - 50 < 157) + pos[6] = CPoint(ball.position.x + 12, 225); + else + pos[6] = CPoint(170, pos[0].y - 50); + pos[7] = CPoint(ball.position.x, 225); + pos[8] = CPoint(170, pos[0].y + 45); + pos[9] = CPoint(170, pos[0].y + 405); + shot(cp_id()); + fp_sort(rp, 0, 8); + Direction(rp[7].id, pos[1]); + Direction(rp[8].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[1].id, pos[6]); + Direction(rp[2].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (ball.position.x < 157 && ball.position.y >= 217 && ball.position.y > 409) // 球在下半 + { + pos[1] = CPoint(142, pos[0].y - 20); + pos[2] = CPoint(142, pos[0].y + 20); + + pos[3] = CPoint(170, pos[0].y - 20); + pos[4] = CPoint(170, pos[0].y + 20); + pos[5] = CPoint(185, pos[0].y + 12); + if (pos[0].y + 50 > 607) + pos[6] = CPoint(ball.position.x + 12, 615); + else + pos[6] = CPoint(170, pos[0].y + 50); + pos[7] = CPoint(ball.position.x, 615); + pos[8] = CPoint(170, pos[0].y - 45); + pos[9] = CPoint(170, pos[0].y - 405); + shot(cp_id()); + fp_sort(rp, 0, 8); + Direction(rp[7].id, pos[1]); + Direction(rp[8].id, pos[2]); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[1].id, pos[6]); + Direction(rp[2].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + } + + // 王徐 + else if (fm_id() == 4) { + Direction(cp_id(), ball.position); + + pos[1] = CPoint(ball.position.x + (int)cos(45.0 * PI / 180.0) * 20, ball.position.y + (int)sin(45.0 * PI / 180.0) * 20); + pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); + pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); + pos[4] = CPoint(pos[0].x + (int)cos(15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(15.0 * PI / 180.0) * 40); + pos[5] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(30.0 * PI / 180.0) * 40); + pos[6] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); + pos[7] = CPoint(pos[0].x + (int)cos(50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(50.0 * PI / 180.0) * 60); + pos[8] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); + pos[9] = CPoint(pos[0].x + (int)cos(75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(75.0 * PI / 180.0) * 60); + + fp_sort(rp); + fp_sort(rp, 0, 2); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 2, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 6, 9); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + + /*double d[10], dy[10]; + CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; + for (int i = 0; i <= 9; i++) { + if (i == cp_id() - 1) { + d[i] = 1e5; + } + else { + d[i] = Distance(cur_pos[i], cur_pos[cp_id() - 1]); + } + } + int p1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + for (int i = 1; i <= 10; i++) { + for (int j = 0; j < 10 - i; j++) { + if (d[j] > d[j + 1]) { + int tmp = d[j]; + d[j] = d[j + 1]; + d[j + 1] = tmp; + tmp = p1[j]; + p1[j] = p1[j + 1]; + p1[j + 1] = tmp; + } + } + } + Direction(p1[0], pos[0]); + Direction(p1[1], pos[1]); + for (int i = 0; i <= 9; i++) { + if (i == cp_id() - 1) { + dy[i] = 1e5; + } + else { + dy[p1[i]] = 217 - cur_pos[i].y; + } + } + dy[p1[0]] = 1e5; + dy[p1[1]] = 1e5; + int p2[10] = { p1[0], p1[1], p1[2], p1[3], p1[4], p1[5], p1[6], p1[7], p1[8], p1[9] }; + for (int i = 1; i <= 10; i++) { + for (int j = 0; j < 10 - i; j++) { + if (dy[j] > dy[j + 1]) { + int tmp = d[j]; + dy[j] = dy[j + 1]; + dy[j + 1] = tmp; + tmp = p2[j]; + p2[j] = p2[j + 1]; + p2[j + 1] = tmp; + } + } + } + Direction(p2[0], pos[9]); + Direction(p2[1], pos[8]); + Direction(p2[2], pos[7]); + Direction(p2[3], pos[6]); + Direction(p2[4], pos[5]); + Direction(p2[5], pos[4]); + Direction(p2[6], pos[3]);*/ + } + else if (fm_id() == 5) { + Direction(cp_id(), ball.position); + + pos[2] = CPoint(ball.position.x + (int)cos(0.0 * PI / 180.0) * 20, ball.position.y + (int)sin(0.0 * PI / 180.0) * 20); + pos[1] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); + pos[6] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); + pos[5] = CPoint(pos[0].x + (int)cos(-15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-15.0 * PI / 180.0) * 40); + pos[4] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 40); + pos[3] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(6 - 45.0 * PI / 180.0) * 40); + pos[9] = CPoint(pos[0].x + (int)cos(-50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-50.0 * PI / 180.0) * 60); + pos[8] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); + pos[7] = CPoint(pos[0].x + (int)cos(-75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-75.0 * PI / 180.0) * 60); + + fp_sort(rp); + fp_sort(rp, 0, 2); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 2, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 6, 9); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + + // double d[10], dy[10]; // dy是球员新的 + // CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; + // for (int i = 0; i <= 9; i++) { + // if (i == cp_id() - 1) { + // d[i] = 1e5; + // } + // else { + // d[i] = Distance(cur_pos[i], cur_pos[cp_id() - 1]); + // } + // } + // int p1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // p1是球员新下标 + // for (int i = 1; i <= 10; i++) { + // for (int j = 0; j < 10 - i; j++) { + // if (d[j] > d[j + 1]) { + // // 根据球员与中心球员距离,按从小到大排列距离 + // int tmp = d[j]; + // d[j] = d[j + 1]; + // d[j + 1] = tmp; + + // // 距离交换后,下标同时交换 + // tmp = p1[j]; + // p1[j] = p1[j + 1]; + // p1[j + 1] = tmp; + // } + // } + //} + // Direction(p1[0], pos[0]); + // Direction(p1[1], pos[1]); + // for (int i = 0; i <= 9; i++) { + // if (i == cp_id() - 1) { + // dy[i] = 1e5; + // } + // else { + // dy[p1[i]] = cur_pos[i].y - 607; + // } + //} + // dy[p1[0]] = 1e5; + // dy[p1[1]] = 1e5; + //// p2 + // int p2[10] = { p1[0], p1[1], p1[2], p1[3], p1[4], p1[5], p1[6], p1[7], p1[8], p1[9] }; + // for (int i = 1; i <= 10; i++) { + // for (int j = 0; j < 10 - i; j++) { + // if (dy[j] > dy[j + 1]) { + // int tmp = d[j]; + // dy[j] = dy[j + 1]; + // dy[j + 1] = tmp; + + // // 距离交换后,下标同时交换 + // tmp = p2[j]; + // p2[j] = p2[j + 1]; + // p2[j + 1] = tmp; + // } + // } + //} + // Direction(p2[0], pos[9]); + // Direction(p2[1], pos[8]); + // Direction(p2[2], pos[7]); + // Direction(p2[3], pos[6]); + // Direction(p2[4], pos[5]); + // Direction(p2[5], pos[4]); + // Direction(p2[6], pos[3]); + } + else if (fm_id() == 6) { + Direction(cp_id(), ball.position); + + pos[1] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); + pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); + pos[5] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); + pos[3] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-45.0 * PI / 180.0) * 40); + pos[4] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); + pos[9] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); + pos[6] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); + pos[8] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 60, pos[0].y + (int)sin(30.0 * PI / 180.0) * 60); + pos[7] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 60); + + fp_sort(rp); + fp_sort(rp, 0, 2); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 2, 5); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + fp_sort(rp, 5, 9); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + + /*int d[10]; + CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; + for (int i = 0; i <= 9; i++) { + if (i == cp_id() - 1) { + d[i] = 1e5; + } + d[i] = cur_pos[i].x - cur_pos[cp_id() - 1].x; + } + int p[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + for (int i = 1; i <= 10; i++) { + int j; + for (j = 0; j < 10 - i; j++) { + if (d[j] > d[j + 1]) { + int tmp = d[j]; + d[j] = d[j + 1]; + d[j + 1] = tmp; + tmp = p[j]; + p[j] = p[j + 1]; + p[j + 1] = tmp; + } + } + } + for (int i = 0; i <= 9; i++) { + if (p[i] = cp_id() - 1) + continue; + Direction(p[i], pos[i + 1]); + }*/ + } + // 景缪 + else if (fm_id() == 7) { + Direction(cp_id(), ball.position); + + if (ball.position.x > 873) { + pos[1] = CPoint(pos[0].x + 20, pos[0].y - 15); + pos[2] = CPoint(pos[0].x + 20, pos[0].y + 15); + pos[3] = CPoint(pos[0].x + 10, pos[0].y + 30); + pos[4] = CPoint(pos[0].x - 20, pos[0].y + 20); + pos[5] = CPoint(pos[0].x + 20, pos[0].y - 30); + pos[6] = CPoint(pos[0].x - 40, pos[0].y + 20); + pos[7] = CPoint(896, 217); + pos[8] = CPoint(919, 217); + pos[9] = CPoint(942, 217); + } + else { + pos[1] = CPoint(pos[0].x, pos[0].y - 20); + pos[2] = CPoint(pos[0].x + 10, pos[0].y + 20); + pos[3] = CPoint(pos[0].x - 25, pos[0].y + 30); + pos[4] = CPoint(pos[0].x - 40, pos[0].y + 30); + pos[5] = CPoint(pos[0].x + 10, pos[0].y + 50); + pos[6] = CPoint(pos[0].x + 50, pos[0].y - 10); + int n1 = 643 > ball.position.x ? 623 : ball.position.x; + int n2 = 733 > ball.position.x ? 733 : ball.position.x; + pos[7] = CPoint(n1, 217); + pos[8] = CPoint(n2, 217); + pos[9] = CPoint(939, 217); + } + + fp_sort(rp); + fp_sort(rp, 0, 2); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 2, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 6, 9); + PositionSE(rp[7].id, pos[7]); + PositionSE(rp[8].id, pos[8]); + PositionSE(rp[9].id, pos[9]); + + // double adou[15]; + // int xz[15]; + // int n = 1; + // xz[n] = cp_id(); + // int pp[15]; + // for (int i = 1; i <= 9; i++) // 按角度从小到大排序,然后最小的占据点位,并且后续将已分配的记名,不参与接下来的分配 + // { + // for (int u = 1; u <= 10; u++) { + // Robot2 *robot; + // switch (u) { + // case HOME1: + // robot = &home1; + // break; + // case HOME2: + // robot = &home2; + // break; + // case HOME3: + // robot = &home3; + // break; + // case HOME4: + // robot = &home4; + // break; + // case HOME5: + // robot = &home5; + // break; + // case HOME6: + // robot = &home6; + // break; + // case HOME7: + // robot = &home7; + // break; + // case HOME8: + // robot = &home8; + // break; + // case HOME9: + // robot = &home9; + // break; + // case HOME10: + // robot = &home10; + // break; + // } + // adou[u] = atwo(robot->position.x, robot->position.y, ball.position.x, ball.position.y, pos[i].x, pos[i].y, ball.position.x, ball.position.y); // 先将值赋给adou + // pp[u] = u; + // } + + // // 然后求adou里最小的,给pos[1]的坐标,并将球员号计入xz中 + // for (int u = 1; u <= 10; u++) + // for (int j = u + 1; j <= 10; j++) + // if (adou[u] > adou[j]) { + // double t; + // int m; + // m = pp[u]; + // pp[u] = pp[j]; + // pp[j] = m; + // t = adou[u]; + // adou[u] = adou[j]; + // adou[j] = t; + // } + // for (int u = 1; u <= 10; u++) { + // int o = 0; + // for (int j = 1; j <= n; j++) { + // if (pp[u] == xz[j]) // 是记录人员 + // { + // break; + // } + // if (j == n) // 不是记录人员 + // { + // Direction(pp[u], pos[i]); + // n++; + // xz[n] = pp[u]; + // o = 1; + // } + // } + // if (o == 1) + // break; + // } + // } + // // if (Distance(pos[i], ball.position)<5) + // // PositionSE(pos[i], ball.position); // 在这个阵型这个点位处的球员就击球 + // // 否则就保持一定速度在点位待机 + } + else if (fm_id() == 8) { + Direction(cp_id(), ball.position); + + if (ball.position.x > 873) { + pos[1] = CPoint(pos[0].x + 20, pos[0].y + 15); + pos[2] = CPoint(pos[0].x + 20, pos[0].y - 15); + pos[3] = CPoint(pos[0].x + 20, pos[0].y - 30); + pos[4] = CPoint(pos[0].x - 20, pos[0].y - 20); + pos[5] = CPoint(pos[0].x + 20, pos[0].y + 30); + pos[6] = CPoint(pos[0].x - 40, pos[0].y - 20); + pos[7] = CPoint(896, 608); + pos[8] = CPoint(919, 608); + pos[9] = CPoint(942, 608); + } + else { + pos[1] = CPoint(pos[0].x, pos[0].y + 20); + pos[2] = CPoint(pos[0].x + 10, pos[0].y - 20); + pos[6] = CPoint(pos[0].x - 25, pos[0].y - 30); + pos[5] = CPoint(pos[0].x - 40, pos[0].y - 30); + pos[4] = CPoint(pos[0].x + 10, pos[0].y - 50); + pos[3] = CPoint(pos[0].x + 50, pos[0].y + 10); + int n1 = 643 > ball.position.x ? 643 : ball.position.x; + int n2 = 733 > ball.position.x ? 733 : ball.position.x; + pos[7] = CPoint(n1, 608); + pos[8] = CPoint(n2, 608); + pos[9] = CPoint(939, 608); + } + + fp_sort(rp); + fp_sort(rp, 0, 2); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 2, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + fp_sort(rp, 6, 9); + PositionSE(rp[7].id, pos[7]); + PositionSE(rp[8].id, pos[8]); + PositionSE(rp[9].id, pos[9]); + // double adou[15]; + // int xz[15]; + // int n = 1; + // xz[n] = cp_id(); + // int pp[15]; + // for (int i = 1; i <= 9; i++) // 按角度从小到大排序,然后最小的占据点位,并且后续将已分配的记名,不参与接下来的分配 + // { + + // for (int u = 1; u <= 10; u++) { + // Robot2 *robot; + // switch (u) { + // case HOME1: + // robot = &home1; + // break; + // case HOME2: + // robot = &home2; + // break; + // case HOME3: + // robot = &home3; + // break; + // case HOME4: + // robot = &home4; + // break; + // case HOME5: + // robot = &home5; + // break; + // case HOME6: + // robot = &home6; + // break; + // case HOME7: + // robot = &home7; + // break; + // case HOME8: + // robot = &home8; + // break; + // case HOME9: + // robot = &home9; + // break; + // case HOME10: + // robot = &home10; + // break; + // } + // adou[u] = atwo(robot->position.x, robot->position.y, ball.position.x, ball.position.y, pos[i].x, pos[i].y, ball.position.x, ball.position.y); // 先将值赋给adou + // pp[u] = u; + // } + // // 然后求adou里最小的,给pos[1]的坐标,并将球员号计入xz中 + // for (int u = 1; u <= 10; u++) + // for (int j = u + 1; j <= 10; j++) + // if (adou[u] > adou[j]) { + // double t; + // int m; + // m = pp[u]; + // pp[u] = pp[j]; + // pp[j] = m; + // t = adou[u]; + // adou[u] = adou[j]; + // adou[j] = t; + // } + // for (int u = 1; u <= 10; u++) { + // int o = 0; + // for (int j = 1; j <= n; j++) { + // if (pp[u] == xz[j]) // 是记录人员 + // { + // break; + // } + // if (j == n) // 不是记录人员 + // { + // Direction(pp[u], pos[i]); + // n++; + // xz[n] = pp[u]; + // o = 1; + // } + // } + // if (o == 1) + // break; + // } + // } + // // if (Distance(pos[i], ball.position)<5) + // // PositionSE(pos[i], ball.position);//在这个阵型这个点位处的球员就击球 + // // 否则就保持一定速度在点位待机 + } + else if (fm_id() == 9) { + Direction(cp_id(), ball.position); + if (ball.position.y > 409) { + pos[1].y = pos[0].y - 35; + pos[1].x = pos[0].x - 10; + pos[2].y = pos[0].y - 25; + pos[2].x = pos[0].x + 30; + pos[3].y = pos[0].y; + pos[3].x = pos[0].x + 30; + pos[4].y = pos[0].y - 65; + pos[4].x = pos[0].x; + pos[5].y = pos[0].y - 75; + pos[5].x = pos[0].x + 60; + pos[6].y = pos[0].y - 60; + pos[6].x = pos[0].x + 70; + pos[7].y = pos[0].y + 20; + pos[7].x = pos[0].x + 70; + pos[8].y = pos[0].y + 60; + pos[8].x = pos[0].x + 70; + pos[9].y = pos[0].y - 90; + pos[9].x = pos[0].x + 07; + } + else if (ball.position.y <= 409) { + pos[1].y = pos[0].y; + pos[1].x = pos[0].x + 30; + pos[2].y = pos[0].y + 35; + pos[2].x = pos[0].x - 40; + pos[3].y = pos[0].y + 25; + pos[3].x = pos[0].x; + pos[4].y = pos[0].y + 65; + pos[4].x = pos[0].x + 70; + pos[5].y = pos[0].y + 75; + pos[5].x = pos[0].x + 60; + pos[6].y = pos[0].y + 65; + pos[6].x = pos[0].x + 70; + pos[7].y = pos[0].y + 20; + pos[7].x = pos[0].x + 70; + pos[8].y = pos[0].y - 20; + pos[8].x = pos[0].x + 70; + pos[9].y = pos[0].y + 90; + pos[9].x = pos[0].x + 70; + } + if (ball.position.x >= 800) { // 球临近禁区 + fp_sort(rp); + fp_sort(rp, 0, 3); + PositionSE(rp[1].id, pos[1]); + PositionSE(rp[2].id, pos[2]); + PositionSE(rp[3].id, pos[3]); + fp_sort(rp, 3, 8); + PositionSE(rp[4].id, pos[4]); + PositionSE(rp[5].id, pos[5]); + PositionSE(rp[6].id, pos[6]); + PositionSE(rp[7].id, pos[7]); + PositionSE(rp[8].id, pos[8]); + fp_sort(rp, 8, 9); + PositionSE(rp[9].id, pos[9]); + } + else { + fp_sort(rp); + fp_sort(rp, 0, 3); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + Direction(rp[3].id, pos[3]); + fp_sort(rp, 3, 8); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + fp_sort(rp, 8, 9); + Direction(rp[9].id, pos[9]); + } + } + } + else { // TODO 无中央球员 + if (fm_id() == 4 || fm_id() == 6) { + pos[0] = CPoint(ball.position.x + (int)cos(0 * PI / 180) * 40, ball.position.y + (int)sin(20 * PI / 180) * 40); + pos[1] = CPoint(ball.position.x + (int)cos(45.0 * PI / 180.0) * 20, ball.position.y + (int)sin(45.0 * PI / 180.0) * 20); + pos[2] = CPoint(ball.position.x + (int)cos(90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(90.0 * PI / 180.0) * 20); + pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); + pos[4] = CPoint(pos[0].x + (int)cos(15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(15.0 * PI / 180.0) * 40); + pos[5] = CPoint(pos[0].x + (int)cos(30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(30.0 * PI / 180.0) * 40); + pos[6] = CPoint(pos[0].x + (int)cos(45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(45.0 * PI / 180.0) * 40); + pos[7] = CPoint(pos[0].x + (int)cos(50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(50.0 * PI / 180.0) * 60); + pos[8] = CPoint(pos[0].x + (int)cos(60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(60.0 * PI / 180.0) * 60); + pos[9] = CPoint(pos[0].x + (int)cos(75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(75.0 * PI / 180.0) * 60); + + fp_sort(rp); + fp_sort(rp, 0, 3); + Direction(rp[0].id, pos[0]); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 3, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + fp_sort(rp, 6, 10); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + else if (fm_id() == 5) { + pos[0] = CPoint(ball.position.x + (int)cos(0 * PI / 180) * 40, ball.position.y - (int)sin(20 * PI / 180) * 40); + pos[1] = CPoint(ball.position.x + (int)cos(0.0 * PI / 180.0) * 20, ball.position.y + (int)sin(0.0 * PI / 180.0) * 20); + pos[2] = CPoint(ball.position.x + (int)cos(-90.0 * PI / 180.0) * 20, ball.position.y + (int)sin(-90.0 * PI / 180.0) * 20); + pos[3] = CPoint(pos[0].x + (int)cos(0.0 * PI / 180.0) * 40, pos[0].y + (int)sin(0.0 * PI / 180.0) * 40); + pos[4] = CPoint(pos[0].x + (int)cos(-15.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-15.0 * PI / 180.0) * 40); + pos[5] = CPoint(pos[0].x + (int)cos(-30.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-30.0 * PI / 180.0) * 40); + pos[6] = CPoint(pos[0].x + (int)cos(-45.0 * PI / 180.0) * 40, pos[0].y + (int)sin(-45.0 * PI / 180.0) * 40); + pos[7] = CPoint(pos[0].x + (int)cos(-50.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-50.0 * PI / 180.0) * 60); + pos[8] = CPoint(pos[0].x + (int)cos(-60.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-60.0 * PI / 180.0) * 60); + pos[9] = CPoint(pos[0].x + (int)cos(-75.0 * PI / 180.0) * 60, pos[0].y + (int)sin(-75.0 * PI / 180.0) * 60); + + fp_sort(rp); + fp_sort(rp, 0, 3); + Direction(rp[0].id, pos[0]); + Direction(rp[1].id, pos[1]); + Direction(rp[2].id, pos[2]); + fp_sort(rp, 3, 6); + Direction(rp[3].id, pos[3]); + Direction(rp[4].id, pos[4]); + Direction(rp[5].id, pos[5]); + fp_sort(rp, 6, 10); + Direction(rp[6].id, pos[6]); + Direction(rp[7].id, pos[7]); + Direction(rp[8].id, pos[8]); + Direction(rp[9].id, pos[9]); + } + } +} + +// 搜索最近球员位置 +// CPoint CStrategySystem::searchNear(int which) { +// CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; +// double ddd = 10000; +// CPoint near; +// for (int i = 0; i < 10; i++) { +// if (Distance(cur_pos[i], ball.position) < ddd) { +// ddd = Distance(cur_pos[i], ball.position); +// near = cur_pos[i]; +// } +// } +// return near; +// } + +// 中央球员 ID +int CStrategySystem::cp_id() { + int id = 0; + CPoint cur_pos[10]{ home1.position, home2.position, home3.position, home4.position, home5.position, home6.position, home7.position, home8.position, home9.position, home10.position }; + if (fm_id() == 1) { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].y >= ball.position.y) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + else if (fm_id() == 2) { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].y <= ball.position.y) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + else if (fm_id() == 7) { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].y <= ball.position.y) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + else if (fm_id() == 8) { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].y >= ball.position.y) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + else if (fm_id() == 3) { + if (ball.position.x >= 157 && ball.position.x <= 290) { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].x < ball.position.x) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + else if (ball.position.x >= 65 && ball.position.x < 157) // 球在禁区用y轴最近 + { + double min = 10000; + for (int i = 0; i < 10; i++) { + if (cur_pos[i].x < ball.position.x) + cur_pos[i] = CPoint(-965, -723); + } + for (int i = 0; i < 10; i++) { + if (fabs(ball.position.y - cur_pos[i].y) < min) { + min = fabs(ball.position.y - cur_pos[i].y); + id = i + 1; + } + } + } + } + else { + for (int i = 0; i < 10; i++) { + if (cur_pos[i].x <= ball.position.x) + cur_pos[i] = CPoint(-965, -723); + } + double min = 10000; + for (int i = 0; i < 10; i++) { + if (Distance(cur_pos[i], ball.position) < min) { + min = Distance(cur_pos[i], ball.position); + id = i + 1; + } + } + } + return id; +} + +// 阵型 ID +int CStrategySystem::fm_id() { + if (ball.position.x < 290) { + if (ball.position.y < 217) + return 1; + else if (ball.position.y <= 607) + return 3; + else + return 2; + } + else if (ball.position.x < 740) { + if (ball.position.y < 217) + return 4; + else if (ball.position.y <= 607) + return 6; + else + return 5; + } + else { + if (ball.position.y < 217) + return 7; + else if (ball.position.y <= 607) + return 9; + else + return 8; + } +} + +// 阵型球员相对中央球员的位置结构体 +// struct RelPos { +// int id; +// double dis; +// double ang; // (-π, π] +// }; + +// 阵型球员排序,h 为该层前的球员数量,t 为包含该层后的球员数量 +void CStrategySystem::fp_sort(RelPos *rp, int h, int t) { + RelPos r; + if (!h && !t) { + for (int i = 1; i < 10; i++) { + for (int j = 0; j < 10 - i; j++) { + if (rp[j].dis > rp[j + 1].dis) { + r = rp[j], rp[j] = rp[j + 1], rp[j + 1] = r; + } + } + } + } + else { + for (int i = h + 1; i < t; i++) { + for (int j = h; j < t - i; j++) { + if (rp[j].ang > rp[j + 1].ang) { + r = rp[j], rp[j] = rp[j + 1], rp[j + 1] = r; + } + } + } + } +} + +// 返回机器人的位置 +CPoint CStrategySystem::coor(int which) { + Robot2 *robot; + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + return robot->position; +} + +// 0向下门框射 +void CStrategySystem::shot(int which) { + Robot2 *robot; + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + bool de; + if (ball.position.y > robot->position.y) + de = 0; + else + de = 1; + double O, O1; + CPoint t1, t2, t3, t4; // t1球,t2机器人,t3机器人要移动到的点,t4门 + t1.x = ball.position.x; + t1.y = ball.position.y; + if (de == 0) { + t4.x = 33.0; + t4.y = 505.0; + O = atan(fabs(ball.position.y - t4.y) / fabs(ball.position.x - t4.x)); // fabs(Angle(,t4)); + O1 = 180 - O; + t3.x = t1.x + cos(O) * 34; + t3.y = t1.y - sin(O) * 34; + } + else if (de == 1) { + t4.x = 33.0; + t4.y = 313.0; + O = atan(fabs(ball.position.y - t4.y) / fabs(ball.position.x - t4.x)); // fabs(Angle(ball.position,t4)); + O1 = 180 + O; + t3.x = t1.x + cos(O) * 34; + t3.y = t1.y + sin(O) * 34; + } + if (Distance(robot->position, ball.position) <= 35 && (fabs(Angle(ball.position, t3) - Angle(robot->position, t3))) <= 2) { + if (de == 1) { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y - sin(O) * 34; + Direction(which, t3); + } + else if (de == 0) { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y + sin(O) * 34; + Direction(which, t3); + } + } + else + Position(which, t3); // 机器人到足够近的点t3 +} + +// 射? +bool CStrategySystem::canshot() { + bool t; // 判断球在敌方上半还是下半;0为下半 + CPoint D1, D2, t4; + Robot2 *robot9, *robot10; + robot9 = &home9; + robot10 = &home10; + // if (ball.position.y >= 409 && ball.position.x <= 290&&ball.position.y<=607) // 球在敌方下半 + // { + // t = 0; + // D1.x = 170; + // D1.y = 265; + // Position(HOME10, D1); + // D2.x = 170; + // D2.y = 409; + // Position(HOME9, D2); + // } + // else if (ball.position.y < 409 && ball.position.x < 290 && ball.position.y >= 217 && Distance(ball.position, home10.position) > 168) // 球在敌方上半 + // { + // t = 1; + // D1.x = 170; + // D1.y = 556; + // Position(HOME10, D1); + // D2.x = 170; + // D2.y = 409; + // Position(HOME9, D2); + // if (ball.position.x >= 104 && ball.position.x <= 170 && ball.position.y >= 313 && ball.position.y <= 449 && (ball.oldPosition.y - ball.oldPosition.y) <= 0) + // Shot(HOME9, 1); + // if (ball.position.x >= 104 && ball.position.x <= 170 && ball.position.y > 449 && ball.position.y <= 607 && (ball.oldPosition.y - ball.oldPosition.y) <= 0) + // Shot(HOME10, 1); + // } + if (ball.position.y <= 481) // 敌方框上半场 + { + D1.x = 170; + D1.y = 265; + D2.x = 170; + D2.y = 409; + if (Distance(ball.position, home9.position) <= 116 && ball.position.y >= 409 && ball.position.y <= 481) // 9可射 + { + shot(HOME9, 0); + Direction(HOME10, D1); + } + else if (Distance(ball.position, home10.position) <= 168 && ball.position.y < 409 && ball.position.y >= 265) // 10可射 + { + Direction(HOME9, D2); + shot(HOME10, 0); + } + else { // 9,10到预定位置 + Direction(HOME10, D1); + Direction(HOME9, D2); + } + return 1; + } + else if (ball.position.y >= 337) // 敌方框下半场 + { + D1.x = 170; + D1.y = 556; + D2.x = 170; + D2.y = 409; + if (Distance(ball.position, home9.position) <= 116 && ball.position.y <= 409 && ball.position.y >= 337) // 9可射 + { + shot(HOME9, 1); + Direction(HOME10, D1); + } + else if (Distance(ball.position, home10.position) <= 164 && ball.position.y > 409 && ball.position.y <= 556) // 10可射 + { + Direction(HOME9, D2); + shot(HOME10, 1); + } + else { // 9,10到预定位置 + Direction(HOME10, D1); + Direction(HOME9, D2); + } + return 1; + } + return 0; + // if () + // { + // if (ball.position.y <= 170) { + // Position(HOME10, D1); + // Shot(HOME9, 0); + // } + // else if (ball.position.y >= 170) { + // Position(HOME9, D2); + // Shot(HOME10, 0); + // } + // } + // else { + // Position(HOME10, D1); + // Position(HOME9, D2); + // } +} + +// 把球向t点射,de向上还是向下射 +void CStrategySystem::shot(int which, CPoint t) { + Robot2 *robot; + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + bool de; + if (ball.position.y > robot->position.y) + de = 0; + else + de = 1; + double O; + CPoint t1, t2, t3; // t1球,t2机器人,t3机器人要移动到的点 + t1.x = ball.position.x; + t1.y = ball.position.y; + if (de == 0) { + O = atan(fabs(ball.position.y - t.y) / fabs(ball.position.x - t.x)); + if (ball.position.x <= 515) { + t3.x = t1.x + cos(O) * 34; + t3.y = t1.y - sin(O) * 34; + } + else { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y - sin(O) * 34; + } + } + else if (de == 1) { + O = atan(fabs(ball.position.y - t.y) / fabs(ball.position.x - t.x)); // fabs(Angle(ball.position,t4)); + if (ball.position.x <= 515) { + t3.x = t1.x + cos(O) * 34; + t3.y = t1.y + sin(O) * 34; + } + else { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y + sin(O) * 34; + } + } + if (Distance(robot->position, ball.position) <= 35 && (fabs(Angle(ball.position, t3) - Angle(robot->position, t3))) <= 2) { + if (de == 1) { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y - sin(O) * 34; + Direction(which, t3); + } + else if (de == 0) { + t3.x = t1.x - cos(O) * 34; + t3.y = t1.y + sin(O) * 34; + Direction(which, t3); + } + } + else + Position(which, t3); // 机器人到足够近的点t3 +} + +// 直射 +void CStrategySystem::shot1(int which, double o, CPoint t) { + Robot2 *robot; + switch (which) { + case HOME9: + robot = &home9; + break; + case HOME1: + robot = &home1; + break; + } + bool a = 0; + /*if((fabs(Angle(ball.position, t) - Angle(robot->position, t))) > 5)*/ + Angle(which, o); + Velocity(which, 127, 127); // which全速前进 +} + +/*void banarea(int which) //让9,10不进禁区 +{ + Robot2 *robot; + switch (which) { + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + } + CPoint t1, t2;//t1球 + t1.x = ball.position.x; + t1.y = ball.position.y; + t2.x = robot->position.x; + t2.y = robot->position.y; + if((t1.x>=65&&1.x<=103&&t1.y>=247&&t1.y<=577)||(t2.x+1==)) +}*/ + +// void CStrategySystem::navigate() // 给人要去的位置坐标导航(预判) +// { +// CPoint robot[11]; +// robot[1] = home1.position; +// robot[2] = home2.position; +// robot[3] = home3.position; +// robot[4] = home4.position; +// robot[5] = home5.position; +// robot[6] = home6.position; +// robot[7] = home7.position; +// robot[8] = home8.position; +// robot[9] = home9.position; +// robot[10] = home10.position; +// /*double d[11]; +// d[1] = Distance(ball.position, home1.position); +// d[2] = Distance(ball.position, home2.position); +// d[3] = Distance(ball.position, home3.position); +// d[4] = Distance(ball.position, home4.position); +// d[5] = Distance(ball.position, home5.position); +// d[6] = Distance(ball.position, home6.position); +// d[7] = Distance(ball.position, home7.position); +// d[8] = Distance(ball.position, home8.position); +// d[9] = Distance(ball.position, home9.position); +// d[10] = Distance(ball.position, home10.position);*/ +// if (65 < ball.position.x && ball.position.x <= 515) { + +// // 对方罚球区内,包围门框 +// if (ball.position.x <= 160 && ball.position.y <= 600 && ball.position.y >= 210) { + +// Navigation[1] = CPoint(175, ball.position.y); +// Navigation[2] = CPoint(175, ball.position.y + 20); +// Navigation[3] = CPoint(175, ball.position.y - 20); +// Navigation[4] = CPoint(200, ball.position.y); +// Navigation[5] = CPoint(175, ball.position.y + 30); +// Navigation[6] = CPoint(200, ball.position.y - 30); +// Navigation[7] = CPoint(ball.position.x, 610); +// Navigation[8] = CPoint(ball.position.x, 210); +// Navigation[9] = CPoint(220, ball.position.y + 50); +// Navigation[10] = CPoint(220, ball.position.y - 50); +// } +// // 对方下半场 +// else if (ball.position.y >= 607) { +// if (home1.position.x > ball.position.x) { // 球员在右 +// if (home1.position.y > ball.position.y) { // 球员在右下 +// Navigation[1] = ball.position; +// } +// else { // 球员在右下 +// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y + 10); +// } +// } +// else { // 球员在左 +// if (home1.position.y > ball.position.y) { // 左下 +// Navigation[1] = ball.position; +// } +// else { // 左上 +// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y + 10); +// } +// } +// if (home2.position.x > ball.position.x) { +// if (home2.position.y > ball.position.y) { +// Navigation[2] = ball.position; +// } +// else { +// Navigation[2] = CPoint(ball.position.x + 10, ball.position.y + 20); +// } +// } +// else { +// if (home2.position.y > ball.position.y) { +// Navigation[2] = ball.position; +// } +// else { +// Navigation[2] = CPoint(ball.position.x - 10, ball.position.y - 20); +// } +// } +// if (home3.position.x > ball.position.x) { +// if (home3.position.y > ball.position.y) { +// Navigation[3] = ball.position; +// } +// else { +// Navigation[3] = CPoint(ball.position.x + 20, ball.position.y + 10); +// } +// } +// else { +// if (home3.position.y > ball.position.y) { +// Navigation[3] = ball.position; +// } +// else { +// Navigation[3] = CPoint(ball.position.x - 20, ball.position.y - 10); +// } +// } +// Navigation[4] = CPoint(ball.position.x + 50, ball.position.y + 50); +// Navigation[5] = CPoint(ball.position.x + 50, ball.position.y); +// Navigation[6] = CPoint(ball.position.x + 50, ball.position.y - 50); +// Navigation[7] = CPoint(ball.position.x, ball.position.y + 50); +// Navigation[8] = CPoint(ball.position.x - 50, ball.position.y + 50); +// Navigation[9] = CPoint(ball.position.x + 80, ball.position.y); +// Navigation[10] = CPoint(ball.position.x + 80, ball.position.y + 50); +// //// Navigate(ball.position); +// //// 机器人在球右下 +// // if (robot->position.y <= ball.position.y && robot->position.x >= ball.position.x) { +// // Direction(which, ball.position); +// // // Velocity(which, 127, 127); +// // } +// //// 机器人在球右上 +// // else if (robot->position.y > ball.position.y && robot->position.x > ball.position.x) { +// // Direction(which, CPoint(ball.position.x + 10, ball.position.y)); +// // // Velocity(which, vL, vR); +// // } +// //// 机器人在球左上 +// // else if (robot->position.y < ball.position.y && robot->position.x < ball.position.x) { +// // // Position(which, CPoint(ball.)); +// // } +// //// 机器人在球左下 +// // else { +// // Direction(which, CPoint(ball.position.x - 20, ball.position.y)); +// // } +// } +// // 对方中场 +// else if (ball.position.y >= 217 && ball.position.y < 607) { +// if (home1.position.x > ball.position.x) { +// if (home1.position.y < ball.position.y) { +// Navigation[1] = ball.position; +// } +// else { +// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 10); +// } +// } +// else { +// if (home1.position.y < ball.position.y) { +// Navigation[1] = CPoint(ball.position.x, ball.position.y - 10); +// } +// else { +// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 10); +// } +// } +// if (home2.position.x > ball.position.x) { +// if (home2.position.y < ball.position.y) { +// Navigation[2] = ball.position; +// } +// else { +// Navigation[2] = CPoint(ball.position.x + 20, ball.position.y + 10); +// } +// } +// else { +// if (home2.position.y < ball.position.y) { +// Navigation[1] = CPoint(ball.position.x, ball.position.y - 15); +// } +// else { +// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 15); +// } +// } +// if (home3.position.x > ball.position.x) { +// if (home3.position.y < ball.position.y) { +// Navigation[3] = ball.position; +// } +// else { +// Navigation[3] = CPoint(ball.position.x + 10, ball.position.y + 20); +// } +// } +// else { +// if (home3.position.y < ball.position.y) { +// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 15); +// } +// else { +// Navigation[1] = CPoint(ball.position.x - 15, ball.position.y - 10); +// } +// } +// Navigation[4] = CPoint(ball.position.x, ball.position.y - 60); +// Navigation[5] = CPoint(ball.position.x + 50, ball.position.y - 60); +// Navigation[6] = CPoint(ball.position.x + 60, ball.position.y - 50); +// Navigation[7] = CPoint(ball.position.x + 60, ball.position.y + 50); +// Navigation[8] = CPoint(ball.position.x + 60, ball.position.y + 70); +// Navigation[9] = CPoint(ball.position.x + 70, ball.position.y - 60); +// Navigation[10] = CPoint(ball.position.x + 70, ball.position.y - 60); +// //// 机器人在球的右下 +// // if (robot->position.x >= ball.position.x && robot->position.y <= ball.position.y) { +// // Direction(which, ball.position); +// // } +// //// 机器人在球右上 +// // else if (robot->position.x > ball.position.x && robot->position.y > ball.position.y) { +// // // 右上且距离较远 +// // if (robot->position.y >= ball.position.y + 100) { +// // Direction(which, CPoint(ball.position.x + 20, ball.position.y + 20)); +// // } +// // // 距离较近 +// // else { +// // Direction(which, CPoint(ball.position.x + 10, ball.position.y)); +// // } +// // } +// //// 机器人在球左下 +// // else if (robot->position.x <= ball.position.x && robot->position.y >= ball.position.y) { +// // Direction(which, CPoint(ball.position.x - 20, ball.position.y + 20)); +// // } +// //// 机器人在球左上 +// // else { +// // Direction(which, CPoint(ball.position.x - 20, ball.position.y - 20)); +// // } +// } +// // 上场 +// else { +// if (home1.position.x > ball.position.x) { +// if (home1.position.y < ball.position.y) { +// Navigation[1] = ball.position; +// } +// else { +// Navigation[1] = CPoint(ball.position.x + 10, ball.position.y - 10); +// } +// } +// else { +// if (home1.position.y < ball.position.y) { +// Navigation[1] = CPoint(ball.position.x, ball.position.y - 10); +// } +// else { +// Navigation[1] = CPoint(ball.position.x - 10, ball.position.y - 10); +// } +// } +// if (home2.position.x > ball.position.x) { +// if (home2.position.y < ball.position.y) { +// Navigation[2] = ball.position; +// } +// else { +// Navigation[2] = CPoint(ball.position.x + 10, ball.position.y); +// } +// } +// else { +// if (home2.position.y < ball.position.y) { +// Navigation[2] = CPoint(ball.position.x - 5, ball.position.y - 10); +// } +// else { +// Navigation[2] = CPoint(ball.position.x - 10, ball.position.y - 10); +// } +// } +// if (home3.position.x > ball.position.x) { +// if (home3.position.y < ball.position.y) { +// Navigation[3] = ball.position; +// } +// else { +// Navigation[3] = CPoint(ball.position.x + 10, ball.position.y - 15); +// } +// } +// else { +// if (home2.position.y < ball.position.y) { +// Navigation[3] = CPoint(ball.position.x - 5, ball.position.y - 10); +// } +// else { +// Navigation[3] = CPoint(ball.position.x - 10, ball.position.y - 10); +// } +// } +// Navigation[4] = CPoint(ball.position.x - 50, ball.position.y - 50); +// Navigation[5] = CPoint(ball.position.x, ball.position.y - 50); +// Navigation[6] = CPoint(ball.position.x + 50, ball.position.y - 50); +// Navigation[7] = CPoint(ball.position.x + 50, ball.position.y); +// Navigation[8] = CPoint(ball.position.x + 60, ball.position.y + 50); +// Navigation[9] = CPoint(ball.position.x + 70, ball.position.y + 60); +// Navigation[10] = CPoint(ball.position.x + 70, ball.position.y + 70); +// // 机器人在球右上 +// // if (robot->position.x >= ball.position.x && robot->position.y <= ball.position.y) { +// // Direction(which, ball.position); +// //} +// //// 机器人在球右下 +// // else if (robot->position.x >= ball.position.x && robot->position.y > ball.position.y) { +// // Direction(which, CPoint(ball.position.x + 20, ball.position.y)); +// // } +// //// 机器人在球左上 +// // else if (robot->position.x < ball.position.x && robot->position.y >= ball.position.y) { +// // Direction(which, CPoint(ball.position.x - 20, ball.position.y)); +// // } +// //// 机器人在左下 +// // else { +// // } +// } +// } +// // 防守区域(在己方罚球区外) +// else if (ball.position.x > 515 && ball.position.x < 965) { +// CPoint goal; +// double l; + +// // 己方上半场 +// goal.x = ball.position.x; +// goal.y = 95; +// l = Distance(ball.position, goal); +// if (ball.position.y < 217 && ball.position.y >= 95) { +// Navigation[1].x = ball.position.x; +// Navigation[1].y = 95 + (int)l + 5; +// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[2].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[4].x = ball.position.x; +// Navigation[4].y = 95 + (int)l + 15; +// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[5].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[9].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// } +// // 己方中场 +// else if (ball.position.y > 217 && ball.position.y <= 607) { +// // 球在中场上侧,要把球往上压 +// if (ball.position.y < 409) { +// Navigation[1].x = ball.position.x; +// Navigation[1].y = 95 + (int)l + 5; +// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[2].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].y = 95 + (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[4].x = ball.position.x; +// Navigation[4].y = 95 + (int)l + 15; +// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[5].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].y = 95 + (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].y = 95 + (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[9].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].y = 95 + (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// } +// // 球在中场下侧,要把球往下压 + +// else { +// goal.x = ball.position.x; +// goal.y = 723; +// l = Distance(ball.position, goal); +// Navigation[1].x = ball.position.x; +// Navigation[1].y = 723 - (int)l - 5; +// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[2].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[4].x = ball.position.x; +// Navigation[4].y = 723 - (int)l - 15; +// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[5].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[9].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// } +// } +// // 己方下半场 + +// else if (ball.position.y > 607) { +// goal.x = ball.position.x; +// goal.y = 723; +// l = Distance(ball.position, goal); +// Navigation[1].x = ball.position.x; +// Navigation[1].y = 723 - (int)l - 5; +// Navigation[2].x = ball.position.x - (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[2].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].x = ball.position.x + (int)sin(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[3].y = 723 - (int)cos(15.0 * PI / 180.0) * ((int)l + 5); +// Navigation[4].x = ball.position.x; +// Navigation[4].y = 723 - (int)l - 15; +// Navigation[5].x = ball.position.x - (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[5].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].x = ball.position.x + (int)sin(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[6].y = 723 - (int)cos(25.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].x = ball.position.x - (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[7].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].x = ball.position.x + (int)sin(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[8].y = 723 - (int)cos(45.0 * PI / 180.0) * ((int)l + 15); +// Navigation[9].x = ball.position.x - (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[9].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].x = ball.position.x + (int)sin(30.0 * PI / 180.0) * ((int)l + 25); +// Navigation[10].y = 723 - (int)cos(30.0 * PI / 180.0) * ((int)l + 25); +// } +// } +// for (int i = 1; i < 11; i++) // 己方禁区处理 +// { +// int kx, ky, x1, x2; +// if (Navigation[i].x > 873 && Navigation[i].y < 607 && Navigation[i].y > 217) // 导航定位不进禁区 +// { +// if (ball.position.x > 873) { +// if (ball.position.y > 607) +// Navigation[i].y = 607; +// if (ball.position.y < 217) +// Navigation[i].y = 217; +// } +// else { +// Navigation[i].x = 873; +// } +// } +// else if (Navigation[i].x > 873 && Navigation[i].y > 607) // 行走路径不进禁区 +// { +// if (robot[i].x < 873 && robot[i].y < 607 && robot[i].y > 217) { +// ky = abs((Navigation[i].y - robot[i].y) / (Navigation[i].x - robot[i].x)); +// x1 = abs((873 - robot[i].x) * ky); +// x2 = abs(607 - robot[i].y); +// if (x2 > x1) { +// Navigation[i].y = robot[i].y + x1; +// Navigation[i].x = 873; +// } +// } +// } +// else if (Navigation[i].x > 873 && Navigation[i].y < 217) { +// if (robot[i].x < 873 && robot[i].y < 607 && robot[i].y > 217) { +// ky = abs((Navigation[i].y - robot[i].y) / (Navigation[i].x - robot[i].x)); +// x1 = abs((873 - robot[i].x) * ky); +// x2 = abs(217 - robot[i].y); +// if (x2 > x1) { +// Navigation[i].y = robot[i].y - x1; +// Navigation[i].x = 873; +// } +// } +// } +// else if (Navigation[i].x < 873 && Navigation[i].y > 217) { +// if (robot[i].x > 873 && robot[i].y < 217) { +// kx = abs((Navigation[i].x - robot[i].x) / (Navigation[i].y - robot[i].y)); +// x1 = abs((217 - robot[i].y) * kx); +// x2 = abs(873 - robot[i].x); +// if (x2 > x1) { +// Navigation[i].y = 217; +// Navigation[i].x = robot[i].x - x1; +// } +// } +// } +// else if (Navigation[i].x < 873 && Navigation[i].y < 607) { +// if (robot[i].x > 873 && robot[i].y > 607) { +// kx = abs((Navigation[i].x - robot[i].x) / (Navigation[i].y - robot[i].y)); +// x1 = abs((607 - robot[i].y) * kx); +// x2 = abs(873 - robot[i].x); +// if (x2 > x1) { +// Navigation[i].y = 607; +// Navigation[i].x = robot[i].x - x1; +// } +// } +// } +// } +// } + +// void CStrategySystem::control(int which) { +// Robot2 *robot; +// // switch (which) { +// // case HOME1: +// // robot = &home1; +// // break; +// // case HOME2: +// // robot = &home2; +// // break; +// // case HOME3: +// // robot = &home3; +// // break; +// // case HOME4: +// // robot = &home4; +// // break; +// // case HOME5: +// // robot = &home5; +// // break; +// // case HOME6: +// // robot = &home6; +// // break; +// // case HOME7: +// // robot = &home7; +// // break; +// // case HOME8: +// // robot = &home8; +// // break; +// // case HOME9: +// // robot = &home9; +// // break; +// // case HOME10: +// // robot = &home10; +// // break; +// // case HGOALIE: +// // robot = &hgoalie; +// // break; +// // } +// PositionSE(which, Navigation[which]); +// } + +// 查找在大区里的机器人 +int CStrategySystem::search1() { + int sum = 0; + if ((home1.position.x >= 105 && home1.position.x <= 157 && home1.position.y >= 247 && home1.position.y <= 577) || (home1.position.x >= 65 && home1.position.x <= 157 && home1.position.y >= 217 && home1.position.y <= 247) || (home1.position.x >= 65 && home1.position.x <= 157 && home1.position.y >= 577 && home1.position.y <= 607)) + sum++; + if ((home2.position.x >= 105 && home2.position.x <= 157 && home2.position.y >= 247 && home2.position.y <= 577) || (home2.position.x >= 65 && home2.position.x <= 157 && home2.position.y >= 217 && home2.position.y <= 247) || (home2.position.x >= 65 && home2.position.x <= 157 && home2.position.y >= 577 && home2.position.y <= 607)) + sum++; + if ((home3.position.x >= 105 && home3.position.x <= 157 && home3.position.y >= 247 && home3.position.y <= 577) || (home3.position.x >= 65 && home3.position.x <= 157 && home3.position.y >= 217 && home3.position.y <= 247) || (home3.position.x >= 65 && home3.position.x <= 157 && home3.position.y >= 577 && home3.position.y <= 607)) + sum++; + if ((home4.position.x >= 105 && home4.position.x <= 157 && home4.position.y >= 247 && home4.position.y <= 577) || (home4.position.x >= 65 && home4.position.x <= 157 && home4.position.y >= 217 && home4.position.y <= 247) || (home4.position.x >= 65 && home4.position.x <= 157 && home4.position.y >= 577 && home4.position.y <= 607)) + sum++; + if ((home5.position.x >= 105 && home5.position.x <= 157 && home5.position.y >= 247 && home5.position.y <= 577) || (home5.position.x >= 65 && home5.position.x <= 157 && home5.position.y >= 217 && home5.position.y <= 247) || (home5.position.x >= 65 && home5.position.x <= 157 && home5.position.y >= 577 && home5.position.y <= 607)) + sum++; + if ((home6.position.x >= 105 && home6.position.x <= 157 && home6.position.y >= 247 && home6.position.y <= 577) || (home6.position.x >= 65 && home6.position.x <= 157 && home6.position.y >= 217 && home6.position.y <= 247) || (home6.position.x >= 65 && home6.position.x <= 157 && home6.position.y >= 577 && home6.position.y <= 607)) + sum++; + if ((home7.position.x >= 105 && home7.position.x <= 157 && home7.position.y >= 247 && home7.position.y <= 577) || (home7.position.x >= 65 && home7.position.x <= 157 && home7.position.y >= 217 && home7.position.y <= 247) || (home7.position.x >= 65 && home7.position.x <= 157 && home7.position.y >= 577 && home7.position.y <= 607)) + sum++; + if ((home8.position.x >= 105 && home8.position.x <= 157 && home8.position.y >= 247 && home8.position.y <= 577) || (home8.position.x >= 65 && home8.position.x <= 157 && home8.position.y >= 217 && home8.position.y <= 247) || (home8.position.x >= 65 && home8.position.x <= 157 && home8.position.y >= 577 && home8.position.y <= 607)) + sum++; + if ((home9.position.x >= 105 && home9.position.x <= 157 && home9.position.y >= 247 && home9.position.y <= 577) || (home9.position.x >= 65 && home9.position.x <= 157 && home9.position.y >= 217 && home9.position.y <= 247) || (home9.position.x >= 65 && home9.position.x <= 157 && home9.position.y >= 577 && home9.position.y <= 607)) + sum++; + if ((home10.position.x >= 105 && home10.position.x <= 157 && home10.position.y >= 247 && home10.position.y <= 577) || (home10.position.x >= 65 && home10.position.x <= 157 && home10.position.y >= 217 && home10.position.y <= 247) || (home10.position.x >= 65 && home10.position.x <= 157 && home10.position.y >= 577 && home10.position.y <= 607)) + sum++; + return sum; +} + +// 查找在小区里的机器人 +int CStrategySystem::search2() { + int sum = 0; + if (home1.position.x >= 65 && home1.position.x < 105 && home1.position.y >= 247 && home1.position.y <= 577) + sum++; + if (home2.position.x >= 65 && home2.position.x < 105 && home2.position.y >= 247 && home2.position.y <= 577) + sum++; + if (home3.position.x >= 65 && home3.position.x < 105 && home3.position.y >= 247 && home3.position.y <= 577) + sum++; + if (home4.position.x >= 65 && home4.position.x < 105 && home4.position.y >= 247 && home4.position.y <= 577) + sum++; + if (home5.position.x >= 65 && home5.position.x < 105 && home5.position.y >= 247 && home5.position.y <= 577) + sum++; + if (home6.position.x >= 65 && home6.position.x < 105 && home6.position.y >= 247 && home6.position.y <= 577) + sum++; + if (home7.position.x >= 65 && home7.position.x < 105 && home7.position.y >= 247 && home7.position.y <= 577) + sum++; + if (home8.position.x >= 65 && home8.position.x < 105 && home8.position.y >= 247 && home8.position.y <= 577) + sum++; + if (home9.position.x >= 65 && home9.position.x < 105 && home9.position.y >= 247 && home9.position.y <= 577) + sum++; + if (home10.position.x >= 65 && home10.position.x < 105 && home10.position.y >= 247 && home10.position.y <= 577) + sum++; + return sum; +} + +// 守门 +void CStrategySystem::Goalie() { // TODO 两侧卡顿 + if (start) + ball.oldPosition = ball.position; + // static int xit; + // if (ball.position != ball.oldPosition) + // xit = 0; + // else + // xit++; + if (ball.position.x <= hgoalie.position.x) { + int xix = ball.position.x > 950 ? 965 : 950, xiy, xii = int((double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * 965 + (ball.oldPosition.y - (double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * ball.oldPosition.x) + 0.5), xid = 2; + if (Distance(ball.position, ball.oldPosition) < 1 || ball.position.x <= ball.oldPosition.x || xii < 313 || xii > 505) { + // if (ball.position.x >= 927 && ball.position.y >= 313 && ball.position.y <= 505) { + // xiy = ball.position.y; + // if (xiy < 343 || xiy > 475) + // xix = 965; + // } + // else { + xii = int((double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * 965 + (shooter_pos().y - (double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * shooter_pos().x) + 0.5); + if (xii < 313 || xii > 505) { + xiy = int((Distance(ball.position, CPoint(863, 313)) * 192 / (Distance(ball.position, CPoint(863, 313)) + Distance(ball.position, CPoint(863, 505)))) + 313.5); + if (xiy < 343 || xiy > 475) + xix = 965; + } + else { + if (xii < 343 || xii > 475) + xix = 965; + xiy = int((double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * (xix - xid) + (shooter_pos().y - (double(ball.position.y - shooter_pos().y) / (ball.position.x - shooter_pos().x)) * shooter_pos().x) + 0.5); + } + if (ball.position.x <= 900 || ball.position.y < 313 || ball.position.y > 505) + if ((T / 4) % 2) + xiy += 30; + else + xiy -= 30; + // } + } + else { + if (xii < 343 || xii > 475) + xix = 965; + xiy = int((double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * (xix - xid) + (ball.oldPosition.y - (double(ball.position.y - ball.oldPosition.y) / (ball.position.x - ball.oldPosition.x)) * ball.oldPosition.x) + 0.5); + } + // if (ball.position.x >= 900 && ball.position.y >= 313 && ball.position.y <= 505 && xit >= 10) // TODO 旋球 + // if (shooter_pos().y > ball.position.y) + // Direction(HGOALIE, CPoint(ball.position.x + 1, ball.position.y + 1)); + // else + // Direction(HGOALIE, CPoint(ball.position.x + 1, ball.position.y - 1)); + // else + Direction(HGOALIE, CPoint(xix, xiy)); + } + else + Stop(HGOALIE); + ball.oldPosition = ball.position; +} + +// 对方射门者位置 +CPoint CStrategySystem::shooter_pos() { + CPoint cur_pos[11]{ opponent.position1, opponent.position2, opponent.position3, opponent.position4, opponent.position5, opponent.position6, opponent.position7, opponent.position8, opponent.position9, opponent.position10, opponent.position11 }; + for (int i = 0; i < 11; i++) { + if (cur_pos[i].x >= ball.position.x) + cur_pos[i] = CPoint(-965, -723); + } + int xii = 0; + double xid = Distance(cur_pos[0], ball.position); + for (int i = 1; i < 11; i++) { + if (Distance(cur_pos[i], ball.position) < xid) { + xid = Distance(cur_pos[i], ball.position); + xii = i; + } + } + return cur_pos[xii]; +} + +double CStrategySystem::Distance(CPoint point1, CPoint point2) { + return sqrt(1.0 * (point1.x - point2.x) * (point1.x - point2.x) + 1.0 * (point1.y - point2.y) * (point1.y - point2.y)); +} + +double CStrategySystem::Angle(CPoint point1, CPoint point2) { + return atan2(1.0 * (point1.y - point2.y), 1.0 * (point1.x - point2.x)); +} + +void CStrategySystem::Direction(int which, CPoint point) { + Robot2 *robot; + double distance_e; + int dx, dy, desired_angle, theta_e, vL, vR; + + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + + point.x = 2 * point.x - robot->position.x; + point.y = 2 * point.y - robot->position.y; + + point.x = point.x < boundRect.left ? boundRect.left : point.x; + point.x = point.x > boundRect.right ? boundRect.right : point.x; + point.y = point.y < boundRect.top ? boundRect.top : point.y; + point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; + + dx = point.x - robot->position.x; + dy = point.y - robot->position.y; + + distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); + + if (dx == 0 && dy == 0) + desired_angle = 90; + else + desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); + + theta_e = desired_angle - robot->angle; + + while (theta_e > 180) + theta_e -= 360; + while (theta_e < -180) + theta_e += 360; + + if (theta_e < -90) { + theta_e += 180; + distance_e = -distance_e; + } + else if (theta_e > 90) { + theta_e -= 180; + distance_e = -distance_e; + } + + vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); + vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); + + Velocity(which, vL, vR); +} + +void CStrategySystem::PositionSE(int which, CPoint point) { + Robot2 *robot; + double distance_e; + int dx, dy, desired_angle, theta_e, vL, vR; + + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + + if (point.x >= 873 && point.y >= 217 && point.y <= 607) + if (robot->position.x >= 873) { + if (robot->position.y <= 217) { + point.x = robot->position.x - (robot->position.x - point.x) * (217 - robot->position.y) / (point.y - robot->position.y); + point.y = 217; + } + else if (robot->position.y >= 607) { + point.x = robot->position.x - (robot->position.x - point.x) * (607 - robot->position.y) / (point.y - robot->position.y); + point.y = 607; + } + } + else { + point.x = 873; + point.y = robot->position.y - (robot->position.y - point.y) * (873 - robot->position.x) / (point.x - robot->position.x); + } + + point.x = point.x < boundRect.left ? boundRect.left : point.x; + point.x = point.x > boundRect.right ? boundRect.right : point.x; + point.y = point.y < boundRect.top ? boundRect.top : point.y; + point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; + + dx = point.x - robot->position.x; + dy = point.y - robot->position.y; + + distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); + + if (dx == 0 && dy == 0) + desired_angle = 90; + else + desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); + + theta_e = desired_angle - robot->angle; + + while (theta_e > 180) + theta_e -= 360; + while (theta_e < -180) + theta_e += 360; + + if (theta_e < -90) { + theta_e += 180; + distance_e = -distance_e; + } + else if (theta_e > 90) { + theta_e -= 180; + distance_e = -distance_e; + } + + vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); + vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); + + Velocity(which, vL, vR); +} + +void CStrategySystem::Rush(int which, CPoint point) { + Robot2 *robot; + double distance_e; + int dx, dy, desired_angle, theta_e, vL, vR; + + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + + CPoint p3; + + // 计算射线的斜率和截距 + double k = (double)(point.y - robot->position.y) / (point.x - robot->position.x); + double b = robot->position.y - k * robot->position.x; + // 判断射线的方向 + bool right = point.x > robot->position.x; // 是否向右 + bool up = point.y < robot->position.y; // 是否向上 + // 根据方向和斜率判断相交边 + if (right && up) { // 右上方 + if (k > 0) { // 斜率大于 0 + // 右边或上边 + if (k * boundRect.right + b < boundRect.top) { + // 右边 + p3.x = boundRect.right; + p3.y = k * boundRect.right + b; + } + else { + // 上边 + p3.x = (boundRect.top - b) / k; + p3.y = boundRect.top; + } + } + else { // 斜率小于等于 0 + // 上边或右边 + if ((boundRect.top - b) / k > boundRect.right) { + // 上边 + p3.x = (boundRect.top - b) / k; + p3.y = boundRect.top; + } + else { + // 右边 + p3.x = boundRect.right; + p3.y = k * boundRect.right + b; + } + } + } + else if (right && !up) { // 右下方 + if (k > 0) { // 斜率大于 0 + // 下边或右边 + if ((boundRect.bottom - b) / k < boundRect.right) { + // 下边 + p3.x = (boundRect.bottom - b) / k; + p3.y = boundRect.bottom; + } + else { + // 右边 + p3.x = boundRect.right; + p3.y = k * boundRect.right + b; + } + } + else { // 斜率小于等于 0 + // 右边或下边 + if (k * boundRect.right + b > boundRect.bottom) { + // 右边 + p3.x = boundRect.right; + p3.y = k * boundRect.right + b; + } + else { + // 下边 + p3.x = (boundRect.bottom - b) / k; + p3.y = boundRect.bottom; + } + } + } + else if (!right && up) { // 左上方 + if (k > 0) { // 斜率大于 0 + // 上边或左边 + if ((boundRect.top - b) / k < boundRect.left) { + // 上边 + p3.x = (boundRect.top - b) / k; + p3.y = boundRect.top; + } + else { + // 左边 + p3.x = boundRect.left; + p3.y = k * boundRect.left + b; + } + } + else { // 斜率小于等于 0 + // 左边或上边 + if (k * boundRect.left + b < boundRect.top) { + // 左边 + p3.x = boundRect.left; + p3.y = k * boundRect.left + b; + } + else { + // 上边 + p3.x = (boundRect.top - b) / k; + p3.y = boundRect.top; + } + } + } + else { // 左下方 + if (k > 0) { // 斜率大于 0 + // 左边或下边 + if (k * boundRect.left + b > boundRect.bottom) { + // 左边 + p3.x = boundRect.left; + p3.y = k * boundRect.left + b; + } + else { + // 下边 + p3.x = (boundRect.bottom - b) / k; + p3.y = boundRect.bottom; + } + } + else { // 斜率小于等于 0 + // 下边或左边 + if ((boundRect.bottom - b) / k > boundRect.left) { + // 下边 + p3.x = (boundRect.bottom - b) / k; + p3.y = boundRect.bottom; + } + else { + // 左边 + p3.x = boundRect.left; + p3.y = k * boundRect.left + b; + } + } + } + + point = p3; + + point.x = point.x < boundRect.left ? boundRect.left : point.x; + point.x = point.x > boundRect.right ? boundRect.right : point.x; + point.y = point.y < boundRect.top ? boundRect.top : point.y; + point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; + + dx = point.x - robot->position.x; + dy = point.y - robot->position.y; + + distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); + + if (dx == 0 && dy == 0) + desired_angle = 90; + else + desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); + + theta_e = desired_angle - robot->angle; + + while (theta_e > 180) + theta_e -= 360; + while (theta_e < -180) + theta_e += 360; + + if (theta_e < -90) { + theta_e += 180; + distance_e = -distance_e; + } + else if (theta_e > 90) { + theta_e -= 180; + distance_e = -distance_e; + } + + vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); + vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); + + Velocity(which, vL, vR); +} + +// 判断状态,1 为罚球,0 为正常, 其他为争球 +int CStrategySystem::Status() { + if (ball.position.x <= 309 && ball.position.x >= 279) { + if (ball.position.y >= 394 && ball.position.y <= 424) + return 1; // 罚球 + if (ball.position.y <= 193 && ball.position.y >= 173) + return 2; // 左上争球点 + if (ball.position.y <= 648 && ball.position.y >= 628) + return 3; // 左下争球点 + } + if (ball.position.x <= 753 && ball.position.x >= 733) { + if (ball.position.y <= 193 && ball.position.y >= 173) + return 4; // 右上争球点 + if (ball.position.y <= 648 && ball.position.y >= 628) + return 5; // 右下争球点 + } + return 0; +} + +void CStrategySystem::Action() { + T++; + Goalie(); + switch (Status()) { + case 1: + flag = true; + Penalty(); + break; + // case 2: + // case 3: + // case 4: + // case 5: + // Freeball(); + // break; + default: + flag = true; + Possession(); + break; + } + if (start) + start = false; +} + +void CStrategySystem::Angle(int which, int desired_angle) { + Robot2 *robot; + int theta_e, vL, vR; + + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + + theta_e = desired_angle - robot->angle; + while (theta_e > 180) + theta_e -= 360; + while (theta_e < -180) + theta_e += 360; + if (theta_e < -90) + theta_e += 180; + else if (theta_e > 90) + theta_e -= 180; + vL = (int)(60.0 / 90.0 * theta_e); + vR = (int)(-60.0 / 90.0 * theta_e); + Velocity(which, vL, vR); +} + +void CStrategySystem::Velocity(int which, int vL, int vR) { + if (vL < -127) + vL = -127; + if (vL > 127) + vL = 127; + + if (vR < -127) + vR = -127; + if (vR > 127) + vR = 127; + + switch (which) { + case HOME1: + command[2] = vL; + command[3] = vR; + command[4] = C_GO; + break; + case HOME2: + command[5] = vL; + command[6] = vR; + command[7] = C_GO; + break; + case HOME3: + command[8] = vL; + command[9] = vR; + command[10] = C_GO; + break; + case HOME4: + command[11] = vL; + command[12] = vR; + command[13] = C_GO; + break; + case HOME5: + command[14] = vL; + command[15] = vR; + command[16] = C_GO; + break; + case HOME6: + command[17] = vL; + command[18] = vR; + command[19] = C_GO; + break; + case HOME7: + command[20] = vL; + command[21] = vR; + command[22] = C_GO; + break; + case HOME8: + command[23] = vL; + command[24] = vR; + command[25] = C_GO; + break; + case HOME9: + command[26] = vL; + command[27] = vR; + command[28] = C_GO; + break; + case HOME10: + command[29] = vL; + command[30] = vR; + command[31] = C_GO; + break; + case HGOALIE: + command[32] = vL; + command[33] = vR; + command[34] = C_GO; + break; + } +} + +void CStrategySystem::Position(int which, CPoint point) { + Robot2 *robot; + double distance_e; + int dx, dy, desired_angle, theta_e, vL, vR; + + switch (which) { + case HOME1: + robot = &home1; + break; + case HOME2: + robot = &home2; + break; + case HOME3: + robot = &home3; + break; + case HOME4: + robot = &home4; + break; + case HOME5: + robot = &home5; + break; + case HOME6: + robot = &home6; + break; + case HOME7: + robot = &home7; + break; + case HOME8: + robot = &home8; + break; + case HOME9: + robot = &home9; + break; + case HOME10: + robot = &home10; + break; + case HGOALIE: + robot = &hgoalie; + break; + } + + point.x = point.x < boundRect.left ? boundRect.left : point.x; + point.x = point.x > boundRect.right ? boundRect.right : point.x; + point.y = point.y < boundRect.top ? boundRect.top : point.y; + point.y = point.y > boundRect.bottom ? boundRect.bottom : point.y; + + dx = point.x - robot->position.x; + dy = point.y - robot->position.y; + + distance_e = sqrt(1.0 * dx * dx + 1.0 * dy * dy); + + if (dx == 0 && dy == 0) + desired_angle = 90; + else + desired_angle = (int)(180.0 / M_PI * atan2((double)(dy), (double)(dx))); + + theta_e = desired_angle - robot->angle; + + while (theta_e > 180) + theta_e -= 360; + while (theta_e < -180) + theta_e += 360; + + if (theta_e < -90) { + theta_e += 180; + distance_e = -distance_e; + } + else if (theta_e > 90) { + theta_e -= 180; + distance_e = -distance_e; + } + + vL = (int)(5. * (100.0 / 1000.0 * distance_e + 40.0 / 90.0 * theta_e)); + vR = (int)(5. * (100.0 / 1000.0 * distance_e - 40.0 / 90.0 * theta_e)); + + Velocity(which, vL, vR); +} + +void CStrategySystem::Stop(int which) { + int vL, vR; + vL = vR = 0; + Velocity(which, vL, vR); +} + +void CStrategySystem::ReceiveData(Robot1 bal, Robot2 ho1, Robot2 ho2, Robot2 ho3, Robot2 ho4, + Robot2 ho5, Robot2 ho6, Robot2 ho7, Robot2 ho8, Robot2 ho9, + Robot2 ho10, Robot2 hgo, Robot3 opp) { + if (m_nGameArea == GAME_RIGHT) { + ball.position = bal.position; + ball.angle = bal.angle; + + home1.position = ho1.position; + home1.angle = ho1.angle; + + home2.position = ho2.position; + home2.angle = ho2.angle; + + home3.position = ho3.position; + home3.angle = ho3.angle; + + home4.position = ho4.position; + home4.angle = ho4.angle; + + home5.position = ho5.position; + home5.angle = ho5.angle; + + home6.position = ho6.position; + home6.angle = ho6.angle; + + home7.position = ho7.position; + home7.angle = ho7.angle; + + home8.position = ho8.position; + home8.angle = ho8.angle; + + home9.position = ho9.position; + home9.angle = ho9.angle; + + home10.position = ho10.position; + home10.angle = ho10.angle; + + hgoalie.position = hgo.position; + hgoalie.angle = hgo.angle; + + opponent.position1 = opp.position1; + opponent.position2 = opp.position2; + opponent.position3 = opp.position3; + opponent.position4 = opp.position4; + opponent.position5 = opp.position5; + opponent.position6 = opp.position6; + opponent.position7 = opp.position7; + opponent.position8 = opp.position8; + opponent.position9 = opp.position9; + opponent.position10 = opp.position10; + opponent.position11 = opp.position11; + } + else { + ball.position.x = 1030 - bal.position.x; + ball.position.y = 818 - bal.position.y; + if (ball.angle > 0) + ball.angle = bal.angle - 180; + else + ball.angle = 180 + bal.angle; + + home1.position.x = 1030 - ho1.position.x; + home1.position.y = 818 - ho1.position.y; + if (home1.angle > 0) + home1.angle = ho1.angle - 180; + else + home1.angle = 180 + ho1.angle; + home2.position.x = 1030 - ho2.position.x; + home2.position.y = 818 - ho2.position.y; + if (home2.angle > 0) + home2.angle = ho2.angle - 180; + else + home2.angle = 180 + ho2.angle; + home3.position.x = 1030 - ho3.position.x; + home3.position.y = 818 - ho3.position.y; + if (home3.angle > 0) + home3.angle = ho3.angle - 180; + else + home3.angle = 180 + ho3.angle; + home4.position.x = 1030 - ho4.position.x; + home4.position.y = 818 - ho4.position.y; + if (home4.angle > 0) + home4.angle = ho4.angle - 180; + else + home4.angle = 180 + ho4.angle; + home5.position.x = 1030 - ho5.position.x; + home5.position.y = 818 - ho5.position.y; + if (home5.angle > 0) + home5.angle = ho5.angle - 180; + else + home5.angle = 180 + ho5.angle; + //*/ + home6.position.x = 1030 - ho6.position.x; + home6.position.y = 818 - ho6.position.y; + ///* + if (home6.angle > 0) + home6.angle = ho6.angle - 180; + else + home6.angle = 180 + ho6.angle; + //*/ + home7.position.x = 1030 - ho7.position.x; + home7.position.y = 818 - ho7.position.y; + ///* + if (home7.angle > 0) + home7.angle = ho7.angle - 180; + else + home7.angle = 180 + ho7.angle; + //*/ + home8.position.x = 1030 - ho8.position.x; + home8.position.y = 818 - ho8.position.y; + ///* + if (home8.angle > 0) + home8.angle = ho8.angle - 180; + else + home8.angle = 180 + ho8.angle; + //*/ + home9.position.x = 1030 - ho9.position.x; + home9.position.y = 818 - ho9.position.y; + ///* + if (home9.angle > 0) + home9.angle = ho9.angle - 180; + else + home9.angle = 180 + ho9.angle; + //*/ + home10.position.x = 1030 - ho10.position.x; + home10.position.y = 818 - ho10.position.y; + ///* + if (home10.angle > 0) + home10.angle = ho10.angle - 180; + else + home10.angle = 180 + ho10.angle; + //*/ + hgoalie.position.x = 1030 - hgo.position.x; + hgoalie.position.y = 818 - hgo.position.y; + ///* + if (hgoalie.angle > 0) + hgoalie.angle = hgo.angle - 180; + else + hgoalie.angle = 180 + hgo.angle; + //*/ + opponent.position1.x = 1030 - opp.position1.x; + opponent.position2.x = 1030 - opp.position2.x; + opponent.position3.x = 1030 - opp.position3.x; + opponent.position4.x = 1030 - opp.position4.x; + opponent.position5.x = 1030 - opp.position5.x; + opponent.position6.x = 1030 - opp.position6.x; + opponent.position7.x = 1030 - opp.position7.x; + opponent.position8.x = 1030 - opp.position8.x; + opponent.position9.x = 1030 - opp.position9.x; + opponent.position10.x = 1030 - opp.position10.x; + opponent.position11.x = 1030 - opp.position11.x; + + opponent.position1.y = 818 - opp.position1.y; + opponent.position2.y = 818 - opp.position2.y; + opponent.position3.y = 818 - opp.position3.y; + opponent.position4.y = 818 - opp.position4.y; + opponent.position5.y = 818 - opp.position5.y; + opponent.position6.y = 818 - opp.position6.y; + opponent.position7.y = 818 - opp.position7.y; + opponent.position8.y = 818 - opp.position8.y; + opponent.position9.y = 818 - opp.position9.y; + opponent.position10.y = 818 - opp.position10.y; + opponent.position11.y = 818 - opp.position11.y; + } +} + +CStrategySystem::CStrategySystem(int id) { + T = 0; + + start = true; + + pos = new CPoint[10]; + rp = new RelPos[10]; + + for (int i = 0; i < 10; i++) { + rp[i].ang = 0; + rp[i].dis = 0; + rp[i].id = i + 1; + } + + flag = true; + + m_OurTeam = id; + boundRect.SetRect(65, 95, 965, 723); + if (id) + m_nGameArea = GAME_LEFT; + else + m_nGameArea = GAME_RIGHT; + for (int i = 0; i < 35; i++) + command[i] = 0; + C_Home1.Data.Lv = 0; + C_Home1.Data.Rv = 0; + C_Home1.Data.Command = C_STOP; + C_Home2.Data.Lv = 0; + C_Home2.Data.Rv = 0; + C_Home2.Data.Command = C_STOP; + C_Home3.Data.Lv = 0; + C_Home3.Data.Rv = 0; + C_Home3.Data.Command = C_STOP; + C_Home4.Data.Lv = 0; + C_Home4.Data.Rv = 0; + C_Home4.Data.Command = C_STOP; + C_Home5.Data.Lv = 0; + C_Home5.Data.Rv = 0; + C_Home5.Data.Command = C_STOP; + C_Home6.Data.Lv = 0; + C_Home6.Data.Rv = 0; + C_Home6.Data.Command = C_STOP; + C_Home7.Data.Lv = 0; + C_Home7.Data.Rv = 0; + C_Home7.Data.Command = C_STOP; + C_Home8.Data.Lv = 0; + C_Home8.Data.Rv = 0; + C_Home8.Data.Command = C_STOP; + C_Home9.Data.Lv = 0; + C_Home9.Data.Rv = 0; + C_Home9.Data.Command = C_STOP; + C_Home10.Data.Lv = 0; + C_Home10.Data.Rv = 0; + C_Home10.Data.Command = C_STOP; + C_Home11.Data.Lv = 0; + C_Home11.Data.Rv = 0; + C_Home11.Data.Command = C_STOP; + + m_nStrategy = id; // left = 0, right = 1 + nKick = 0; + nKick2 = 0; + nShoot = 0; + nSweep = 0; +} + +// CStrategySystem::~CStrategySystem() { +// } diff --git a/TParseString.cpp b/src/TParseString.cpp similarity index 94% rename from TParseString.cpp rename to src/TParseString.cpp index 648cd0c..d69af2c 100644 --- a/TParseString.cpp +++ b/src/TParseString.cpp @@ -1,242 +1,242 @@ -// TParseString.cpp: implementation of the TParseString class. -// -////////////////////////////////////////////////////////////////////// - -#include // MFC core and standard components -#include // MFC extensions -#include "stdafx.h" -#include "TParseString.h" - -#ifdef _DEBUG -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#define new DEBUG_NEW -#endif - -BOOL TParseString::ParseBracket(TParseString &retString) { - int iNoOfOpenBrackets = 1; - int iRightPosition = m_iPosition + 1; - int iLen = GetLength(); - m_bErrorOccured = FALSE; - // iposition must index an opening bracket - if ((m_iPosition >= iLen) || GetAt(m_iPosition) != '(') - return FALSE; - - while (iNoOfOpenBrackets > 0) { - // reached the end of the string ? error - if (iRightPosition >= iLen) - return FALSE; - - // look at the next character - switch (GetAt(iRightPosition)) { - case '(': - iNoOfOpenBrackets++; - break; - - case ')': - iNoOfOpenBrackets--; - break; - } - iRightPosition++; - } - retString.CString::operator=(Mid(m_iPosition + 1, iRightPosition - m_iPosition - 2)); - m_iPosition = iRightPosition + 1; - return TRUE; -} - -BOOL TParseString::ParseString(CString &str) { - int iRightPos; - BOOL bReady = FALSE; - int len = GetLength(); - char tmp; - - m_bErrorOccured = FALSE; - OverreadLeadingSpaces(); - iRightPos = m_iPosition + 1; - - // check, if there is a string - if (m_iPosition - 1 >= len) { - // the expected string is not there - m_iPosition++; - return FALSE; - } - - // search for a ' ' or ')' - bReady = FALSE; - while (!bReady && (iRightPos < len)) { - tmp = GetAt(iRightPos); - switch (tmp) { - case ' ': - case ')': - case '\r': - case '\n': - bReady = TRUE; - break; - - default: - iRightPos++; - } - } - - // get the string - str = Mid(m_iPosition, iRightPos - m_iPosition); - m_iPosition = iRightPos + 1; - - return TRUE; -} - -int TParseString::ParseInteger() { - int iValue = 0; - BOOL bSign = FALSE; - BOOL bReady = FALSE; - char cChar; - int len = GetLength(); - - m_bErrorOccured = TRUE; - OverreadLeadingSpaces(); - // read in the number - while (!bReady && (m_iPosition < len)) { - cChar = GetAt(m_iPosition); - switch (cChar) { - case '-': - // only one - sign expected - bSign = TRUE; - m_iPosition++; - break; - - case '+': - m_iPosition++; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - iValue = 10 * iValue + cChar - '0'; - m_bErrorOccured = FALSE; - m_iPosition++; - break; - - case ')': - case ' ': - m_iPosition++; - // no break here - - default: - bReady = TRUE; - } - } - - // convert the number if neccessary - if (bSign) - iValue = -iValue; - - return iValue; -} - -double TParseString::ParseDouble() { - double dValue = 0.0; - double dNumber; - BOOL bSign = FALSE; - BOOL bReady = FALSE; - BOOL bDot = FALSE; - double dDivisor = 1.0; - char cChar; - int len = GetLength(); - - m_bErrorOccured = TRUE; - // read in the number - while (!bReady && (m_iPosition < len)) { - cChar = GetAt(m_iPosition); - switch (cChar) { - case '-': - // only one - sign expected - bSign = TRUE; - m_iPosition++; - break; - - case '+': - m_iPosition++; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - dValue = 10.0 * dValue + (double)(cChar - '0'); - dDivisor *= 10.0; - m_bErrorOccured = FALSE; - m_iPosition++; - break; - - case '.': - case ',': - dDivisor = 1.0; - bDot = TRUE; - m_iPosition++; - break; - - case ')': - case ' ': - m_iPosition++; - // no break here - - default: - bReady = TRUE; - } - } - - // convert the number if neccessary - if (bDot) - dNumber = dValue / dDivisor; - else - dNumber = dValue; - - if (bSign) - dNumber = -dNumber; - - return dNumber; -} - -void TParseString::OverreadLeadingSpaces() { - char tmp; - - // overread inital spaces, returns and new lines - while (m_iPosition < GetLength()) { - tmp = GetAt(m_iPosition); - switch (tmp) { - case ' ': - case '\r': - case '\n': - m_iPosition++; - break; - - default: - return; - } - } -} - -void TParseString::SetPosition(int pos) { - if (pos >= GetLength()) { - m_iPosition = GetLength() - 1; - if (m_iPosition < 0) - m_iPosition = 0; - } - else if (pos < 0) - m_iPosition = 0; - else - m_iPosition = pos; -} +// TParseString.cpp: implementation of the TParseString class. +// +////////////////////////////////////////////////////////////////////// + +#include // MFC core and standard components +#include // MFC extensions +#include "stdafx.h" +#include "TParseString.h" + +#ifdef _DEBUG +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#define new DEBUG_NEW +#endif + +BOOL TParseString::ParseBracket(TParseString &retString) { + int iNoOfOpenBrackets = 1; + int iRightPosition = m_iPosition + 1; + int iLen = GetLength(); + m_bErrorOccured = FALSE; + // iposition must index an opening bracket + if ((m_iPosition >= iLen) || GetAt(m_iPosition) != '(') + return FALSE; + + while (iNoOfOpenBrackets > 0) { + // reached the end of the string ? error + if (iRightPosition >= iLen) + return FALSE; + + // look at the next character + switch (GetAt(iRightPosition)) { + case '(': + iNoOfOpenBrackets++; + break; + + case ')': + iNoOfOpenBrackets--; + break; + } + iRightPosition++; + } + retString.CString::operator=(Mid(m_iPosition + 1, iRightPosition - m_iPosition - 2)); + m_iPosition = iRightPosition + 1; + return TRUE; +} + +BOOL TParseString::ParseString(CString &str) { + int iRightPos; + BOOL bReady = FALSE; + int len = GetLength(); + char tmp; + + m_bErrorOccured = FALSE; + OverreadLeadingSpaces(); + iRightPos = m_iPosition + 1; + + // check, if there is a string + if (m_iPosition - 1 >= len) { + // the expected string is not there + m_iPosition++; + return FALSE; + } + + // search for a ' ' or ')' + bReady = FALSE; + while (!bReady && (iRightPos < len)) { + tmp = GetAt(iRightPos); + switch (tmp) { + case ' ': + case ')': + case '\r': + case '\n': + bReady = TRUE; + break; + + default: + iRightPos++; + } + } + + // get the string + str = Mid(m_iPosition, iRightPos - m_iPosition); + m_iPosition = iRightPos + 1; + + return TRUE; +} + +int TParseString::ParseInteger() { + int iValue = 0; + BOOL bSign = FALSE; + BOOL bReady = FALSE; + char cChar; + int len = GetLength(); + + m_bErrorOccured = TRUE; + OverreadLeadingSpaces(); + // read in the number + while (!bReady && (m_iPosition < len)) { + cChar = GetAt(m_iPosition); + switch (cChar) { + case '-': + // only one - sign expected + bSign = TRUE; + m_iPosition++; + break; + + case '+': + m_iPosition++; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + iValue = 10 * iValue + cChar - '0'; + m_bErrorOccured = FALSE; + m_iPosition++; + break; + + case ')': + case ' ': + m_iPosition++; + // no break here + + default: + bReady = TRUE; + } + } + + // convert the number if neccessary + if (bSign) + iValue = -iValue; + + return iValue; +} + +double TParseString::ParseDouble() { + double dValue = 0.0; + double dNumber; + BOOL bSign = FALSE; + BOOL bReady = FALSE; + BOOL bDot = FALSE; + double dDivisor = 1.0; + char cChar; + int len = GetLength(); + + m_bErrorOccured = TRUE; + // read in the number + while (!bReady && (m_iPosition < len)) { + cChar = GetAt(m_iPosition); + switch (cChar) { + case '-': + // only one - sign expected + bSign = TRUE; + m_iPosition++; + break; + + case '+': + m_iPosition++; + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + dValue = 10.0 * dValue + (double)(cChar - '0'); + dDivisor *= 10.0; + m_bErrorOccured = FALSE; + m_iPosition++; + break; + + case '.': + case ',': + dDivisor = 1.0; + bDot = TRUE; + m_iPosition++; + break; + + case ')': + case ' ': + m_iPosition++; + // no break here + + default: + bReady = TRUE; + } + } + + // convert the number if neccessary + if (bDot) + dNumber = dValue / dDivisor; + else + dNumber = dValue; + + if (bSign) + dNumber = -dNumber; + + return dNumber; +} + +void TParseString::OverreadLeadingSpaces() { + char tmp; + + // overread inital spaces, returns and new lines + while (m_iPosition < GetLength()) { + tmp = GetAt(m_iPosition); + switch (tmp) { + case ' ': + case '\r': + case '\n': + m_iPosition++; + break; + + default: + return; + } + } +} + +void TParseString::SetPosition(int pos) { + if (pos >= GetLength()) { + m_iPosition = GetLength() - 1; + if (m_iPosition < 0) + m_iPosition = 0; + } + else if (pos < 0) + m_iPosition = 0; + else + m_iPosition = pos; +}