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

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

?? calien.cpp

?? 游戲開發人工智能技術-AI.Techniques.for.Game.Programming
?? CPP
字號:
#include "CAlien.h"



//the vertices making up its shape
const int NumAlienVerts = 19;
const SPoint Alien[NumAlienVerts] = { SPoint(1,3),
                                      SPoint(4,1),
                                      SPoint(4,-1),
                                      SPoint(2,-4),
                                      SPoint(1,-1),
                                      SPoint(0,-2),
                                      SPoint(-1,-1),
                                      SPoint(-2,-4),
                                      SPoint(-4,-1),
                                      SPoint(-4,1),
                                      SPoint(-1,3),

                                      SPoint(-2,1),
                                      SPoint(-1.5,0.5),
                                      SPoint(-2,0),
                                      SPoint(-2.5,1),

                                      SPoint(2,1),
                                      SPoint(1.5,0.5),
                                      SPoint(2,0),
                                      SPoint(2.5,1)};




//--------------------------------- ctor ---------------------------------
//
//------------------------------------------------------------------------
CAlien::CAlien(): m_dScale(CParams::dAlienScale),
                  m_vVelocity(SVector2D(0, 0)),
                  m_dMass(CParams::dAlienMass),
                  m_iAge(0),
                  m_bWarning(false)
{ 
  //set its position
  m_vPos = SVector2D(RandInt(0, CParams::WindowWidth), CParams::WindowHeight);
  
  //create the vertex buffer
  for (int i=0; i<NumAlienVerts; ++i)
  {
    m_vecAlienVB.push_back(Alien[i]);
  }

  //setup its bounding box
  m_AlienBBox.left  = m_vPos.x - (4*CParams::dAlienScale);
  m_AlienBBox.right = m_vPos.x + (4*CParams::dAlienScale);
  m_AlienBBox.top   = m_vPos.y + (3*CParams::dAlienScale);
  m_AlienBBox.bottom= m_vPos.y - (4*CParams::dAlienScale);

}


//------------------------------ Render ----------------------------------
void CAlien::Render(HDC &surface, HPEN &GreenPen, HPEN &RedPen)
{
  //transform the vertices
  WorldTransform();

  //select in green pen
  HPEN OldPen = (HPEN)SelectObject(surface, GreenPen);
 
  //draw body
  MoveToEx(surface, m_vecAlienVBTrans[0].x, m_vecAlienVBTrans[0].y, NULL);

  for (int vtx=0; vtx<11; ++vtx)
  {
    LineTo(surface, m_vecAlienVBTrans[vtx].x, m_vecAlienVBTrans[vtx].y);
  }

  LineTo(surface, m_vecAlienVBTrans[0].x, m_vecAlienVBTrans[0].y);

  //select in red pen
  SelectObject(surface, RedPen);
  
  //left eye
  MoveToEx(surface, m_vecAlienVBTrans[11].x, m_vecAlienVBTrans[11].y, NULL);

  for (vtx=12; vtx<15; ++vtx)
  {
    LineTo(surface, m_vecAlienVBTrans[vtx].x, m_vecAlienVBTrans[vtx].y);
  }

  //right eye
  MoveToEx(surface, m_vecAlienVBTrans[15].x, m_vecAlienVBTrans[15].y, NULL);

  for (vtx=16; vtx<19; ++vtx)
  {
    LineTo(surface, m_vecAlienVBTrans[vtx].x, m_vecAlienVBTrans[vtx].y);
  }


  //replace the old pen
  SelectObject(surface, OldPen);

  //display warning if a problem with the network
  if (m_bWarning)
  {
    string s = "Wrong amount of inputs!";
	  TextOut(surface, 110, 200, s.c_str(), s.size());
  }

}


//---------------------WorldTransform--------------------------------
//
//	sets up the translation matrices for the ship and applies the
//	world transform to the ships vertex buffer
//-------------------------------------------------------------------
void CAlien::WorldTransform()
{
	//copy the original vertices into the buffer about to be transformed
  m_vecAlienVBTrans = m_vecAlienVB;
  
  //create a transformation matrix
	C2DMatrix matTransform;
	
	//scale
	matTransform.Scale(m_dScale, m_dScale);

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

//----------------------------- GetActionFromNetwork ---------------------
//
//  this function updates the neural net and returns the action the 
//  network selects as its output
//------------------------------------------------------------------------
action_type CAlien::GetActionFromNetwork(const vector<CBullet> &bullets,
                                         const SVector2D       &GunPos)
{
  //the inputs into the net 
  vector<double> NetInputs;

  //This will hold the outputs from the neural net
  static vector<double> outputs(0,3);

  //add in the vector to the gun turret
  int XComponentToTurret = GunPos.x - m_vPos.x;
  int YComponentToTurret = GunPos.y - m_vPos.y;

  NetInputs.push_back(XComponentToTurret);
  NetInputs.push_back(YComponentToTurret);

  //now any bullets
  for (int blt=0; blt<bullets.size(); ++blt)
  {
    if (bullets[blt].Active())
    {
      
      double xComponent = bullets[blt].Pos().x - m_vPos.x;
      double yComponent = bullets[blt].Pos().y - m_vPos.y;

      NetInputs.push_back(xComponent);
      NetInputs.push_back(yComponent);
    }

    else
    {
      //if a bullet is innactive just input the vector to
      //the gun turret
      NetInputs.push_back(XComponentToTurret);
      NetInputs.push_back(YComponentToTurret);
    }
  }

  //feed the inputs into the net and get the outputs
  outputs = m_ItsBrain.Update(NetInputs);

  //this is set if there is a problem with the update
  if (outputs.size() == 0)
  {
     m_bWarning = true;
  }

  //determine which action is valid this frame. The highest valued
  //output over 0.9. If none are over 0.9 then just drift with
  //gravity
  double BiggestSoFar = 0;

  action_type action = drift;

  for (int i=0; i<outputs.size(); ++i)
  {
    if( (outputs[i] > BiggestSoFar) && (outputs[i] > 0.9))
    {
      action = (action_type)i;
      
      BiggestSoFar = outputs[i];
    }
  }

  return action;
}


//----------------------------- Update -----------------------------------
//
//  Checks for user keypresses and updates the aliens parameters accordingly
//------------------------------------------------------------------------
bool CAlien::Update(vector<CBullet> &bullets,const SVector2D &GunPos)
{
  //update age
  ++m_iAge;

  //get the next action from the neural network
  int action = GetActionFromNetwork(bullets, GunPos);

  //switch on the action
  switch(action)
  {
  case thrust_left:
    {
      m_vVelocity.x -= CParams::dMaxThrustLateral/m_dMass;
    }

    break;

  case thrust_right:
    {
      m_vVelocity.x += CParams::dMaxThrustLateral/m_dMass;
    }

    break;

  case thrust_up:
    {
      m_vVelocity.y += CParams::dMaxThrustVertical/m_dMass;
    }

    break;

    default:break;
  }

  //add in gravity
  SVector2D gravity(0, CParams::dGravityPerTick); 
                                                         
  m_vVelocity += gravity;

  //clamp the velocity of the alien
  Clamp(m_vVelocity.x, -CParams::dMaxVelocity, CParams::dMaxVelocity);
  Clamp(m_vVelocity.y, -CParams::dMaxVelocity, CParams::dMaxVelocity);
  
  //update the alien's position
	m_vPos += m_vVelocity;

  //wrap around window width 
  if (m_vPos.x < 0)
  {
    m_vPos.x = CParams::WindowWidth;
  }

  if (m_vPos.x > CParams::WindowWidth)
  {
    m_vPos.x = 0;
  }

  //update the bounding box 
  m_AlienBBox.left  = m_vPos.x - (4*CParams::dAlienScale);
  m_AlienBBox.right = m_vPos.x + (4*CParams::dAlienScale);
  m_AlienBBox.top   = m_vPos.y + (3*CParams::dAlienScale);
  m_AlienBBox.bottom= m_vPos.y - (4*CParams::dAlienScale);

  //an alien dies if it drops below the gun, flys too high
  //or is hit by a bullet
  if ( (m_vPos.y > (CParams::WindowHeight + 5)) ||
       (m_vPos.y < 15)                          || 
       CheckForCollision(bullets))
  {   
    return false;
  }
      
  return true;
}


//------------------------- CheckForCollision ---------------------------
//
//  tests the aliens bounding box against each bullet's bounding box.
//  returns true if a collision is detected
//-----------------------------------------------------------------------
bool CAlien::CheckForCollision(vector<CBullet> &bullets)const
{
  //for each bullet  
  for (int blt=0; blt<bullets.size(); ++blt)
  {
    //if bullet is not active goto next bullet
    if (!bullets[blt].Active())
    {
      continue;
    }
    
    RECT blts = bullets[blt].BBox();

    //test for intersection between bounding boxes
    if (!((blts.bottom > m_AlienBBox.top) ||
          (blts.top < m_AlienBBox.bottom) ||
          (blts.left > m_AlienBBox.right) ||
          (blts.right < m_AlienBBox.left)))
    {
      bullets[blt].SwitchOff();
      
      return true;
    }
  }

  return false;
}


//--------------------------------- Reset --------------------------------
//
//------------------------------------------------------------------------
void CAlien::Reset()
{
  m_iAge      = 0;
  m_vVelocity = SVector2D(0, 0);
  m_vPos      = SVector2D(RandInt(0, CParams::WindowWidth), CParams::WindowHeight);
}


//------------------------------ mutate ----------------------------------
//
//  mutates the connection weights in the alien's neural network.
//------------------------------------------------------------------------
void CAlien::Mutate()
{

  //grab the weights for the neural net
  vector<double> weights = m_ItsBrain.GetWeights();

  //mutate them
  for (int w=0; w<weights.size(); ++w)
  {
    //do we perturb this weight?
    if (RandFloat() < CParams::dMutationRate)
		{
			//add a small value to the weight
			weights[w] += (RandomClamped() * CParams::dMaxPerturbation);
		}
	}

  //put 'em back!
  m_ItsBrain.PutWeights(weights);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆国产香蕉久久精品| 一区二区三区不卡视频| 激情综合网最新| 欧美精品一区二区久久久| 日本不卡高清视频| 2023国产精品视频| 成人sese在线| 亚洲激情校园春色| 555www色欧美视频| 韩日精品视频一区| 亚洲欧洲一区二区三区| 欧美性受xxxx| 国产在线视频一区二区| 国产精品伦理一区二区| 欧美亚洲图片小说| 激情综合网激情| 国产精品区一区二区三区| 色88888久久久久久影院按摩 | 91久久人澡人人添人人爽欧美| 一区二区三区四区亚洲| 欧美高清激情brazzers| 粉嫩13p一区二区三区| 夜夜揉揉日日人人青青一国产精品| 欧美日韩美女一区二区| 国产成人综合网站| 亚洲夂夂婷婷色拍ww47| 久久女同性恋中文字幕| 91老司机福利 在线| 蜜臀精品一区二区三区在线观看| 久久亚洲一级片| 在线观看网站黄不卡| 国产在线精品免费av| 亚洲一区国产视频| 欧美激情一区二区三区四区| 在线观看91av| 99精品热视频| 国产麻豆日韩欧美久久| 亚洲线精品一区二区三区| 久久精品一区二区三区不卡 | 91在线观看下载| 久久综合综合久久综合| 亚洲免费三区一区二区| 精品久久久久久无| 欧美日韩一区国产| 国产91丝袜在线播放| 美女诱惑一区二区| 亚洲一区影音先锋| 一区在线观看视频| 国产欧美日韩另类一区| 日韩欧美www| 欧美人狂配大交3d怪物一区| 91在线你懂得| 成人免费不卡视频| 国产一区二区中文字幕| 日本色综合中文字幕| 亚洲综合在线五月| 综合久久久久久| 国产欧美精品一区二区色综合 | 欧美二区乱c少妇| 一本一道久久a久久精品| 国产精品一卡二| 激情小说亚洲一区| 日本乱人伦一区| 成人性生交大片免费| 国产米奇在线777精品观看| 久久精品免费观看| 久国产精品韩国三级视频| 日本亚洲电影天堂| 青青草国产精品亚洲专区无| 午夜av区久久| 爽爽淫人综合网网站| 天堂蜜桃91精品| 秋霞国产午夜精品免费视频| 久久久噜噜噜久久中文字幕色伊伊| 蜜臀久久久久久久| 亚洲一区中文日韩| 亚洲一区视频在线观看视频| 亚洲免费在线观看视频| 夜夜精品浪潮av一区二区三区| 一区二区三区.www| 亚洲国产乱码最新视频| 亚洲福利视频导航| 免费国产亚洲视频| 国内成人精品2018免费看| 国产一区二区三区观看| 国产传媒欧美日韩成人| 成a人片亚洲日本久久| 97久久精品人人做人人爽50路| 91色综合久久久久婷婷| 欧美日韩一区成人| 日韩一卡二卡三卡| 国产亚洲综合在线| 中文字幕字幕中文在线中不卡视频| 亚洲精品中文在线影院| 午夜精品影院在线观看| 极品少妇xxxx偷拍精品少妇| 国产盗摄精品一区二区三区在线| jiyouzz国产精品久久| 欧美影院精品一区| 精品国产污污免费网站入口| 亚洲国产成人午夜在线一区| 亚洲少妇最新在线视频| 天天色图综合网| 国产福利91精品一区| 一本在线高清不卡dvd| 日韩三级伦理片妻子的秘密按摩| 久久久国产综合精品女国产盗摄| 亚洲欧美国产高清| 精品在线你懂的| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 91精品国产品国语在线不卡| 欧美va在线播放| 亚洲免费高清视频在线| 麻豆91精品91久久久的内涵| 粉嫩欧美一区二区三区高清影视| 在线看一区二区| 久久人人超碰精品| 亚洲自拍偷拍网站| 久色婷婷小香蕉久久| 欧美精品aⅴ在线视频| 99久久综合精品| 91精品国产欧美一区二区18| 国产婷婷色一区二区三区 | 久久色.com| 亚洲毛片av在线| 色综合久久久久综合| 欧美成人bangbros| 亚洲精品一二三| 国产麻豆精品theporn| 欧美性色黄大片手机版| 中文字幕欧美日韩一区| 久久精品国产第一区二区三区| 91在线国产观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲香肠在线观看| 91麻豆自制传媒国产之光| 久久天天做天天爱综合色| 日韩成人一区二区| 欧洲生活片亚洲生活在线观看| 国产亚洲欧美激情| 精久久久久久久久久久| 欧美酷刑日本凌虐凌虐| 一区二区三区在线视频播放| 成人中文字幕在线| 欧美成人福利视频| 免费观看在线综合| 欧美精品第1页| 亚洲激情欧美激情| 91色porny蝌蚪| 国产精品污www在线观看| 国内精品久久久久影院薰衣草| 欧美巨大另类极品videosbest| 毛片av中文字幕一区二区| 久久精品网站免费观看| 亚洲免费观看高清完整版在线| 国产精品99久久久久久久vr| 日韩一区二区三免费高清| 水蜜桃久久夜色精品一区的特点 | 大白屁股一区二区视频| 国产亚洲综合性久久久影院| 免费的国产精品| 91精品国产综合久久久久久久久久| 一区二区三区日本| 91视频一区二区三区| 亚洲免费观看在线视频| 欧日韩精品视频| 亚洲国产一区二区a毛片| 欧美日韩综合不卡| 亚洲与欧洲av电影| 欧美日韩综合在线| 日韩激情视频网站| 日韩一本二本av| 精品一区二区三区的国产在线播放| 日韩免费电影网站| 国产精品一区二区视频| 久久精品欧美日韩精品| www.亚洲激情.com| 一区二区三区不卡视频| 欧美私模裸体表演在线观看| 亚洲成人在线免费| 日韩网站在线看片你懂的| 美国av一区二区| 成人免费视频一区| 久久久久免费观看| 天天影视网天天综合色在线播放| 欧美主播一区二区三区| 日日摸夜夜添夜夜添精品视频| 日韩网站在线看片你懂的| 国产精品69毛片高清亚洲| 国产精品无人区| 欧美三区在线观看| 韩日av一区二区| 中文字幕一区二区三区乱码在线| 色中色一区二区| 美日韩一级片在线观看| 国产精品久久一卡二卡| 欧美日韩卡一卡二| 国产激情精品久久久第一区二区| 国产精品久久久久一区| 欧美日韩你懂得|