亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? clander.cpp

?? 開發游戲人工智能的王道書
?? CPP
字號:
#include "CLander.h"

//this defines the vertices for the lander shape
const int	 NumLanderVerts = 30;

const SPoint lander[NumLanderVerts] = {//middle of lander
                                       SPoint(-1, 0),
                                       SPoint(1, 0),    
                                       SPoint(1, -0.5),
                                       SPoint(-1, -0.5),
                                       //top of lander
                                       SPoint(-0.5, 0),
                                       SPoint(-1, 0.3),
                                       SPoint(-1, 0.7),
                                       SPoint(-0.5, 1),
                                       SPoint(0.5, 1),
                                       SPoint(1, 0.7),
                                       SPoint(1, 0.3),
                                       SPoint(0.5, 0),
                                       //legs
                                       SPoint(-1, -0.4),
                                       SPoint(-1.3, -0.8),
                                       SPoint(-1.3, -1.2),
                                       SPoint(-1.5, -1.2),
                                       SPoint(-1.1, -1.2),
                                       SPoint(-0.9, -0.5),
                                       SPoint(-1.3, -0.8),

                                       SPoint(1, -0.4),
                                       SPoint(1.3, -0.8),
                                       SPoint(1.3, -1.2),
                                       SPoint(1.5, -1.2),
                                       SPoint(1.1, -1.2),
                                       SPoint(0.9, -0.5),
                                       SPoint(1.3, -0.8),
                                       //rocket
                                       SPoint(-0.2, -0.5),
                                       SPoint(-0.3, -0.8),
                                       SPoint(0.3, -0.8),
                                       SPoint(0.2, -0.5)};

//and the vertices for the jet
const NumJetVerts = 5;

const SPoint jet[NumJetVerts] = {SPoint(-0.1, -0.9),
                                 SPoint(-0.2, -1.2),
                                 SPoint(0, -1.6),
                                 SPoint(0.2, -1.2),
                                 SPoint(0.1, -0.9)};



//----------------------------------- ctor -------------------------------
//
//------------------------------------------------------------------------

CLander::CLander(int       cxClient,
				         int       cyClient,
				         double    rot,
                 SVector2D pos,
                 SVector2D pad):m_vPos(pos),
                                m_vPadPos(pad),
                                m_vVelocity(SVector2D(0,0)),
  						                  m_dRotation(rot),
						                    m_dMass(SHIPS_MASS),
						                    m_dScale(LANDER_SCALE),
						                    m_cxClient(cxClient),
						                    m_cyClient(cyClient),
						                    m_dFitness(0),
                                m_cTick(0),
                                m_iPadX(cxClient/2),
                                m_bCheckedIfLanded(false)
                           
{
	m_vStartPos		   = m_vPos;
	m_dStartRotation = rot;

   //set up the vertex buffer for the lander shape
  for (int i=0; i<NumLanderVerts; ++i)
	{
		m_vecShipVB.push_back(lander[i]);
	}

  m_vecShipVBTrans = m_vecShipVB;

  //and for the jet shape
  for (i=0; i<NumJetVerts; ++i)
  {
    m_vecJetVB.push_back(jet[i]);
  }

  m_vecJetVBTrans = m_vecJetVB;
}

//------------------------Reset-------------------------------------
//
//	just resets variables back to starting position
//------------------------------------------------------------------
void CLander::Reset(SVector2D &NewPadPos)
{
	m_vPos		     = m_vStartPos;
	m_dRotation	 = m_dStartRotation;
	m_vVelocity.x = 0;
	m_vVelocity.y = 0;
  m_cTick    = 0;
	m_dFitness	 = 0;
  m_vPadPos    = NewPadPos;
  m_bCheckedIfLanded = false;

}


//---------------------WorldTransform--------------------------------
//
//	sets up the translation matrices for the ship and applies the
//	world transform to the ships vertex buffer
//-------------------------------------------------------------------
void CLander::WorldTransform(vector<SPoint> &ship)
{
	//create a transformation matrix
	C2DMatrix matTransform;
	
	//scale
	matTransform.Scale(m_dScale, m_dScale);

	//rotate -  remember, because the mapping mode is set so that the y
  //axis is pointing up, the rotation is reversed
	matTransform.Rotate(-m_dRotation);

	//and translate
	matTransform.Translate(m_vPos.x, m_vPos.y);
	
  //now transform the ships vertices
  matTransform.TransformSPoints(ship);

}

//----------------------UpdateShipFromAction---------------------------
//
//  this is the main workhorse. It reads the ships decoded string of
//  actions and performs them, updating the lander accordingly. It also 
//  checks for impact and updates the fitness score.
//
//----------------------------------------------------------------------
bool CLander::UpdateShip()
{
   //just return if ship has crashed or landed
  if (m_bCheckedIfLanded)
  {
    return false;
  }
 
  //this will be the current action
  action_type action;

  //check that we still have an action to perform. If not then
  //just let the lander drift til it hits the ground
  if (m_cTick >= m_vecActions.size())
  {
    action = non;
  }

  else
  {
    action = m_vecActions[m_cTick++];
  }
  	

	//switch the jet graphic off
  m_bJetOn = false;
  
	switch (action)
	{
	case rotate_left:

		m_dRotation -= ROTATION_PER_TICK;

		if (m_dRotation < -PI)
		{
			m_dRotation += TWO_PI;
		}
		break;

	case rotate_right:

		m_dRotation += ROTATION_PER_TICK;

		if (m_dRotation > TWO_PI)
		{
			m_dRotation -= TWO_PI;
		}
		break;

	case thrust:
    {
      //the lander's acceleration per tick calculated from
      //the force the thruster exerts and the lander's mass
      double ShipAcceleration = THRUST_PER_TICK/m_dMass;

	    //resolve the acceleration vector into its x, y components
      //and add to the lander's velocity vector
      m_vVelocity.x += ShipAcceleration * sin(m_dRotation);
		  m_vVelocity.y += ShipAcceleration * cos(m_dRotation);
		  
      //switch the jet graphic on
      m_bJetOn = true;
    }

		break;

	case non:

		break;

	}//end switch


  //now add in the gravity vector
	m_vVelocity.y += GRAVITY_PER_TICK;

  //update the lander's position	
  m_vPos += m_vVelocity;

	
	//bounds checking
	if (m_vPos.x > WINDOW_WIDTH)
	{
		m_vPos.x = 0;
	}
	
	if (m_vPos.x < 0)
	{
		m_vPos.x = WINDOW_WIDTH;
	}

  //now we check to see if the lander has crashed or landed

  //create a copy of the landers verts before we transform them
	m_vecShipVBTrans = m_vecShipVB;

	//transform the vertices
  WorldTransform(m_vecShipVBTrans);

	//if we are lower than the ground then we have finished this run
	if (TestForImpact(m_vecShipVBTrans))
  {
    //check if user has landed ship
    if (!m_bCheckedIfLanded)
    {
       //calculate fitness if we haven't already
      if (!m_dFitness)
      {
        CalculateFitness();
    
        m_bCheckedIfLanded = true;
      }
    
      return false;
    }
  }
    
  return true;
}

//----------------------TestForImpact------------------------------
//
//	checks each vertex of the ship to see if it's reached ground-
//	level.
//-----------------------------------------------------------------
bool CLander::TestForImpact(vector<SPoint> &ship)
{
	for (int vrtx=0; vrtx<ship.size(); ++vrtx)
	{
		if ( (ship[vrtx].y) < 55)
		{
			return true;
			
		}
	}

  return false;
}

//-----------------------CalculateFitness-----------------------------
//
//	calculates a fitness score based on how far the lander is away 
//	from the pad, what speed it's travelling when it reaches ground
//	level and its angle at touchdown.
//-------------------------------------------------------------------
void CLander::CalculateFitness()
{

	//calculate distance from pad
  double DistFromPad = fabs(m_vPadPos.x - m_vPos.x);

  double distFit = m_cxClient-DistFromPad;
  
  //calculate speed of lander
  double speed = sqrt((m_vVelocity.x*m_vVelocity.x) 
					           +(m_vVelocity.y*m_vVelocity.y));

  //fitness due to rotation
  double rotFit = 1/(fabs(m_dRotation)+1);

  //fitness due to time in air
  double fitAirTime = (double)m_cTick/(speed+1);

  //calculate fitness
  m_dFitness = distFit + 400*rotFit + 4* fitAirTime; 

  //check if we have a successful landing
  if( (DistFromPad            < DIST_TOLERANCE)       && 
      (speed                  < SPEED_TOLERANCE)      && 
      (fabs(m_dRotation)      < ROTATION_TOLERANCE))
  {
    m_dFitness = BIG_NUMBER;
  }
}

//----------------------------- Decode() ---------------------------------
//
//  takes a genome an decodes it into its sequence of actions
//------------------------------------------------------------------------
void CLander::Decode(const vector<SGene> &actions)
{
  //clear
  m_vecActions.clear();
  
  for (int i=0; i<actions.size(); ++i)
  {
    for (int j=0; j<actions[i].duration; ++j)
    {
      m_vecActions.push_back(actions[i].action);
    }
  }
}

//------------------------- Render ---------------------------------------
//
//------------------------------------------------------------------------
void CLander::Render(HDC surface)
{
   
  //draw the vertices for the landers base
	MoveToEx(surface, (int)m_vecShipVBTrans[0].x, (int)m_vecShipVBTrans[0].y, NULL);

	for (int vert=1; vert<4; ++vert)
	{
		LineTo(surface, (int)m_vecShipVBTrans[vert].x, (int)m_vecShipVBTrans[vert].y);
	}
  
  LineTo(surface, (int)m_vecShipVBTrans[0].x, (int)m_vecShipVBTrans[0].y);

  //landers top
  MoveToEx(surface, (int)m_vecShipVBTrans[4].x, (int)m_vecShipVBTrans[4].y, NULL);

  for (vert=5; vert<12; ++vert)
	{
		LineTo(surface, (int)m_vecShipVBTrans[vert].x, (int)m_vecShipVBTrans[vert].y);
	}

  //left leg
  MoveToEx(surface, (int)m_vecShipVBTrans[12].x, (int)m_vecShipVBTrans[12].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[13].x, (int)m_vecShipVBTrans[13].y);
  LineTo(surface, (int)m_vecShipVBTrans[14].x, (int)m_vecShipVBTrans[14].y);
  MoveToEx(surface, (int)m_vecShipVBTrans[15].x, (int)m_vecShipVBTrans[15].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[16].x, (int)m_vecShipVBTrans[16].y);
  MoveToEx(surface, (int)m_vecShipVBTrans[17].x, (int)m_vecShipVBTrans[17].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[18].x, (int)m_vecShipVBTrans[18].y);

  //right leg
  MoveToEx(surface, (int)m_vecShipVBTrans[19].x, (int)m_vecShipVBTrans[19].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[20].x, (int)m_vecShipVBTrans[20].y);
  LineTo(surface, (int)m_vecShipVBTrans[21].x, (int)m_vecShipVBTrans[21].y);
  MoveToEx(surface, (int)m_vecShipVBTrans[22].x, (int)m_vecShipVBTrans[22].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[23].x, (int)m_vecShipVBTrans[23].y);
  MoveToEx(surface, (int)m_vecShipVBTrans[24].x, (int)m_vecShipVBTrans[24].y, NULL);
  LineTo(surface, (int)m_vecShipVBTrans[25].x, (int)m_vecShipVBTrans[25].y);

  //the burner
  MoveToEx(surface, (int)m_vecShipVBTrans[26].x, (int)m_vecShipVBTrans[26].y, NULL);
  for (vert=27; vert<30; ++vert)
	{
		LineTo(surface, (int)m_vecShipVBTrans[vert].x, (int)m_vecShipVBTrans[vert].y);
	}

  //if the last action was thrust then we need to draw the jet from the burner
  if (m_bJetOn)
  {
    //first transform the verts 
    m_vecJetVBTrans = m_vecJetVB;

    WorldTransform(m_vecJetVBTrans);

    MoveToEx(surface, m_vecJetVBTrans[0].x, m_vecJetVBTrans[0].y, NULL);

    for (int vert=1; vert<m_vecJetVBTrans.size(); ++vert)
    {
      LineTo(surface, m_vecJetVBTrans[vert].x, m_vecJetVBTrans[vert].y);
    }
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二| 樱桃国产成人精品视频| 国产精品久久一卡二卡| 亚洲最大成人综合| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩一区二区视频在线观看| 久久久久国产精品麻豆| 亚洲gay无套男同| 成人综合在线视频| 日韩精品中文字幕一区二区三区| 成人免费视频在线观看| 国产在线视频精品一区| 91精品国产乱| 亚洲一区二区精品久久av| 国产传媒欧美日韩成人| 日韩一级黄色片| 亚洲国产日韩a在线播放| 成人av网址在线| 久久久91精品国产一区二区精品 | 国产精品国模大尺度视频| 韩国女主播成人在线| 欧美一区二区精品| 视频一区二区欧美| 欧美日韩激情在线| 午夜影院久久久| 欧美在线播放高清精品| 国产精品久久久久影院色老大| 国产精品一卡二卡| 国产色产综合产在线视频| 麻豆精品在线观看| 欧美一激情一区二区三区| 夜夜嗨av一区二区三区中文字幕| av一本久道久久综合久久鬼色| 国产婷婷色一区二区三区在线| 国产专区综合网| 国产视频一区不卡| av电影天堂一区二区在线观看| 国产清纯在线一区二区www| 国产剧情一区在线| 国产亚洲一区二区三区在线观看| 久久99国产精品尤物| 欧美不卡在线视频| 国产精一品亚洲二区在线视频| 国产丝袜欧美中文另类| 成人avav影音| 一区二区三区日韩精品| 色综合欧美在线视频区| 一区二区三区免费观看| 欧美日韩精品三区| 久久疯狂做爰流白浆xx| 久久久久9999亚洲精品| 成人午夜视频网站| 樱花草国产18久久久久| 正在播放一区二区| 国产宾馆实践打屁股91| 综合久久久久综合| 欧美另类videos死尸| 人妖欧美一区二区| 国产精品欧美一级免费| 99久精品国产| 三级久久三级久久久| 国产亚洲精品精华液| 一本大道久久a久久精二百| 午夜久久电影网| 久久先锋影音av鲁色资源网| 91小宝寻花一区二区三区| 午夜精品视频在线观看| 久久久久久久精| 欧美亚洲综合一区| 国产最新精品免费| 亚洲综合丁香婷婷六月香| 精品国一区二区三区| 91亚洲男人天堂| 久久激情综合网| 亚洲精品日韩专区silk| 2023国产一二三区日本精品2022| 一本色道**综合亚洲精品蜜桃冫 | 亚洲国产一区视频| www国产成人| 欧美日韩一区在线| 成人动漫av在线| 美女在线观看视频一区二区| 亚洲色图在线视频| 久久美女高清视频| 91精品欧美久久久久久动漫| 成人免费视频一区| 久久国产精品无码网站| 亚洲第一搞黄网站| 亚洲男同性视频| 久久久www成人免费无遮挡大片| 欧美午夜电影一区| caoporn国产精品| 国产高清久久久久| 爽好多水快深点欧美视频| 国产精品国产自产拍在线| 欧美精品一区二区三区蜜臀| 欧美日韩在线直播| 91麻豆国产在线观看| 国产大片一区二区| 国产精品资源网站| 久久99国产乱子伦精品免费| 日韩精品一区第一页| 亚洲一区二区三区四区中文字幕| 国产精品麻豆99久久久久久| 久久久综合网站| 欧美xxxx在线观看| 91精选在线观看| 91精品国产综合久久婷婷香蕉| 91久久线看在观草草青青| 成人h动漫精品一区二区 | 日韩av电影免费观看高清完整版在线观看| 国产精品女同一区二区三区| 久久综合久久综合久久| 日韩片之四级片| 日韩欧美国产一区二区在线播放| 欧美福利一区二区| 在线国产电影不卡| 欧美性三三影院| 在线观看视频一区二区欧美日韩| eeuss国产一区二区三区| 91视频91自| 欧美午夜精品久久久久久孕妇| 欧美在线观看禁18| 欧美日韩在线一区二区| 欧美巨大另类极品videosbest| 欧美裸体bbwbbwbbw| 91精品国产福利在线观看| 欧美一区二区三区免费大片| 日韩一级完整毛片| 久久夜色精品一区| 欧美国产日韩精品免费观看| 自拍偷在线精品自拍偷无码专区| 亚洲男人的天堂一区二区| 亚洲一区在线观看网站| 日本 国产 欧美色综合| 国产白丝精品91爽爽久久| 成人福利视频网站| 欧美日韩三级一区二区| 欧美草草影院在线视频| 国产精品美女久久久久aⅴ| 亚洲婷婷综合色高清在线| 亚洲va国产va欧美va观看| 久久国产人妖系列| 99精品在线免费| 欧美精品vⅰdeose4hd| 久久色视频免费观看| 国产精品国产三级国产aⅴ入口 | 欧美日韩免费在线视频| 精品久久久久一区二区国产| 国产精品午夜久久| 午夜精品一区在线观看| 国产高清不卡二三区| 欧美中文字幕不卡| 久久老女人爱爱| 午夜视频在线观看一区| 成人黄色综合网站| 欧美精品日韩一本| 国产欧美日韩不卡免费| 亚洲成a人片在线观看中文| 国产精品18久久久久久久网站| 91麻豆精品在线观看| 日韩你懂的电影在线观看| 亚洲视频1区2区| 国内精品自线一区二区三区视频| 99久久精品一区二区| 日韩一二三区不卡| 亚洲黄网站在线观看| 国产一区二区日韩精品| 777色狠狠一区二区三区| 亚洲情趣在线观看| 国产成人午夜视频| 日韩免费一区二区三区在线播放| 亚洲色欲色欲www| 国产成人精品免费一区二区| 在线成人av网站| 亚洲高清视频在线| 91热门视频在线观看| 国产欧美1区2区3区| 老色鬼精品视频在线观看播放| 日本高清免费不卡视频| 中文一区二区在线观看| 久久精品国产第一区二区三区| 欧美精品日韩一本| 亚洲成av人片观看| 欧美中文一区二区三区| 亚洲男人的天堂在线观看| 丁香六月久久综合狠狠色| 久久免费视频色| 国产乱一区二区| 精品国产一区二区三区忘忧草| 青草国产精品久久久久久| 欧美日韩国产电影| 一区2区3区在线看| 91成人国产精品| 亚洲一区二区中文在线| 色先锋aa成人| 一区二区三区毛片| 欧美这里有精品| 五月激情丁香一区二区三区| 精品视频在线看|