⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplestrange.cpp

📁 一个简单的基础机器人足球程序
💻 CPP
字号:
// SimpleStrange.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "function.h"
#include "action.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}


extern "C" SIMPLESTRANGE_API void Create ( Environment *env )
{
	//初始化数据工作
	env->userData=(void* ) new MyEnv;
	MyEnv *g;	
	g=(MyEnv*)env->userData;

	//初始坐标
	g->robot[0].pos=Vector3D(10.6663,42.3077,90);
	g->robot[1].pos=Vector3D(19.9199,60.3647,0);
	g->robot[2].pos=Vector3D(19.7433,22.9943,0);
	g->robot[3].pos=Vector3D(39.4618,60.3031,0);
	g->robot[4].pos=Vector3D(39.8876,23.1065,0);

	g->opp[0].pos=Vector3D(90.4616,42.2002,-90);
	g->opp[1].pos=Vector3D(82.0921,22.9046,180);
	g->opp[2].pos=Vector3D(81.2890,60.4876,180);
	g->opp[3].pos=Vector3D(61.8525,23.1527,180);
	g->opp[4].pos=Vector3D(61.4469,60.3599,180);

	for(int i =0 ;i < 5;i++)
	{
		g->robot[i].oldpos=g->robot[i].pos;
		g->robot[i].speed.x=g->robot[i].speed.y=g->robot[i].speed.z=g->robot[i].speed.v=0.01;
		g->robot[i].oldvelocity.x=g->robot[i].oldvelocity.y=g->robot[i].oldvelocity.z=0;

		g->opp[i].oldpos = g->opp[i].pos;
		g->opp[0].speed.x = g->opp[0].speed.y = g->opp[0].speed.z =  g->opp[0].speed.v=0.01;
	}

	g->judged=false;				// 判断了吗? 
	g->is_yellow=true;				// 是黄队吗?
	g->penalty_count=0;

	g->ball.oldpos=g->ball.pos=g->ball.prepos=Vector3D(50,41.7,0);
	g->ball.speed.x = g->ball.speed.y = g->ball.speed.z = g->ball.speed.v=0.01;
}

extern "C" SIMPLESTRANGE_API void Destroy ( Environment *env )
{
	MyEnv * g = (MyEnv *)env->userData;
	if ( env->userData != NULL )	delete ( MyEnv * ) env->userData;
}

//策略接口函数
extern "C" SIMPLESTRANGE_API void Strategy ( Environment *env )
{
	MyEnv * g = (MyEnv *)env->userData;
	Pre(env);			// 调用预处理函数进行数据的处理


	//由于时间关系,我们在现在只用对点球和普通情况进行处理,其他的情况都由普通情况处理
	switch(g->gameState)
	{
		case PENALTY_KICK:	//3:点球
			//处理点球
			Play(g);	//点球处理完成后,继续执行默认的Play
			break;
		default:		//意外的情况
			Play(g);
			break;
	}

	End ( env );		//后期处理
}

//预处理
void Pre (Environment *env)
{
	MyEnv * g = (MyEnv *)env->userData;

	// 首先判断场地  如果已经判断 则跳过!
	if(!g->judged)		
	{
		if( env->home[0].pos.x < 50. )
			g->is_yellow=true; /// 黄队
		else
			g->is_yellow=false;/// 蓝队
		g->judged=true;
	}

	//设置游戏状态和球权
	g->gameState = env->gameState ;
	g->whosBall=env->whosBall;


	int i = 0;		//for循环计数器

	//场地转换赋值,使代码适合与两方
	//**********************************************
	if(g->is_yellow)  //  如果我方是黄队
	{
		for(i=0;i<5;i++)
		{
			g->robot[i].pos = env->home[i].pos ;	//我方队员坐标
			g->robot[i].rotation= env->home[i].rotation;

			NormalAngle(g->robot[i].rotation);
			
			g->opp[i].pos.x =env->opponent[i].pos.x;	//对方坐标
			g->opp[i].pos.y =env->opponent[i].pos.y;
			g->opp[i].rotation =env->opponent[i].rotation;
			NormalAngle(g->opp[i].rotation);
		}
	}
	else
	{//   否则 是蓝队  场地变换,球坐标变换
		g->ball.pos.x =FLEFT+FRIGHT -  env->currentBall.pos.x;		//球坐标变化
		g->ball.pos.y =FBOT+FTOP -  env->currentBall.pos.y;

		for(i=0;i<5;i++)
		{
			g->robot[i].pos.x =FLEFT+FRIGHT - env->home[i].pos.x ;	//我方队员坐标变换
			g->robot[i].pos.y =FBOT+FTOP -  env->home[i].pos.y ;
			g->robot[i].pos.z =g->robot[i].rotation= 180.0 + env->home[i].rotation;
			NormalAngle(g->robot[i].rotation);
			
			g->opp[i].pos.x = FLEFT+FRIGHT -  env->opponent[i].pos.x;	//对方坐标变换
			g->opp[i].pos.y = FBOT+FTOP -  env->opponent[i].pos.y;
			g->opp[i].pos.z =g->opp[i].rotation =  180 + env->opponent[i].rotation;
			NormalAngle(g->opp[i].rotation);
		}
	}
	//**********************************************

}

//做一些转化记录工作
void End (Environment *env)
{
	//eg 实际给小车赋速度
	//		给old赋值

}

//核心运行部分
void Play(MyEnv* g)
{
	
}

⌨️ 快捷键说明

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