偼偠傔偵

僎乕儉僐乕僨傿儞僌僔儕乕僘偼慡3嶜曇惉偱偁傝丄杮彂偱姰惉偟傑偡丅

vol.1vol.2偱偼DirectX偺塣梡傪埖偭偰偄傑偡丅嵟弶偺2嶜偲偼堎側傝vol.3偱偁傞杮彂偱偼丄偁傞掱搙DirectX偐傜撈棫偟丄弮悎側傾儖僑儕僘儉傪夝愢偡傞傛偆偵搘傔傑偟偨丅偱偡偺偱丄DirectX埲奜偺SDK椺偊偽CgOpenGL丄偁傞偄偼Win32API偺傒傪巊梡偟偨僎乕儉傾僾儕働乕僔儑儞偵傕傕偪傠傫桳岠側抦幆偲側傞偲巚偄傑偡丅傑偨丄摿偵婎杮傾儖僑儕僘儉偼僎乕儉埲奜偵傕梡搑偑偁傞偲傕巚偄傑偡丅

 

僎乕儉僐乕僨傿儞僌僔儕乕僘偼摉弶丄1擭掱搙偱姰惉偝偣傞偮傕傝偱偟偨偑寢嬊2擭嬤偔偐偐偭偰偟傑偄傑偟偨丅

偙偺棟桼偼丄彂偄偰偄傞偆偪偵乽偙傟偼彂偐側偔偰偼側傜側偄傫偠傖側偄偩偆偐丠乿偲偄偆帠暱偑偳傫偳傫憹偊偰偄偭偨偙偲偑傑偢戞1偵偁傝傑偡丅偦傟偐傜丄幚偼杮彂偺僒儞僾儖僾儘僌儔儉帺懱偼憗偄帪婜偵姰惉偟偰偄偨偺偱偡偑丄懠偺僾儘僕僃僋僩傪桪愭偝偣偨偨傔丄尨峞嶌惉偑傎偲傫偳恑傑側偄忬懺偑挿偔懕偄偨偺傕姰惉傪挿堷偐偣偨尨場偱偡丅

偝偰丄杮彂偺摿挜傪弎傋偨偄偲巚偄傑偡丅

 

僎乕儉僐乕僨傿儞僌僔儕乕僘偵尷傜偢丄夝愢偵偼搘傔偰弌椡妋擣偮傑傝僒儞僾儖僾儘僌儔儉傪揧偊傞偺偑昅幰偺僗僞僀儖偱偡丅傕偪傠傫杮彂偵傕傎偲傫偳偺崁栚偵僒儞僾儖傪偮偗偰偄傑偡丅婎杮傾儖僑儕僘儉曇偺杮幙晹暘偺僐乕僪偼丄偙傟埲忋側偄偲偄偆儗儀儖傑偱嵟揔壔傪峴偭偨僐乕僪側偺偱丄偦偺傑傑巊梡偱偒傞偲巚偄傑偡丅媡偵庤傪壛偊傞偲僷僼僅乕儅儞僗偑棊偪傞壜擻惈偑偁傝傑偡丅傑偨A*傗僋傾僢僪丒僆僋僩僩儕乕僒儞僾儖偱偼偦傟偧傟偺杮幙傾儖僑儕僘儉傪僼儗乕儉儚乕僋偐傜暘棧偟僋儔僗偵傑偲傔偰偄傞偺偱嵞棙梡偟堈偄傛偆偵傕側偭偰偄傑偡丅

偦傟偐傜丄杮彂偺栚揑偼DirectX偺塣梡偑栚揑偱偼側偄偺偱丄崱夞偼偁傞掱搙帺桼偵僐乕僨傿儞僌偝偣偰傕傜偄傑偟偨丅vol.1vol.2偱偼堦偮偺僒儞僾儖500峴埲撪偲偄偆僐儞僙僾僩偑偁傝傑偟偨偑丄杮彂偵偼偁傝傑偣傫丅晄梡側僋儔僗傕偁傞偱偟傚偆偑丄拲栚偡傋偒応強偼偦偺搒搙帵偟偰偄傞偺偱丄帺暘偵偲偭偰晄梡側晹暘偼柍帇偡傟偽偄偄偩偗偺榖偱偡丅崱偼昁梫偠傖側偔偲傕丄偄偮偐栶棫偮壜擻惈傕偁傞偲巚偄丄偁偊偰巆偟偰偍偒傑偟偨丅

側偍丄梊掕偱偼杮彂偱僎乕儉忬懺摨婜傪夝愢偡傞偮傕傝偱偄傑偟偨偑丄峫偊偰傒傞偲乽偼偠傔偰偺3D僎乕儉奐敪乿偱偐側傝偺儁乕僕傪妱偄偰夝愢偟偰偄傞偙偲偵婥晅偒丄摨偠偙偲傪彂偔偙偲偵側傞偺偱彍偒傑偟偨丅

 

僒儞僾儖傪價儖僪偡傞僐儞僷僀儔偱偡偑丄摿偵寛傑偭偨僐儞僷僀儔偼偁傝傑偣傫丅DirecrX偵僔價傾偵摿壔偟偰偄傞傢偗偱偼側偄偺偱丄VC6偱傕VC2005偱傕丄偁傞偄偼儅僀僋儘僜僼僩埲奜偺儊乕僇乕偱傕戝忎晇偱偡丅傕偪傠傫撉幰懁偱偦傟偧傟偺愝掕傪峴偊傞応崌偵尷傝傑偡丅Direct3D傪巊梡偟偰偄傞僒儞僾儖偺僐乕僪偼DirectXSDK9.0C宯偺僐乕僪偱偡丅僐儞僷僀儔乕偑VisualC++6.0偺応崌丄DirectXSDK9.0cSummer2003偁偨傝偺傕偺傪巊梡偟偰偔偩偝偄丅

僒儞僾儖僾儘僕僃僋僩偼丄VC2002,2003,20053偮偺僶乕僕儑儞傪晅偗傑偡偑僜乕僗帺懱偼慡偔摨偠傕偺偱偡丅

 

嵟屻偵丄vol.1偐傜杮僔儕乕僘傪攦偭偰偔偩偝偭偰偄傞曽傕偄傜偭偟傖傞偲巚偄傑偡丅傛偆傗偔嵟屻偺vol.3傪弌偡偙偲偑偱偒傑偟偨丅抶傟偰偟傑偭偨偙偲偵偮偄偰偍榣傃傪怽偟忋偘傞偲偲傕偵丄柍帠偵僔儕乕僘傪姰惉偱偒偨偙偲偵偍楃怽偟忋偘傑偡丅偁傝偑偲偆偛偞偄傑偟偨丅

昅幰偼崱屻摉暘偺娫丄杮嬈偵栠傝傑偡丅悢擭屻偵彂愋偱偼側偄宍偱偺乬惉壥暔乭傪奆偝傫偵偍尒偣偡傞偙偲偵側傞偲巚偄傑偡丅丂偱偼両

 

斈梡傾儖僑儕僘儉

偙偙偱夝愢偟偰偄傞斈梡傾儖僑儕僘儉偼婎杮傾儖僑儕僘儉偲傕尵傢傟傑偡丅乬婎杮乭偲偄偆尵梩偐傜乬娙扨乭偲偄偆僀儊乕僕偑晜偐傇偐傕偟傟傑偣傫丅

 

偟偐偟懡偔偺応崌丄慡偔媡偱偡丅

 

僐儞僺儏乕僞乕偵側傫傜偐偺巇帠傪偝偣傞応崌丄巇帠偺庬椶偵埶懚偤偢丄懡偔偺婡夛偱搊応偡傞儘僕僢僋偱偁傞偲偄偆堄枴偱偺乬婎杮乭偱偁偭偰丄巇慻傒偑乬扨弮乭偲偄偆偙偲偱偼偁傝傑偣傫丅傑偨丄嵟弶偺復偵彂偄偰偄傞偐傜偲尵偭偰丄娙扨側偺偱偁傠偆偲巚偆偺偼婋尟偱偡丅

偨偟偐偵婎杮傾儖僑儕僘儉偼丄僐儞僺儏乕僞乕偺抋惗偲摨帪偵惗傒弌偝傟偨婎杮揑側摦嶌偱丄弶婜偺崰偵帺慠敪惗揑偵抋惗偟偨娙扨側傾儖僑儕僘儉傕拞偵偼偁傝傑偡丅偟偐偟丄偦傟偩偗偱偼傕偪傠傫側偔丄偦偺楌巎偑挿偄偨傔丄崱傑偱懡偔偺尋媶幰偑傛傝崅懍側傕偺傪捛媮偟丄旕忢偵擄夝側儘僕僢僋偱峔惉偝傟偰偄傞傾儖僑儕僘儉傕彮側偔偁傝傑偣傫丅偦傟傜偼変乆偑偪傚偭偲巚偄偮偄偨傛偆側儘僕僢僋偲偼堘偄傑偡丅娙扨側偺偼杮摉偵弶婜偺崰偺扤傕偑峫偊晅偔傛偆側儘僕僢僋傪巊梡偟偨傾儖僑儕僘儉偩偗偱偡丅

側偤偙偺傛偆側偙偲傪弎傋傞偐偲偄偆偲丄娙扨側傾儖僑儕僘儉偲巚偄崬傫偱丄偄偞棟夝偟傛偆偲偡傞偲偦偺嬌尷傑偱愻楙偝傟偨傾儖僑儕僘儉傪僀儊乕僕偟偒傟偢丄屻偺復偵峴偔慜偵婥棊偪丄偁傞偄偼嵙愜偟偰偟傑偆壜擻惈偑峫偊傜傟傞偐傜偱偡丅

杮曇偼傓偟傠偙偺杮偺拞偱堦斣擄夝側復偲尵偭偰傕偄偄偔傜偄偱偡丅偱偡偺偱丄怱偟偰撉攋偟偰偔偩偝傞傛偆偍婅偄偟傑偡丅

傑偨丄偙偺斈梡傾儖僑儕僘儉曇偑擄偟偄偲姶偠傞偺偱偁傟偽屻偵恑傫偱偔偩偝偄丅屻偺復偺傎偆偑娙扨偱偁傞偙偲偑懡偄偺偱偡偐傜丅

彮側偔偲傕巹偵偲偭偰丄婎杮傾儖僑儕僘儉偼丒丒丒

 

儀僋僩儖夝愅傛傝傕丄

帺慜X僼傽僀儖偺愝寁傛傝傕丄

LightWave偺僆僽僕僃僋僩丒僔乕儞仺X僼傽僀儖曄姺傛傝傕丄

COM僒乕僶乕偺幚憰傛傝傕丄

僗僉儞傾僯儊乕僔儑儞偺幚憰傛傝傕丄

A*傾儖僑儕僘儉傛傝傕丄

僋僢僋僩儔儞僗僔僃乕僟乕傪幚憰偡傞傛傝傕丄

 

丒丒丒乬偼傞偐偵乭擄偟偄偱偡丅

 

堦尒丄崅搙偐偮愭恑揑側媄弍偱傕丄擄偟偔姶偠偝偣偰偄傞偺偼幚偼乬巇條偺忣曬廂廤乭嶌嬈偱偁偭偰丄儘僕僢僋偦偺傕偺偱偼側偄偙偲偑彮側偔偁傝傑偣傫丅乬惢嶌幰懁偑帩偭偰偄傞忣曬乭傪抦傜側偗傟偽偳傫側揤嵥偱傕暘偐傞偼偢偑側偔丄尰幚偼傑偝偵丄偦傟傜偺忣曬偑揱傢傝偵偔偄偺偑尰忬偱偡丅乮偦偺偨傔偵杮彂偍傛傃椶彂偑偁傞傢偗偱偡偑乯

偦傟偵懳偟婎杮傾儖僑儕僘儉偼丄for暥傗if暥偲尵偭偨扤偱傕抦偭偰偄傞奣擮偺傒偱峔惉偝傟偰偄傞偺傕娭傜偡丄棟夝偱偒側偄偲偄偆忬嫷偑懡偔偁傝傑偡丅偁傞堄枴丄僙儞僗丒擻椡偑嵟傕栤傢傟傞暘栰偱偡丅杮彂偑偳傟傎偳夝愢偟偰傕丄壗10儁乕僕傪愢柧偵妱偄偨偲偟偰傕丄帺暘帺恎偱峫偊丄摢偺拞偵撈帺偺僀儊乕僕傪昤偐側偗傟偽丄偦傟埲忋棟夝偑恑傑側偄偲偄偆弖娫偼昁偢棃傑偡丅偙傟偽偭偐傝偼偳偆偟傛偆傕偁傝傑偣傫丅

摿偵僜乕僩偼偙傟埲忋僜僼傿僗僥傿働乕僩偱偒側偄偲偄偆偲偙傠傑偱嬌搙偵惛楤偝傟偒偭偰偄傞偺偱丄攏幁偵偟偰偄傞偲偐側傝偺崅妋棪偱曉傝摙偪偵憳偆偱偟傚偆丅

 

偝偰丄嵟弶偺2偮丄乽儕儞僋僪丒儕僗僩乿偲乽栘乿偼乽拪徾僨乕僞峔憿乿偲屇偽傟傞傛偆偵丄傾儖僑儕僘儉偱偁傝側偑傜丄僨乕僞峔憿偱傕偁傝傑偡偐傜丄婎杮傾儖僑儕僘儉偺拞偺偝傜偵婎杮傾儖僑儕僘儉偲偱傕尵偊傞偱偟傚偆丅傕偪傠傫乬傾儖僑儕僘儉乭側傢偗偱偡偐傜丄儅僔儞岅偵11揑偵懳墳偡傞傕偭偲傕扨弮側僨乕僞峔憿偱偁傞攝楍偲偼堎側傝丄僾儘僌儔儅乕偺岺晇偵傛傝幚憰偱偒傞乮偟側偔偰偼側傜側偄乯壗傜偐偺巇慻傒傪帩偭偰偄傑偡丅

僜乕僩傗僷僞乕儞儅僢僠儞僌偵斾傋傞偲扨弮偱丄偙偺2偮偑棟夝偱偒側偄偲偄偆偙偲偼偁傑傝柍偄偲巚偄傑偡丅

傑偢偼偦偺2偮偐傜奐巒偟傑偟傚偆丅

 

侾復丂儕儞僋僪儕僗僩

摨偠宆偺側傫傜偐偺僨乕僞側偄偟偼僆僽僕僃僋僩偼攝楍偵偟傑偡傛偹丅

攝楍傪巊偭偰偄偰乽梫慺悢傪搑拞偱憹傗偣偨傜側偀乧乿偲巚偭偨偙偲偼扤偟傕偁傞偺偱偼側偄偱偟傚偆偐丠

儕儞僋僪丒儕僗僩乮Linked List側傜偦傟偑弌棃傑偡丅

傑偨丄攝楍撪偵怴偟偄僨乕僞傪憓擖偡傞応崌丄応強傪嬻偗傞偨傔偵慜屻偺梫慺慡偰傪偄偭偣偄偵堏摦偟側偗傟偽側傜側偄偙偲偵旕岠棪偝傪姶偠偨偙偲偼側偄偱偟傚偆偐丠

偙傟傕儕儞僋僪儕僗僩側傜岠棪揑偵弌棃傑偡丅

 

儕儞僋僪丒儕僗僩偼拪徾僨乕僞峔憿偺側偐偱偼嵟傕扨弮側傕偺偱偡丅偦偺峔憿偼1師尦側偺偱慄宍儕僗僩偲傕屇偽傟丄乮懡師尦偺奒憌傪帩偮儕儞僋僪儕僗僩傕偁傝傑偡偑彍偒傑偡乯丄儕儞僋僪儕僗僩傪夝愢偡傞応崌丄攝楍偲懳斾偡傞偲偦偺巇慻傒傗棙揰偑柧妋偵側傝傑偡丅

攝楍偺峔憿偼扤傕偑暘偐偭偰偄傞扨弮側傕偺偱偟傚偆丅攝楍偼扨偵愰尵偝偊偡傟偽傛偔丄宆掕媊傗帠慜弨旛偼梫傝傑偣傫傛偹丅傑偨丄梫慺傊偺傾僋僙僗偼扨偵揧偊帤偱堦敪傾僋僙僗偑壜擻偱偡丅

椺偊師偺傛偆偵丅

INT a[10];

a[3]=12;

 

堦曽儕儞僋僪儕僗僩偵偍偄偰乬梫慺乭偼乬僲乕僪乭偲屇偽傟傑偡偑丄傑偢偼僲乕僪偺峔憿懱傪掕媊偟側偔偰偼側傝傑偣傫丅奺僲乕僪偵偳偺傛偆側僨乕僞傪帩偨偣傞偐偼傕偪傠傫帺桼偱偡偑丄昁偢師偺僲乕僪傊偺億僀儞僞乕傪帩偨偣傑偡丅偙偺億僀儞僞乕傪乬儕儞僋乭偲屇傃丄偙傟偑儕儞僋僪儕僗僩偲屇偽傟傞強埲偱偡丅偦偆偡傞偙偲偵傛傝丄擟堄偺僲乕僪偐傜懠偺慡偰偺僲乕僪偵傾僋僙僗偁傞偄偼僲乕僪偺僩儔僶乕僗乮憱嵏乯偑壜擻偵側傝傑偡丅

 

攝楍偺椺偲摨條偵梫慺乮僲乕僪乯偑10屄偺儕儞僋僪儕僗僩傪婡擻偝偣傞偨傔偵偼師偺傛偆偵側傝傑偡丅

struct NODE

{

        NODE* pNext;仼師偺僲乕僪傊偺億僀儞僞

        INT Data;仼側傫傜偐偺僨乕僞

};

 

NODE* a[10];

 

for(i=0;i<10;i++)

{

        a[i]=new NODE;

        a[i]->pNext=a[i+1];

}

a[3]->Data=12;

 

1-1

 

儕儞僋僪儕僗僩偵偍偄偰奺僲乕僪偼昁偢偟傕儊儌儕偵弴斣偳偍傝偵攝抲偝傟傑偣傫丅捠忢偼慡偰偺梫慺偑寗娫柍偔儊儌儕偵攝抲偝傟傞偙偲偼傎偲傫偳偁傝傑偣傫丅乮偁傞僞僀儈儞僌偵偺傒儕儞僋僪儕僗僩傪弶婜壔偟偨弖娫偼寗娫柍偔攝抲偝傟傞壜擻惈偼崅偄偱偡偑乯偦傟偼丄揧偊帤偱楢斣揑偵傾僋僙僗偱偒側偄偲偄偆偙偲傪堄枴偟傑偡丅擟堄偺僲乕僪偵偨偳傝拝偔傑偱弴斣偵儕儞僋傪扝偭偰偄偐側偗傟偽側傝傑偣傫丅乮僩儔僶乕僗偟側偗傟偽側傝傑偣傫乯

1-2

 

1-3

儕儞僋僪儕僗僩偺奺僲乕僪偼捠忢僶儔僶儔偵儊儌儕忋偵懚嵼偟傑偡偑丄榑棟攝抲偼楢懕偟偰偄傑偡丅奺僲乕僪偺儊儌儕忋偺埵抲偵娭傜偢1偮偺乬儕僗僩乭偲偟偰傑偲傔傞偙偲偑儕儞僋僪儕僗僩側偺偱偡偐傜摉慠偱偡丅

奺僲乕僪傪堎側傞僞僀儈儞僌偱惗惉偟丄儊儌儕忋偺埵抲偑傑偭偨偔楢懕偟偰偄側偔偰傕儕儞僋偵傛偭偰宷偘傞偙偲偵傛傝丄擟堄偺僲乕僪偐傜儕僗僩撪偺慡偰偺僲乕僪偵偨偳傝拝偔偙偲偑偱偒傑偡丅尵偄曽傪曄偊傟偽堎側傞僞僀儈儞僌偱惗惉偱偒傞偺偱丄僲乕僪偺捛壛偑壜擻側偺偱偡丅

 

偝偰丄朻摢偱婛偵弎傋傑偟偨偑丄儕儞僋僪儕僗僩偺摿挜偲偟偰堦斒揑偵尵傢傟偰偄傞偺偼師偺俀揰偱偡丅

 

嘆丂摦揑偵偦偺僒僀僘傪憹尭偝偣傞偙偲偑偱偒傞丅攝楍偱偼梫慺悢傪搑拞偱憹傗偡偙偲偼偱偒傑偣傫偑丄儕儞僋僪儕僗僩偼壗帪偱傕僲乕僪傪憹傗偟偨傝尭傜偟偨傝帺桼偵弌棃傑偡丅

 

嘇丂僲乕僪乮攝楍偱尵偆偲偙傠偺梫慺乯傪乬憓擖乭偡傞僐僗僩偑埨偄乮張棟懍搙偑懍偄乯丅

 

偟偐偟丄偙偺乬桪傟偰偄傞乭偲尵傢傟傞摿挜偺椉曽偵偮偄偰戝偒側棊偲偟寠偑偁傝傑偡丅

偲偄偆偺偼丄嘆偼攝楍偱傕偱偒傞偺偱儕儞僋僪儕僗僩偺摿挜偲偼尵偊傑偣傫偟丄偦偟偰嘇傕堦尒偟偰慺惏傜偟偔尒偊傑偡偑丄偁傞棊偲偟寠偑偁傞偐傜偱偡丅

 

偙偙偱偁偊偰乮昅幰揑側乯寢榑傪愭偵弎傋傞偲丄僎乕儉偵偍偄偰儕儞僋僪儕僗僩偺巊偄偳偙傠偼偁傑傝偁傝傑偣傫丅張棟帪娫偑偳偆偱傕偄偄偺側傜暿偱偡偑丅儕儞僋僪儕僗僩偼扨偵擟堄偺僲乕僪偵傾僋僙僗偡傞偺偵偡傜帪娫偑偐偐傝傑偡丅懍偄偲偝傟偰偄傞憓擖乮媦傃嶍彍乯傕乬嶍彍偡傞偨傔偵偼僩儔僶乕僗偑昁梫乭偱偁傝丄憓擖丒嶍彍偺弖娫偩偗偺幚峴懍搙偺懍偝偵閤偝傟偰偼偄偗側偄偺偱偡丅椺偊偽愭摢偐傜7斣栚偺僲乕僪傪嶍彍偡傞応崌丄愭摢偐傜7夞儕儞僋傪扝偭偰弶傔偰嶍彍偱偒傞偺偱偡丅

傕偭偲傕攝楍偵偍偗傞憓擖張棟偱応強傪嬻偗傞偨傔偵攏幁惓捈偵慜屻偺梫慺慡偰傪僑僢僜儕堏摦偟偨傝偟偨傜丄岎姺偺張棟僐僗僩偼崅偄偱偡偐傜僩儔僶乕僗偺暘傪峫偊偰傕儕儞僋僪儕僗僩偺傎偆偑偁傞偐偵崅懍偵側傝傑偡丅偦傫側偙偲傪偟側偔偰傕攝楍偱偺憓擖偵偼偙傟傪夞旔偡傞僩儕僢僋偑偁傝傑偡丅

偦偟偰摦揑側儊儌儕妋曐偱偡偑丄攝楍偱傕嵟弶偵廫暘側億僀儞僞乕宆攝楍傪嶌偭偰偍偒丄昁梫偵側偭偨傜昁梫側暘偩偗儊儌儕妋曐偡傟偽偄偄偩偗偺偙偲偱偡丅億僀儞僞乕暘偺儊儌儕傕屌掕揑偵妋曐偟偰偍偒偨偔側偄偲偄偆偺偱偁傟偽丄億僀儞僞乕偺億僀儞僞乕傪掕媊偟丄摦揑妋曐偡傞偙偲偩偭偰弌棃傑偡丅

攝楍偵偍偗傞摦揑側儊儌儕妋曐丄梫慺偺捛壛丄偍傛傃憓擖僩儕僢僋偵偮偄偰偼2復偱幚嵺偺僐乕僪傪帵偟傑偡丅

 

偱偼丄儕儞僋僪儕僗僩偵娭傞張棟傪幚嵺偺僐乕僪偱尒偰偄偒傑偟傚偆丅

 

1-1 僲乕僪偺捛壛乮惗惉乯

僒儞僾儖僾儘僕僃僋僩柤丂儕儞僋僪儕僗僩乮惗惉丒捛壛乯

 

僲乕僪偺惗惉偼丄僲乕僪傪儕僗僩偵捛壛偡傞偙偲偱傕偁傝傑偡丅儕儞僋僪儕僗僩偱嵟傕婎杮揑偱廳梫側憖嶌偱偟傚偆丅

傑偢偼丄僲乕僪傪掕媊偟側偔偰偼側傝傑偣傫丅僲乕僪偺掕媊偼偨偲偊偽師偺傛偆偵偟傑偡丅

struct NODE

{

        INT Index;

        NODE* pNext;

};

扨弮偱偡丅NODE* pNext偲偟偰昁偢師偺儌乕僪傊偺億僀儞僞乕乮儕儞僋乯傪帩偨偣偰偝偊偡傟偽丄偁偲偼帺桼偵岲偒側偩偗僨乕僞傪帩偨偣傑偡丅偙偙偱偼娙扨偺偨傔Index偲偄偆INT宆僨乕僞傪1屄偺傒掕媊偟偰偄傑偡偑丄尵偆傑偱傕側偔偳偺傛偆側僨乕僞傪壗屄偱傕帩偨偣傞偙偲偑偱偒傑偡丅捠忢偼偦偺傛偆側宍偵側傞偱偟傚偆丅

 

僲乕僪偺宆偑偳偺傛偆側傕偺偐暘偐偭偨偲偙傠偱丄幚嵺偵偙偺僲乕僪傪偳偺傛偆偵惗惉偡傞偺偐夝愢偟傑偟傚偆丅

傑偢丄儕僗僩偺愭摢偲怟旜乮嵟弶偺僲乕僪偲嵟屻旜偺僲乕僪乯偺億僀儞僞乕偩偗偼帠慜偵惗惉偟偰偍偒傑偡丅弨旛偲偟偰偼偙傟偩偗偱偡丅

僒儞僾儖偱偼丄愭摢傪Head丄怟旜傪Tail偲偟偰偄傑偡丅

NODE* Head = new NODE;

NODE* Tail = new NODE;

尩枾偵恾帵偡傞偲偟偨傜師偺傛偆偵側傝傑偡偑丄崿棎偡傞偺偱嵶偐偔恾帵偟傑偣傫丅乮偦傕偦傕丄杮摉偵嵶偐偔彂偙偆偲偟偨傜僉儕偑柍偄偺偱乯

1-4

 

僔儞僾儖偵恾帵偡傞偲師偺傛偆偵側傝傑偡丅

1-5

 

Head->pNext=Tail;

Tail->pNext=NULL;

 

1-6

 

 

捛壛偲憓擖偼憖嶌偲偟偰偼摨偠偙偲偱偡丅偨偩丄憓擖偼偡偱偵僀儞僗僞儞僗偑惗惉偝傟偰偄傞応崌偑峫偊傜傟傞偺偱慡偔偺摨媊偱偼偁傝傑偣傫丅傑偢僀儞僗僞儞僗傪new偵傛傝惗惉偟儕僗僩偵壛偊傑偡乮宷偘傑偡乯丅壛偊傞応強偼偳偙偱傕峔偄傑偣傫偑丄捠忢偼愭摢偺慜屻偐怟旜偺慜屻偵宷偘傑偡丅偙偙偱偼怟旜偵宷偘偰偄傑偡丅

Tail->pNext = new NODE;

 

1-7

偙偺帪揰偱惗惉偟偨僀儞僗僞儞僗偼乬堦弖乭偩偗怟旜乮Tail乯偺師偺僲乕僪乮儕儞僋愭乯偵側偭偰偄傑偡丅偮傑傝丄怴偨側僲乕僪偑怟旜傛傝屻傠偵埵抲偟偰偟傑偭偰偄傑偡丅

偙傟傪廋惓偡傞偨傔偵丄偦偺師偺峴偱偡偖偵怟旜傪杮棃偺怟旜偺埵抲偵栠偟傑偡丅

Tail=Tail->pNext;

1-8

埲忋偱丄僲乕僪偺惗惉媦傃捛壛偵偐偐傞夝愢偼廔椆偱偡丅嶲峫偲妋擣偺偨傔偵丄僒儞僾儖傪挱傔偰偔偩偝偄丅

 

儕儞僋僪儕僗僩乮惗惉丒捛壛乯僒儞僾儖僐乕僪

#include <conio.h>

#include <stdio.h>

#include <windows.h>

//宆掕媊

struct NODE

{

       INT Index;

       NODE* pNext;

};

//

//VOID main()

//僄儞僩儕乕億僀儞僩

VOID main()

{

        INT Amount=0;

 

        NODE* pTmp;

        NODE* Head = new NODE;

       NODE* Tail = new NODE;

       Head->pNext=Tail;

       Tail->pNext=NULL;

 

        //惗惉偲昞帵    

        while(!kbhit())

        {      

                printf("\n捛壛惗惉丗y  廔椆丗n \n");

                CHAR c=getch();                

                if(c=='y')

                {

                        //惗惉              

                     Tail->pNext = new NODE;

                        Tail->Index=Amount;

                        Tail=Tail->pNext;

                     Tail->pNext=NULL;

                        Amount++;

                        //昞帵

                        pTmp=Head->pNext;

                        while(  pTmp->pNext != NULL)

                        {

                                printf("%d ",pTmp->Index);

                                pTmp=pTmp->pNext;              

                        }                      

                }

                //廔椆

                else if(c=='n')

                {

                        break;

                }

        }

        //慡偰奐曻

        NODE* pTmp2;

        pTmp2=Head->pNext;

        pTmp=Head;

        while(  pTmp->pNext != NULL)

        {

                delete pTmp;

                pTmp = pTmp2;

                pTmp2 = pTmp2->pNext;          

        }      

}

偙偺僒儞僾儖偼丄儐乕僓乕偵僉乕擖椡傪懀偟丄y僉乕偱怴偨側僲乕僪傪惗惉偟丄儕僗僩偵壛偊傑偡丅

妋擣偲偟偰丄Index儊儞僶偵楢斣傪擖傟偰偦傟傪昞帵偡傞傛偆偵偟偰偄傑偡偑丄惗惉偺杮幙晹暘偼傢偢偐側僐乕僪偱偡丅傑偨僲乕僪偺憤悢傪曐帩偡傞Amount偲偄偆曄悢傪巊梡偟偰偄傑偡丅捠忢偼偙偺傛偆側曄悢偑昁梫偵側傝傑偡丅

HeadTail偼婡擻偲偟偰偼僟儈乕偺僀儞僗僞儞僗偱偡丅

19

 

偪側傒偵丄怟旜傪梡堄偟側偔偰傕儕儞僋傪偮側偘偰偄偔偙偲偑偱偒傑偡丅傕偭偲尵偊偽愭摢偡傜側偔偰傕儕儞僋傪嶌偭偰偄偔偙偲偼偱偒傑偡丅偨偩丄偦偺応崌丄儕僗僩偺憖嶌偵娭傞僐乕僪偼悢峴懡偔側偭偰偟傑偄幚峴懍搙偵塭嬁偟傑偡丅傑偨丄僒儞僾儖偱偼HeadTail偺僀儞僗僞儞僗傪惗惉偟偰偄傑偡偑丄僀儞僗僞儞僗偱偼側偔扨側傞億僀儞僞乕偱偁偭偰傕婡擻偝偣傞偙偲偑偱偒傑偡丅偙偺応崌傕傗偼傝僐乕僪偼悢峴懡偔側偭偰偟傑偄傑偡丅

 

1-2 僲乕僪偺憓擖

僒儞僾儖僾儘僕僃僋僩柤丂儕儞僋僪儕僗僩乮憓擖乯

憓擖偲捛壛偼帡偰偄傑偡偑丄偙偙偱尵偆憓擖偲偼儕僗僩偺嵟屻旜偱偼側偔儕僗僩偺搑拞偵嵎偟崬傓偙偲偱偡丅扨偵偳偙偱傕偄偄偐傜捛壛偡傞偲偄偆傕偺偱偼側偔丄僨乕僞偺弴斣摍偱堄恾偟偨応強偵嵎偟崬傒偨偄応崌偵峴偆憖嶌偱偡丅

扨側傞攝楍撪偵憓擖偡傞応崌丄慜屻偺梫慺傪堦惸偵堏摦偟偰丄憓擖偡傞抧揰傪嬻偗側偗傟偽側傝傑偣傫丅

偟偐偟丄儕儞僋僪儕僗僩偵偍偄偰憓擖偼旕忢偵娙扨偵峴偊傑偡丅偟偐傕儕僗僩偺挿偝偵埶懚偣偢丄乬憓擖張棟帺懱乭偼忢偵堦掕偺幚峴懍搙偱憖嶌偑姰椆偡傞偲偄偆摿挜偑偁傝傑偡丅乮偨偩偟丄憓擖偡傞偨傔偵偼帠慜偵僩儔僶乕僗偑昁梫乯

 

崱丄偁傞儕僗僩偺搑拞偱僲乕僪P1偲僲乕僪P2偑椬偳偆偟偱偁傞側傜丄儕儞僋偼師偺傛偆偵側偭偰偄傑偡丅

P1->Next=P2;

1-10

 

偦偙偵僲乕僪X傪憓擖偡傞応崌丄

1-11

傑偢P1偺儕儞僋愭傪X偵宷偓姺偊傑偡丅

P1->Next=X;

1-12

 

偦偟偰丄X偺儕儞僋傪P2偵宷偘傑偡丅

X->Next=P2;

1-13

 

1-14

 

偙傟偱姰椆偱偡丅偙傟偩偗傪尒傞偲夋婜揑偲傕尵偊傞僔儞僾儖偝偱偡丅

 

僒儞僾儖偱偼慡偔摨偠偙偲傪峴偭偰偄傑偡丅僲乕僪X帺懱傪new偡傞張棟偲丄Index偵抣傪擖傟傞張棟偱懡彮僐乕僪偑懡偔側偭偰偄傑偡偑丄憓擖偺尨棟偼慡偔摨偠傕偺偱偡丅

115

 

愭摢偐傜n斣栚偺僲乕僪偲丄偦偺師偺僲乕僪偺娫偵憓擖偟傑偡丅pTmp偑巜偡僲乕僪偲pTmp2偑巜偡僲乕僪偺娫偵惗惉偟偨僲乕僪傪擖傟偰偄傑偡丅

pTmp=Head;

for(i=0;i<n;i++)

{

        pTmp=pTmp->pNext;

}

pTmp2=pTmp->pNext;

pTmp->pNext=new NODE;

pTmp->pNext->Index=Index;

pTmp->pNext->pNext=pTmp2;

 

帠慜偺僩儔僶乕僗傗杮幙偱偼側偄晹暘傪徣偔偲暘偐傝堈偄偲巚偄傑偡丅

pTmp2=pTmp->pNext;

pTmp->pNext=new NODE;

pTmp->pNext->pNext=pTmp2;

 

偄偪偍偆僒儞僾儖偺慡僐乕僪傪宖嵹偟偰偍偒傑偡偺偱挱傔偰偔偩偝偄丅

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

//宆掕媊

struct NODE

{

        INT Index;

        NODE* pNext;

        NODE()

        {

                Index=0;

                pNext=NULL;

        }

};

//

//VOID main()

//僄儞僩儕乕億僀儞僩

VOID main()

{

        INT Amount=0;

        INT i=0;

        INT n=0;

        INT Index=0;

        CHAR String[10]={NULL};

 

        NODE* pTmp;

        NODE* pTmp2;

        NODE* Head = new NODE;

        NODE* Tail = new NODE;

        Head->pNext=Tail;

        Tail->pNext=NULL;

        //弶婜忬懺儕僗僩偺惗惉偲昞帵

        //偲傝偁偊偢10屄惗惉丅乮僿僢僪偲僥僀儖傪偁傢偣傞偲12屄乯       

        while(Amount<10)

        {

                Tail->pNext = new NODE;

                Tail->Index=Amount;

                Tail=Tail->pNext;

 

                printf("%3d ",Amount);

                Amount++;              

        }      

        Tail->pNext=NULL;

        //憓擖偲昞帵

        while(!kbhit())

        {      

                printf("\n捛壛:a  廔椆:e \n");

                CHAR c=getch();

 

                //僿僢僪偐傜悢偊偰n斣栚偵憓擖

                switch(c)

                {

                case 'a':                      

                        printf("偦偺僲乕僪偺抣傪巜掕偟偰偔偩偝偄\n");

                        gets(String);

                        Index=atoi(String);    

                        printf("偳偙偵憓擖偟傑偡偐丠乮僛儘偐傜乯\n");

                        gets(String);

                        n=atoi(String);

 

                        pTmp=Head;

                        for(i=0;i<n;i++)

                        {

                                pTmp=pTmp->pNext;

                        }

                        pTmp2=pTmp->pNext;

                        pTmp->pNext=new NODE;

                        pTmp->pNext->Index=Index;

                        pTmp->pNext->pNext=pTmp2;

                       

                        Amount++;              

                        break;

                        //廔椆

                case 'e':

                        goto out;

                        break;

                }

                //昞帵

                {                      

                        //僲乕僪偑曐帩偡傞僀儞僨僢僋僗

                        pTmp=Head->pNext;

                        while(  pTmp->pNext != NULL)

                        {

                                printf("%3d ",pTmp->Index);

                                pTmp=pTmp->pNext;              

                        }                              

                }      

        }

out:

        //慡偰奐曻     

        pTmp2=Head->pNext;

        pTmp=Head;

        while(  pTmp->pNext != NULL)

        {

                delete pTmp;

                pTmp = pTmp2;

                pTmp2 = pTmp2->pNext;

        }

}

 

 

1-3 僲乕僪偺嶍彍

僒儞僾儖僾儘僕僃僋僩柤丂儕儞僋僪儕僗僩乮嶍彍乯

嶍彍偼憓擖偺媡憖嶌偱偁傝丄巇慻傒偼憓擖偲摨偠偱偡丅偮傑傝丄嶍彍帺懱偼儕儞僋傪宷偓姺偊傞偩偗偲偄偆娙扨側傕偺偱偡丅

崱丄偁傞儕僗僩偺搑拞偱僲乕僪P1偲僲乕僪P2偺娫偵僲乕僪X偑偁傞側傜丄儕儞僋偼師偺傛偆偵側偭偰偄傑偡丅

P1->Next=X;

X->Next=P2;

1-16

 

僲乕僪X傪嶍彍偡傞応崌丄傑偢

P1偺儕儞僋愭傪P2偵宷偓姺偊傑偡丅偙傟偱X偼儕僗僩偐傜奜偝傟丄傕偼傗儕儞僋傪扝偭偰傕X傪尒偮偗傞偙偲偼偱偒側偔側傝傑偡丅

 

P1->Next=P2;

1-17

 

儕僗僩偐傜偺嶍彍偼偙傟偩偗偱偡丅憓擖傛傝傕1岺掱彮側偔1僗僥僢僾偱幚尰偱偒傑偡丅

偨偩丄捠忢偼儊儌儕偐傜傕嶍彍偡傞偺偱

delete X;

傪幚峴偟傑偡丅

1-18

 

偙傟偱姰帏偱偡丅

 

僒儞僾儖偱偼師偺僐乕僪偵傛傝丄愭摢偐傜n斣栚偺僲乕僪偺師偺僲乕僪傪嶍彍偟偰偄傑偡丅

pTmp=Head;

for(i=0;i<n;i++)

{

        pTmp=pTmp->pNext;

}

pTmp2=pTmp->pNext;

pTmp->pNext = pTmp->pNext->pNext;

delete pTmp2;

Amount--;

慜敿偺儖乕僾偑廔椆偟偨帪揰偱丄pTmp偼愭摢偐傜n斣栚偺僲乕僪傪巜偟偰偄傑偡丅

 

偦偺師偺僲乕僪傪pTmp2偵堦扷曐懚偟偰偍偒傑偡丅

pTmp2=pTmp->pNext;

曐懚偡傞棟桼偼丄偦偺壓偺峴偱儕僗僩偐傜奜偡偲傕偼傗僩儔僶乕僗偱億僀儞僞傪尒偮偗傞偙偲偑偱偒側偔側傞偨傔偱偡丅

 

n斣栚偺僲乕僪偺儕儞僋愭傪堦屄旘偽偟偰挘傝傑偡丅偮傑傝娫偺僲乕僪乮Tmp2偑巜偡僲乕僪乯傪儕僗僩偐傜奜偟傑偡丅

pTmp->pNext = pTmp->pNext->pNext;

 

曐懚偟偰偍偄偨乮Tmp2偑巜偡僲乕僪偺乯傾僪儗僗偵傛傝儊儌儕偐傜傕嶍彍偟傑偡丅

delete pTmp2;

 

 

偄偪偍偆僒儞僾儖偺慡僐乕僪傪宖嵹偟偰偍偒傑偡偺偱挱傔偰偔偩偝偄丅

119

 

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

//宆掕媊

struct NODE

{

        INT Index;

        NODE* pNext;

 

};

//

//VOID main()

//僄儞僩儕乕億僀儞僩

VOID main()

{

        INT Amount=0;

        INT i=0;

        INT n=0;

        INT Index=0;

        CHAR String[10]={NULL};

 

        NODE* pTmp;

        NODE* pTmp2;

        NODE* Head = new NODE;

        NODE* Tail = new NODE;

        Head->pNext=Tail;

        Tail->pNext=NULL;

        //弶婜忬懺儕僗僩偺惗惉偲昞帵

        //偲傝偁偊偢10屄惗惉丅乮僿僢僪偲僥僀儖傪偁傢偣傞偲12屄乯       

        while(Amount<10)

        {

                Tail->pNext = new NODE;

                Tail->Index=Amount;

                Tail=Tail->pNext;              

 

                //printf("%3d ",Amount);

                Amount++;              

        }

        Tail->pNext=NULL;

        //捛壛偲昞帵

        while(!kbhit())

        {      

                //昞帵

                {                      

                        //僲乕僪偑曐帩偡傞僀儞僨僢僋僗

                        pTmp=Head->pNext;

                        while(  pTmp->pNext != NULL)

                        {

                                printf("%3d ",pTmp->Index);

                                pTmp=pTmp->pNext;              

                        }                      

                }

                printf("\n嶍彍:d  廔椆:e \n");

                CHAR c=getch();

 

                //僿僢僪偐傜悢偊偰n斣栚傪嶍彍

                switch(c)

                {

                case 'd':      

                        printf("壗斣栚傪嶍彍偟傑偡偐丠\n");

                        gets(String);

                        n=atoi(String);

                               

                        pTmp=Head;

                        for(i=0;i<n;i++)

                        {

                                pTmp=pTmp->pNext;

                        }

                        pTmp2=pTmp->pNext;

                        pTmp->pNext = pTmp->pNext->pNext;

                        delete pTmp2;

                        Amount--;              

                        break;

                        //廔椆

                case 'e':

                        goto out;

                        break;

                }

                       

        }

out:

        //慡偰奐曻     

        pTmp2=Head->pNext;

        pTmp=Head;

        while(  pTmp->pNext != NULL)

        {

                delete pTmp;

                pTmp = pTmp2;

                pTmp2 = pTmp2->pNext;          

        }      

}

 

1-4 僲乕僪偺慡嶍彍乮儊儌儕偺奐曻乯

 

偦偺儕儞僋僪儕僗僩帺懱偑晄梡偵側偭偨応崌偼丄偦偺儕儞僋僪儕僗僩偑愯傔偰偄傞儊儌儕傪慡偰奐曻偡傞傢偗偱偡偑丄偙傟偼師偺僐乕僪偺傛偆偵側傝傑偡丅

 

NODE* pTmp, pTmp2;

 

//慡偰奐曻

pTmp=Head;

pTmp2=Head->pNext;

while(  pTmp->pNext != NULL)

{

        delete pTmp;

        pTmp = pTmp2;

        pTmp2 = pTmp2->pNext;

}

愭摢偐傜弴偵丄屄乆偺僲乕僪傪奐曻偟側偑傜儕儞僋傪弴偵扝偭偰偄偗偽偄偄偱偟傚偆丅

 

旛峫

師僲乕僪傊偺儕儞僋偩偗偱偼側偔乬捈慜偺乭僲乕僪傊偺儕儞僋傕帩偨偣傞偲媡曽岦僩儔僶乕僗偑壜擻偵側傝傑偡丅乮摉偨傝慜偱偡偹乯丅傑偨丄巇條偵傛偭偰偼怟旜偺儕儞僋愭傪愭摢偵偡傞偲傛傝僐乕僪偑僔儞僾儖偵側傞働乕僗偑偁傝傑偡丅

偪側傒偵慜幰偼憃曽岦儕儞僋僪儕僗僩丄屻幰偼弞娐儕儞僋僪儕僗僩偲屇偽傟偰偄傑偡丅

杮復偺儕僗僩偼曅曽岦儕儞僋僪儕僗僩偲屇偽傟傞傕偺偱偡丅曅曽岦儕儞僋僪儕僗僩偑棟夝偱偒傟偽丄偦傟傜偺儕儞僋僪儕僗僩傪僐乕僨傿儞僌偡傞偙偲偼娙扨偱偁傞偲尵偊傑偡丅

 

2 摨條偺憖嶌傪億僀儞僞乕偲攝楍偩偗偱峴偆

攝楍偼峔憿忋摦揑偵偦偺梫慺偺悢傪憹尭偱偒傑偣傫丅偟偐偟丄攝楍傪巊偭偰摦揑偵梫慺偺悢傪憹尭偝偣傞偙偲偼弌棃傑偡丅乿

 

杮復偺嵟弶偱彂偄偨傛偆偵丄摿偵儕儞僋僪儕僗僩傪巊梡偟側偔偲傕丄暋悢僆僽僕僃僋僩偺儊儌儕妋曐傪敽偆摦揑捛壛丄偍傛傃崅懍側憓擖丒嶍彍偼壜擻偱偁傝丄傓偟傠儕儞僋僪儕僗僩傛傝傕崅懍偱偡丅

 

傑偢偼摦揑妋曐偵偮偄偰丄2偮偺曽朄傪夝愢偟傑偡丅

1偮栚偺曽朄偼丄廫暘側悢偺億僀儞僞乕攝楍傪梡堄偟偰偍偔偲偄偆傕偺偱丄昅幰偲偟偰偼偙偺曽朄偩偗偱廫暘偩偲巚偭偰偄傑偡丅

2偮栚偺曽朄偼丄億僀儞僞乕攝楍偡傜梡堄偡傞昁梫偑偁傝傑偣傫丅

 

2-1帠慜偵億僀儞僞乕攝楍傪廫暘側悢偩偗梡堄偡傞曽朄

 

僒儞僾儖僾儘僕僃僋僩柤丂攝楍偱偺摦揑妋曐

僨乕僞傪傑偲傔偰愰尵偡傞応崌偵偍偄偰丄捠忢偼師偺傛偆偵攝楍愰尵偟傑偡偹丅

SOMETHING Data[1000];

偙偺応崌丄SOMETHING宆偺僀儞僗僞儞僗傪捈偵愰尵偟偰偟傑偭偰偄傞偺偱丄摦揑側怢弅偼弌棃傑偣傫丅

 

僀儞僗僞儞僗傪偺傕偺傪攝楍偵偡傞偺偱偼側偔丄偦偺僀儞僗僞儞僗偺乬億僀儞僞乕乬傪攝楍愰尵偡傞偲丄摦揑偵怢弅偝偣傞偙偲偑偱偒傑偡丅

SOMETHING * pData[1000];

 

慜幰偺応崌偼丄愰尵偲摨帪偵僀儞僗僞儞僗偑惗惉偝傟傞偺偱丄偦偺屻峴偆偙偲偼側偵傕偁傝傑偣傫偑丄億僀儞僞乕攝楍偺応崌偼丄傑偩僀儞僗僞儞僗偼儊儌儕忋偵懚嵼偟傑偣傫丅儊儌儕忋偵偁傞偺偼偁偔傑偱傕1000屄偺億僀儞僞乕偺梾楍偩偗偱偡丅

偱偡偺偱丄婡擻偝偣傞偨傔偵偼傕偪傠傫僀儞僗僞儞僗傪柧帵揑偵惗惉偡傞昁梫偑偁傝傑偡丅

pData[0]= new SOMETHING;

pData[1]= new SOMETHING;

       

       

傑偲傔偰惗惉偡傞応崌偼

pData[0] = new SOMETHING [ (惗惉偟偨偄梫慺悢) ]

 

傑偨丄崱10屄傑偱偺僀儞僗僞儞僗傪婛偵惗惉偟偰偄傞応崌偵,偝傜偵20屄偺梫慺傪捛壛偟偨応崌偼丄忋偺傛偆側彂偒曽偑弌棃側偄偺偱for暥傪巊梡偟偰

for(i=9;i<=9+20;i++)

{

        pData[ i ] = new SOMETHING;

}

側偳偲偟傑偡丅

 

恾偵偡傞偲師偺傛偆偵側傝傑偡丅

21丂僀儞僗僞儞僗偺攝楍

 

22丂億僀儞僞乕偺攝楍

 

僒儞僾儖偱偼丄偙偺庤朄傪偦偺傑傑幚憰偟偰偄傑偡丅

壗偱傕偄偄偺偱偲傝偁偊偢揔摉偵SOMETHING偲偄偆峔憿懱傪掕媊偟丄偦偺僀儞僗僞儞僗傪摦揑偵妋曐偟偰偄傑偡丅

23

#include <stdio.h>

#include <windows.h>

//

//側傫傜偐偺僨乕僞宆

struct SOMETHING

{

        INT Index;

        FLOAT Some;

        DOUBLE Thing;

};

//

//VOID main()

//僄儞僩儕乕億僀儞僩

VOID main()

{

        INT i; 

        //乭億僀儞僞乕乭1000屄梡堄偡傞

        SOMETHING* pSome[1000];

        //椺偊偽100屄暘偺僀儞僗僞儞僗傪惗惉偡傞乮儊儌儕傪妋曐偡傞乯

        for( i=0;i<100;i++)

        {

                pSome[i]=(SOMETHING *) new SOMETHING;

        }

        //偝傜偵捛壛偟偰200屄暘偺僀儞僗僞儞僗傪惗惉偡傞乮儊儌儕傪妋曐偡傞乯

        for( i=99;i<300;i++)

        {

                pSome[i]=(SOMETHING *) new SOMETHING;

        }

 

        //偙傟堏峴偼妋擣偺偨傔偺傕偺

        for( i=0;i<300;i++)

        {

                pSome[i]->Index=i;

                printf("%d ",pSome[i]->Index);

        }

}

億僀儞僞乕傪1000屄梡堄偟偰偄傑偡偺偱丄1000屄傑偱偺梫慺傪摦揑妋曐偱偒傑偡丅

嵟弶偺摦揑妋曐偱偼丄揔摉偵100屄偺梫慺傪捛壛偟偰偄傑偡丅乮僀儞僗僞儞僗傪惗惉偟偰偄傑偡乯

偦傟埲崀偼100屄傑偱偺僀儞僗僞儞僗傪巊梡偡傞偙偲偑偱偒傑偡丅乮僀儞僨僢僋僗揑偵偼99斣栚傑偱偱偡丅乯

偦偟偰丄偙傟傕揔摉偵200屄偺梫慺偑捛壛偱昁梫偵側偭偨偲憐掕偟丄200屄偺僀儞僗僞儞僗傪惗惉偟偰偄傑偡丅偙偺帪揰偱崌寁300屄偺梫慺偑棙梡壜擻偵側偭偰偄傑偡丅300屄埲忋偺梫慺偑昁梫偵側偭偨傜200屄偺梫慺傪捛壛偟偨偲偒偲摨條偺僐乕僪傪彂偔偙偲偵側傝傑偡丅

 

2-2 億僀儞僞乕攝楍帺懱傕摦揑偵妋曐偡傞曽朄乮姰慡側摦揑妋曐乯

僒儞僾儖僾儘僕僃僋僩柤丂攝楍偱偺姰慡摦揑妋曐

慜崁偺庤朄偱偼丄儊儌儕偺摦揑妋曐偲偼尵偊丄帠慜偵乬懡彮乭偺屌掕揑側儊儌儕偑昁梫偱偟偨丅屌掕揑側儊儌儕偲偼億僀儞僞帺懱偺儊儌儕椞堟偺偙偲偱偡丅億僀儞僞乕偱偡偐傜宆偺僒僀僘偵偼埶懚偣偢忢偵4僶僀僩(32bitPC偺応崌)偱偡偐傜丄椺偊偽壗傜偐偺宆乮峔憿懱傕娷傓乯偵偮偄偰1000屄偺億僀儞僞乕傪梡堄偟偨偲偟偰傕4僉儘僶僀僩埲壓偱嵪傒傑偡丅乮僎乕儉偱偼丄僆僽僕僃僋僩偺屄悢偼悢愮屄僆乕僟乕丄懡偔偰傕悢枩屄僆乕僟乕偱偟傚偆丅乯偟偐偟丄偙傟傪乬懡彮乭偲峫偊傞偐乬偗偭偙偆側僒僀僘偩傛乭偲峫偊傞偐偼庡娤傗忬嫷偵傛偭偰堄尒偑暘偐傟傞壜擻惈偑偁傝傑偡丅

偱偼丄1000屄偱偼側偔嵟戝1壄屄偵側傞壜擻惈偑偁傞応崌偼偳偆偱偟傚偆丠1壄屄偩偲梡堄偟側偗傟偽側傜側偄億僀儞僞乕梡偺儊儌儕椞堟偼381儊僈僶僀僩偵傕側傝傑偡丅偙偙傑偱偵側傞偲傕偼傗庡娤揑側栤戣偱偼側偔崱偺PC娐嫬偱偼柧傜偐偵栤戣偱偡丅傑偨偝傜偵丄嵟戝悢偑慡偔枹抦偺応崌丄偮傑傝1壄屄偳偙傠偐10壄丄100壄乧偦傟埲忋偺屄悢偵側傞壜擻惈偑偁傞応崌偼偍庤忋偘偱偡丅傕偭偲傕偦偺傛偆側僨乕僞偵側傞応崌偼丄僀儞僗僞儞僗傪惗惉偟偨屻偵傕懴偊偆傞偩偗偺儊儌儕傪搵嵹偟偰偄側偗傟偽側傜側偄傢偗偱丄偦偺傛偆側娐嫬偵偍偄偰丄億僀儞僞乕梡偺儊儌儕椞堟偼埶慠偲偟偰憡懳揑偵彫偝偄偲偄偆偙偲傕廫暘峫偊傟傜傟傑偡丅

偨偩傗偼傝丄偦偺帪戙偺PC娐嫬偵偍偗傞儊儌儕搵嵹検偵偍偄偰丄億僀儞僞乕梡偵妋曐偟側偔偰偼側傜側偄儊儌儕椞堟偑憡懳揑偵傕攏幁偵側傜側偄応崌傕峫偊偨傎偆偑埨怱偱偼偁傝傑偡丅偦偺傛偆側応崌偵丄偙偙偱偺庤朄偑桳岠偱偡丅

 

偙偺庤朄偱偼帠慜偵梡堄偡傞傕偺偼億僀儞僞乕偺億僀儞僞乕乮4僶僀僩乯偩偗偱偡丅僀儞僗僞儞僗偼傕偪傠傫丄偦傟偧傟偺億僀儞僞乕帺懱傕摦揑偵惗惉偟傑偡丅

 

僒儞僾儖偺僐乕僪偱捈愙夝愢偟傑偡丅

#include <stdio.h>

#include <windows.h>

//

//側傫傜偐偺僨乕僞宆

struct SOMETHING

{

        INT Index;

        INT Some;

        FLOAT Thing;

};

//

//VOID main()

//僄儞僩儕乕億僀儞僩

VOID main()

{

        INT i;

        //乭億僀儞僞乕偺億僀儞僞乕乭乮愭摢億僀儞僞乕偲偟偰婡擻乯偺傒傪梡堄偡傞

        SOMETHING** ppSome;

        //椺偊偽100屄暘偺僀儞僗僞儞僗傪惗惉偡傞乮儊儌儕傪妋曐偡傞乯

        ppSome=(SOMETHING**) new SOMETHING*[100];

       for( i=0;i<100;i++)

       {

              ppSome[i]=(SOMETHING *) new SOMETHING;

       }

        //偝傜偵捛壛偟偰200屄暘偺僀儞僗僞儞僗傪惗惉偡傞乮儊儌儕傪妋曐偡傞乯

        SOMETHING**  ppTmp=ppSome;

       ppSome=(SOMETHING**) new SOMETHING*[100 + 200];

       memcpy(ppSome,ppTmp,sizeof(SOMETHING*) * 100);

        delete ppTmp;

       for( i=100;i<300;i++)

       {

              ppSome[i]=(SOMETHING *) new SOMETHING;

       }

        //偙傟堏峴偼妋擣偺偨傔偺傕偺

        for( i=0;i<300;i++)

        {

                ppSome[i]->Index=i;

                printf("%d ",ppSome[i]->Index);

        }

}

 

慜崁偲摨偠偔SOMETHING偲偄偆峔憿懱宆傪摦揑惗惉偟偰偄偔傕偺偲偟傑偡丅

帠慜偵梡堄偡傞傕偺偼丄SOMETHING**宆偺曄悢乮SOMETHING億僀儞僞乕偺億僀儞僞乕乯偩偗偱偡丅

SOMETHING** ppSome;

 

椺偊偽100屄偺僀儞僗僞儞僗傪嵟弶偵惗惉偡傞偲偡傞偲丄

ppSome=(SOMETHING**) new SOMETHING*[100];

for( i=0;i<100;i++)

{

        ppSome[i]=(SOMETHING *) new SOMETHING;

}

偙偺傛偆偵彂偗傑偡丅嵟弶偺惗惉偼扤偟傕偑擄側偔彂偗傞偲巚偄傑偡丅

 

彮乆柺搢側偺偑丄2夞栚埲崀偺捛壛偱偡丅

SOMETHING**  ppTmp=ppSome;

ppSome=(SOMETHING**) new SOMETHING*[100 + 200];

memcpy(ppSome,ppTmp,sizeof(SOMETHING*) * 100);

delete ppTmp;

for( i=100;i<300;i++)

{

        ppSome[i]=(SOMETHING *) new SOMETHING;

}

1峴偛偲偵暥復偱昞尰偡傞偲師偺偲偍傝偱偡丅

 

偁傞僞僀儈儞僌偱惗惉偟偨晹暘傪1偮偺僌儖乕僾偲峫偊傞偲

嘆傑偢偼丄崱傑偱惗惉偟偨僌儖乕僾乮100屄暘乯偲崱夞捛壛偡傞僌儖乕僾乮200屄暘乯傪娷傔偨崌寁300暘偺億僀儞僞乕傪梡堄偟傑偡丅捛壛暘(200)偩偗偱偼側偄偙偲偵拲堄偟偰偄偔偩偝偄丅棟桼偼偡偖偵暘偐傝傑偡丅

ppSome=(SOMETHING**) new SOMETHING*[100 + 200];

 

嘇嵟弶偺100屄暘偺億僀儞僞乕孮傪300屄偺椞堟乮偺愭摢乯偵僐僺乕偟傑偡丅

memcpy(ppSome,ppTmp,sizeof(SOMETHING*) * 100);

 

嘊偙偺帪揰偱丄嵟弶偺100屄偺億僀儞僞乕僌儖乕僾偼丄傕偼傗晄梡側偺偱夝曻偟傑偡丅

delete ppTmp;

 

嘋偁偲偼300屄偺椞堟偺100偐傜300偺応強偵200屄偺僀儞僗僞儞僗傪惗惉偟傑偡丅

for( i=100;i<300;i++)

{

        ppSome[i]=(SOMETHING *) new SOMETHING;

}

 

24

 

25

 

26

 

27

 

 

偙偺傛偆偵偡傞棟桼偼丄儊儌儕乮壖憐儊儌儕乯忋偵楢懕揑偵僀儞僗僞儞僗傪攝抲偡傞偨傔偱偡丅儊儌儕忋偵楢懕偟偰攝抲偝傟偰偄側偗傟偽揧偊帤偱乮僀儞僨僢僋僗偱乯楢斣揑偵傾僋僙僗弌棃側偔側傝傑偡丅

嬶懱揑偵弎傋傞偲丄嵟弶偺100屄偺惗惉偲摨偠傛偆偵200屄偺捛壛惗惉傪偟偰偟傑偭偰偼丄楢斣偱偼側偔側傞壜擻惈偑偁傝傑偡丅

偲偄偆偺偼丄屄乆偺僌儖乕僾偱偼儊儌儕忋偵楢懕偟偰攝抲偝傟傑偡丅偮傑傝丄0偐傜99傑偱偼楢懕偟偰偄傑偡丅偦偟偰100偐傜299傑偱傕楢懕偟偰偄傑偡丅偟偐偟丄堎側傞僞僀儈儞僌偱惗惉偟偨僌儖乕僾摨巑偑楢懕偟偰偄傞偲偼尷傝傑偣傫丅嵟弶偺僌儖乕僾偺嵟屻偲捛壛僌儖乕僾偺嵟弶丄偮傑傝丄99100偑楢懕偟偰偄傞偲偼尷傝傑偣傫丅偟偨偑偭偰慡懱偲偟偰楢懕偟側偄偙偲偵側傝丄巊偄暔偵側傜側偄偐傜偱偡丅

28

 

29

3 SK朄儗儀儖1#2 乮攝楍偵偍偗傞崅懍側憓擖偲嶍彍乯

僒儞僾儖僾儘僕僃僋僩柤丂攝楍偱崅懍憓擖丒嶍彍

SK朄儗儀儖1#2戝検偺僄儞僥傿僥傿傪挻崅懍偵張棟偡傞偙偲偑偱偒丄僇儞僷僯乕僂僅乕僘偱嵦梡偟偰偄傞庤朄偱傕偁傝傑偡丅偙偺掱搙偱偁傟偽帡偨傛偆側儘僕僢僋傪峫偊傞恖偼彮側偔側偄偐傕偟傟傑偣傫丅SK朄偼僩儕僢僋偺榑棟儔僀僽儔儕偱偁傝儗儀儖2傑偱妋棫偝傟丄尰嵼儗儀儖3偺尋媶拞偱偡丅儗儀儖1偵偼偙偺懠偵儗儀儖1#3偲偟偰僱僢僩儚乕僋偺摨婜儘僕僢僋偑偁傝傑偡偑丄偦傟偼偡偱偵乽偼偠傔偰偺俁D僎乕儉奐敪乿偱徻嵶偵夝愢偟偰偄傑偡丅

偝偰丄愭偵儕儞僋僪儕僗僩偺摿挜傪弎傋偨嵺丄攝楍偱偼丄偁傞梫慺傪憓擖偡傞偺偵慜屻偺梫慺慡偰傪堦惸偵堏摦偟側偗傟偽側傜側偄偲弎傋傑偟偨丅慺捈偵峫偊傞偲偦偆側傝傑偡偟丄攝楍偺峔憿偐傜尨棟揑偵偼偦傟偟偐偁傝傑偣傫丅

偟偨偑偭偰丄偙偙偱偺庤朄偼僩儕僢僋揑側怓崌偄偑擹偄傕偺偱丄杮摉偺堄枴偱偺憓擖丒嶍彍偱偼偁傝傑偣傫丅

偙偙偱偺僩儕僢僋偼戝掞偺応崌丄憓擖丒嶍彍偑堦掕帪娫偱峴傢傟忋庤偔偄偒傑偡偑丄偁傞忬嫷偵偍偄偰丄彮乆忋庤偔偄偐側偄棟桼傕屻傎偳弎傋傑偡丅偟偐偟丄偦偺傛偆側忬嫷偵偟側偄偙偲偼梕堈偱偡丅

偙偺僩儕僢僋偺幚峴懍搙偼媶嬌偲傕尵偊傞懍偝偱乬堦掕帪娫乭偱偡丅昞尰傪曄偊傞偲O(1)傾儖僑儕僘儉偱偡丅

儕儞僋僪儕僗僩偺憓擖傗嶍彍偑懍偄偲尵偭偰傕丄僩儔僶乕僗偺晹暘偱儕僗僩偺挿偝偵塭嬁偝傟丄幚峴懍搙偼乬慄宍帪娫乭偵棷傑傝傑偡丅O婰朄偩偲O(N)偵側傝傑偡丅

偙偺僩儕僢僋偼丄O(1)偱偡偐傜梫慺偺屄悢偵埶懚偣偢偵忢偵摨偠張棟帪娫偱偡丅梫慺悢偑10屄偺帪偲10挍屄偺偲偒偱傕丄憓擖丒嶍彍偵偐偐傞帪娫偼摨偠偲偄偆偙偲偱偡丅傕偪傠傫丄偦傟傜偺張棟偵昁梫側張棟慡懱偱偺帪娫偑O(1)偲偄偆偙偲偱偡丅

杮愡偺僒儞僾儖偱偡偑丄巹偺乬恖惗偺拞乭偱丄偙傟傎偳扨弮側僎乕儉偼嶌偭偨偙偲偑偁傝傑偣傫丅摉慠嶌傝抲偒側偳傕偁傝傑偣傫偐傜丄1偐傜偺僼儖僗僋儔僢僠偱偡偑丄偙偺僒儞僾儖偺惂嶌偵偼5帪娫偐偐偭偰偄傑偣傫丅僎乕儉偺奜尒偩偗傪尒傞偲丄戝愄15嵨偺帪偵弶傔偰嶌偭偨僾儘僌儔儉偺傎偆偑傑偩儅僔偱偡丅

偟偐偟丄拞恎偼偲尵偆偲丄攝楍偺岠棪揑憖嶌偲丄偦偺寢壥偲偟偰僐乕僪偺僔儞僾儖偝偼15嵨偺崰偲偼塤揇偺嵎偑偁傝傑偡丅乮傕偪傠傫丄偙偪傜偺傎偆偑桪傟偰偄傞偲偄偆偙偲偱偡乧擮偺偨傔乯

巹揑偵偼乮堦斒揑偵傕乯乬僎乕儉乭偲傕屇傋側偄戙暔偱偡偑丄攝楍偺憖嶌偲丄偦偺寢壥傪妋擣偡傞偵偼偄偄僒儞僾儖偩偲巚偄傑偡丅

 

31

ENEMY e[ 10 ];

N=揋偺憤悢;

 

for(i=0;i<N;i++)

{

        if(徚柵偝偣傞僞僀儈儞僌偵側偭偨)

        {

                memcpy( &e[i],&e[N -1],sizeof(ENEMY));

                N--;

        }

}

 

32

 

僒儞僾儖偱偼丄僆僽僕僃僋僩乮抏丄揋乯偺嶍彍偼慡偰偙偺庤朄傪巊梡偟偰偄傑偡丅僒儞僾儖偵偍偗傞僆僽僕僃僋僩偺嶍彍偼師偺4庬椶偑偁傝傑偡丅

帺暘偺抏嶍彍

揋偺嶍彍乮帺暘偺抏偑摉偨偭偨帪乯

揋偺嶍彍乮夋柺奜偵弌偨帪乯

揋偺抏偺嶍彍

師偼偦傟偧傟偺僐乕僪曅偱偡偑丄尒傞偲暘偐傞傛偆偵丄曄悢摍偼堎側傞傕偺偺丄傗偭偰偄傞偙偲摨偠偱偁傞偙偲偑暘偐傞偱偟傚偆丅

帺暘偺抏嶍彍

//帺暘偺抏偑夋柺奜偵弌偨傜嶍彍

if(Me.Shell[i].Pos.y<=0)

{

        memcpy(&Me.Shell[i],&Me.Shell[Me.ShellAmt-1],sizeof(SHELL));

       Me.ShellAmt--;

}

 

揋偺嶍彍乮帺暘偺抏偑摉偨偭偨帪乯

//帺暘偺抏偲揋偺摉偨傝敾掕

for(INT k=0;k<EnemyAmt;k++)

{

        if( D3DXVec3Length(&(Enemy[k].Pos-Me.Shell[i].Pos)) <16)

        {

                memcpy(&Enemy[k],&Enemy[EnemyAmt-1],sizeof(CHARACTER));

              EnemyAmt--;

        }

}

 

揋偺嶍彍乮夋柺奜偵弌偨帪乯

//揋偑夋柺奜偵弌偨傜嶍彍

if(Enemy[i].Pos.y>600)

{

        memcpy(&Enemy[i],&Enemy[EnemyAmt-1],sizeof(CHARACTER));

       EnemyAmt--;

}

 

揋偺抏偺嶍彍

//揋偺抏偑夋柺奜偵弌偨傜嶍彍

if(Enemy[i].Shell[k].Pos.y>600)

{

        memcpy(&Enemy[i].Shell[k],&Enemy[i].Shell[Enemy[i].ShellAmt-1],sizeof(SHELL));

       Enemy[i].ShellAmt--;

}

 

嶍彍偟偨偄梫慺偑偁傞応強偵嵟屻旜偺梫慺偺拞恎傪僐僺乕偟丄憤悢傪1尭傜偟偰偄傞偩偗偱偡丅偙傟偱忋庤偔婡擻偟傑偡丅側偍丄嵟屻旜偵偁傞僨乕僞偼僛儘偱弶婜壔偟側偔偰傕峔偄傑偣傫丅怴偨側僆僽僕僃僋僩偑惗惉偝傟傞嵺偵偼丄偳偺傒偪怴偨側僨乕僞偱弶婜壔偝傟傑偡偐傜丅

 

僗儁乕僗僀儞儀儞僞乕丂慡僜乕僗

//昁梫側僿僢僟乕僼傽僀儖偺僀儞僋儖乕僪

#include <time.h>

#include <windows.h>

#include <d3dx9.h>

#include <dinput.h>

//昁梫側儔僀僽儔儕僼傽僀儖偺儘乕僪

#pragma comment(lib,"d3d9.lib")

#pragma comment(lib,"d3dx9.lib")

#pragma comment(lib,"dinput8.lib")

#pragma comment(lib,"dxguid.lib")

// 掕悢丄儅僋儘掕媊

#define WINDOW_WIDTH 800

#define WINDOW_HEIGHT 600

#define SPRITE_WIDTH 32

#define SPRITE_HEIGHT 32

#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

#define X_SPEED 1

#define Y_SPEED 2

#define SHELL_SPEED 4

#define MAX_ENEMY 20

//宆掕媊

struct SHELL//

{

        D3DXVECTOR3 Pos;

        SHELL()

        {

                ZeroMemory(this,sizeof(SHELL));

        }

};

 

struct CHARACTER//帺暘偲揋

{

        D3DXVECTOR3 Pos;

        FLOAT AddX;    

        INT ShellAmt;

        SHELL Shell[50];

 

        CHARACTER()

        {

                ZeroMemory(this,sizeof(CHARACTER));

        }

};

//僌儘乕僶儖側僀儞僗僞儞僗傪愰尵

LPDIRECT3D9 pD3d;

LPDIRECT3DDEVICE9 pDevice;

LPDIRECT3DTEXTURE9 pTexture;

LPDIRECT3DTEXTURE9 pEnemyTexture;

LPDIRECT3DTEXTURE9 pShellTexture;

LPD3DXSPRITE pSprite;

LPDIRECTINPUT8 pDinput=NULL;        

LPDIRECTINPUTDEVICE8 pKeyDevice=NULL;

FLOAT fPosX=0,fPosY=0;

CHARACTER Me,Enemy[MAX_ENEMY];

INT EnemyAmt=0;

//娭悢僾儘僩僞僀僾偺愰尵

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HRESULT InitD3d(HWND);

HRESULT InitDinput(HWND hWnd);

VOID Move();

VOID GenerateEnemy();

VOID MoveEnemy();

VOID DrawSprite();

VOID FreeDx();

//

//INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)

//傾僾儕働乕僔儑儞偺僄儞僩儕乕娭悢

INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)

{

        HWND hWnd=NULL;

        MSG msg;

        // 僂傿儞僪僂偺弶婜壔

        static char szAppName[] = "Space Inventor 僗儁乕僗僀儞儀儞僞乕 塅拡偺奐敪幰";    

     WNDCLASSEX  wndclass;

 

     wndclass.cbSize           = sizeof (wndclass) ;

     wndclass.style              = CS_HREDRAW | CS_VREDRAW ;

     wndclass.lpfnWndProc    = WndProc ;

     wndclass.cbClsExtra      = 0 ;

     wndclass.cbWndExtra     = 0 ;

     wndclass.hInstance        = hInst ;

     wndclass.hIcon             = LoadIcon (NULL,  IDI_APPLICATION) ;

     wndclass.hCursor          = LoadCursor (NULL, IDC_ARROW) ;

     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;

     wndclass.lpszMenuName = NULL ;

     wndclass.lpszClassName = szAppName ;

     wndclass.hIconSm         = LoadIcon (NULL,IDI_ASTERISK);

 

     RegisterClassEx (&wndclass) ;

 

     hWnd = CreateWindow (szAppName,szAppName,WS_OVERLAPPEDWINDOW,  

                    0,0,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInst,NULL); 

    ShowWindow (hWnd,SW_SHOW) ;

    UpdateWindow (hWnd) ;

        // 僟僀儗僋僩俁D偺弶婜壔娭悢傪屇傇

        if(FAILED(InitD3d(hWnd)))

        {

                return 0;

        }

        // 僟僀儗僋僩僀儞僾僢僩偺弶婜壔娭悢傪屇傇

        if(FAILED(InitDinput(hWnd)))

        {

                return 0;

        }

        //僆僽僕僃僋僩弶婜愝掕

        Me.Pos.x=400;

        Me.Pos.y=520;

        // 儊僢僙乕僕儖乕僾

    ZeroMemory( &msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )

     {

                 if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )

         {

                         TranslateMessage( &msg );

             DispatchMessage( &msg );

         }

         else

                 {

                         Move();                       

                         GenerateEnemy();                      

                         MoveEnemy();

                         DrawSprite();                 

                 }

                 Sleep(1);

         }

         //傾僾儕働乕僔儑儞傪廔椆偡傞帪偵偼丄Direct3D僆僽僕僃僋僩傪儕儕乕僗偡傞

         FreeDx();

     return (INT)msg.wParam ;

}

//

//LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)

// 僂傿儞僪僂僾儘僔乕僕儍乕娭悢

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)

{      

        switch(iMsg)

        {

                case WM_DESTROY:

                        PostQuitMessage(0);

                        break;

                case WM_KEYDOWN:

                switch((CHAR)wParam)

                {

                        case VK_ESCAPE:

                                PostQuitMessage(0);

                                break;

                }

                break;

        }

        return DefWindowProc (hWnd, iMsg, wParam, lParam) ;    

}

//

//HRESULT InitD3d(HWND hWnd)

//僟僀儗僋僩3D偺弶婜壔屻偵僗僾儔僀僩偲偦傟偵敽偆僥僋僗僠儍偺弶婜壔

HRESULT InitD3d(HWND hWnd)

{

        // Direct3D乿僆僽僕僃僋僩偺嶌惉

        if( NULL == ( pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )

        {

                MessageBox(0,"Direct3D偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

        return E_FAIL;

        }

        // DIRECT3D僨僶僀僗乿僆僽僕僃僋僩偺嶌惉

        D3DPRESENT_PARAMETERS d3dpp;

        ZeroMemory( &d3dpp, sizeof(d3dpp) );  

        d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;

        d3dpp.BackBufferCount=1;

        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;      

        d3dpp.Windowed = TRUE;

       

        if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

    {

                if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

                {                      

                        MessageBox(0,"DIRECT3D僨僶僀僗偺嶌惉偵幐攕偟傑偟偨",NULL,MB_OK);                  

                        return E_FAIL;

               

                }

        }

        //乽僥僋僗僠儍僆僽僕僃僋僩乿偺嶌惉

        if(FAILED(D3DXCreateTextureFromFileEx(pDevice,"Me.bmp",SPRITE_WIDTH*(16.0f /24.0f),SPRITE_HEIGHT*(16.0f /24.0f),0,0,D3DFMT_UNKNOWN,

                                                                                        D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,

                                                                            0xff000000,NULL,NULL,&pTexture)))

        {

                MessageBox(0,"僥僋僗僠儍偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

                return E_FAIL;

        }

        if(FAILED(D3DXCreateTextureFromFileEx(pDevice,"Enemy.bmp",SPRITE_WIDTH*(16.0f /24.0f),SPRITE_HEIGHT*(16.0f /24.0f),0,0,D3DFMT_UNKNOWN,

                                                                                        D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,

                                                                            0xff000000,NULL,NULL,&pEnemyTexture)))

        {

                MessageBox(0,"僥僋僗僠儍偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

                return E_FAIL;

        }

        if(FAILED(D3DXCreateTextureFromFileEx(pDevice,"Shell.bmp",SPRITE_WIDTH*(16.0f /24.0f),SPRITE_HEIGHT*(16.0f /24.0f),0,0,D3DFMT_UNKNOWN,

                                                                                        D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_DEFAULT,

                                                                            0xff000000,NULL,NULL,&pShellTexture)))

        {

                MessageBox(0,"僥僋僗僠儍偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

                return E_FAIL;

        }

 

        // 乽僗僾儔僀僩僆僽僕僃僋僩乿偺嶌惉

        if(FAILED(D3DXCreateSprite(pDevice,&pSprite)))

        {

                MessageBox(0,"僗僾儔僀僩偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

                return E_FAIL;

        }

        return S_OK;

}

//

//HRESULT InitDinput(HWND hWnd)

//僟僀儗僋僩僀儞僾僢僩偺弶婜壔娭悢

HRESULT InitDinput(HWND hWnd)

{

        HRESULT hr;

        // DirectInput乿僆僽僕僃僋僩偺嶌惉

         if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL),

                 DIRECTINPUT_VERSION,IID_IDirectInput8, (VOID**)&pDinput, NULL ) ) )

         {

                 return hr;

         }

    // DirectInput僨僶僀僗乿僆僽僕僃僋僩偺嶌惉

    if( FAILED( hr = pDinput->CreateDevice( GUID_SysKeyboard,

                &pKeyDevice, NULL ) ) )

        {

                return hr;

        }

        // 僨僶僀僗傪僉乕儃乕僪偵愝掕

    if( FAILED( hr = pKeyDevice->SetDataFormat( &c_dfDIKeyboard ) ) )

        {

                return hr;

        }

        // 嫤挷儗儀儖偺愝掕

    if( FAILED(hr= pKeyDevice->SetCooperativeLevel(

                hWnd,DISCL_NONEXCLUSIVE | DISCL_BACKGROUND )) )

        {

                return hr;

        }

        // 僨僶僀僗傪乽庢摼乿偡傞

    pKeyDevice->Acquire();

        return S_OK;

}

//

//VOID Move()

//

VOID Move()

{

        //丂帺暘偺憖嶌

        HRESULT hr=pKeyDevice->Acquire();

        if((hr==DI_OK) || (hr==S_FALSE))

        {

                BYTE diks[256];

                pKeyDevice->GetDeviceState(sizeof(diks),&diks);

 

                if( Me.Pos.x>4 && diks[DIK_LEFT] & 0x80)

                {

                        Me.Pos.x-=4;

                }

                if( Me.Pos.x<760 && diks[DIK_RIGHT] & 0x80)

                {

                        Me.Pos.x+=4;

                }

                if(Me.Pos.y>4 && diks[DIK_UP] & 0x80)

                {

                        Me.Pos.y-=4;

                }

                if(Me.Pos.y<540 && diks[DIK_DOWN] & 0x80)

                {

                        Me.Pos.y+=4;

                }

 

                //抏惗惉

                static INT time=clock();               

                if( (diks[DIK_SPACE] & 0x80) && (clock()-time>100 ) )

                {

                        time=clock();

                        Me.Shell[Me.ShellAmt].Pos=Me.Pos;

                        if(Me.ShellAmt<48)

                        {

                                Me.ShellAmt++;

                        }

                }

        }

        //帺暘偺抏堏摦偲摉偨傝敾掕

        for(INT i=0;i<Me.ShellAmt;i++)

        {

                //

                Me.Shell[i].Pos.y-=SHELL_SPEED;

                //帺暘偺抏偑夋柺奜偵弌偨傜嶍彍

                if(Me.Shell[i].Pos.y<=0)

                {

                        memcpy(&Me.Shell[i],&Me.Shell[Me.ShellAmt-1],sizeof(SHELL));

                        Me.ShellAmt--;

                }

                //帺暘偺抏偲揋偺摉偨傝敾掕

                for(INT k=0;k<EnemyAmt;k++)

                {

                        if( D3DXVec3Length(&(Enemy[k].Pos-Me.Shell[i].Pos)) <16)

                        {

                                memcpy(&Enemy[k],&Enemy[EnemyAmt-1],sizeof(CHARACTER));

                                EnemyAmt--;

                        }

                }

        }

}

//

//VOID GenerateEnemy()

//

VOID GenerateEnemy()

{

        //揋惗惉

        static INT time=clock();

        if(clock()-time>100)

        {

                time=clock();

                if(EnemyAmt<MAX_ENEMY-2)

                {

                        Enemy[EnemyAmt].Pos.x=(rand() % 700) +32;

                        Enemy[EnemyAmt].Pos.y=rand() % 300;

                        rand()<16000 ? Enemy[EnemyAmt].AddX=-X_SPEED : Enemy[EnemyAmt].AddX=X_SPEED;

 

                        EnemyAmt++;

                }

        }

}

//

//VOID MoveEnemy()

//

VOID MoveEnemy()

{

        //揋堏摦

        for(DWORD i=0;i<EnemyAmt;i++)

        {

                Enemy[i].Pos.y+=Y_SPEED;

                //揋偑夋柺奜偵弌偨傜嶍彍

                if(Enemy[i].Pos.y>600)

                {

                        memcpy(&Enemy[i],&Enemy[EnemyAmt-1],sizeof(CHARACTER));

                        EnemyAmt--;

                }

                Enemy[i].Pos.x+=Enemy[i].AddX;

                if(Enemy[i].Pos.x<=0 || Enemy[i].Pos.x>800-32)

                {

                        Enemy[i].AddX*=-1;

                }

                if(D3DXVec3Length(&(Enemy[i].Pos - Me.Pos ) )<32)

                {

                        //MessageBox(0,"僎乕儉僆乕僶乕","揋偺摉偨偭偨",MB_OK);

                        //PostQuitMessage(0);

                }

        }

        //揋偺抏敪幩

        for(DWORD i=0;i<EnemyAmt;i++)

        {

                if(rand()<320)

                {

                        if(Enemy[i].ShellAmt<48)

                        {

                                Enemy[i].Shell[Enemy[i].ShellAmt].Pos=Enemy[i].Pos;

                                Enemy[i].ShellAmt++;

                        }

                }

                //揋偺抏堏摦偲摉偨傝敾掕

                for(INT k=0;k<Enemy[i].ShellAmt;k++)

                {

                        Enemy[i].Shell[k].Pos.y+=SHELL_SPEED;

                        //揋偺抏偑夋柺奜偵弌偨傜嶍彍

                        if(Enemy[i].Shell[k].Pos.y>600)

                        {

                                memcpy(&Enemy[i].Shell[k],&Enemy[i].Shell[Enemy[i].ShellAmt-1],sizeof(SHELL));

                                Enemy[i].ShellAmt--;

                        }

                        if(D3DXVec3Length(&(Enemy[i].Shell[k].Pos - Me.Pos)) < 16)

                        {

                                //MessageBox(0,"僎乕儉僆乕僶乕","揋偺抏偵摉偨偭偨",MB_OK);

                                //PostQuitMessage(0);

                        }

                }

        }

}

//

//VOID DrawSprite()

//僗僾儔僀僩傪儗儞僟儕儞僌偡傞

VOID DrawSprite()

{

        INT i,k;

        pDevice->Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(30,30,30), 1.0f, 0 );

        if( SUCCEEDED( pDevice->BeginScene() ) )

        {

                pSprite->Begin(D3DXSPRITE_ALPHABLEND);

                //帺暘         

                pSprite->Draw(pTexture,NULL,NULL,&Me.Pos,D3DCOLOR_ARGB(255,255,255,255));

                //帺暘偺抏

                for( i=0;i<Me.ShellAmt;i++)

                {                      

                        pSprite->Draw(pShellTexture,NULL,NULL,&Me.Shell[i].Pos,D3DCOLOR_ARGB(255,255,255,255));

                }

                //

                for( i=0;i<EnemyAmt;i++)

                {

                        pSprite->Draw(pEnemyTexture,NULL,NULL,&Enemy[i].Pos,D3DCOLOR_ARGB(255,255,255,255));

                        //揋偺抏

                        for(k=0;k<Enemy[i].ShellAmt;k++)

                        {

                                pSprite->Draw(pShellTexture,NULL,NULL,&Enemy[i].Shell[k].Pos,D3DCOLOR_ARGB(255,255,255,255));

                        }

                }

                pSprite->End();

                pDevice->EndScene();

        }      

        pDevice->Present( NULL, NULL, NULL, NULL );    

}

//

//VOID FreeDx()

// 嶌惉偟偨DirectX僆僽僕僃僋僩偺奐曻

VOID FreeDx()

{      

        if(pKeyDevice)

        {

                pKeyDevice->Unacquire();

        }

        SAFE_RELEASE( pKeyDevice );

    SAFE_RELEASE( pDinput );

        SAFE_RELEASE( pTexture );

        SAFE_RELEASE( pEnemyTexture );

        SAFE_RELEASE( pShellTexture );

        SAFE_RELEASE( pSprite );

        SAFE_RELEASE( pDevice );

        SAFE_RELEASE( pD3d );

}

 

偆傑偔婡擻偟側偄忬嫷

嵟弶偵丄偁傞忬嫷偵偍偄偰彮乆忋庤偔偄偐側偄偙偲偑偁傞偲弎傋偨傑偟偨丅偦偺棟桼偲夞旔曽朄傪夝愢偟傑偡丅

椺偊偽丄10屄偺僄儞僥傿僥傿偑惗偒偰偄傞偲偟偰丄偁傞僼儗乕儉偱偦偺乬慡偰乭偑妀儈僒僀儖偵傛傝徚幐偟偨偲偟傑偟傚偆丅偦偺僼儗乕儉撪偱慡偰傪嶍彍偟側偔偰偼側傝傑偣傫傛偹丅

N偼嵟弶10

丂丂丂伀

for(i=0;i<N;i++)

{

        memcpy( &e[i],&e[N -1],sizeof(ENEMY));

        N--;

}

僐乕僪傪摢偺拞偱僩儗乕僗偟偰偔偩偝偄丅N5傑偱偟偐尭傜側偄偙偲偑傢偐傞偱偟傚偆偐丠

偦偟偰師偺僼儗乕儉偵偼5偐傜2偵尭傝丄師偱2偐傜1丄偦偟偰傛偆傗偔4僼儗乕儉栚偱慡偰偑嶍彍偱偒傑偡丅

恾偵偟偰傒傑偟偨偺偱尒偰偔偩偝偄丅

 

3-3

偙偺傛偆偵丄偦偺僼儗乕儉撪偱慡偰傪嶍彍偱偒傑偣傫丅

偨偩丄夞揮悢帺懱偼4僼儗乕儉偺崌寁偱10夞揮偟偐偟側偄偺偱丄張棟懍搙偑梋寁偵偐偐傞偲偄偆傕偺偱偼偁傝傑偣傫丅

偙傟偱栤戣偵側傞偺偼丄乮尒偨栚偵偼堦弖偱偡偑)埲崀偺僼儗乕儉偱僄儞僥傿僥傿偑巆偭偰偟傑偆偙偲偱偡丅

偙傟傪夝寛偡傞偵偼丄娙扨偱丄師偺傛偆偵while暥偱偔偔偭偰丄N偑僛儘偵側傞傑偱夞偣偽偄偄偩偗偱偡丅

N偼嵟弶10

丂丂丂伀

while(N>0)

{

        for(i=0;i<N;i++)

        {

                memcpy( &e[i],&e[N -1],sizeof(ENEMY));

                N--;

        }

}

孞傝曉偟傑偡偑丄夞揮悢偼偁偔傑偱傕10夞揮偱偡丅懍搙偑棊偪傞偙偲偼偁傝傑偣傫丅

 

4復丂栘

栘乮Tree 僩儕乕乯偼儕儞僋僪儕僗僩偲摨偠偔僨乕僞峔憿偱偡丅儕儞僋僪儕僗僩偑1師尦偱偁傞偺偵懳偟丄栘偼2師尦埲忋偺奒憌峔憿偵側傝傑偡丅攝楍傗儕儞僋僪儕僗僩偑乬奒憌乭偵側偭偰偄傞偲偒丄偦偺峔憿傪栘偲屇傃傑偡丅偙偺偙偲偐傜丄儕儞僋僪儕僗僩偼儕儞僋傪堦偮偟偐傕偨側偄栘偱偁傞偲傕尵偊傑偡丅

偝偰丄幚嵺偵栘峔憿偱偁傞傕偺偵偼偳偺傛偆側傕偺偑偁傞偐偲偄偆偲丄椺偊偽丄DirectXX僼傽僀儖偼丄傾僯儊乕僔儑儞儊僢僔儏偺奺僷乕僣儊僢僔儏傗僗僉儞傾僯儊乕僔儑儞偺奺儃乕儞傪栘峔憿偱奿擺偟傑偡丅僸乕僾僜乕僩乮5復僜乕僩偺拞偱夝愢乯偼僸乕僾偲屇偽傟傞摿庩側2暘栘偵傛傝僜乕僩傪岠棪揑偵峴偄傑偡丅傑偨丄僋傾僢僪僩儕乕乮8復乯丄僆僋僩僩儕乕乮9復乯傕偦偺柤偺偲偍傝栘偱偡丅

 

栘偵偼丄巬乮偲梩乯偺悢偵傛傝婔偮偐偺暘椶偑偱偒傑偡丅

傑偢丄巬偺悢偑晄摿掕偵偁傞傕偺傪帺桼栘偲屇傃傑偡丅X僼傽僀儖偼帺桼栘偵傛傝儊僢僔儏傗儃乕儞傪娭楢晅偗偰偄傑偡丅

4-1丂帺桼栘

 

巕傪2偮傑偱帩偮栘偼2暘栘偲屇傃傑偡丅

僸乕僾僜乕僩偼2暘栘偵傛傝丄僲乕僪傪宷偘偰偄傑偡丅

4-22暘栘

 

巕傪4偮傑偱帩偮栘偼4暘栘偲屇傃傑偡丅

僋傾僢僪僩儕乕偼4暘栘偱偡丅僋傾僢僪乮quad乯偲偼4暘妱偲偄偆堄枴偱偡丅

4-34暘栘

 

巕傪8偮傑偱帩偮栘偼8暘栘偲屇傃傑偡丅

僆僋僩僩儕乕偼8暘栘偱偡丅僆僋僩乮oct乯偼octan偺棯偱8暘妱偲偄偆堄枴偱偡丅

側偍丄捲傝偼octree偱偁偭偰octtree偱偼偁傝傑偣傫丅偦偟偰敪壒偼媡偵乽僆僋僩儕乕乿偱偼側偔乽僆僋僩丒僩儕乕乿偲偡傞恖偑懡偄偱偡丅

4-48暘栘

 

n暘栘偵偍偄偰丄慡偰偺僲乕僪偑昁偢n屄偺巕傪帩偮傕偺丄偮傑傝丄傃偭偟傝僲乕僪偑枛抂傑偱媗傑偭偰偄傞傕偺偼摿偵姰慡n暘栘偲屇傃傑偡丅杮復偺恾偼帺桼栘傪彍偒丄慡偰姰慡n暘栘傪昞偟偰偄傑偡丅

 

5復丂僜乕僩

 

僜乕僩偲偼乽惍楍乿偺偙偲偱偁傝丄傾儖僑儕僘儉偺曌嫮偦偟偰庼嬈偱偼昁偢偲尵偭偰偄偄傎偳搊応偟傑偡丅

僜乕僩偼丄乬傾儖僑儕僘儉乭偲偼壗側偺偐偲偄偆偙偲傪敡偱姶偠偝偣偰偔傟傞傕偺丄偦偟偰丄偦偺戠岉枴傪宱尡偡傞偺偵嵟揔側儘僕僢僋偩偲巚偄傑偡丅

 

51

 

偙偺悽偵僐儞僺儏乕僞乕偺尨宆偑惗傑傟偨偲摨帪偵惗傑傟偨傾儖僑儕僘儉偱偁傝丄尵偄曽傪曄偊傟偽丄僐儞僺儏乕僞乕偵巇帠傪偝偣傞嵺偵偡偖偵昁梫偲偝傟偨儘僕僢僋偱偡丅偦偺傛偆側儘僕僢僋偼崱偱傕僐儞僺儏乕僞乕偺巇慻傒傪棟夝偡傞偺偵傕栶棫偪傑偡丅

杮復偱偼丄偍傛偦峫偊傜傟傞慡偰偺僜乕僩傪夝愢偟傑偡丅傕偪傠傫慡偰偺僜乕僩傾儖僑儕僘儉偵偮偄偰僜乕僗僐乕僪偑偁傝丄偦傟傪價儖僪丒幚峴偟丄偝傜偵丄慡偰偺僜乕僩偺惈擻傪寁應丒斾妑偱偒傞傛偆側幚憰偵側偭偰偄傑偡丅

52

 

杮彂偵偼14庬椶偺僜乕僩偺僜乕僗傪揧晅偟偰偄傑偡偑丄乮斾妑偵偼丄慻傒崬傒qsort偲暪偣偰15庬椶偺僜乕僩傪斾妑偟傑偡乯丄偦偺惈擻偵傛傝丄偁傞僌儖乕僾暘偗偑弌棃傑偡丅O婰朄偱昞偟偨帪偺3偮偺僌儖乕僾偱偡丅偑嵟傕抶偔丄偼拞娫丄偑嵟傕懍偄僌儖乕僾偱偡丅

師恾偼丄慡僜乕僩偺幚峴帪娫偺堦棗昞偱偡丅1000屄偐傜1000枩屄傑偱偺梫慺悢傪寁應偟偰偄傑偡丅扨埵偼儈儕昩偱丄傕偪傠傫戝偒偄抣偺傎偆偑偦傟偩偗帪娫偑偐偐偭偨偲偄偆偙偲偱偁傝丄惈擻偑掅偄偙偲傪堄枴偟傑偡丅

53

 

偙傟傪尒偰丄偁傞摿挜偑尒偊傞偲巚偄傑偡丅偔偭偒傝偲惈擻嵎偑暘偐傟丄3偮偺僌儖乕僾偵側偭偰偄傞偙偲偑傢偐傞偱偟傚偆偐丅O婰昞尰傪彂偒擖傟傞偲師偺傛偆偵側傝傑偡丅

 

54

宯偺僜乕僩偱偺1000枩屄偺楍偱N/A偲彂偄偰偁傞棑偼丄幚應抣偱偼側偔悇掕抣偱偡丅乬悇掕乭偲尵偭偰傕丄偐側傝幚應抣偵嬤偄偲尵偊傑偡丅宯偺N/A偺晹暘偩偗偺強梫帪娫傪崌傢偣傞偲側傫偲520帪娫乮21擔娫乯両偵傕側偭偰偟傑偄丄昅幰偑壗傕巇帠傪弌棃側偔側傞偺偱幚嵺偵寁應偼偟偰偄傑偣傫丅1000枩屄偺僜乕僩偱丄僶僽儖僜乕僩偑166帪娫側偺偵懳偟丄媡幨憸僜乕僩偑1昩埲壓偱偁傞偙偲偼嫼埿揑側嵎偱偡偹丅

O婰朄偺撉傒曽

宯偺僜乕僩偼嵟傕抶偄僜乕僩偱丄梫慺悢偑100枩埲忋偐傜巊偄暔偵側傜側偔側傝傑偡丅乮抶偡偓偰乯

梫慺悢偑1000偁偭偨傜丄惈擻偼戝嶨攃偵尵偭偰1,0001,000=1,000,000掱搙偵側傝傑偡丅

 

宯偺僜乕僩偼丄傛傝偼懍偄傕偺偺丄傛傝偼抶偄僜乕僩偱偡丅

梫慺悢偑1000偁偭偨傜丄惈擻偼戝嶨攃偵尵偭偰1,0003=3,000掱搙偵側傝傑偡丅乮1000=103忔丄log1000=3

 

宯偺僜乕僩偼丄嵟傕懍偄僜乕僩偱偡丅

側偍丄僜乕僩偼帠幚忋桳傝摼傑偣傫丅傑偨僜乕僩偼乮k偼抣偺斖埻乯丄応崌偵傛偭偰偼傛傝傕抶偔側偭偨傝懍偔側偭偨傝偡傞偱偟傚偆偐傜丄偙偙偱偼偵娷傔傑偡丅傕偭偲傕僜乕僩偺幚憰傪尒偨偙偲偼偁傝傑偣傫偑丅

 

偱偼傑偢丄棟夝偟堈偄宯偺僜乕僩偐傜巒傔傑偟傚偆丅

5-1 宯僜乕僩

僙儗僋僔儑儞僜乕僩乮Selection Sort

乽僜乕僩僾儘僌儔儉傪彂偄偰偔偩偝偄乿偲尵傢傟偨帪丄僜乕僩偺僐乕僨傿儞僌偵弉払偟偰偄側偄尷傝丄戝掞偺恖偑彂偔傾儖僑儕僘儉偑宯偺僜乕僩偱偁傝丄側偐偱傕偙偺僙儗僋僔儑儞僜乕僩偱偁傞応崌偑傎偲傫偳偩偲巚偄傑偡丅

儔儞僟儉側抣偑擖偭偰偄傞攝楍a[100]傪僜乕僩偡傞応崌丄傑偢恀偭愭偵峫偊傞傾儖僑儕僘儉偼丄2廳偵儖乕僾偝偣傞偙偲偱偼側偄偱偟傚偆偐丅a[0]偐傜a[99]偺偦傟偧傟偵懳偟丄偝傜偵100夞暘偺儖乕僾傪偟偰丄憤摉傝揑偵弴彉傪尒偮偗傛偆偲偡傞儘僕僢僋偱偡丅100屄偵懳偟偦傟偧傟100夞偺僗僥僢僾偑幚峴偝傟傑偡偐傜丄憤僗僥僢僾悢偼100100=10000僗僥僢僾偵側傝傑偡傛偹丅僙儗僋僔儑儞僜乕僩偵尷傜偢丄偙傟偑宯僜乕僩偺乮梫慺悢偺擇忔乯偱偁傞尨場偱偡丅側偐偱傕僙儗僋僔儑儞僜乕僩偼儘僕僢僋偑旕忢偵埨堈偱偁傝丄彂偄偰偟傑偄偑偪側僜乕僩偱偡丅

側偍丄2廳儖乕僾傪偡傞偙偲帺懱偼杮幙偱偼偁傝傑偣傫丅幚嵺O(N)宯偱傕2廳儖乕僾帺懱偼峴偄傑偡偑丄杮幙偼側傫傜岺晇傕側偔2廳儖乕僾傪偟偰偟傑偆偙偲偱偁傝丄2廳儖乕僾偦偺傕偺偑拞怱尨棟偵側偭偰偄傞揰偱偡丅暯偨偔尵偊偽椡媄偱偡丅

 

偝偰丄僙儗僋僔儑儞僜乕僩偺巇慻傒偼丄奜懁偺儖乕僾偱拃師揑偵梫慺傪1偮偢偮弴偵挷傋偰偄偒丄尰嵼挷傋偰偄傞梫慺傛傝彫偝偄梫慺傪撪懁偺儖乕僾拞偱尒偮偗丄彫偝偄梫慺偑尒偮偐偭偨傜偦偺搒搙岎姺偟偰偄偔偲偄偆傕偺偱偡丅

乬僙儗僋僔儑儞乭偺桼棃偼丄撪懁偺儖乕僾拞偱彫偝偄梫慺傪慖戰乮慖敳丄慖戰偟偰敳偒弌偡乯偟偰偄偔宍偵側傞偐傜偱偡丅

僐乕僪偼師偺傛偆偵側傝傑偡丅

#define INT_SWAP(a,b) INT tmp=a;a=b;b=tmp;

 

VOID SORTER::SelectionSort(INT* pData,INT Amount)

{

        INT i,k;

        DWORD dwMin;

       

        for(i=0;i<Amount-1;i++)

        {

                dwMin=i;

                for(k=i+1;k<Amount;k++)

                {

                        if(pData[k] < pData[ i ] )

                        {

                                dwMin=k;

                                INT_SWAP(pData[dwMin],pData[i]);

                               

                        }

                }

        }

}

棙曋惈偺偨傔INT_SWAP偲偄偆儅僋儘傪掕媊偟傑偟偨丅掕媊傪尒傟偽柧傜偐偱偼偁傝傑偡偑丄INT宆偺2偮偺曄悢傪擖傟懼偊傞乮岎姺偡傞乯傕偺偱偡丅偙偺儅僋儘偼懠偺僜乕僩偱傕巊梡偟傑偡丅

 

僲乕儉僜乕僩乮Gnome Sort

僲乕儉僜乕僩偺僐乕僪偼丄乬嵟傕僔儞僾儖側乭僐乕僪偱偡丅偪側傒偵僲乕儉僜乕僩偺僲乕儉偼乬梔惛乭傪堄枴偟丄梔惛偑1楍偵暲傫偩壴偺敨傪峴偭偨傝棃偨傝偡傞偙偲傪僜乕僩偺棳傟偵椺偊偨傕偺偩偲尵傢傟偰偄傑偡丅

VOID SORTER::Gnome(INT* pData,INT Amount,INT Dammy)

{

        for(INT i=0;i<Amount;)

        {      

                if (i==0 || pData[i-1]<=pData[i])      

                {      

                        i++;   

                }      

                else     

                {              

                        INT_SWAP(pData[i-1],pData[i]);         

                        i--;             

                }   

        }      

}

僐乕僪偼偨偭偨偙傟偩偗偱偡丅柍棟偡傟偽堦峴偱彂偗偰偟傑偆傎偳抁偄僐乕僪偱偡偹丅

偲傝偁偊偢丄偡偖偵僜乕僩晹暘傪彂偐側偗傟偽側傜側偄応崌偱僨乕僞悢偑1000屄埲撪掱搙側傜僲乕儉僜乕僩偑偍姪傔偱偡丅

僨乕僞悢偑1000屄掱搙傑偱側傜宯偺僜乕僩偺傎偆偑弶婜壔帪偵儊儌儕妋曐偺僆乕僶乕僿僢僪偑偁傞宯僜乕僩傛傝懍偄壜擻惈偑崅偄偐傜偱偡丅

 

僶僽儖僜乕僩乮Bubble Sort

僶僽儖僜乕僩偼僲乕儉僜乕僩偵晧偗側偄偔傜偄僔儞僾儖側僐乕僪偲側傝傑偡丅

VOID SORTER::BubbleSort(INT* pData,INT Amount,INT Dammy)

{

        INT i,k;

 

        for(i=Amount;i>1;i--)

        {

                for(k=1;k<i;k++)

                {

                        if(pData[k-1] > pData[k])

                        {

                                INT_SWAP(pData[k-1],pData[k]);

                        }

                }

        }

}

僶僽儖僜乕僩傕僲乕儉僜乕僩偲摨條偵丄1000屄掱搙偺僨乕僞悢偱偁傟偽巊梡偟偰傕栤戣側偄偺偱丄偡偖偵彂偔偵偼偍庤寉側僜乕僩偱偟傚偆丅

僶僽儖僜乕僩偺乬僶僽儖乭偺堄枴偼丄僨乕僞偺堏摦偺條巕偵婲場偟傑偡丅椺偊偽僜乕僩慜偺僨乕僞偵偍偄偰嵟戝抣偑愭摢偵偁傞偲偟偰丄偦偺嵟戝抣偼1夞偺儖乕僾偱堦偮偢偮埵抲傪偢傜偟側偑傜偩傫偩傫偲嵟屻旜傑偱乬晜偒忋偑偭偰乭偔傞傛偆偵堏摦偟傑偡丅偙傟偑僶僽儖偲徧偝傟傞棟桼偱偡丅

椺乯

師偺傛偆側5偮偺僨乕僞傪僜乕僩偡傞応崌丄

5, 1, 2, 3, 4

 

5偼師偺傛偆偵1僗僥僢僾乮儖乕僾1夞揮乯偵堦偮偢偮堏摦偟傑偡丅

1,5,2,3,41僗僥僢僾

1,2,5,3,42僗僥僢僾

1,2,3,5,43僗僥僢僾

1,2,3,4,54僗僥僢僾偱廔椆丅

 

朅偑偩傫偩傫偲忋偑偭偰偔傞偙偲傪楢憐偝偣傑偡丅

 

僔僃乕僇乕僜乕僩乮Shaker Sort

僔僃乕僇乕僜乕僩偼僶僽儖僜乕僩偺夵椙斉偱偡丅

僶僽儖僜乕僩偺栤戣揰偼丄愭摢偐傜挷嵏偡傞偐嵟屻旜偐傜挷嵏偡傞偐偱丄惈擻偑嬌抂偵曄壔偡傞壜擻惈偑偁傞偙偲偱偡丅乮偙傟偼懠偺僙儗僋僔儑儞僜乕僩偵尵偊傞偙偲偱傕偁傝丄僶僽儖僜乕僩偵尷偭偨偙偲偱偼側偄偺偱偡偑乯

椺偊偽丄師偺傛偆側5偮偺僨乕僞傪僜乕僩偡傞応崌丄

5, 1, 2, 3, 4

 

僨乕僞岎姺偺夞悢乮岎姺偺夞悢偑惈擻傪傎傏寛掕偟傑偡乯偼4夞偱偡丅偮傑傝丄師偺傛偆偵5偑堏摦偡傞偺偵4僗僥僢僾梫偟傑偡丅

1,5,2,3,41僗僥僢僾

1,2,5,3,42僗僥僢僾

1,2,3,5,43僗僥僢僾

1,2,3,4,54僗僥僢僾偱廔椆丅

偱偼丄師偺傛偆偵側偭偰偄傞応崌偼偳偆偱偟傚偆丅

1,2,3,5,4

5偺堏摦偼1僗僥僢僾偱廔椆偟傑偡丅

1,2,3,4,51僗僥僢僾偱廔椆丅

 

偙偺傛偆偵僨乕僞偺暲傃偲僶僽儖偺恑峴曽岦偺娭學偱惈擻偑戝偒偔嵍塃偝傟傑偡丅

偙傟傪夞旔偡傞偨傔偵丄僶僽儖偺曽岦傪岎屳偵媡偵側傞傛偆偵夵椙偟偨傕偺偑僔僃乕僇乕僜乕僩偱偡丅僔僃乕僇乕僜乕僩偑憃曽岦僶僽儖僜乕僩偲傕屇偽傟傞偺偼偦偺偨傔偱偡丅

 

VOID SORTER::Shaker(INT* pData,INT Amount,INT Dammy)

{

        INT Left = 0, Right = Amount-1;

    BOOL Swapped=TRUE;

 

    while (Swapped)    

    {

        Swapped = FALSE;

       

        for (INT i = Left; i < Right; i++)

                {

            if (pData[i] > pData[i+1])

                        {

                INT_SWAP(pData[i], pData[i+1]);

                Swapped = TRUE;

            }

                }

       

        for (INT i = Right; i > Left; i--)

                {

            if (pData[i] < pData[i-1])

                        {

                INT_SWAP(pData[i], pData[i-1]);

                Swapped = TRUE;

            }

                }

        Left++;

                Right--;

    }

}

 

僀儞僒乕僔儑儞僜乕僩乮Insertion Sort

僀儞僒乕僔儑儞僜乕僩偼丄偪傚偆偳僇乕僪僎乕儉偱偺僇乕僪乮偁傞偄偼儅乕僕儍儞偺攙乯傪恖娫偑暲傋懼偊傞嶌嬈偵帡偰偄傑偡丅僙儗僋僔儑儞傗僶僽儖僜乕僩偵偍偄偰丄堏摦偝傟偨梫慺偼偦偺埵抲偱妋掕偟丄嵞搙埵抲傪曄偊傞偙偲偼偁傝傑偣傫偑丄僀儞僒乕僔儑儞僜乕僩偺応崌丄堏摦偝傟偰懙偭偨晹暘偱傕丄偦傟偱妋掕偱偼側偔丄偦偺屻嵞搙暲傃懼偊偑敪惗偟傑偡丅懙偭偰偄傞晹暘偵怴偨側僨乕僞偺憓擖傪孞傝曉偡偺偱丄晹暘揑側惍楍偼暲傃偼摦揑偵曄壔偟偰偄偒傑偡丅偙傟偑僀儞僒乕僔儑儞乮憓擖乯僜乕僩偲屇偽傟傞棟桼偱偡丅

椺偊偽弶婜僨乕僞偑師偺傛偆偵側偭偰偄傞偲偡傞偲丄

5 2 4 3 1

 

僀儞僒乕僔儑儞僜乕僩偼丄師偺4偮偺僗僥僢僾偱僜乕僩傪姰椆偟傑偡丅

2 5 4 3 1

2 4 5 3 1

2 3 4 5 1

1 2 3 4 5

 

1僗僥僢僾

2,5偺晹暘偑偲傝偁偊偢偺惍楍嬫娫偱偡丅

2 5 4 3 1

 

2僗僥僢僾

2 4 5 3 1

4偑憓擖偝傟傑偡丅

僀儞僒乕僔儑儞僜乕僩偱偼丄惍楍嬫娫偼偁偔傑偱乬偲傝偁偊偢乭側偺偱丄屻偐傜偳傫偳傫憓擖偑敪惗偟丄撪梕偑曄壔偟傑偡丅尰幚偺僇乕僪傗僷僀傪暲傋傞條偲帡偰偄傑偡丅偙偺傛偆側偙偲偼僙儗僋僔儑儞僜乕僩摍偱偼婲偒傑偣傫丅

偙偺帪揰偱偺壖偺惍楍嬫娫偼2,3,4偺晹暘偱偡丅

 

3僗僥僢僾

2 3 4 5 1

摨偠傛偆偵丄怴偨偵3偑憓擖偝傟偰傑偨撪梕偑曄壔偟傑偡丅

 

4僗僥僢僾

1 2 3 4 5

嵟屻偵1偑憓擖偝傟偰丄偙偺応崌姰惉偱偡丅

 

VOID SORTER::InsertionSort(INT* pData,INT Amount,INT Dammy)

{

        INT i=0,k=0,tmp=0;

               

        for(i=1;i<Amount;i++)

        {      

                k=i;

                tmp=pData[i];  

                while(tmp < pData[k-1] && k>0)

                {

                        pData[k]=pData[k-1];   

                        k--;

                }

                pData[k]=tmp;  

        }

}

5-2 宯僜乕僩

宯偺僜乕僩偼丄傛傝偼懍偄偱偡偑丄傛傝偼抶偄僜乕僩偱偡丅

僔僃儖僜乕僩乮Shell Sort

僔僃儖僜乕僩偺乬僔僃儖乭偼丄奐敪幰僪僫儖僪丒L丒僔僃儖乮Donald.L. Shell乯偵桼棃偟丄僀儞僒乕僔儑儞僜乕僩偺夵椙斉偱偡丅

僀儞僒乕僔儑儞僜乕僩偵偍偄偰丄梫慺1屄暘偺娫妘乮椬傝崌偭偨梫慺摨巑乯偱偟偐岎姺偟側偄偲偄偆惈幙偼儃僩儖僱僢僋偵側偭偰偄傑偡丅

偦傟傪夝徚偟傛偆偲偡傞傕偺偱丄堦掕偺娫妘傪偁偗偰婔偮偐偺椞堟偵暘妱偟丄偦傟偧傟偺斖埻撪偱憓擖僜乕僩傪峴偆偲偄偆傕偺偱偡丅偦偺娫妘偼僊儍僢僾乮Gap偲屇偽傟傑偡丅

僊儍僢僾偼丄嵟弶偑堦斣戝偒偔丄偩傫偩傫偲嫹傔偰偄偒傑偡丅嵟廔揑偵僊儍僢僾偑1埲壓偵側偭偨偲偒丄僜乕僩偑姰椆偟偨偙偲偵側傝傑偡丅

僊儍僢僾傪1偵屌掕偡傞偲僀儞僒乕僔儑儞僜乕僩偲摨偠偱偁傞偙偲偵婥晅偔偱偟傚偆偐丠僀儞僒乕僔儑儞僜乕僩偺僐乕僪偲尒斾傋傞偲偡偖偵暘偐傝傑偡丅

 

椺偊偽弶婜僨乕僞偑師偺傛偆偵側偭偰偄傞偲偡傞偲丄

5 2 4 3 1

 

僔僃儖僜乕僩偼丄師偺6偮偺僗僥僢僾偱僜乕僩傪姰椆偟傑偡丅

3 2 4 5 1

3 1 4 5 2

1 3 4 5 2

1 3 4 5 2

1 3 4 5 2

1 2 3 4 5

 

乬帍柺忋乭偼僀儞僒乕僔儑儞僜乕僩傛傝僗僥僢僾悢偑懡偔尒偊傑偡偑丄嵟怺晹偺儖乕僾偵偍偗傞岎姺夁掱傪昞帵偟偰偄側偄偨傔偱偡丅偝傜偵梫慺悢偑嬌抂偵彮側偔丄僀儞僒乕僔儑儞僜乕僩偺僂傿乕僋億僀儞僩偑昞柺壔偟偰偄側偐偭偨偲偄偆偙偲偵棷堄偟偰偔偩偝偄丅僔僃儖僜乕僩偼僀儞僒乕僔儑儞僜乕僩傛傝偼傞偐偵崅懍偱偡丅

 

僋僀僢僋僜乕僩乮Quick Sort

僋僀僢僋僜乕僩偼僠儍乕儖僘丒傾儞僩僯乕丒儕僠儍乕僪丒儂乕傾乮Charles AntonyRichard Hoare乯嫧偑敪柧偟偨傾儖僑儕僘儉偱乮挿偄柤慜偱偡偑堦恖偱偡乯丄斾妑揑恖婥偺偁傞僜乕僩傾儖僑儕僘儉偺傛偆偱偡丅

偨偩丄偙傟偼偁偔傑偱杮彂僒儞僾儖偱偺榖偱偡偑丄僋僀僢僋僜乕僩偑偲傝傢偗懍偄傢偗偱偼側偔丄昅幰偲偟偰偼恖婥偺崻嫆偑暘偐傝傑偣傫丅

幚憰偼僔儞僾儖偱丄暘妱摑帯偱嵞婣揑偵僜乕僩偟偰偄偒傑偡丅

暘妱摑帯偺暘妱抧揰偼乬寛傔懪偪乭偱丄偦偺偲偒偺僨乕僞偺敿暘抧揰偱暘妱偟丄嵞婣偟偰備偒傑偡丅乮杮彂偺応崌乯

 

VOID SORTER::QuickSort(INT* pData, INT Left, INT Right)

{ 

丂丂丂INT Pivot = pData[ (Left + Right) / 2];

    INT Low = Left-1,Hi = Right+1;  

       

    while (TRUE)

        {    

        while (pData[++Low] < Pivot);

        while (pData[--Hi] >Pivot) ;

       

        if (Low >= Hi)

                {

                        break;

                }

        SWAP(INT, pData[Low], pData[Hi]);

    }

 

    if (Left < Low)

        {

        QuickSort(pData, Left, Low - 1);

        }

    if (Right >Hi)

        {

        QuickSort(pData, Hi + 1, Right);

        }

}

儅乕僕僜乕僩乮Merge Sort

儅乕僕僜乕僩偼丄僕儑儞丒僼僅儞丒僲僀儅儞乮John von Neumann乯偑敪柧偟偨傾儖僑儕僘儉偱丄梫偼僋僀僢僋僜乕僩偺曄宍斉偱偡丅

傎偲傫偳惍楍偟偰偄傞僨乕僞偁傞偄偼丄傎偲傫偳摨偠僨乕僞偵懳偟偰偼僋僀僢僋僜乕僩傛傝傕崅懍偱偡丅乮廫暘偵棎嶨側僨乕僞偱偼僋僀僢僋僜乕僩傛傝掅懍偱偡乯

偨偩偟丄儚乕僋僄儕傾偲偟偰梫慺悢暘偺儊儌儕椞堟偑昁梫偱偡丅

 

INT* WA=new INT[Amount];

 

VOID SORTER::MergeSort(INT *pData,INT* WA,INT Left, INT Right)

{

        INT i,k,n;

 

        if(Right>Left)

        {

                INT Middle=(Left+Right)/2;

                MergeSort(pData,WA,Left,Middle);

                MergeSort(pData,WA,Middle+1,Right);

 

                for(i=Middle+1;i>Left;i--)

                {

                        WA[i-1]=pData[i-1];

                }

                for(k=Middle;k<Right;k++)

                {

                        WA[Right+Middle-k]=pData[k+1];

                }

                for(n=Left;n<=Right;n++)

                {

                        if(WA[i]<WA[k])

                        {

                                pData[n]=WA[i++] ;

                        }

                        else

                        {

                                pData[n]=WA[k--];

                        }

                }

        }

}

僨乕僞斖埻傪2暘妱偟丄偦傟偧傟偺椞堟偱偼僋僀僢僋僜乕僩傪峴偄傑偡丅偦傟傜偺巇帠偼堦扷儚乕僋僄儕傾忋偱峴偄丄偦偺屻偱2偮偺椞堟傪儅乕僕乮寢崌乯偟丄杮棃偺僨乕僞椞堟偵忋彂偒偟傑偡丅

 

僸乕僾僜乕僩乮Heap Sort

乮偁偔傑偱杮彂偱偼乯僸乕僾僜乕僩偼丄慡偰偺宯僜乕僩偺拞偱嵟傕暯嬒惈擻偑崅偄偲偄偆寢壥偵側偭偰偄傑偡丅梫慺悢10000掱搙偱偁傟偽丄宯偱偁傞儔僨傿僢僋僗僜乕僩傛傝傕懍偄偲偄偆寢壥傕弌偰偄傞偔傜偄偱偡丅

暯嬒惈擻傪忋偘偰偄傞嵟傕戝偒側梫場偼丄乬傎偲傫偳摨偠僨乕僞乭偺僜乕僩偑嬌抂偵懍偄偲偄偆偙偲偱丄偦偟偰丄偦傟埲奜偺応崌偱傕嬌抂偵抶偄偲偄偆応崌偑柍偄偺傕暯嬒惈擻傪崅偔偟偰偄傑偡丅

 

僸乕僾偲偼乽2暘栘乿偺僨乕僞攝楍揑昞尰偱偡丅乮栘偵偮偄偰偼4復傪嶲徠乯丂乮側偍丄僸乕僾儊儌儕偺僸乕僾偼堄枴偑堘偄傑偡乯

偟偨偑偭偰偁傞攝楍偺僨乕僞攝抲偑僸乕僾偱偁傞側傜偽丄2暘栘偺惈幙傪帩偪傑偡偐傜丄師偺偙偲偑曐忈偝傟傑偡丅

乽偁傞僲乕僪偑i偵偁傞偲偡傞偲丄偦偺巕僲乕僪偼2i乮嵍偺巕乯偲2i+1乮塃偺巕乯偵埵抲偡傞乿

媡偵尵偆偲丄偙偺惈幙乮僸乕僾忦審偲尵偄傑偡乯傪枮偨偟偰偄側偄偺偱偁傟偽丄偦偺僨乕僞攝楍偼僸乕僾偱偼偁傝傑偣傫丅

僸乕僾忦審偑惉傝棫偮偙偲偵傛偭偰丄僩儔僶乕僗偑梕堈偵弌棃傑偡丅

 

VOID SORTER::Heap(INT* pData,INT Amount,INT Dammy)

{

         INT i,n,v;

         INT Parent, LChild , RChild;

         n = Amount, i = Amount>>1;

 

        while(TRUE)

        {

                if (i > 0)

                {

                        i--;

                        v = pData[i];

                }

                else

                {

                        n--;

                        if (n <= 0)

                        {

                                return;

                        }

 

                        v = pData[n];

                        pData[n] = pData[0];

                }

 

                Parent = i;

                LChild = (i<<1)+1;

 

                while (LChild < n)

                {

                        RChild =LChild+1;

 

                        if (RChild<n)

                        {

                                if(pData[RChild] > pData[LChild])

                                {

                                        LChild++;

                                }

                        }

 

                        if (pData[LChild] <=v)

                        {

                                break;

                        }

                        pData[Parent] = pData[LChild];

                        Parent = LChild;

                        LChild = (LChild<<1) + 1;

                }

                pData[Parent] = v;

        }

}

 

僐乕儉僜乕僩媦傃僐乕儉僜乕僩11Comb Sort Comb Sort11

僐乕儉僜乕僩偼僶僽儖僜乕僩偺夵椙斉偱丄僗僥傿乕僽儞丒儗僀僔乕乮Stephen Lacey乯偲儕僠儍乕僪丒儃僢僋僗乮Richard Box乯偵傛偭偰敪柧偝傟偨傾儖僑儕僘儉偱偡丅

僶僽儖僜乕僩偱偼梫慺1屄暘偺娫妘偱斾妑偟傑偡偑丄僐乕儉僜乕僩偼丄堦掕偺娫妘偱斾妑偟丄偦偺斖埻撪偱偼僶僽儖僜乕僩傪峴偄傑偡丅

堦掕偺娫妘偼僊儍僢僾乮Gap乯偲屇傃傑偡丅

偙偙偱撉幰偼丄乽偁傟偭丄偳偭偐偱暦偄偨傛偆側乧乿偲巚偆偱偟傚偆偐丅偦偆偱偡丄僔僃儖僜乕僩偑僀儞僒乕僔儑儞僜乕僩偵懳偟偰峴偭偨夵椙偲摨偠偱偡丅

僐乕儉偲偄偆柤慜偼丄僜乕僩偺棳傟傪敮傪孂偱偲偐偡乮僐乕儉Comb乯偙偲偵椺偊偨偙偲偵桼棃偟傑偡丅

 

僐乕儉僜乕僩

VOID SORTER::Comb(INT* pData,INT Amount,INT Dammy)

{      

        INT i,k;

        INT Gap = Amount;

        BOOL Swapped=FALSE;

 

        while(TRUE)

        {

                Gap = (Gap * 10) / 13;         

                if (Gap < 1)           

                {

                        Gap=1;

                }

            Swapped = FALSE;   

                for (i = 0; i < Amount - Gap; i++)

                {

                        k = i+Gap;

                        if (pData[i] > pData[k])

                        {

                                INT_SWAP(pData[i], pData[k]);

                                Swapped = TRUE;

                        }

                }

                if (Gap <= 1 && !Swapped)

                {

                        break;

                }

        }      

}

 

僐乕儉僜乕僩11

僐乕儉僜乕僩偺僊儍僢僾偑910偺応崌偵尷偭偰丄僊儍僢僾傪嫮惂揑偵乬11乭偵屌掕偡傞偲僷僼僅乕儅儞僗偑乬傗傗乭忋偑傞偙偲偑抦傜傟偰偄傑偡丅

偦偺傛偆側夵椙傪壛偊偨傕偺偼僐乕儉僜乕僩11偲屇偽傟傑偡丅捠忢偺僐乕儉僜乕僩偲偺堘偄偼丄僊儍僢僾傪嫮惂揑偵11偵偡傞晹暘偩偗偱偡丅

VOID SORTER::Comb11(INT* pData,INT Amount,INT Dammy)

{      

        INT i,k;

        INT Gap = Amount;

        BOOL Swapped=FALSE;

 

        while(TRUE)

        {

                Gap = (Gap * 10) / 13;

                if (Gap == 9 || Gap == 10)//910偺応崌丄嫮惂揑偵僊儍僢僾傪11偵偡傞

              {

                     Gap=11;

              }

               

                if (Gap < 1)

                {

                        Gap=1;

                }

            Swapped = FALSE;   

                for (i = 0; i < Amount - Gap; i++)

                {

                        k = i+Gap;

                        if (pData[i] > pData[k])

                        {

                                INT_SWAP(pData[i], pData[k]);

                                Swapped = TRUE;

                        }

                }

                if (Gap <= 1 && !Swapped)

                {

                        break;

                }

        }      

}

5-3 宯僜乕僩

 

僶働僢僩僜乕僩乮Bucket Sort

僶働僢僩僜乕僩偼岎姺媦傃斾妑偡傜傕敪惗偟側偄偨傔丄挻崅懍側僜乕僩傾儖僑儕僘儉偱偡丅偦偟偰丄杮彂偺懠偺僜乕僩2偮偲斾妑偟偰嵟傕棟夝偟傗偡偄傾儖僑儕僘儉偱偡丅側偤側傜丄懠偺2偮偼僶働僢僩僜乕僩傪尨宆偲偟偰偄傞偐傜偱偡丅僶働僢僩僜乕僩偼懠偺2偮偵斾傋尨宆偺傒側偺偱傛傝僔儞僾儖側偺偱偡丅

俁偮偺僜乕僩傾儖僑儕僘儉偵偍偗傞崻掙偺尨棟偼嫟捠偱偡丅崻掙尨棟偲偼丄乽偲傝摼傞抣偺斖埻暘偩偗偺乬敔乭傪梡堄偟丄偦偙偵梫慺傪擖傟偰偄偔乿偲偄偆儘僕僢僋偱偡丅偙傟偼僺僕儑儞儂乕儖僜乕僩乮數偺憙敔僜乕僩乯偲屇偽傟傑偡丅僺僕儑儞儂乕儖僜乕僩帺懱偼僇僥僑儕乕揑側奣擮偱偡丅墷暷偱偼嵶偐側擖傟暔偵暔傪惍棟惍撢偡傞偙偲傪僺僕儑儞儂乕儖偲屇傇偲偙傠偵桼棃偟傑偡丅

側偐偱傕僶働僢僩僜乕僩偼丄僺僕儑儞儂乕儖僜乕僩偺尨宆偲傕尵偊丄崻掙尨棟傪偦偺傑傑慺捈偵昞尰偟偨傕偺偲尵偊傑偡丅偙傟偑僶働僢僩僜乕僩偑嵟傕棟夝偟傗偡偄偲偄偆棟桼偱偡丅

懠曽丄儔僨傿僢僋僗僜乕僩偼僶働僢僩僜乕僩偺徣儊儌儕僶乕僕儑儞偱丄儊儌儕愡栺偺偨傔偺儘僕僢僋偑壛傢傞偨傔丄懡彮暋嶨偵側傝傑偡丅

偦偟偰僀儞僶乕僗儅僢僾僜乕僩偼丄僺僕儑儞儂乕儖僜乕僩偺堦庬側偺偱丄傕偪傠傫崻掙尨棟偦偺傕偺偼僶働僢僩傗儔僨傿僢僋僗偲摨椶偱偡偑丄敔偵乬擖傟傞傕偺乭偑堎側傝丄嵟傕棟夝偑崲擄偱偟傚偆丅

 

偝偰丄僶働僢僩僜乕僩偺尨棟傪嬶懱揑偵夝愢偟傑偟傚偆丅

戝傑偐側棳傟

傑偢偼丄戝傑偐側棳傟傪帵偟傑偡丅

 

嘆丂僶働僢僩梡堄

偲傝摼傞抣偺斖埻偩偗偺僶働僢僩乬敔乭傪梡堄偟傑偡丅梫慺悢偱偼偁傝傑偣傫

椺偊偽丄梫慺悢偑100屄偩偗偩偲偟偰傕丄奺梫慺偑DWORD抣偺慡斖埻傪庢傝摼傞偲偟偨傜丄栺43壄屄乮4294967296屄乯偺僶働僢僩傪梡堄偟側偔偰偼側傜偢丄

媡偵梫慺悢偑1壄偁偭偨偲偟偰傕丄奺梫慺偺抣偑0偐傜100傑偱偺抣偟偐偲傜側偄偺偱偁傟偽丄僶働僢僩偼101屄偁傟偽懌傝傞偙偲偵側傝傑偡丅

 

嘇儚乕僋僄儕傾傪梡堄

梫慺悢偲摨偠偩偗偺椞堟傪妋曐偟傑偡丅偟偨偑偭偰尦僨乕僞偲摨偠戝偒偝偺擖傟暔傪梡堄偡傞偲偄偆偙偲偱偡丅僜乕僩偼儚乕僋僄儕傾忋偱姰惉偟丄嵟廔揑偵偼儚乕僋僄儕傾偺撪梕傪尦僨乕僞偵僐僺乕偟傑偡丅

 

嘊丂僶働僢僩偵媗傔崬傓

偁傞梫慺偺揧偊帤偱偁傞僶働僢僩偺僒僀僘傪僀儞僋儕儊儞僩偟偰備偒傑偡丅

偮傑傝椺偊偽丄Data[100]偺抣偑70偩偲偟偨傜丄Bucket[70]++偲偡傞偲偄偆偙偲偱偡丅

岼偵偼僶働僢僩僜乕僩偲尵偄偮偮丄偦偆偱偼側偄傕偺傪偨傑偵尒偐偗傑偡丅偦偺傛偆側僜乕僩偼偙偺嶌嬈傪峴傢側偄偺偱丄摨偠抣偺梫慺偑偁偭偨偲偒偵懳張偱偒傑偣傫丅

僶働僢僩偍傛傃偦偺僒僀僘偼儚乕僋僄儕傾偵僨乕僞傪媗傔崬傓偲偒偺僆僼僙僢僩偲偟偰婡擻偟傑偡丅

 

嘋丂梫慺傪懳墳偡傞僶働僢僩偵媗傔崬傫偱備偔

嘆乣嘊偼尵偭偰傒傟偽弨旛晹暘偱偁傝丄偙偙偑幚幙揑側僜乕僩晹暘偱偡丅傕偭偲傕僜乕僩偲偄偭偰傕丄梫慺偺抣傪僀儞僨僢僋僗偲偟偰丄偦偺僀儞僨僢僋僗偺儚乕僋僄儕傾偵帠柋揑偵媗傔崬傫偱偄偔偺偱娙扨偱偡丅乮偦偟偰崅懍偱偡乯

 

嘍丂儚乕僋僄儕傾傪尦僨乕僞偵僐僺乕偡傞

偙傟偼偦偺傑傑偱偡丅夝愢偼晄梫偱偟傚偆丅側偍丄摉慠娭悢撪偱妋曐偟偨儊儌儕乮僶働僢僩丄儚乕僋僄儕傾乯偼奐曻偟傑偡丅

 

埲忋偱偡丅

 

徻嵶

偱偼丄VOID SORTER::Bucket娭悢偺僐乕僪傪尒側偑傜丄徻偟偔傒偰偄偒傑偟傚偆丅

恾傪岎偊偰夝愢偟傑偡丅

傑偢偼僐乕僪偺慜敿晹暘偐傜丄

VOID SORTER::Bucket(INT* pData,INT Amount,INT MaxRange)

{

        INT i; 

        INT Range=MaxRange+1; 

        INT *BacketSize= (INT*)new INT[Range+1]; 

        INT *DataWorkArea = (INT*)new INT[Amount];

        ZeroMemory(BacketSize,sizeof(INT)*Range);

 

        for(i=0; i<Amount; i++)

        {

                INT Index = pData[i]+1; 

                BacketSize[Index]++;

        }

 

 

尦僨乕僞偑師偺傛偆偵側偭偰偄傞偲偟傑偡

5-5

 

僨乕僞偼偦傟偧傟0偐傜10偺抣傪庢傞偙偲偑暘偐偭偰偄傞偲偡傞偲丄梡堄偡傞僶働僢僩偼11屄偱偡丅

嵟弶偼pData[0]偐傜僶働僢僩僒僀僘傪寁嶼偟傑偡丅pData[0]偺抣偼7側偺偱7+1=8丄僶働僢僩偺僀儞僨僢僋僗8偺応強傪僀儞僋儕儊儞僩偟傑偡丅BucketSize[8]++

5-6

 

埲崀摨條偵僀儞僋儕儊儞僩偟偰備偒傑偡丅

5-7

5-8

5-9

5-10

偙傟偱丄僶働僢僩僒僀僘偼偲傝偁偊偢姰椆偱偡丅

偙傟偼尵偄姺偊傞偲丄乽暘晍傪偲偭偰偄傞乿偙偲偱傕偁傝傑偡丅僶働僢僩僜乕僩偑乬暘晍悢偊僜乕僩乭偲傕尵傢傟傞棟桼偼偙偺偨傔偱偡丅

偙偺偁偲丄僶働僢僩僒僀僘傪僆僼僙僢僩偲偟偰婡擻偝偣傞偨傔偵丄偁傞岺晇傪巤偟傑偡丅岺晇偲偼丄捈慜偺僶働僢僩僒僀僘偺抣傪偳傫偳傫懌偟偰偄偔偲偄偆傕偺偱偡丅

        for(i=1;i<Range;i++)

        {  

                BacketSize[i] += BacketSize[i-1];

        }

 

5-11

5-12

5-13

5-14

偙傟偱慡偰偺弨旛偑姰椆偱偡丅偄傛偄傛僜乕僩嶌嬈偵堏傝傑偡丅

 

 

        for(i=0;i<Amount;i++)

        {   

                INT Index = pData[i];   

                INT Stride = BacketSize[Index];   

                DataWorkArea[Stride] = pData[i];

                BacketSize[Index]++;

        }

 

弨旛偑姰椆偟偨捈屻偵丄偦傟偧傟偼師偺傛偆偵側偰偄傑偡丅

5-15

 

偙傟傪棙梡偟偰僜乕僩傪峴偄傑偡丅

僜乕僩偲尵偭偰傕丄傗偭偰偄傞偙偲偼嶲徠偲奿擺偱偁傝丄斾妑傗岎姺偑敪惗偟傑偣傫丅偦偺偨傔崅懍側惍楍偑壜擻偱偡丅

pData[]偐傜DataWorlArea[]偵丄偳傫偳傫抣傪奿擺偟偰備偒傑偡丅

pData[]偺傎偆偼愭摢偐傜怟旜傑偱弴斣偵恑傒傑偢偑丄DataWorlArea[]BucketSize傪嶲徠偟丄奩摉偡傞僆僼僙僢僩埵抲偵奿擺偝傟傑偡丅偙傟偼偡側傢偪僜乕僩偟偰偄傞偙偲偵側傝傑偡丅

塃懁偵偼僾儘僌儔儉拞偱偺曄悢偑偦偺帪揰偱崗乆偲傞抣傪彂偄偰偄傑偡丅僐乕僪偲徠傜偟崌傢偣側偑傜挌擩偵捛偭偰偔偩偝偄丅

5-16

5-17

5-18

5-19

5-20

5-21

5-22

5-23

5-24

5-25

 

DataWorkArea[]傪尒偰偔偩偝偄丅偍尒帠偱偡丅

偁偲偼丄DataWorkArea[]傪尦僨乕僞偱偁傞pData[]偵僐僺乕偟偰姰惉偱偡丅

        memcpy(pData,DataWorkArea,sizeof(INT) * Amount);

 

        delete (INT*)DataWorkArea;

        delete (INT*)BacketSize; 

}

 

 

儔僨傿僢僋僗僜乕僩乮Radix Sort

儔僨傿僢僋僗僜乕僩偼丄僨乕僞傪婎悢偛偲偵暘妱偟丄偦傟偧傟偺婎悢僌儖乕僾偱偼僶働僢僩僜乕僩傪揔梡偡傞偲偄偆傕偺偱丄僴儘儖僪丒H丒僔儏儚乕僪乮Harold H. Seward乯偵傛偭偰敪柧偝傟偨傾儖僑儕僘儉偱偡丅

婎悢偼擔忢揑側10偱偼側偔丄8bit扨埵偱暘偗傑偡丅偮傑傝256偱偡丅

偟偨偑偭偰僨乕僞偑32價僢僩偱偁傟偽4暘妱偝傟傞偙偲偵側傝傑偡丅偦偟偰4偮偺偦傟偧傟偵偮偄偰僶働僢僩僜乕僩傪巤偟傑偡丅

側偤丄婎悢偱暘偗傞偺偱偟傚偆丠

偦傟偼儊儌儕傪愡栺偡傞偨傔偱偡丅

僶働僢僩僜乕僩偱偼丄DWORD偱偁傟偽偦傟偑偦偺傑傑偲傝偆傞抣偺斖埻偵側傞偺偱丄偲傝偆傞抣偺庬椶偼43壄庬椶偵傕側偭偰偟傑偄傑偡偑丄8bit偛偲偵暘偗傜傟偨偦傟偧傟偺椞堟偱偺僨乕僞偺庬椶偼256庬椶偺斖埻撪偱廂傑傞偙偲偑曐忈偝傟傞偺偱丄梡堄偡傞僶働僢僩偑256屄偱嵪傓偺偑嵟戝桞堦偺儊儕僢僩偱偡丅

偦偺戙彏偲偟偰張棟懍搙偼僶働僢僩僜乕僩傛傝掅懍偵側傝傑偡偑丄僺僕儑儞儂乕儖僜乕僩側偺偱挻崅懍僜乕僩偵暘椶偝傟傞偙偲偵曄傢傝偼偁傝傑偣傫丅

 

VOID SORTER::Radix(INT* pData,INT Amount,INT Dammy)

{

        INT i,j;

        INT shift;

        INT *temp=(INT*)new INT[Amount];

        INT BucketSize[256], BucketOffset[256];

儚乕僋僄儕傾偲偟偰梫慺悢暘偺儊儌儕椞堟乮temp乯偲丄僶働僢僩乮BucektSize,BucketOffset乯傪梡堄偟傑偡丅

 

        for(shift=0; shift<32; shift+=8) 

        {      

32價僢僩抣偱偁傞偙偲偑暘偐偭偰偄傞偺偱丄shift<32偲偟丄8價僢僩偢偮恑傔傑偡丅shitf+=8

偟偨偑偭偰丄偙偺儖乕僾偼4夞揮偟傑偡丅

 

 

                ZeroMemory(BucketSize,sizeof(BucketSize));   

                for(j=0; j<Amount; j++)   

                {    

                        i=(pData[j]>>shift)&255;   

                        BucketSize[i]++;       

                        temp[j]=pData[j];

                }

偙偺晹暘偱峴偭偰偄傞偙偲偼丄32價僢僩偺偆偪8價僢僩乮4暘偺1晹暘乯偵偮偄偰暘晍傪悢偊偰偄傞偲偄偆傕偺偱偡丅暘晍悢偊帺懱偼僶働僢僩僜乕僩偲摨偠偱偡偹丅

偦傟偲傕偆堦偮偙偺晹暘偱峴偭偰偄傞偙偲偼丄儚乕僋僄儕傾temp[]偵尦僨乕僞pData[]傪扨弮偵僐僺乕偟偰偄傑偡丅

 

                BucketOffset[0]=0; 

                for(i=1; i<256; i++)

                {     

                        BucketOffset[i]=BucketOffset[i-1]+BucketSize[i-1];

                }

偙偺張棟傕僶働僢僩僜乕僩偵偍偗傞僆僼僙僢僩偺弶婜壔偲摨偠偱偡丅

 

                for(j=0; j<Amount; j++)

                {

                        i=(temp[j]>>shift)&255;

                        pData[BucketOffset[i]]=temp[j];

                        BucketOffset[i]++;

                }

偙偺晹暘偱峴偭偰偄傞偙偲偼丄4暘妱偟偨椞堟偐傜尦僨乕僞偵僐僺乕偟偰偄傑偡丅扨弮偵僐僺乕偡傞偺偱偼側偔丄僶働僢僩傪嶲徠偟偰僐僺乕偟偰偄傑偡丅忋庤偄嬶崌偵丄摨帪偵僜乕僩偟偰偄傞偙偲偵側傝傑偡丅

夋婜揑側儘僕僢僋偱偡丅偙傟偼儔僨傿僢僋僗僜乕僩乮偺尨棟偵側偭偰偄傞僶働僢僩僜乕僩乯偑乬埨掕僜乕僩偱偁傞偑備偊乭偵惉偣傞媄偱偡丅

埨掕僜乕僩偲偼丄摨偠抣偺梫慺偺弴斣丄慜屻偺埵抲娭學偑僜乕僩慜偲僜乕僩屻偱曵傟側偄僜乕僩偺偙偲傪尵偄傑偡丅

堦曽丄旕埨掕僜乕僩偲偼丄僜乕僩屻偵摨偠抣偺梫慺娫偺埵抲娭學偑晄掕偺僜乕僩傪尵偄傑偡丅

傕偪傠傫旕埨掕僜乕僩偱傕丄僜乕僩帺懱偑晄埨掕乮偆傑偔偄偐側偄乯偲偄偆偙偲偱偼偁傝傑偣傫丅摨偠抣摨巑偺慜屻娭學偑曄壔偟偨偲偟偰傕捠忢偼栤戣側偄傢偗偱偡偐傜丅

椺偊偽丄

僜乕僩慜偑4,3,2,2,1偱偁傞偲偟偰

埨掕僜乕僩偱傕旕埨掕僜乕僩偱傕偪傖傫偲

1,2,2,3,4

偲側傝傑偡丅偨偩丄旕埨掕僜乕僩偱偼丄僜乕僩慜偺3斣栚偺24斣栚偺2偺慜屻娭學偑偢傟傞偐傕偟傟側偄偲偄偆偙偲偱偡丅偱偡偺偱嵟弶偺埵抲娭學偑曵傟偰偼崲傞応崌偼丄旕埨掕僜乕僩傪嵦梡偟側偄傎偆偑偄偄偱偟傚偆丅

 

        }

        delete temp;

}

偙傟偼壗傕尵偆偙偲偼柍偄偱偟傚偆丅

 

僀儞僶乕僗儅僢僾僜乕僩乮Inverse-map Sort

傑偢嵟弶偵尵偭偰偍偔偲丄偙偺僜乕僩偺僐乕僪偑嵟傕擄偟偄偱偡丅崻掙尨棟偦偺傕偺偼偝傎偳偱傕側偄偱偡偑丄僐乕僪偼偐側傝擖傝慻傫偱偄傑偡丅

僀儞僶乕僗儅僢僾僜乕僩傪棟夝偡傞偵偁偨傝丄僶働僢僩僜乕僩偲懳斾偡傞偲棟夝偺彆偗偵側傞壜擻惈偑偁傞偺偱丄偪傚偭偲偙偙偱僶働僢僩僜乕僩偺崻掙尨棟偲斾傋偰傒傑偟傚偆丅

僶働僢僩僜乕僩偺崻掙尨棟偼丄庢傝摼傞抣偺斖埻偩偗梡堄偟偨僶働僢僩偵僨乕僞偺抣傪奿擺偟偰偄偔偲偄偆傕偺偱偟偨偹丅

 

5-26

 

僶働僢僩僜乕僩偱偼丄僶働僢僩偵擖傟傞傕偺偼抣偱偟偨偑丄僀儞僶乕僗儅僢僾偱偼乬僀儞僨僢僋僗乭傪擖傟傑偡丅

5-27

D[3]偺僀儞僨僢僋僗偼0D[1]偺僀儞僨僢僋僗偼1D[0]偺僀儞僨僢僋僗偼2D[2]偺僀儞僨僢僋僗偼3偱偡丅

偁偲偼D[M[i]]傪彂偒弌偣偽丄偦傟偑僜乕僩寢壥偱偡丅

側偍丄M偺梫慺傪嵟弶偵-1偵偟偰偄傞偺偼丄摨偠抣偵懳張偡傞偨傔偺僥僋僯僢僋偱偡偑崻掙尨棟忋偼怺偔峫偊傞昁梫偼偁傝傑偣傫丅

 

偝偰丄僶働僢僩僜乕僩偺僐乕僪偼恾5-26傎偳扨弮偱偼側偐偭偨偱偡傛偹丅偦傟偼側偤偱偟傚偆丠

偦傟偼乽摨偠抣偺梫慺偑偁傞応崌偵懳墳偡傞乿僐乕僪忋偺岺晇偺偨傔偱偡丅恾5-26傪偦偺傑傑僐乕僪偵偟偰偄偄偺側傜丄儚乕僋僄儕傾偼梫傜側偐偭偨偺偱偡偐傜丅

僀儞僶乕僗儅僢僾偺僐乕僪偵傕慡偔摨偠偙偲偑尵偊傑偡丅乽摨偠抣偺梫慺偑偁傞応崌偵懳墳偡傞乿偨傔偵丄偐偮丄崅懍惈傪捛媮偡傞偨傔偵丄堦悺偺寗傕側偄崅搙偵尋偓悷傑偝傟偨旕忢偵擄夝側僐乕僪偵側傝傑偡丅

 

 

VOID SORTER::InvMappingSort(INT* pData, INT Amount, INT MaxRange)

{

        INT i,k;

        INT *pDataWorkArea , *pRange;

        INT *pDataCur, *pRangeCur, *pDataWorkAreaCur;  

 

        pRange = (INT *) new INT[MaxRange+1];

        pDataWorkArea = (INT *) new INT[Amount];

 

        memset(pRange,-1,sizeof(INT)*MaxRange+1);      

 

        //慜敿張棟

        INT Cur = Amount - 1;

        pDataCur = pData + Cur;

        pDataWorkAreaCur = pDataWorkArea + Cur;

        INT *pTmp;

        while(pDataCur >= pData)

        {                      

                pTmp = pRange+*pDataCur;

                *pDataWorkAreaCur = *pTmp;

                *pTmp = Cur;

 

                pDataCur--;

                pDataWorkAreaCur--;

                Cur--;

        }

        //屻敿張棟

        pDataCur = pData;

        pRangeCur = pRange;

        k=0;

        INT *pLastRange = pRange + MaxRange;

        while( pRangeCur <= pLastRange)

        {      

                i = *pRangeCur;

                pRangeCur++;

                while(i >= 0)

                {

                        *pDataCur = k;

                        pDataCur++;

                        i = *(pDataWorkArea + i);

                }

                k++;

        }

 

        delete pDataWorkArea;

        delete pRange;

}

 

 

VOID SORTER::InvMappingSort(INT* pData, INT Amount, INT MaxRange)

{

        INT i,k;

        INT *pDataWorkArea , *pRange;

        INT *pDataCur, *pRangeCur, *pDataWorkAreaCur;

 

        pRange = (INT *) new INT[MaxRange+1];

        pDataWorkArea = (INT *) new INT[Amount];

梡堄偡傞儊儌儕椞堟偼丄検揑偵偼僶働僢僩僜乕僩偲摨堦偱偡丅

庢傝摼傞抣偺斖埻偺屄悢偩偗僶働僢僩傪梡堄偟傑偡丅偙偙偱偼pRange偺巜偡椞堟偑偦傟偱偡丅

偦偟偰丄儚乕僋僄儕傾傕梡堄偟傑偡丅儚乕僋僄儕傾偺僒僀僘偼尦僨乕僞偺僒僀僘偲摨偠偱偡丅

 

偁偲丄億僀儞僞乕傪3偮梡堄偟傑偡丅

尦僨乕僞撪傪堏摦偡傞僇乕僜儖億僀儞僞丄pDataCur

僶働僢僩撪傪堏摦偡傞僇乕僜儖億僀儞僞丄pRangeCur

儚乕僋僄儕傾撪傪堏摦偡傞僇乕僜儖億僀儞僞丄pDataWorkAreaCur

偑偦偆偱偡丅

 

 

        memset(pRange,-1,sizeof(INT)*MaxRange+1);      

僶働僢僩偺梫慺慡偰傪-1偵偟偰偍偒傑偡丅

 

 

        //慜敿張棟

        INT Cur = Amount - 1;

        pDataCur = pData + Cur;

        pDataWorkAreaCur = pDataWorkArea + Cur;

        INT *pTmp;

        while(pDataCur >= pData)

        {                      

                pTmp = pRange+*pDataCur;

                *pDataWorkAreaCur = *pTmp;

                *pTmp = Cur;

 

                pDataCur--;

                pDataWorkAreaCur--;

                Cur--;

        }

偙偺慜敿張棟偱峴偭偰偄傞偙偲偼丄乽恾5-27偺張棟乿偱偡丅

while(pDataCur >= pData)

儖乕僾偺恑峴曽岦偼丄僨乕僞偺怟旜仺僨乕僞偺愭摢偱偡丅

 

偦傟偲丄儚乕僋僄儕傾傪棙梡偟偰乽摨偠抣乿偑偁傞応崌偵儚乕僋僄儕傾傪-1偐傜師偺抣偺僀儞僨僢僋僗偵彂偒姺偊傑偡丅偮傑傝乬儕儞僋乭偵偟傑偡丅

偳偆備偆偙偲偐偲尵偆偲丄恾偱尒偨傎偆偑憗偱偟傚偆丅傑偢師偺3偮椺傪尒偰偔偩偝偄丅

 

5-28

偦傟偧傟偺尦僨乕僞偵懳偟偰丄儚乕僋僄儕傾偑偳偺傛偆偵側傞偐傪帵偟偰偄傑偡丅

偙傟傪尒偰丄壗偐朄懃惈偑偁傞偲巚偄傑偣傫偐丠

 

摨偠悢偑偁傞応崌丄庒偄梫慺偐傜丄師偵弌偰偔傞摨偠抣偺梫慺傊偺乬僀儞僨僢僋僗乭傪擖傟傑偡丅偮傑傝乬儕儞僋乭偟傑偡丅偦傟埲崀偵傕傑偨摨偠抣偑偁傟偽丄偳傫偳傫儕儞僋偟偰偄偒傑偡丅偙偆偡傟偽丄摨偠抣偑壗屄偁偭偰傕懳墳偱偒傑偡丅師恾偼暘偐傝堈偔栴報偱寢傫偩傕偺偱偡丅

 

5-29

 

傕偟僨乕僞偺梫慺偑慡偰堎側傞抣偱偁傟偽丄儚乕僋僄儕傾偺慡偰偺梫慺偼-1偺傑傑偱偡丅

 

        //屻敿張棟

        pDataCur = pData;

        pRangeCur = pRange;

        k=0;

        INT *pLastRange = pRange + MaxRange;

        while( pRangeCur <= pLastRange)

        {      

                i = *pRangeCur;

                pRangeCur++;

                while(i >= 0)

                {

                        *pDataCur = k;

                        pDataCur++;

                        i = *(pDataWorkArea + i);

                }

                k++;

        }

屻敿晹暘偱偼丄幚嵺偵尦僨乕僞傪僜乕僩寢壥偵彂偒姺偊偰偄傑偡丅

 

while( pRangeCur <= pLastRange)

儖乕僾偺恑峴曽岦偼丄僶働僢僩偺愭摢仺枛旜偱偡丅

 

撪懁偵傕儖乕僾偑偁傝傑偡丅

while(i >= 0)

偙傟偼摨偠抣偑偁傞応崌偺懳墳偱偡丅

 

i = *(pDataWorkArea + i);

偙傟偑儈僜偱丄

儚乕僋僄儕傾偑-1丄偡側傢偪偦傟埲崀偵傕偆摨偠抣偑柍偄偺偱偁傟偽儖乕僾偐傜敳偗丄

-1埲奜丄偡側傢偪乬摨偠抣乭偑偦傟埲崀偵偁傞偺偱偁傟偽丄i偑師偺乬摨偠抣乭傊偺嫍棧偵側傞偲偄偆忋庤偄巇慻傒偱偡丅

 

        delete pDataWorkArea;

        delete pRange;

}

偙傟偼栤戣側偄偱偟傚偆丅

 

 

6復丂僷僞乕儞儅僢僠儞僌乮暥帤楍専嶕乯

偁傞廤崌偺側偐偵擟堄偺僷僞乕儞傪尒偮偗傞偙偲丄僷僞乕儞偲堦抳偡傞晹暘偑偁傞偐偳偆偐傪挷傋傞偙偲傪僷僞乕儞儅僢僠儞僌偲尵偄傑偡丅

偙偙偱偼丄戝偒側僥僉僗僩偺拞偐傜摿掕偺暥帤楍僷僞乕儞偲堦抳偡傞晹暘傪専嶕偡傞偲偄偆僷僞乕儞儅僢僠儞僌傪峴偄傑偡丅

僷僞乕儞儅僢僠儞僌偺傾儖僑儕僘儉偼丄僜乕僩傎偳僶儕僄乕僔儑儞偑偁傝傑偣傫丅

杮彂僒儞僾儖偑幚憰偡傞僷僞乕儞儅僢僠儞僌偺傾儖僑儕僘儉偼4偮偱偡丅

椡媄乮僽儖乕僩丂傾儖僑儕僘儉乯

椡媄夵椙斉乮儔僺僢僪丂傾儖僑儕僘儉乯

KMP朄乮Knuth-Morris-Pratt丂僋僰乕僗丒儌儕僗丒僾儔僢僩丂傾儖僑儕僘儉乯

BM朄乮Boyer-Moore丂儃僀儎乕丒儉乕傾丂傾儖僑儕僘儉乯

傾儖僑儕僘儉娫偱偺惈擻嵎傕僜乕僩傎偳尠挊偱偼偁傝傑偣傫丅

柺敀偄偙偲偵丄傕偭偲傕埨堈偱娙扨側椡媄傾儖僑儕僘儉偑寑揑偵抶偄偲偄偆傢偗偱偼側偄偙偲偱偡丅傓偟傠丄KMP朄傛傝懍偄応崌偑懡偄偲偄偆應掕寢壥偑弌傑偟偨丅KMP朄偑懍偄偺偼僶僀僫儕乕僷僞乕儞偩偗偱偁傝乮懍偄偲偄偭偰傕BM朄偵偼晧偗傑偡乯丄偦偺懠偱偼椡媄傾儖僑儕僘儉偵偡傜晧偗傑偡丅

偦偟偰応崌偵傛偭偰偼椡媄偺傎偆偑偄偄応崌傕偁傝傑偡丅偦傟偵偮偄偰偼6-5愡偱棟桼傪弎傋傑偡丅

 

BM朄偼慡偰偺忬嫷偵偍偄偰嵟懍偱偡丅偮傑傝丄偳偺傾儖僑儕僘儉傪揔梡偡傞偐偱擸傓昁梫偼側偄傢偗偱偡丅BM朄偨偩堦偮傪妎偊偰偍偗偽偄偄偱偟傚偆丅

 

椡媄傾儖僑儕僘儉偼僷僞乕儞儅僢僠儞僌偺奣梫傪攃埇偡傞偺偵偼桳岠偩偲巚偄傑偡偺偱丄堦墳BM朄埲奜偺傕偺傕夝愢偟傑偡丅側偍丄KMP朄偼棟夝偡傞儊儕僢僩偑側偄偺偱夝愢偼妱垽偟丄僒儞僾儖僐乕僪偩偗偲偟傑偡丅

 

嫟捠帠崁

傑偢嵟弶偵丄奺傾儖僑儕僘儉偺夝愢拞偵巊梡偡傞梡岅偺掕媊傪弎傋偰偍偒傑偡丅

僷僞乕儞乧僒乕僠偡傞暥帤楍偱偡丅僉乕儚乕僪偲傕尵偄傑偡丅

僥僉僗僩乧僷僞乕儞傪娷傓乮娷傑側偄偐傕偟傟側偄乯戝偒側暥帤孮偱偡丅偙偺僥僉僗僩偺拞偐傜僷僞乕儞傪扵偟傑偡丅

 

6-1 椡媄傾儖僑儕僘儉乮僽儖乕僩僒乕僠乯

椡擟偣偺傾儖僑儕僘儉傪僽儖乕僩僼僅乕僗揑傾儖僑儕僘儉偲偐僽儖乕僩傾儖僑儕僘儉偲尵偄傑偡偑丄偙偙偱偼僷僞乕儞儅僢僠儞僌偵偍偗傞僽儖乕僩傾儖僑儕僘儉傪傒偰傒傑偟傚偆丅

偍偦傜偔丄傎偲傫偳偺恖偑彂偔僐乕僪偼師偺傛偆側僽儖乕僩傾儖僑儕僘儉偱偟傚偆丅尵偄曽傪曄偊傞偲傎偲傫偳偺恖偼偙偺傾儖僑儕僘儉傪彂偗傞偺偱偼側偄偱偟傚偆偐丅

INT BruteSearch(CHAR *p, CHAR *a)

{

        INT M = strlen(p);

        INT N = strlen(a);

       

        for(INT i=0;i<N;i++)

        {

                for(INT k=0;k<M;k++)

                {

                        if(a[i+k] != p[k])

                        {

                                break;

                        }

                }      

                if(k==M)//堦抳偑偁偭偨

                {

                        return i;

                }

        }

 

        return N;//堦抳側偟

}

僥僉僗僩偺嵟弶偐傜丄2廳儖乕僾偵傛傝1暥帤偯偮挷嵏傪恑傔偰偄偔偲偄偆扨弮側傕偺偱偡丅

僜乕僩偺偲偒偵偼丄偙偺傛偆側慺捈側僐乕僪偼憡懳揑偵旕忢偵抶偄傾儖僑儕僘儉偱偟偨偑丄僷僞乕儞儅僢僠儞僌偵偍偄偰偼丄乬埆偔偁傝傑偣傫乭丅偨偩偟丄BM朄偑慡偰偺柺偱懍偄偲偄偆偙偲偑暘偐偭偰偄傞偺偱僽儖乕僩傾儖僑儕僘儉傪嵦梡偡傞棟桼偑側偄偙偲偵曄傢傝偼偁傝傑偣傫丅

 

6-2 椡媄夵椙斉傾儖僑儕僘儉乮儔僺僢僪僒乕僠乯

僽儖乕僩傾儖僑儕僘儉偵庒姳偺夵椙傪巤偟偨傕偺偑師偺僐乕僪偱偡丅摨偠偔椡媄揑側傾儖僑儕僘儉偱丄埨堈偱偁傞偙偲偵偐傢傝偼側偄偺偱儔僺僢僪僒乕僠偲屇傇偙偲偵偟傑偡丅埨堈偲偄偭偰傕丄壗搙傕弎傋偰偄傞傛偆偵愊嬌揑偵旕擄偝傟傞傛偆側抶偝偱偼側偔丄傓偟傠KMP朄傛傝偼懍偄偱偡丅

INT RapidSearch(CHAR *p, CHAR *a)

{

        INT i,k;

    INT M = strlen(p);

        INT N = strlen(a);

       

    for (i = 0,k = 0; k < M && i < N; i++, k++)

        {

                if (a[i] != p[k])

                {

                        i -= k-1;

                        k = -1;

                }

        }

    if (k == M)

        {

                return i-M;

        }

        else

        {

                return i;

        }

}

 

6-3  BM

BM朄偼丄懡偔偺僥僉僗僩僄僨傿僞偱嵦梡偝傟偰偄傞崅懍側傾儖僑儕僘儉偱偡丅

尨棟偺僉乕億僀儞僩偼丄

乽乮僷僞乕儞偺塃抂傪傑偢斾妑偟丄乯堎側傟偽1暥帤埲忋偺暆偱僗僉僢僾偡傞丅乿

偲偄偆偙偲偱偁傝丄偦傟偩偗偱偡丅

 

椡媄偵偍偄偰丄晄堦抳偱偁傞応崌偺僗僉僢僾検乮僥僉僗僩撪偺斾妑僇乕僜儖傪恑傔傞曕暆乯傕1暥帤暘偱偟偨偑丄BM朄偱偼傕偭偲戝偒側暆偱僗僉僢僾偟傑偡丅偦傟偵傛傝丄旕忢偵彮側偄僗僥僢僾悢偵側傝傑偡丅

嬌抂偵尵偆偲丄100暥帤偺僥僉僗僩偱丄僷僞乕儞偑10暥帤挿偩偲偡傞偲丄僽儖乕僩傾儖僑儕僘儉偺応崌偼丄100夞偺僗僥僢僾悢偵側傞偺偵懳偟丄BM朄偼10夞偺僗僥僢僾偟偐梫偟傑偣傫丅乮偨偩偟嵟椙偺応崌偱乯

 

僐乕僪偼挿偄偱偡偑丄偙偺尨棟傪僐乕僨傿儞僌偟偰偄傞偵夁偓傑偣傫丅

 

僐乕僪偼師偺傛偆偵側傝傑偡丅

#define MaxPatLength 100  //僷僞乕儞暥帤楍偺嵟戝挿(100暥帤傪墇偊傞応崌偼揔媂偙偺抣傪曄峏偡傞乯

 

//僌儘乕僶儖

 

INT Skip[256];  //僗僉僢僾検乮256屄偺僉儍儔僋僞乕傑偱懳墳丄偮傑傝ANSI暥帤偵偺傒懳墳乯

INT Shift[MaxPatLength];//僔僼僩検

 

//

//INT BMSearch(CHAR *p, CHAR *a)

//儃僀儎乕丒儉乕傾丂僒乕僠

INT BMSearch(CHAR *p, CHAR *a)

{ 

        INT i,k;

        INT La=strlen(a);//僥僉僗僩偺挿偝

        INT Lp=strlen(p);//僷僞乕儞暥帤楍偺挿偝

        INT Index=Lp-1;//僷僞乕儞暥帤楍偺挿偝-1丅僷僞乕儞偺塃抂偺僀儞僨僢僋僗傪堄枴偡傞

 

        //慜張棟旛晹暘

        {

                INT DeadEnd;//

                INT Matches[MaxPatLength];// 

 

                for ( i = 0; i < 256; i++)

                {

                        Skip[i] = Lp;

                }

                for ( i = 0; p[i] !=NULL ; i++)

                {

                        Skip[p[i]] = Index - i;

                }

                //僔僼僩偺弶婜壔

                Shift[0] = 1; 

                for ( i = 1; i < Lp; i++)

                {

                        Shift[i] = Lp;

                }

                //僷僞乕儞偺嵟廔暥帤偲摨偠暥帤偑僷僞乕儞拞偵偁傞応崌偵旛偊偨僔僼僩偺曗惓

                for ( i = 1; i < Lp; i++) 

                {

                        for ( k = 0; k < Lp - i && p[Index - k] == p[Index - i - k]; k++);  

                        Matches[i] = k; 

                }      

                for ( i = Index; i > 0; i--)

                {

                        Shift[Matches[i]] = i;

                }

                //暿偺壜擻惈偵旛偊偨僔僼僩偺曗惓 乮傎偲傫偳奩摉偟側偄偑丄杮僒儞僾儖俀恑悢僒乕僠偺帪偵奩摉偡傞乯

                DeadEnd = 0; 

                for ( i = 0; i < Lp; i++) 

                {  

                        if (Matches[i] == Index - i)

                        {

                                DeadEnd = i;

                        }

                        if (DeadEnd)

                        {

                                Shift[i] = DeadEnd;

                        }

                }

        }

        //僒乕僠晹暘

        {

                INT RightPos=Index;//僷僞乕儞塃抂偵懳墳偡傞乭僥僉僗僩忋乭偺埵抲

 

                while (RightPos < La)

                {              

                        for ( i = 0; i < Lp && a[RightPos - i] == p[Index - i]; i++);   

                        if (i == Lp)   

                        {              

                                return RightPos - Index;//堦抳偟偨偺偱丄堦抳応強傪曉偡丅

                        }              

                        RightPos = max(RightPos - i + Skip[a[RightPos - i]], RightPos + Shift[i]);

                }

                return La; //堦抳柍偟丅僥僉僗僩偺嵟屻旜埵抲傪曉偡丅

        }

} 

側偍丄BM朄偵偼乬曎宑偺媰偒強乭偑偁傝傑偡丅偦傟偵偮偄偰偼師愡偱夝愢偟傑偑丄偦傟傪嵎偟堷偄偰傕嵟懍傾儖僑儕僘儉偱偁傞偙偲偵娫堘偄偼偁傝傑偣傫丅

 

6-4丂惈擻斾妑

幚嵺偵偳傟偔傜偄偺帪娫偑偐偐傞偺偐丄偦偟偰4偮偺傾儖僑儕僘儉娫偱偳偺掱搙偺嵎偑偁傞偺偐傪尒偰傒傑偟傚偆丅

 

儔儞僟儉300枩暥帤

傑偢偼儔儞僟儉側暥帤偐傜側傞僥僉僗僩300枩暥帤偐傜丄乽gamecording乿偲偄偆僷僞乕儞傪僒乕僠偡傞帪娫傪尒偰傒傑偡丅

僷僞乕儞偑偁傞埵抲傪嵟弶丄恀傫拞丄嵟屻偺3捠傝偵偮偄偰挷傋偰偄傑偡丅

側偍僷僞乕儞偼僥僉僗僩拞偵偨偩堦売強偟偐弌尰偟側偄傛偆偵偟偰偄傑偡丅

 

6-1

慡偰偵偍偄偰BM朄偑埑彑偱偡丅傑偨丄慡偰偵偍偄偰KMP朄偑嵟壓埵偱偁傞偙偲偑暘偐傝傑偡丅

 

椶帡300枩暥帤

僥僉僗僩撪偺暥帤偑儔儞僟儉偱偼側偔丄僷僞乕儞偵旕忢偵傛偔帡偨暥帤楍偽偐傝偱偁傞応崌偼偳偆偱偟傚偆丅

椺偊偽丄

僷僞乕儞乽gamecoding乿偵懳偟偰丄

僥僉僗僩偼乽gamecodinaamecodingamecodinaamecoding乧乮300枩暥帤乯乿側偳偲側偭偰偄傞応崌偱偡丅

6-2

寢壥偼儔儞僟儉僥僉僗僩偲堦弿偱偡丅

 

 

2恑暥帤300枩暥帤偐傜2恑悢僷僞乕儞偺専嶕

僷僞乕儞偑2恑悢丄偮傑傝2偮偺忬懺偟偐偲傜側偄暥帤偐傜惉傝丄僥僉僗僩懁傕2恑悢偱偁傞応崌偼偳偆偱偟傚偆丅

6-3

2恑悢偱偼丄KMP朄偲僽儖乕僩宯傾儖僑儕僘儉偑媡揮偟傑偡丅2恑悢偺専嶕偼KMP朄偑桳岠偱偁傞桞堦偺忬嫷偱偟傚偆丅

 

BM朄偵偲偭偰嵟埆側僥僉僗僩

偙偙傑偱偼丄BM朄偑慡偰偵偍偄偰嵟懍偱偟偨偑丄幚偼僷僼僅乕儅儞僗偑嬌抂偵棊偪傞忬嫷偑偁傞偵偼偁傝傑偡丅偟偐偟丄偦偺傛偆側僥僉僗僩偼傑偢柍偄偺偱怱攝偼側偄偲巚偄傑偡丅

BM朄偑嵟埆偵側傞摿庩側働乕僗偲偼丄僥僉僗僩偑乽僷僞乕儞偺塃偐傜2屄栚偺暥帤偽偐傝偐傜惉傞乿応崌偱偡丅

僒儞僾儖偱偼丄僷僞乕儞偑gamecoding偱偡偐傜丄塃偐傜2斣栚偺暥帤偼n偱偡丅僥僉僗僩偺傎偲傫偳偑n偺応崌偼BM朄偵偲偭偰嵟埆偱懠偺3偮偺傾儖僑儕僘儉偲斾妑偟偰傕抶偔側傝傑偡丅

側偤丄偦偺傛偆側応崌偵抶偔側傞偺偐偲偄偆偲丄BM朄偺巇慻傒傪棟夝偟偰偄傟偽偍偺偢偲暘偐傝傑偡丅

僷僞乕儞偺塃偐傜2斣栚偺暥帤偲僥僉僗僩忋偺暥帤偑摨偠暥帤偱偁傞応崌丄乽僗僉僢僾悢偑偨偭偨堦暥帤暘乿偵偟偐側傜側偄偐傜偱偡丅偟偨偑偭偰丄堦暥帤扨埵偱挷嵏傪恑傔傞乬椡媄偲摨偠偵乭側偭偰偟傑偄傑偡丅偦偆側偭偰偼僐乕僪偑僔儞僾儖側椡媄傛傝抶偔側傞偺偼摉慠偱偡丅

 

6-4

 

BM朄偑嵟傕抶偄寢壥偵側偭偰偄傑偡丅

 

6-5丂椡媄傕乬巊偊傞乭傾儖僑儕僘儉

復偺嵟弶偱丄乽応崌偵傛偭偰偼椡媄偺傎偆偑偄偄応崌傕偁傝傑偡丅乿偲弎傋傑偟偨偹丅偲偄偆偺偼丄BM朄偼妋偐偵崅懍側傾儖僑儕僘儉偱偡偑丄偦傟屘丄傗偼傝偦偙偵偼偦傟側傝偺戙彏偑敽偄傑偡丅偦傟偵懳偟丄椡媄傾儖僑儕僘儉偵偼偦偺戙彏傪暐偆昁梫偑側偄偐傜偱偡丅

戙彏偲偄偆偺偼丄儚乕僋僄儕傾暘偺儊儌儕妋曐偺昁梫惈偺偙偲偱偡丅

BM朄偵偍偄偰偼丄僥僉僗僩撪偵弌尰偟偆傞暥帤偺庬椶偩偗儚乕僋僄儕傾偑昁梫偵側傝傑偡丅椺偊偽ANSI暥帤偟偐側偄僥僉僗僩偱偁傞偙偲偑暘偐偭偰偄傞偺偱偁傟偽256屄丄偮傑傝256僶僀僩偺儚乕僋僄儕傾偑昁梫偵側傝傑偡丅256僶僀僩偱偁傟偼偦偺戙彏偼柍帇偱偒傑偡丅偟偐偟丄擔杮岅暥帤楍偱偁傞応崌偼丄壗枩屄傕偺暥帤暘偺儊儌儕偑昁梫偵側傝傑偡丅儚乕僋僄儕傾偑戝偒偄偙偲偵傛傞僒乕僠偦偺傕偺偺懍搙曄壔偼偁傝傑偣傫偑丄弶婜壔帪偵帪娫偑偐偐傝傑偡丅僥僉僗僩偑彫偝偄応崌偼丄弶婜壔偵偐偐傞帪娫偺傎偆偑戝偒偄偙偲偼桳傝摼傑偡丅偨偩偟丄O(N)宯偺僜乕僩偺傛偆偵壗壄屄傕偺儚乕僋僄儕傾傪昁梫偲偡傞傕偺偱偼側偄偺偱丄偦偺戙彏偼彫偝偄偙偲偼彫偝偄偱偡丅

偁偲偼丄椡媄偲BM朄偺懍搙嵎偑僜乕僩偵偍偗傞偦傟傛傝偼彫偝偄偙偲傕丄椡媄傾儖僑儕僘儉偑乬巊偊傞乭偲尵偭偨棟桼偱偡丅

儚乕僋僄儕傾偺偨傔偵丄僥僉僗僩偺暥帤僙僢僩傪挷傋傞岺掱偑柺搢偩偭偨傝丄儚乕僋僄儕傾傪壗傜偐偺棟桼偱妋曐偟偨偔側偄応崌偼丄偁傞偄偼僥僉僗僩偑彫婯柾偱BM朄偵傛傞弶婜壔帪娫偺傎偆偑挿偔側偭偰偟傑偆応崌偼乬椡媄乭傪巊梡偟偨傎偆偑偄偄偱偟傚偆丅

 

摿掕栚揑傾儖僑儕僘儉

7復丂A*

 

僒儞僾儖僾儘僕僃僋僩丂ch07 A僗僞乕

7-0

 

A*偺儖乕僣

暯柺忋偱2揰娫偺嵟抁宱楬傪尒偮偗傞傾儖僑儕僘儉偼丄僷僗専嶕傾儖僑儕僘儉(Path Finding Algorithm)偲尵偄傑偡丅傕偪傠傫忈奞暔傪夞旔偟偨僷僗乮宱楬乯偱嵟抁偲偄偆堄枴偱偡丅

7-1

 

忈奞暔傪峫偊側偔偰傕偄偄偺側傜嵟抁宱楬偼2揰傪寢傇捈慄側傢偗偱丄杮復偺夝愢傕1峴偱廔傢偭偰偟傑偄傑偡丅

x+=(x<僑乕儖x嵗昗)-(x>僑乕儖x嵗昗);y+=(y<僑乕儖y嵗昗)-(y>僑乕儖y嵗昗);

1峴偱嵪傑偣偰偟傑偆偲師偺恾偺傛偆偵側傝傑偡丅

7-2

乧偙傟偱偼偁傑傝偵傕埨堈偱偡傛偹丅偙傟側傜彫妛惗偱傕幚憰偱偒傑偡偟丄傢偞傢偞杮復傪愝偗傞昁梫偼偁傝傑偣傫丅

 

偝偰丄僐儞僺儏乕僞乕壢妛偺暘栰偱嵟弶偵僷僗専嶕傾儖僑儕僘儉傪敪昞偟偨偺偼丄僆儔儞僟恖偺Edsger Wybe Dijkstra偱偡丅

斵偼丄僪僀僣偺尃埿偁傞悢妛嶨帍Numerische Mathematik偺拞偱乽A note on two problems in connexion with graphs乿偲偟偰僷僗専嶕傾儖僑儕僘儉傪1959擭偵敪昞偟偰偄傑偡丅偙傟偼屻偵Dijkstras Algorithm偲屇偽傟傞傛偆偵側傝傑偡丅

偟偐偟丄Dijkstra傾儖僑儕僘儉偼慡偰偺僷僗傪昡壙偡傞偲偄偆椡媄揑側傕偺偱偁傞偺偱丄妋偐偵嵟抁僷僗傪尒偮偗傞偙偲偑弌棃傞傕偺偺丄偦偺幚峴帪娫偑栤戣偵側傝傑偡丅

偦偙偱丄僶僇惓捈偵慡偰偺壜擻惈傪寁嶼偟偰偟傑偆Dijkstra傾儖僑儕僘儉偵乬僑乕儖傑偱偺梊應嫍棧乭乮僸儏乕儕僗僥傿僢僋乯傪庢傝擖傟丄幚峴懍搙傪忋偘偨傾儖僑儕僘儉偺堦斒宯偑採彞偝傟傞傛偆偵側傝傑偡丅偦偺傾儖僑儕僘儉偼乽A 傾儖僑儕僘儉乿偲屇偽傟傑偡丅偝傜偵A傾儖僑儕僘儉傪嵟揔壔偟偨條乆側僇僗僞儉僶乕僕儑儞傪憤徧偟偰A*傾儖僑儕僘儉偲屇傃傑偡丅A傾儖僑儕僘儉媦傃嵟弶偺A*傾儖僑儕僘儉偼丄1968擭偵Peter HartNils NilssonBertram Raphael傜偵傛偭偰敪昞偝傟傑偟偨丅

偟偨偑偭偰Dijkstra傾儖僑儕僘儉偼A(A*)傾儖僑儕僘儉偵偍偄偰悇應抣傪峫椂偟側偄応崌偺摿庩宍偲傕尵偊傑偡丅

側偍丄A*偼乽僄乕丒僗僞乕乿偲敪壒偟傑偡丅

 

尨棟偲幚嵺偺専嶕夁掱

尨棟偼偗偭偙偆扨弮偱偡偺偱丄怱攝偼梫傝傑偣傫丅

側偍丄堦斒揑側A*偲偼旝柇偵堎側傞昅幰撈帺偺巇慻傒傗昞尰偑偁傝傑偡丅傕偭偲傕A*帺懱偑A傾儖僑儕僘儉偺僇僗僞儉僶乕僕儑儞偺憤徧側偺偱丄乬堦斒揑側A*乭偲偄偆偺傕曄側榖偱偁傝丄偁偊偰抐傞昁梫傕側偄偺偱偡偑丅

 

偝偰丄傑偢A*偺寁嶼傪崅懍偵偡傞偨傔偵僼傿乕儖僪傪揔摉側扨埵偵暘妱偟傑偡丅

7-3

7-4

偙偙偱丄堦偮偺儅僗栚傪乬僙儖乭偲屇傇偙偲偵偟傑偡丅

僙儖偼儕儞僋僪儕僗僩偲偟偰娗棟偟偰傕偄偄偱偡偟丄攝楍偱娗棟偟偰傕偄偄偺偱偡偑丄壗傟偵偟偰傕僙儖帺恎偵婔偮偐偺忣曬傪帩偨偣側偔偰偼側傜側偄偺偱丄僙儖梡偺峔憿懱傪掕媊偡傞偙偲偵側傞偱偟傚偆丅

嬶懱揑偵丄僙儖1屄偵偮偒嵟掅尷帩偨偣傞忣曬偼師偺5偮偱偡丅

 

1丏僐僗僩

2.僸儏乕儕僗僥傿僢僋

3.僗僐傾

4丏僗僥乕僞僗

5.恊僙儖傊偺儕儞僋

 

1丏僐僗僩偲偼丄尰嵼埵抲乮挷嵏偟偰偄傞僙儖乯偐傜弌敪揰乮挷嵏傪奐巒偟偨埵抲乯偵栠傞偨傔偵梫偡傞嫍棧乮儅僗栚偺悢乯偱偡丅

 

2.僸儏乕儕僗僥傿僢僋偲偼丄尰嵼埵抲偐傜僑乕儖傑偱偺乬悇掕乭嫍棧偱偡丅側偤乬悇掕乭側偺偐偲偄偆偲丄峫偊偰傕傒偰偔偩偝偄丄挷嵏偺搑拞偱丄僑乕儖傑偱偺惓妋側儅僗悢偑暘偐傞傢偗偑偁傝傑偣傫丅媡偵尵偆偲丄傕偟搑拞偱僑乕儖傑偱偺儅僗悢偑暘偐傞偺偱偁傟偽丄偦傕偦傕挷嵏偺昁梫偑側偄傢偗偱偡丅僑乕儖傑偱偺儅僗悢傪挷傋傞偺偑栚揑偱側偺偱偡偐傜丅

僒儞僾儖偱偼丄悇掕嫍棧傪奐巒埵抲偲僑乕儖偺娫偺捈慄嫍棧偵傛傝媮傔偰偄傑偡丅忈奞暔偼堦愗柍帇偟偨捈慄嫍棧偱偡丅

 

3.僗僐傾偲偼丄僐僗僩偲僸儏乕儕僗僥傿僢僋傪扨弮偵懌偟偨抣偱偡丅師偵堏摦偡傞僙儖傪寛掕偡傞偺偵偼僗僐傾傪婎偵敾抐偟傑偡丅挷嵏偼嵟彫僗僐傾偺僙儖傪偳傫偳傫堏摦偟偰偄偔偙偲偵傛傝恑傔偰偄偒傑偡丅

 

4丏僗僥乕僞僗偲偼丄僙儖偺忬懺偱偡丅僙儖偼忬懺傪帩偪丄偦偺忬懺偵傛傝廳梫側敾抐偑壜擻偵側傝傑偡丅嬶懱揑偵偼師偺5偮偺忬懺傪偲傝傑偡丅

嘆僄儞僾僥傿乮Empty乯乧枹挷嵏偺僙儖丅

嘇僆乕僾儞乮Open乯乧忈奞暔偑柍偔丄捠夁偱偒傞僙儖丅

嘊僆僽僗僞僋儖乮Obstacle乯乧忈奞暔偑偁傝丄捠夁偡傞偙偲偑弌棃側偄僙儖丅

嘋僋儘乕僘僪乮Closed乯乧崱傑偱捠夁偟偨僙儖丅

嘍僑乕儖(Goal)乧僑乕儖僙儖丅乮偟偨偑偭偰偙偺僗僥乕僞僗偑晅偔僙儖偼堦偮偺傒乯

 

5.恊僙儖傊偺儕儞僋偼丄僑乕儖僙儖傪尒偮偗偨偲偒丄偦偺儕儞僋傪媡偵扝傞偙偲偵傛傝丄宱楬傪嶌惉偡傞嵺偵巊梡偟傑偡丅

 

挷嵏慜偵偍偄偰丄忈奞暔埲奜偺慡偰偺僙儖偼僄儞僾僥傿偱偁傝丄僐僗僩丄僸儏乕儕僗僥傿僢僋丄僗僐傾偲傕偵抣偑擖偭偰偄傑偣傫丅

7-5

 

偱偼丄幚嵺偺挷嵏夁掱傪侾僗僥僢僾偢偮尒側偑傜丄嵶偐偔夝愢偟傑偡丅偁偣傜偢偠偭偔傝撉傔偽昁偢棟夝偱偒傞偼偢偱偡丅乮婎杮傾儖僑儕僘儉傛傝傕傛偭傐偳娙扨偱偡傛乯

側偍丄恾偼慡偰幚嵺偵婡擻偟偰偄傞僒儞僾儖僾儘僌儔儉偺僉儍僾僠儍夋憸偱偡偺偱丄偙傟埲忋尰幚揑側恾偼偁傝傑偣傫丅側傫側傜僒儞僾儖傪幚峴偟側偑傜撉傫偱傕傜偭偰傕峔偄傑偣傫丅

僙儖忋偺暥帤忣曬傕幚嵺偵僒儞僾儖偑弌椡偟偰偄傞傕偺偱偁傝丄巻柺忋偱廳偹彂偒偟偰偄傞傢偗偱偼偁傝傑偣傫丅

 

僒儞僾儖偱偺僙儖忋偺忣曬偺堄枴偼師偺恾偺偲偍傝偱偡丅

7-6

C偼僐僗僩丄h偼僸儏乕儕僗僥傿僢僋丄S偼僗僐傾丄偦偺壓偵偁傞僴僀僼儞傪嫴傫偩2偮偺悢帤偼嵗昗偱偡丅恾偱偼13-19偐傜22-12傑偱偁傝傑偡偹丅偙傟偼僇儊儔偑僼傿乕儖僪偺拞怱晅嬤偵偁傞偨傔偱偡丅僒儞僾儖偺僼傿乕儖僪偼偗偭偙偆戝偒偔丄僗僋儘乕儖偵傛傝僇儊儔傪堏摦偟傑偡丅

嵗昗偺撉傒曽偼丄乮墶嵗昗乯-乮廲嵗昗乯偱偡丅墶偺嵗昗抣偑塃偵偄偔傎偳憹偊偰偄傞偺偑暘偐傞偲巚偄傑偡丅廲偺嵗昗偑壓偵峴偔傎偳憹偊偰偄傞偺傕摨條偱偡丅

堦斣壓偺暥帤偼僗僥乕僞僗偱偡丅EMPTYOPENOBSTACLECLOSEDGOAL5偮偺壗傟偐偵側傝傑偡丅

 

偝偀丄幚嵺偵挷嵏傪奐巒偟偰偄偒傑偟傚偆両

偦偺帪挷嵏偟偰偄傞僙儖傪婲揰偲偟偰廃埻8屄偺僙儖偵偮偄偰挷傋傞岺掱傪1僗僥僢僾偲偡傞偲丄慡24僗僥僢僾偱専嶕傪廔偊傑偡丅

僗僥僢僾1偮偵偮偒1偮偺恾傪尒偰偄偒傑偡丅

 

傑偢丄1僗僥僢僾栚偼師偺恾偵側傝傑偡丅

7-7

挷嵏奐巒揰偼帺暘偑偄傞応強丄嵗昗15-14偺埵抲偱偡丅偦偟偰僑乕儖偼嵗昗19-19偱偡丅

傑偢偼奐巒揰傪拞怱偲偟偰丄廃埻8僙儖傪挷傋傑偡丅偙偺応崌丄廃埻偵偼忈奞暔偑柍偄偺偱8偮偺僙儖偺僗僥乕僞僗偼慡偰OPEN乮捠夁偟摼傞僙儖乯偵偟傑偡丅偦偟偰丄奐巒揰偼柧傜偐偵挷嵏偺昁梫偑側偄偺偱柍忦審偱CLOSED偵偟傑偡丅

僗僥乕僞僗晅偗偲摨帪偵丄僗僐傾傪寁嶼乮僗僐傾儕儞僌乯偟傑偡丅

僐僗僩乮c乯偼丄奐巒揰偵栠傞偺偵梫偡傞嫍棧乮僙儖悢乯偱偡丅尵偄姺偊傞偲奐巒揰偐傜偺嫍棧乮僙儖悢乯偲傕尵偊傑偡丅偙偺応崌丄奐巒揰偐傜偺嫍棧偼慡偰偺僙儖偱1側偺偱丄慡偰僐僗僩傪1偵偟傑偡丅

僸儏乕儕僗僥傿僢僋乮h乯偼丄僑乕儖傑偱偺悇掕嫍棧偱偡丅僒儞僾儖偱偼忈奞暔傪柍帇偟偨僑乕儖傑偱偺扨弮側捈慄嫍棧傪僸儏乕儕僗僥傿僢僋偲偟偰偄傞偺偱丄嵗昗15-15,16-15,16-143僙儖偼僸儏乕儕僗僥傿僢僋偑5偱偡丅幚嵺偵僑乕儖傑偱偺僙儖傪悢偊偰傒偰偔偩偝偄丅帺暘帺恎傕僇僂儞僩偡傞偺偱丄偦偺僙儖偐傜僑乕儖傑偱偺僙儖悢+1傪僸儏乕儕僗僥傿僢僋偲偟偰偄傑偡丅

摨條偵嵗昗14-15,16-13偼僸儏乕儕僗僥傿僢僋偑6丄嵗昗14-14,14-13,15-13偼僸儏乕儕僗僥傿僢僋偑7偱偡丅

僐僗僩偲僸儏乕儕僗僥傿僢僋偑媮傑傟偽丄偡側傢偪僗僐傾偼帺摦揑偵媮傑傝傑偡丅乮僗僐傾偼僐僗僩+僸儏乕儕僗僥傿僢僋乯

偁偲丄恾偱偼尒偊傑偣傫偑丄廃埻8偮偺僙儖偺恊傪婎揰僙儖乮15-14乯偵偟傑偡丅

 

師偵挷傋傞僙儖埵抲傪寛掕偡傞偵偼丄乬嵟傕僗僐傾偑彫偝偄乭僙儖偵堏摦偟傑偡丅偟偨偑偭偰丄僗僐傾偑6偱偁傞3偮偺僙儖乮15-15,16-15,16-14乯偑岓曗偵嫇偑傝傑偡丅

岓曗偲側傞僙儖偑暋悢偁傞応崌丄偳偺僙儖傪偲偭偰傕偄偄偙偲偑暘偐偭偰偄傑偡丅

僒儞僾儖偱偼丄15-15偺僙儖傪師偺挷嵏偺婎揰僙儖偵偟傑偡丅

 

偙傟偱1偮偺僗僥僢僾偑廔椆偱偡丅婎杮揑偵偙傟偺孞傝曉偟傪峴偭偰偄偗偽丄僑乕儖傑偱偺嵟抁宱楬偑尒偮偐傝傑偡丅

娙扨偱偟偐傕惓妋側僷儔僟僀儉偱偡偹丅

 

2僗僥僢僾偱偡丅戞1僗僥僢僾偱偺婲揰僙儖偼CLOSED偵偟傑偡丅CLOSED偵偡傞棟桼偼丄嵞搙偦偺僙儖傪捠夁偟偰偟傑偆偲偄偆儘僗傪柍偔偡偨傔偱偡丅

7-8

僗僥僢僾1偲摨偠傛偆偵僗僐傾儕儞僌傪峴偭偰偄傑偡丅偨偩偟丄婲揰偑15-15側偺偱丄廃埻8僙儖偼摉慠僗僥僢僾1偲堎側傝傑偡丅

傑偨丄廃埻8僙儖偲尵偭偰傕丄偦偺偆偪6屄偼偡偱偵僗僥僢僾1偱挷嵏偟偰偄偰偡偱偵僗僥乕僞僗晅偗偑偝傟偰偄傑偡丅偟偨偑偭偰丄怴偨偵挷嵏偡傞偺偼忋3偮偩偗偱偡丅

偙偺僗僥僢僾偵偍偗傞8僙儖偲崱傑偱偺OPEN僙儖傪娷傔偨拞偱丄僗僐傾偑嵟彫側僙儖偼丄挌搙塃懁偺3偮乮16-16,16-15,16-14乯偱偡丅OPEN偵側偭偰偄傞僙儖慡偰偺拞偐傜嵟彫偺傕偺傪慖傃傑偡丅

椺偵傛傝3偮偺偆偪偳傟傪師偺婲揰偵偟偰傕椙偔丄僒儞僾儖偱偼16-15傪婲揰偵偟偰偄傑偡丅

 

僗僥僢僾3偱偡丅

僗僥僢僾2偺婲揰偼CLOSED偵偟傑偡丅

僗僐傾儕儞僌摍丄崱傑偱偲摨條偺寁嶼傪峴偄傑偡丅

傑偨丄師偺僙儖偺寛掕傕摨條偱偡丅僒儞僾儖偱偼17-16偺僙儖傪師偺僙儖偵偟傑偡丅

7-9

 

僗僥僢僾4偱偡丅

偙偙偱弶傔偰崱傑偱偲堎側傞忬嫷偵側傝傑偡丅

 

7-10

17-16偺廃傝偵偼丄忈奞暔偑娷傑傟傑偡丅廃埻8僙儖拞5屄偺僙儖偑忈奞暔偱偡丅A*偺庬椶偵傛偭偰偼偙偺帪揰偱僙儖偺僗僥乕僞僗傪忈奞暔偲偡傞傕偺傕偁傞偲巚偄傑偡偑丄杮僒儞僾儖偱偼丄弶婜壔帪偵偍偄偰僼傿乕儖僪傪僥僉僗僩僼傽僀儖偐傜撉傒崬傓帪揰偱婛偵丄OBSTACLE乮忈奞暔乯偵偟偰偄傑偡丅

摉慠丄忈奞暔僙儖偼乬捠夁偱偒側偄僙儖乭側偺偱師偺婎揰僙儖偵側傞偙偲傕偁傝傑偣傫丅偟偨偑偭偰僗僐傾儕儞僌偡傞偙偲偼柍堄枴側偺偱偟傑偣傫丅

忈奞暔埲奜偺僙儖丄偡側傢偪OPEN偱偁傞僙儖偺偆偪嵟彫側僙儖傪師偺婎揰僙儖偵偟傑偡丅僒儞僾儖偱偼16-14傪師偺婲揰僙儖偵偟偰偄傑偡丅

尒偨栚丄媡峴偟偰偄傞傛偆偵姶偠傞偐傕偟傟傑偣傫丅偟偐偟婛偵弎傋偨傛偆偵丄摨偠僗僐傾偱偁傟偽偳偺僙儖傪慖戰偟偰傕摨偠偱偁傝丄堦尒媡偵恑傫偱偄傞傛偆偵尒偊偰傕丄柍懯偵側傞傢偗偱偼偁傝傑偣傫丅

 

僗僥僢僾5偱偡丅婲揰僙儖偼16-14

崱傑偱偲摨條偱偡丅

偙傟埲崀偼丄怴偟偄忬嫷偼堦愗側偔丄偡傋偰崱傑偱愢柧偟偨偙偲傪孞傝曉偡偩偗偱偡偺偱丄恾偩偗挱傔偰偔偩偝偄丅

7-11

 

僗僥僢僾6偱偡丅婲揰僙儖偼16-16

7-12

 

僗僥僢僾7偱偡丅婲揰僙儖偼17-15

7-13

 

僗僥僢僾8偱偡丅婲揰僙儖偼14-15偱偡丅偪傚偭偲棧傟傑偟偨偹丅巚偄弌偟偰偔偩偝偄丄崱傑偱挷嵏偟偨慡偰偺OPEN僙儖偐傜嵟彫傪慖傇偙偲傪丅

7-14

 

僗僥僢僾9偱偡丅婲揰僙儖偼16-13偱偡

7-15

 

僗僥僢僾10偱偡丅婲揰僙儖偼14-16偱偡

7-16

 

僗僥僢僾11偱偡丅婲揰僙儖偼15-16偱偡

7-17

 

僗僥僢僾12偱偡丅婲揰僙儖偼17-14偱偡

7-18

 

僗僥僢僾13偱偡丅婲揰僙儖偼15-13偱偡

7-19

 

僗僥僢僾14偱偡丅婲揰僙儖偼14-13偱偡

7-20

 

僗僥僢僾15偱偡丅婲揰僙儖偼14-14偱偡

7-21

 

僗僥僢僾16偱偡丅婲揰僙儖偼17-13偱偡

7-22

 

僗僥僢僾17偱偡丅婲揰僙儖偼18-14偱偡

7-23

 

僗僥僢僾18偱偡丅婲揰僙儖偼19-15偱偡

7-24

 

僗僥僢僾19偱偡丅婲揰僙儖偼19-16偱偡

7-25

 

僗僥僢僾20偱偡丅婲揰僙儖偼20-16偱偡

7-26

 

僗僥僢僾21偱偡丅婲揰僙儖偼19-17偱偡

7-27

 

僗僥僢僾22偱偡丅婲揰僙儖偼20-17偱偡

7-28

 

僗僥僢僾23偱偡丅婲揰僙儖偼21-17偱偡

7-29

 

僗僥僢僾24偱偡丅OPEN僙儖偺拞偵丄GOAL偑娷傑傟偰偄傑偡丅偡側傢偪挷嵏偑姰椆偟傑偟偨丅

偁偲偼丄偦偺GOAL僙儖偐傜恊僙儖傪媡憱嵏偟偰僷僗傪嶌傟偽偄偄偺偱偡丅

 

7-30

僒儞僾儖偺愢柧

僉乕憖嶌

W,僗儁乕僗,A,D僉乕丗庡恖岞偺堏摦丅

栴報僉乕丗僇儊儔偺堏摦

Z,X僉乕丗僇儊儔偺崅偝挷愡乮夋柺偺戝偒偝乯

儕僞乕儞僉乕丗僷僗寁嶼奐巒

 

奣梫

偙偺僒儞僾儖偼A*偵傛傝庡恖岞傪堏摦偝偣傞偩偗偱偼側偔丄寁嶼夁掱傪儕傾儖僞僀儉偱昞帵偱偒傑偡丅

僙儖忋偵ID3DXFONT傪棙梡偟偨暥帤偱忣曬傪昞帵偟傑偡丅

儅僢僾偼1庬椶偱偼側偔丄偄傠偄傠側僷僞乕儞傪悢庬椶梡堄偟偰偄傑偡丅儅僢僾偲尵偭偰傕忈奞暔偺攝抲傪昞偡僥僉僗僩僼傽僀儖偱偡丅

Entry.cpp545峴偁偨傝偱僥僉僗僩僼傽僀儖傪撉傒崬傫偱偄傑偡丅

//FILE *fp=fopen("僷僞乕儞1.txt","r");

//FILE *fp=fopen("僷僞乕儞2.txt","r");

//FILE *fp=fopen("僷僞乕儞3.txt","r");

FILE *fp=fopen("柪楬.txt","r");

//FILE *fp=fopen("峏抧.txt","r");

//FILE *fp=fopen("揰嵼.txt","r");

//FILE *fp=fopen("暵偠偨応強.txt","r");

妋擣偟偨偄儅僢僾偺僐儊儞僩傾僂僩傪奜偟丄偦偺懠傪僐儊儞僩傾僂僩偟偰偔偩偝偄丅

 

ID3DXFONT偺僼僅儞僩傪旕忢偵戝検偵儗儞僟儕儞僌偟偰偄傞偺偱娐嫬偵傛偭偰偼偐側傝抶偄偐傕偟傟傑偣傫丅摦嶌妋擣偩偗偱偁傟偽僼僅儞僩傪昞帵偟側偔偰傕偄偄偺偱丄偦偺応崌偼僼僅儞僩偺儗儞僟儕儞僌傪柍岠偵偟偨傎偆偑偄偄偱偟傚偆丅RenderString娭悢偺嵟弶偵return傪捛壛偡傟偽僼僅儞僩偺儗儞僟儕儞僌傪僆僼偵偱偒傑偡丅

VOID RenderString(LPSTR szStr,INT iX,INT iY,D3DCOLOR Color)

{

        return;

        RECT rect={iX,iY,0丒丒丒丒丒

 

僐乕僪夝愢

A僗僞乕偼僋儔僗偵傑偲傔傑偟偨丅斾妑揑抁偄僐乕僪側偺偱丄僋儔僗偺慡僐乕僪傪堦墳宖嵹偟傑偡丅

夝愢偼億僀儞僩晹暘偺傒峴偄傑偡丅

 

A-Star.h

//昁梫側僿僢僟乕僼傽僀儖偺僀儞僋儖乕僪

#include <windows.h>

#include <d3dx9.h>

//

#define SAFE_DELETE(p)       { if(p) { delete (p);     (p)=NULL; } }

#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p)=NULL; } }

#define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } }

//

//僨乕僞宆掕媊

 

//enum ASTAR_STATUS

enum ASTAR_STATUS

{

        ASTAR_EMPTY,

        ASTAR_OPEN,

        ASTAR_CLOSED,

        ASTAR_OBSTACLE,

        ASTAR_GOAL,

};

//struct CELL

struct CELL

{

        POINT ptIndex;

        POINT ptParent;

        INT iCost;

        INT iHeuristic;

        INT iScore;

        ASTAR_STATUS Status;

        BOOL boRealPath;

        VOID* ppv1;

        VOID* ppv2;    

};

//struct ASTAR_INIT

struct ASTAR_INIT

{

        CELL* pCell;

        DWORD dwCellWidth;

        DWORD dwCellHeight;            

};

//struct ASTAR_PARAM

struct ASTAR_PARAM

{

        CELL* pCell;

        POINT ptStartPos;

        POINT ptGoalPos;       

        POINT ptCurrentPos;

};

//class ASTAR

class ASTAR

{

public:

        ASTAR();

        ~ASTAR();

        POINT* m_ptPath;

        DWORD m_dwPathList;

 

        HRESULT Init(ASTAR_INIT* );

        HRESULT CalcPath(ASTAR_PARAM* );       

protected:

        CELL* m_pCell;

        POINT* m_pOpenList;

        DWORD m_dwOpenAmt;

        POINT* m_pClosedList;

        DWORD m_dwClosedAmt;

        DWORD m_dwCellWidth;

        DWORD m_dwCellHeight;

        POINT m_ptVolute[9+1];

        POINT m_ptGoal;

 

        HRESULT CalcScore(ASTAR_PARAM*);

        HRESULT MakePathFromClosedList(ASTAR_PARAM*);

        INT CalcDistance(POINT*,POINT*);

        HRESULT Reset();

};

 

A-Star.cpp

//昁梫側僿僢僟乕僼傽僀儖偺僀儞僋儖乕僪

#include "A-Star.h"

//

//ASTAR::ASTAR()

//

ASTAR::ASTAR()

{      

        ZeroMemory(this,sizeof(ASTAR));

        //volute乮僌儖僌儖丂徫乯弶婜壔丅 偁傞嵗昗偺廃傝8曽岦丂乮婲揰僙儖偺廃埻8僙儖偵堏摦偡傞嵺偵棙梡偡傞乯

        m_ptVolute[0].x=0;     

        m_ptVolute[0].y=0;

        m_ptVolute[1].x=-1;

        m_ptVolute[1].y=1;

        m_ptVolute[2].x=0;

        m_ptVolute[2].y=1;

        m_ptVolute[3].x=1;

        m_ptVolute[3].y=1;

        m_ptVolute[4].x=1;

        m_ptVolute[4].y=0;

        m_ptVolute[5].x=1;

        m_ptVolute[5].y=-1;

        m_ptVolute[6].x=0;

        m_ptVolute[6].y=-1;

        m_ptVolute[7].x=-1;

        m_ptVolute[7].y=-1;

        m_ptVolute[8].x=-1;

        m_ptVolute[8].y=0;

        /* 斣崋偲嵗昗偺懳墳偼丄師偺偲偍傝

        1 2 3

    8 0 4

    7 6 5

        */     

}

//

//ASTAR::~ASTAR()

//

ASTAR::~ASTAR()

{

        SAFE_DELETE_ARRAY(m_pOpenList);

        SAFE_DELETE_ARRAY(m_pClosedList);

        SAFE_DELETE_ARRAY(m_ptPath);

}

//

//HRESULT ASTAR::Init(ASTAR_INIT* pai)

//

HRESULT ASTAR::Init(ASTAR_INIT* pai)

{

        m_dwCellWidth=pai->dwCellWidth;

        m_dwCellHeight=pai->dwCellHeight;

        m_pCell=pai->pCell;    

 

        m_pOpenList = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_pOpenList)

        {

                return E_OUTOFMEMORY;

        }

        m_pClosedList = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_pClosedList)

        {

                return E_OUTOFMEMORY;

        }

 

        m_ptPath = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_ptPath)

        {

                return E_OUTOFMEMORY;

        }

 

        return S_OK;

}

//

//

//

HRESULT ASTAR::Reset()

{

        DWORD dwMaxAmt=m_dwCellWidth * m_dwCellHeight;

        for(DWORD i=0;i<dwMaxAmt;i++)

        {

                m_pCell[i].iCost=0;

                m_pCell[i].iHeuristic=0;

                m_pCell[i].iScore=0;

                m_pCell[i].boRealPath=FALSE;   

                ZeroMemory(&m_pCell[i].ptParent,sizeof(POINT));

                if(m_pCell[i].Status != ASTAR_OBSTACLE)

                {

                        m_pCell[i].Status=ASTAR_EMPTY;

                }

        }

 

        m_dwOpenAmt=0;

        m_dwClosedAmt=0;

        m_dwPathList=0;

        ZeroMemory(m_ptPath,sizeof(POINT) * m_dwCellWidth * m_dwCellHeight );

 

        return S_OK;

}

//

//HRESULT ASTAR::CalcPath(ASTAR_PARAM* pParam)

//

HRESULT ASTAR::CalcPath(ASTAR_PARAM* pParam)

{

        //僑乕儖偑揔惓側応強偐乮僑乕儖偑忈奞暔偺撪晹偵側偭偰偄側偄偐乯

        if(m_pCell[ pParam->ptGoalPos.y*m_dwCellWidth+pParam->ptGoalPos.x ].Status==ASTAR_OBSTACLE)

        {

                MessageBox(0,"obstacle","",MB_OK);

                return E_FAIL;

        }

        Reset();

        if(SUCCEEDED(CalcScore(pParam)))

        {

                MakePathFromClosedList(pParam);

        }

        else

        {

                MessageBox(0,"摦偗側偄","",MB_OK);

        }

        return S_OK;

}

//

//HRESULT ASTAR::CalcScore(ASTAR_PARAM* pParam)

//

HRESULT ASTAR::CalcScore(ASTAR_PARAM* pParam)

{

        DWORD i;

        INT iOffset;

 

        POINT ptStart=pParam->ptStartPos;

        POINT ptGoal=pParam->ptGoalPos;

        POINT ptCurrentPos=pParam->ptCurrentPos;

        //尰嵼僙儖偼柍忦審偱僋儘乕僘僪偵偡傞

        iOffset=ptCurrentPos.x*m_dwCellHeight+ptCurrentPos.y;

        if(m_pCell[iOffset].Status != ASTAR_CLOSED)

        {

                m_pCell[iOffset].Status=ASTAR_CLOSED;

                m_dwClosedAmt++;

        }      

        //椬愙8僙儖偺僗僐傾儕儞僌乮僆乕僾儞儕僗僩嶌惉乯

        for(i=1;i<=8;i++)

        {              

                ptCurrentPos=pParam->ptCurrentPos;

                ptCurrentPos.x+=m_ptVolute[i].x;

                ptCurrentPos.y+=m_ptVolute[i].y;

                //僙儖儅僢僾偺斖埻奜偵摓払偟偨応崌

                if(ptCurrentPos.x<0 || (DWORD)ptCurrentPos.x>m_dwCellWidth || ptCurrentPos.y<0 || (DWORD)ptCurrentPos.y>m_dwCellHeight)

                {      

                        continue;

                }              

 

                iOffset=(INT)ptCurrentPos.x*m_dwCellHeight+(INT)ptCurrentPos.y;

                //僑乕儖僙儖偵摓払偟偨応崌

                if(ptCurrentPos.x == ptGoal.x && ptCurrentPos.y == ptGoal.y)

                {

                        m_pCell[iOffset].ptParent=pParam->ptCurrentPos;//恊僙儖傊偺儕儞僋

                        m_pCell[iOffset].Status=ASTAR_GOAL;

                        m_ptGoal=m_pCell[iOffset].ptIndex;             

                        return S_OK;

                }              

                switch(m_pCell[iOffset].Status)

                {

                        case ASTAR_EMPTY:                              

                                m_pCell[iOffset].iHeuristic=CalcDistance(&ptGoal,&ptCurrentPos);

                                //僐僗僩偼恊偺僐僗僩偵侾傪懌偟偨傕偺

                                {

                                        m_pCell[iOffset].iCost=m_pCell [ pParam->ptCurrentPos.x*m_dwCellHeight +(INT)pParam->ptCurrentPos.y ].iCost+1;

                                }

                                m_pCell[iOffset].iScore=m_pCell[iOffset].iCost + m_pCell[iOffset].iHeuristic;

                                m_pCell[iOffset].Status=ASTAR_OPEN;

                                m_pOpenList[ m_dwOpenAmt ]=ptCurrentPos;

                                m_dwOpenAmt++;

                                //俉僙儖偺恊傪尰嵼僙儖偵偡傞

                                {

                                        m_pCell[iOffset].ptParent=pParam->ptCurrentPos;//恊僙儖傊偺儕儞僋

                                }

                                break;

                        case ASTAR_OPEN:       

                        case ASTAR_CLOSED:             

                        case ASTAR_OBSTACLE:

                                continue;                              

                                break;

                }

        }

        //僆乕僾儞儕僗僩傪娷傔偰嵟彫僗僐傾傪丄怴偨側婲揰僙儖偵偡傞丂乮僋儘乕僘僪儕僗僩偺嶌惉乯

        INT iMinScore=INT_MAX;

        POINT ptNextCellIndex={0};

        DWORD dwMinIndex=0;

        for(i=0;i<m_dwOpenAmt;i++)

        {              

                iOffset=m_pOpenList[ i ].x*m_dwCellHeight+ m_pOpenList[ i ].y;

                if( m_pCell[iOffset].iScore < iMinScore && m_pCell[iOffset].Status == ASTAR_OPEN)

                {

                        iMinScore=m_pCell[iOffset].iScore;

                        dwMinIndex=i;

                }      

        }

        iOffset=m_pOpenList[ dwMinIndex ].x*m_dwCellHeight+ m_pOpenList[ dwMinIndex ].y;

        ptNextCellIndex=m_pCell[iOffset].ptIndex;

        m_pClosedList[ m_dwClosedAmt ]=ptNextCellIndex;

        //怴偨側婲揰僙儖偵傛傞嵞婣屇傃弌偟

        ASTAR_PARAM Param;

        Param.ptStartPos=pParam->ptStartPos;

        Param.ptGoalPos=pParam->ptGoalPos;

        Param.ptCurrentPos=m_pOpenList[ dwMinIndex ];

        Param.pCell=pParam->pCell;

        return CalcScore(&Param);

}

//

//HRESULT ASTAR::MakePathFromClosedList(ASTAR_PARAM* pParam)

//

HRESULT ASTAR::MakePathFromClosedList(ASTAR_PARAM* pParam)

{

        INT iOffset=0;

        INT iBreak=0;

        INT iMaxStep=m_dwCellWidth * m_dwCellHeight;

        m_dwPathList=0;

        // 僋儘乕僘僪僙儖忋偱丄僑乕儖抧揰偐傜僗僞乕僩抧揰傑偱恊傪扝偭偨宱楬傪嵟廔揑側僷僗偲偡傞

        iOffset=m_ptGoal.x*m_dwCellHeight + m_ptGoal.y;   

        do

        {

                if(iBreak>iMaxStep)

                {

                        MessageBox(0,"恊偺儕儞僋偑僗僞乕僩抧揰傑偱宷偑偭偰偄側偄偐丄儕儞僋偑弞娐偟偰偄傑偡","",MB_OK);

                        break;

                }

                iBreak++;

                m_pCell[iOffset].boRealPath=TRUE;

                iOffset=m_pCell[iOffset].ptParent.x*m_dwCellHeight + m_pCell[iOffset].ptParent.y;

                //僷僗儕僗僩偵婰榐乮屇傃弌偟尦偺棙曋惈)

                m_ptPath[m_dwPathList]=m_pCell[iOffset].ptIndex;

                m_dwPathList++;

        }

        while(m_pCell[iOffset].ptIndex.x != pParam->ptStartPos.x || m_pCell[iOffset].ptIndex.y != pParam->ptStartPos.y);

 

        return S_OK;

}

//

//INT ASTAR::CalcDistance(POINT* pptA,POINT* pptB)

//

INT ASTAR::CalcDistance(POINT* pptA,POINT* pptB)

{

        INT iX=pptA->x - pptB->x;

        INT iY=pptA->y - pptB->y;      

        return (INT)sqrtf( iX*iX + iY*iY );

}

 

掕媊晹暘偺愢柧

enum ASTAR_STATUS

{

        ASTAR_EMPTY,

        ASTAR_OPEN,

        ASTAR_CLOSED,

        ASTAR_OBSTACLE,

        ASTAR_GOAL,

};

5偮偺僗僥乕僞僗傪楍嫇宆偱掕媊偟偰偄傑偡丅

 

師偼僙儖偺峔憿懱掕媊偱偡丅

struct CELL

{

        POINT ptIndex;

帺暘帺恎偺嵗昗偱偡丅2師尦側偺偱POINT宆偵偟傑偟偨丅

        POINT ptParent;

恊偺嵗昗偱偡丅尨棟偺夝愢拞偱偼恊傊偺儕儞僋偲弎傋偨偺偱丄

CELL* pParent偲偄偆宍傪憐憸偟偨撉幰傕偄傞偱偟傚偆丅偟偐偟恊偺嵗昗傪曐帩偟傑偡丅側偤側傜丄嵗昗傪偦偺傑傑僀儞僨僢僋僗偲偡傟偽恊傪摿掕偱偒傞偐傜偱偡丅儕儞僋偩偐傜偲偄偭偰億僀儞僞乕偲偼尷傝傑偣傫丅杮僒儞僾儖偼嵗昗偱傕摨條偺婡擻傪桳偟傑偡丅

嵗昗偵偡傞偙偲偵傛傝丄僐乕僪傪彮側偐傜偢嶍尭偱偒傞偙偲偑棟桼偵傕側偭偰偄傑偡丅

 

        INT iCost;

        INT iHeuristic;

        INT iScore;

僐僗僩丄僸儏乕儕僗僥傿僢僋丄僗僐傾傪曐帩偡傞曄悢偱偡丅

 

        ASTAR_STATUS Status;

僗僥乕僞僗傪曐帩偡傞曄悢偱偡丅

 

        BOOL boRealPath;

挷嵏偑姰椆偟偨偲偒偵丄宱楬忋偵偁傞僙儖偵偍偄偰丄偙偺僼儔僌偑TRUE偵側傝傑偡丅偮傑傝丄偙偺僼儔僌偑1偱偁傞僙儖傪暲傋傞偲宱楬偵側傝傑偡丅

 

        VOID* ppv1;

        VOID* ppv2;    

};

ppv1偼丄屇傃弌偟懁乮A僗僞乕僋儔僗偺奜乯偺壗傜偐偺僨乕僞傪巜偡億僀儞僞乕偱偡丅斈梡惈傪峫偊偙偺傛偆偵偟傑偟偨丅杮僒儞僾儖偱偼丄Main.cpp懁偱偺Thing乮儊僢僔儏乯傪巜偟傑偡丅偨偩偟丄僋儔僗撪偱儊僢僔儏摍偺DirectX埶懚僆僽僕僃僋僩傪巊梡偡傞側偳偲偄偆偙偲傪傗偭偰偟傑偆偲丄旕忢偵巊偄偯傜偄僋儔僗偵側偭偰偟傑偆偺偱丄偦偆備偆傢偗偱偼偁傝傑偣傫丅

偙偺億僀儞僞乕傪棙梡偡傞偺偼丄Main.cpp懁偩偗偱偡丅僐乕僪傪僔儞僾儖偵偡傞偨傔偵偙偆偟傑偟偨丅A-Star偵偼杮幙揑偵娭學偁傝傑偣傫偺偱丄怺偔峫偊側偄偱偔偩偝偄丅

ppv2偼掕媊偟偰偄傞偩偗偱丄巊梡偟偰偄傑偣傫丅

 

//struct ASTAR_INIT

struct ASTAR_INIT

{

        CELL* pCell;

        DWORD dwCellWidth;

        DWORD dwCellHeight;

};

A-Star僋儔僗傪弶婜壔偡傞嵺偵弶婜壔僷儔儊乕僞僨乕僞傪嫶搉偟偡傞偨傔偺峔憿懱偱偡丅昅幰偼傛偔偙偺傛偆側宍偱僋儔僗偺弶婜壔傪峴偄傑偡丅

 

//struct ASTAR_PARAM

struct ASTAR_PARAM

{

        CELL* pCell;

        POINT ptStartPos;

        POINT ptGoalPos;       

        POINT ptCurrentPos;

};

偙偺峔憿懱偼摿偵掕媊偟側偔偰傕偄偄傕偺偱偡偑丄僷儔儊乕僞乕傪傑偲傔傞偙偲偵傛傝丄僋儔僗撪偍傛傃奜晹偐傜僋儔僗傊偺僷儔儊乕僞乕傪搉偡晹暘偺僐乕僪傪尭傜偡偙偲偑偱偒傞偺偱丄掕媊偟傑偟偨丅

 

僋儔僗杮懱偺掕媊偵偮偄偰愢柧偟傑偡丅

//class ASTAR

class ASTAR

{

public:

        ASTAR();

        ~ASTAR();

僐儞僗僩儔僋僞丄僨僗僩儔僋僞偱偡丅

 

        POINT* m_ptPath;

嵟廔揑偵専嶕偟偨嵟抁宱楬僙儖孮傊偺億僀儞僞乕偱偡丅屇傃弌偟懁偼丄偙偺億僀儞僞乕偵傛傝宱楬傪抦傞偙偲偵側傝傑偡偺偱丄僷僽儕僢僋偵偟傑偡丅僋儔僗撪偱棙梡偡傞偙偲偼偁傝傑偣傫丅

 

        DWORD m_dwPathList;

嵟廔僷僗傪宍惉偡傞僙儖偺屄悢偱偡丅

 

        HRESULT Init(ASTAR_INIT* );

僋儔僗偺弶婜壔娭悢偱偡丅嵟弶偵堦搙偟偐幚峴偝傟傑偣傫丅

 

        HRESULT CalcPath(ASTAR_PARAM* );

僷僗寁嶼娭悢偱偡丅屇傃弌偟懁偑僷僗傪寁嶼偟偨偲偒偵屇偽傟傑偡丅僒儞僾儖偱偼儕僞乕儞僉乕傪墴偟偨偲偒偵屇偽傟傑偡丅側偍丄尩枾偵尵偊偽偙偺娭悢偼杮摉偺巇帠傪偡傞僾儔僀儀乕僩娭悢傪僐乕儖偡傞偩偗偺儔僢僷乕娭悢偱偡丅

杮棃偺巇帠偼CalcScore娭悢偲MakePathFromClosedList娭悢偺2偮偑峴偄傑偡丅

 

偙傟埲崀偼僋儔僗撪晹偱巊梡偡傞僾儔僀儀乕僩曄悢媦傃娭悢偱偡丅

protected:

        CELL* m_pCell;

慡偰偺僙儖偺愭摢億僀儞僞乕偱偡丅

 

        POINT* m_pOpenList;

僆乕僾儞儕僗僩偺愭摢億僀儞僞乕偱偡丅

 

        DWORD m_dwOpenAmt;

僆乕僾儞儕僗僩撪偺僙儖偺屄悢偱偡丅

 

        POINT* m_pClosedList;

僋儘乕僘僪儕僗僩偺愭摢億僀儞僞乕偱偡丅

 

        DWORD m_dwClosedAmt;

僋儘乕僘僪儕僗僩撪偺僙儖偺屄悢偱偡丅

 

        DWORD m_dwCellWidth;

        DWORD m_dwCellHeight;

僂傿僢僘偼僙儖偑墶偵壗屄昁梫偐丄偦偺屄悢偱偡丅

僴僀僩偼廲偺屄悢偱偡丅

偟偨偑偭偰偙偺2偮傪偐偗偨屄悢偑僙儖偺憤悢偵側傝傑偡丅

 

        POINT m_ptVolute[9+1];

擟堄偺嵗昗偺廃埻8曽岦傪嶲徠偡傞嵺偺棙曋惈偺偨傔偙偺曄悢傪巊梡偟傑偡丅

扨偵婲揰嵗昗偵懌偡僆僼僙僢僩偱偡丅庢傝摼傞抣偼0,1,-1偺壗傟偐偱偡丅

m_ptVolute[0](0,0)側偺偱拞怱偱偡丅乮婲揰嵗昗偲摨偠嵗昗乯

m_ptVolute[1]偼嵍忋

m_ptVolute[2]偼忋

m_ptVolute[3]偼塃忋

m_ptVolute[4]偼嵍

丒丒丒

偲偄偆傛偆偵丄婲揰偺廃傝傪僌儖僌儖夞傞嵗昗傪摼偨偄応崌丄偙偺傛偆側僆僼僙僢僩僥乕僽儖傪梡堄偟偰偍偔偲曋棙偱偡丅

 

        POINT m_ptGoal;

僑乕儖偺嵗昗傪曐帩偡傞曄悢偱偡丅

 

        HRESULT CalcScore(ASTAR_PARAM*);

偙偺娭悢偑庡梫側巇帠傪峴偆丄僋儔僗偺嵟廳梫娭悢偱偡丅

僗僐傾傪寁嶼偟丄僑乕儖傑偱偺僋儘乕僘僪儕僗僩傪嶌惉偟傑偡丅

 

        HRESULT MakePathFromClosedList(ASTAR_PARAM*);

CalcScore偑廔椆偟丄僋儘乕僘僪儕僗僩偑嶌惉偝傟偨傜丄偙偺娭悢偵傛傝嵟廔揑側僷僗偑嶌惉偝傟傑偡丅

 

        INT CalcDistance(POINT*,POINT*);

僸儏乕儕僗僥傿僢僋抣傪媮傔傞娭悢偱偡丅撪梕偼扨弮偵2揰娫偺捈慄嫍棧傪媮傔偰偄傞偩偗偱偡丅

 

        HRESULT Reset();

偁偨傜側僷僗専嶕傪峴偆嵺偵丄慜夞偺寁嶼撪梕摍傪徚嫀偟丄怴偨側専嶕偑壜擻偵側傞傛偆偵偟傑偡丅

 

幚憰晹暘偺愢柧

ASTAR::ASTAR()

{      

        ZeroMemory(this,sizeof(ASTAR));

        //volute乮僌儖僌儖丂徫乯弶婜壔丅 偁傞嵗昗偺廃傝8曽岦丂乮婲揰僙儖偺廃埻8僙儖偵堏摦偡傞嵺偵棙梡偡傞乯

        m_ptVolute[0].x=0;     

        m_ptVolute[0].y=0;

        m_ptVolute[1].x=-1;

        m_ptVolute[1].y=1;

        m_ptVolute[2].x=0;

        m_ptVolute[2].y=1;

        m_ptVolute[3].x=1;

        m_ptVolute[3].y=1;

        m_ptVolute[4].x=1;

        m_ptVolute[4].y=0;

        m_ptVolute[5].x=1;

        m_ptVolute[5].y=-1;

        m_ptVolute[6].x=0;

        m_ptVolute[6].y=-1;

        m_ptVolute[7].x=-1;

        m_ptVolute[7].y=-1;

        m_ptVolute[8].x=-1;

        m_ptVolute[8].y=0;

        /* 斣崋偲嵗昗偺懳墳偼丄師偺偲偍傝

        1 2 3

    8 0 4

    7 6 5

        */     

}

Volute乽塓姫偒乿忬偺僆僼僙僢僩偲偟偰m_ptVolute[]傪弶婜壔偟傑偡丅

暘偐傝堈偄傛偆偵偙偺傛偆側彂偒曽傪偟傑偟偨偑丄捠忢偼師偺傛偆偵儖乕僾偵傛傝傕偭偲僗儅乕僩偵彂偄偨傎偆偑偄偄偱偟傚偆丅

DWORD Index=0;

for(INT i=-1;i<=1;i++)

{

        for(INT k=-1;k<=1;k++)

        {

                m_ptVolute[Index].x=i;

                m_ptVolute[Index].y=k;

        }

}

偙偺僐乕僪偱弶婜壔偟偨応崌丄偙偙偱偺弶婜壔偲偼旝柇偵堎側傞僆僼僙僢僩偵側傝傑偡偑丄A*寁嶼偵偼塭嬁偼媦傃傑偣傫丅

 

ASTAR::~ASTAR()

{

        SAFE_DELETE_ARRAY(m_pOpenList);

        SAFE_DELETE_ARRAY(m_pClosedList);

        SAFE_DELETE_ARRAY(m_ptPath);

}

僨僗僩儔僋僞偱偡丅僋儔僗撪偱妋曐偟偨僸乕僾儊儌儕傪奐曻偟偰偄傑偡丅

 

HRESULT ASTAR::Init(ASTAR_INIT* pai)

{

        m_dwCellWidth=pai->dwCellWidth;

        m_dwCellHeight=pai->dwCellHeight;

        m_pCell=pai->pCell;    

 

        m_pOpenList = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_pOpenList)

        {

                return E_OUTOFMEMORY;

        }

        m_pClosedList = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_pClosedList)

        {

                return E_OUTOFMEMORY;

        }

 

        m_ptPath = (POINT*) new POINT[ m_dwCellWidth * m_dwCellHeight ];

        if(!m_ptPath)

        {

                return E_OUTOFMEMORY;

        }

 

        return S_OK;

}

僋儔僗偺弶婜壔娭悢偱偡丅嵟弶偵堦搙偩偗屇偽傟丄傗偭偰偄傞偙偲偼

僙儖偺屄悢丄偮傑傝僼傿乕儖僪偺僒僀僘偲奜晹偱梡堄偝傟偰偄傞僙儖僶僢僼傽偺億僀儞僞乕傪婰榐偟偰偄傑偡丅

傑偨丄僆乕僾儞儕僗僩丄僋儘乕僘僪儕僗僩丄偍傛傃嵟廔揑側僷僗傪奿擺偡傞僶僢僼傽偺儊儌儕妋曐傪偟偰偄傑偡丅

 

HRESULT ASTAR::CalcPath(ASTAR_PARAM* pParam)

偙偺娭悢偼丄扨側傞儔僢僷乕娭悢偱偡丅奜晹偐傜偼偙偺娭悢偵傛傝僷僗寁嶼傪奐巒偟傑偡丅杮幙揑偵僷僗専嶕傪峴偆偺偼埲崀偱夝愢偡傞僾儔僀儀乕僩娭悢偱偡丅

 

師偺娭悢偑僋儔僗偺90%埲忋偺巇帠傪峴偆娭悢偱偡丅

偙偺娭悢偼堦夞偺屇傃弌偟偱丄尰嵼僙儖偺廃埻8僙儖暘偺挷嵏傪峴偄傑偡偑丄堦扷屇傃弌偡偲嵞婣偟側偑傜僑乕儖傑偱偺寁嶼傪慡偰峴偄傑偡丅

HRESULT ASTAR::CalcScore(ASTAR_PARAM* pParam)

{

        DWORD i;

        INT iOffset;

 

        POINT ptStart=pParam->ptStartPos;

        POINT ptGoal=pParam->ptGoalPos;

        POINT ptCurrentPos=pParam->ptCurrentPos;

        //尰嵼僙儖偼柍忦審偱僋儘乕僘僪偵偡傞

        iOffset=ptCurrentPos.x*m_dwCellHeight+ptCurrentPos.y;

        if(m_pCell[iOffset].Status != ASTAR_CLOSED)

        {

                m_pCell[iOffset].Status=ASTAR_CLOSED;

                m_dwClosedAmt++;

        }

尰嵼偺婲揰僙儖偼柍忦審偱僋儘乕僘僪偵偱偒傑偡丅

 

        //椬愙8僙儖偺僗僐傾儕儞僌乮僆乕僾儞儕僗僩嶌惉乯

        for(i=1;i<=8;i++)

        {              

                ptCurrentPos=pParam->ptCurrentPos;

                ptCurrentPos.x+=m_ptVolute[i].x;

                ptCurrentPos.y+=m_ptVolute[i].y;

ptCurrentPos偼尰嵼僙儖偺嵗昗傪曐帩偟偰偄傑偡丅偦傟偵m_ptVolute[]傪壛嶼偡傟偽廃埻8僙儖偺嵗昗偑摼傜傟傑偡丅

 

 

                iOffset=(INT)ptCurrentPos.x*m_dwCellHeight+(INT)ptCurrentPos.y;

iOffset傪寁嶼偟偰偍偒傑偡丅iOffset偼慡僙儖偺拞偱尰嵼挷傋偰偄傞僙儖乮婲揰僙儖偺廃埻偺偳傟偐乯偺僆僼僙僢僩偱偡丅

 

                //僑乕儖僙儖偵摓払偟偨応崌

                if(ptCurrentPos.x == ptGoal.x && ptCurrentPos.y == ptGoal.y)

                {

                        m_pCell[iOffset].ptParent=pParam->ptCurrentPos;//恊僙儖傊偺儕儞僋

                        m_pCell[iOffset].Status=ASTAR_GOAL;

                        m_ptGoal=m_pCell[iOffset].ptIndex;             

                        return S_OK;

                }

挷嵏拞偵僗僥乕僞僗偑GOAL偱偁傞僙儖偑弌尰偟偨応崌偼丄挷嵏偺姰椆傪堄枴偟傑偡丅

屻偱恊儕儞僋傪扝傞張棟偺偨傔偺弨旛傪偟偰丄嵞婣偐傜扙弌偡傞偨傔儕僞乕儞偟傑偡丅

 

                switch(m_pCell[iOffset].Status)

                {

                        case ASTAR_EMPTY:                              

                                m_pCell[iOffset].iHeuristic=CalcDistance(&ptGoal,&ptCurrentPos);

                                //僐僗僩偼恊偺僐僗僩偵侾傪懌偟偨傕偺

                                {

                                        m_pCell[iOffset].iCost=m_pCell [ pParam->ptCurrentPos.x*m_dwCellHeight +(INT)pParam->ptCurrentPos.y ].iCost+1;

                                }

                                m_pCell[iOffset].iScore=m_pCell[iOffset].iCost + m_pCell[iOffset].iHeuristic;

                                m_pCell[iOffset].Status=ASTAR_OPEN;

                                m_pOpenList[ m_dwOpenAmt ]=ptCurrentPos;

                                m_dwOpenAmt++;

                                //俉僙儖偺恊傪尰嵼僙儖偵偡傞

                                {

                                        m_pCell[iOffset].ptParent=pParam->ptCurrentPos;//恊僙儖傊偺儕儞僋

                                }

                                break;

                        case ASTAR_OPEN:       

                        case ASTAR_CLOSED:             

                        case ASTAR_OBSTACLE:

                                continue;                              

                                break;

                }

        }

僗僥乕僞僗偑EMPTY偺応崌偵尷傝丄挷嵏傪峴偄傑偡丅

case暥偵偦偺懠偺僗僥乕僞僗傕婰弎偟偰偄傞偺偼奼挘惈偺偨傔偱偁傝丄杮僒儞僾儖偵尷偭偰偼柍懯偱偡丅

 

        //僆乕僾儞儕僗僩傪娷傔偰嵟彫僗僐傾傪丄怴偨側婲揰僙儖偵偡傞丂乮僋儘乕僘僪儕僗僩偺嶌惉乯

        INT iMinScore=INT_MAX;

        POINT ptNextCellIndex={0};

        DWORD dwMinIndex=0;

        for(i=0;i<m_dwOpenAmt;i++)

        {              

                iOffset=m_pOpenList[ i ].x*m_dwCellHeight+ m_pOpenList[ i ].y;

                if( m_pCell[iOffset].iScore < iMinScore && m_pCell[iOffset].Status == ASTAR_OPEN)

                {

                        iMinScore=m_pCell[iOffset].iScore;

                        dwMinIndex=i;

                }      

        }

尰嵼偺廃埻8僙儖媦傃偦傟傑偱偺僆乕僾儞儕僗僩偺僙儖傪娷傔丄偦偺拞偱嵟彫僗僐傾偱偁傞僙儖傪挷傋偰偄傑偡丅

 

        iOffset=m_pOpenList[ dwMinIndex ].x*m_dwCellHeight+ m_pOpenList[ dwMinIndex ].y;

僙儖儕僗僩偐傜嵟彫僗僐傾僙儖傪嶲徠偡傞偨傔偺僆僼僙僢僩傪嵞寁嶼偟傑偡丅

 

        ptNextCellIndex=m_pCell[iOffset].ptIndex;

        m_pClosedList[ m_dwClosedAmt ]=ptNextCellIndex;

師偺婲揰僙儖傪嵟彫僗僐傾僙儖偵偟偰丄

 

        //怴偨側婲揰僙儖偵傛傞嵞婣屇傃弌偟

        ASTAR_PARAM Param;

        Param.ptStartPos=pParam->ptStartPos;

        Param.ptGoalPos=pParam->ptGoalPos;

        Param.ptCurrentPos=m_pOpenList[ dwMinIndex ];

        Param.pCell=pParam->pCell;

        return CalcScore(&Param);

帺暘帺恎傪嵞婣揑偵幚峴偟傑偡丅

 

師偺娭悢偼丄挷嵏偑廔椆偟偨偁偲丄嵟廔揑側僷僗傪嶌惉偡傞娭悢偱偡丅

僑乕儖僙儖偐傜偳傫偳傫恊僙儖傪扝偭偰偄偒丄奐巒僙儖偵摓払偡傟偽僷僗偺姰惉偱偡丅

扨偵媡僩儔僶乕僗偡傞偩偗側偺偱丄側偵傕擄偟偄偙偲偼偁傝傑偣傫丅

HRESULT ASTAR::MakePathFromClosedList(ASTAR_PARAM* pParam)

{

        INT iOffset=0;

        INT iBreak=0;

        INT iMaxStep=m_dwCellWidth * m_dwCellHeight;

        m_dwPathList=0;

        // 僋儘乕僘僪僙儖忋偱丄僑乕儖抧揰偐傜僗僞乕僩抧揰傑偱恊傪扝偭偨宱楬傪嵟廔揑側僷僗偲偡傞

        iOffset=m_ptGoal.x*m_dwCellHeight + m_ptGoal.y;   

        do

        {

                if(iBreak>iMaxStep)

                {

                        MessageBox(0,"恊偺儕儞僋偑僗僞乕僩抧揰傑偱宷偑偭偰偄側偄偐丄儕儞僋偑弞娐偟偰偄傑偡","",MB_OK);

                        break;

                }

                iBreak++;

                m_pCell[iOffset].boRealPath=TRUE;

                iOffset=m_pCell[iOffset].ptParent.x*m_dwCellHeight + m_pCell[iOffset].ptParent.y;

                //僷僗儕僗僩偵婰榐乮屇傃弌偟尦偺棙曋惈)

                m_ptPath[m_dwPathList]=m_pCell[iOffset].ptIndex;

                m_dwPathList++;

        }

        while(m_pCell[iOffset].ptIndex.x != pParam->ptStartPos.x || m_pCell[iOffset].ptIndex.y != pParam->ptStartPos.y);

 

        return S_OK;

}

 

 

師偺娭悢偼丄僸儏乕儕僗僥傿僢僋傪寁嶼偟傑偡丅

INT ASTAR::CalcDistance(POINT* pptA,POINT* pptB)

{

        INT iX=pptA->x - pptB->x;

        INT iY=pptA->y - pptB->y;      

        return (INT)sqrtf( iX*iX + iY*iY );

}

扨弮側捈慄嫍棧偱偡丅x,y嵗昗偼惍悢側偺偱偙偺傛偆偵寁嶼偟偰傕僙儖悢偑妱傝弌偣傑偡丅

 

埲忋偱A*偺夝愢偼廔椆偱偡丅

A*偼曋棙偱偡偑丄巊偄曽傪岆傞偲彮乆崜偄偙偲偵側傞偐傕偟傟傑偣傫丅梫偼僶儔儞僗側偺偱偡偑丄帺暘偺僎乕儉偵偍偄偰偳偺掱搙傑偱僙儖偺夝憸搙傪崅偔偡傞偐丄偁傑傝掅偔偡傞偲幚嵺偺忈奞暔傪偡傝敳偗偰偟傑偄傑偡偟丄媡偵晄昁梫偵夝憸搙傪崅偔偡傞偲儊儌儕傪戝検偵怘偄丄摨帪偵懍搙傕嬌抂偵掅壓偡傞偱偟傚偆丅

偪側傒偵丄愘彂乽偼偠傔偰偺3D僎乕儉奐敪乿偱偼A*偵埶傜側偄昅幰僆儕僕僫儖偺僷僗専嶕乽KamPass乿傪夝愢偟偰偄傑偡丅帺嶌僎乕儉偱偁傞僇儞僷僯乕僂僅乕僘偱偼KamPass傪巊梡偟A*偼堦愗巊梡偟偰偄傑偣傫偑丄800傪挻偊傞儐僯僢僩偺僷僗専嶕傪峴偭偰偄傑偡丅

 

8復丂僋傾僢僪僩儕乕偵傛傞暯柺暘妱

8-1

 

8-2

僒儞僾儖僾儘僕僃僋僩丂ch08 僋傾僢僪僩儕乕椞堟暘妱

 

4復偱搊応偟偨僋傾僢僪僩儕乕傪棙梡偟偰2師尦僼傿乕儖僪傪暘妱偡傟偽丄柍懯側寁嶼傪徣棯偡傞偙偲偑偱偒傑偡丅

偙偙偱偼丄50懱偺憡庤儊僢僔儏偺拞偱儗僀傪摉偰傞昁梫偺偁傞儊僢僔儏傪僋傾僢僪僩儕乕偵傛傝慖暿偟傑偡丅

慖暿偑柍偗傟偽偦偺傑傑50懱偵憤摉傝偱儗僀傪寁嶼偟偰偟傑偄丄旕忢偵帪娫偑偐偐傝傑偡丅

偦偙偱丄僋傾僢僪僩儕乕偵傛傝岲偒側偩偗暯柺傪暘妱偟丄帺暘偑偄傞扨埵椞堟偵嫃傞憡庤儊僢僔儏偵偺傒儗僀寁嶼傪峴偆偍偙偲偱崅懍壔傪恾傝傑偡丅

 

慖暿偩偗偑栚揑側傜嫬奅儃儕儏乕儉偺傎偆偑偄偄丠

嵟弶偵尵偭偰偍偒傑偡偑丄偁傞堦掕偺椞堟偵嫃傞儊僢僔儏偵偺傒慖暿偡傞偲偄偆偙偲偩偗偑栚揑偱偁傟偽丄側偵傕僋傾僢僪僩儕乕傪巊梡偡傞昁梫偼偁傝傑偣傫丅

扨弮偵丄慡偰偺憡庤儊僢僔儏偺嫍棧偲帺暘偺嫍棧傪斾妑偟偰丄堄恾偟偨嫍棧撪偵嫃傞憡庤儊僢僔儏傪慖暿偡傟偽偄偄偺偱偡偐傜丅偦傟偼偡側傢偪嫬奅媴偱偡丅偁傞偄偼嫬奅儃僢僋僗偵傛傝慖暿傪峴偊偽丄傛傝惛搙偺崅偄慖暿傕峴偊傞偱偟傚偆丅

摿偵師復偱夝愢偡傞僆僋僩僩儕乕偱偁傟偽嫬奅儃儕儏乕儉傪巊梡偡傞傎偆偑偐側傝懍偄偲巚偄傑偡丅

偱偼側偤僋傾僢僪僩儕乕傗僆僋僩僩儕乕傪巊梡偡傞偺偐丠

偦傟傜偺栘傪巊梡偡傟偽慖暿偩偗偱偼側偔懠偵怓乆側忣曬傪帩偨偣傞偙偲偑弌棃傞偐傜偱偡丅杮彂偺僒儞僾儖偼慖暿偟偐峴偭偰偄傑偣傫偑丄栘峔憿偱偁傞偙偲偵傛傝側傫傜偐偺奼挘偑梕堈偵側傝傑偡丅

暿偺忬嫷丄偨偲偊偽懳徾儊僢僔儏偑摦偐側偄応崌乮3DCG偺僆僼儔僀儞儗儞僟儕儞僌側偳偑偦偆偱偡偑乯偵偍偄偰偼丄嵟弶偵屄乆偺椞堟撪偵偁傞億儕僑儞傪栘偺僲乕僪偵奿擺偟傑偡丅偦偺寁嶼偼嵟弶偺僞僀儈儞僌偵堦夞偩偗偱偡丅

偦偆偡傟偽丄偦傟埲崀偺儗僀僩儗乕僗偵偍偄偰丄斖埻撪敾掕偺寁嶼傪偡傞偙偲側偔扨弮偵偦偺椞堟僲乕僪偑曐帩偡傞億儕僑儞僀儞僨僢僋僗傪嶲徠偡傟偄偄偺偱嫬奅儃儕儏乕儉傛傝傕崅懍偱偡丅偨偩杮復僒儞僾儖偍傛傃堦斒揑側僎乕儉偵偍偄偰偼懳徾儊僢僔儏偼捠忢堏摦偟傑偡偐傜丄椞堟偵曐帩偡傞僨乕僞偼忢偵曄壔偟丄栘偵傛傞慖暿偺儊儕僢僩偑昞柺壔偟側偄偩偗偱偡丅栘偵傛傞慖暿偼偳偪傜偐偲偄偆偲丄偦傟偙偦屄乆偺儊僢僔儏偵偍偗傞儗僀敾掕偵桳岠偱偡丅側偵傕偟側偗傟偽儊僢僔儏傪峔惉偡傞慡偰偺億儕僑儞偵懳偟儗僀岎嵎敾掕傪峴偄傑偡偑丄栘偵傛傝斖埻傪峣傞偙偲偵傛傝崅懍壔偱偒傑偡丅偟偐偟偦偺応崌偱傕捀揰偑摦偔乮僗僉儞儊僢僔儏乯応崌偼丄杮僒儞僾儖偲摨條偺忬嫷偵側傝傑偡丅

暿偺梡搑偲偟偰偼丄偪傚偆偳僒儞僾儖偑偦偆偱偡偑丄側傫傜偐偺僈僀僪乮僌儕僢僪乯傪儗儞僟儕儞僌偟偨偄応崌傕偁傞偱偟傚偆丅偦偺応崌丄僋傾僢僪僩儕乕傗僆僋僩僩儕乕偱偁傟偽斾妑揑娙扨偱偁傞偙偲偼僒儞僾儖傪尒偰偄偨偩偗傟偽暘偐傝傑偡丅

 

僒儞僾儖偺愢柧

 

僒儞僾儖偼丄乬僾僯儑乭偲偄偆僉儍儔僋僞乕偲偟偰嶌惉偟偨儊僢僔儏偺徴撍専弌偺強梫帪娫傪斾妑偟傑偡丅

強梫帪娫偼1僼儗乕儉偵偍偗傞強梫帪娫偱偡丅

愒偄僾僯儑偑1屄偩偗偁傝丄偦傟傪庡恖岞偲偟傑偡丅巆傝偺敀偄僾僯儑偼50屄偁傝丄儗僀傪摉偰傞岓曗懳徾儊僢僔儏乮憡庤儊僢僔儏乯偱偡丅

徴撍専弌偼儗僀偵傛傞専弌曽朄偲偟丄儗僀偼庡恖岞偐傜6杮旘偽偟偰偄傑偡丅偨偩偟丄儗僀偑憡庤儊僢僔儏偵岎嵎偟偰偄傞応崌偱傕儊僢僙乕僕摍偼弌傑偣傫丅栚揑偼偁偔傑偱傕帪娫傪寁應偡傞偙偲側偺偱徴撍傪敾抐偡傞僐乕僪偼彂偄偰偄傑偣傫丅

6杮偺儗僀傪50屄偺儊僢僔儏懳偟岎嵎敾掕偡傞偺偱丄偐側傝廳偨偄張棟偱偡丅

傑偢偼丄椞堟偵傛傞憡庤儊僢僔儏偺慖暿傪偟側偄応崌丄50屄偺儊僢僔儏慡偰偵偮偄偰儗僀敾掕傪6夞峴偭偰偟傑偄傑偡丅昅幰偺儅僔儞偱偺僼儗乕儉儗乕僩偼45fps偱偟偨丅

8-3

僒儞僾儖婲摦捈屻丄側偵傕偟側偗傟偽暯柺乮僼傿乕儖僪乯偺暘妱儗儀儖偼乬1乭側偺偱暯柺偼4暘妱偝傟偰偄傑偡丅

偙偺儗儀儖偱丄乬慖暿乭傪峴偭偰傒傑偡丅夋柺忋偱偼乬斖埻僥僗僩偁傝乮側偟乯乭偲偄偆儊僢僙乕僕偑昞帵偝傟傑偡丅

8-4

僼儗乕儉儗乕僩偑71fps偵忋徃偟傑偟偨丅偙傟偼50屄拞12屄偵懳徾偑峣傜傟偨偺偱僼儗乕儉儗乕僩偑忋徃偟偨偺偱偡丅

 

偝傜偵暘妱儗儀儖傪忋偘偰丄峣崬傒傪偒偮偔偟偰傒傑偡丅

8-5

懳徾儊僢僔儏偑12屄偐傜7屄偵尭偭偨偺偱僼儗乕儉儗乕僩偼71fps偐傜74fps偵忋偑傝傑偡偟偨丅

 

偝傜偵暘妱儗儀儖傪2抜奒忋偘偰傒傑偡丅

8-6

僼儗乕儉儗乕僩偼80fps傑偱忋偑傝傑偟偨丅懳徾偼僛儘偱偡丅昅幰偺儅僔儞偱偼儗僀敾掕傪慡偔偟側偄忬懺偲摨偠僼儗乕儉儗乕僩偵側偭偰偄傑偡丅

 

 

巊梡朄

僉乕儃乕僪偲偺懳墳偼師偺偲偍傝偱偡丅

 

F1僉乕丗斖埻僥僗僩偺僆儞丒僆僼丅

儕僞乕儞僉乕丗斖埻僥僗僩傪峴偭偰偄傞応崌丄偳偺儊僢僔儏偑懳徾側偺偐斣崋偲屄悢傪昞帵丒旕昞帵偟傑偡丅

栴報僉乕丗庡恖岞儊僢僔儏偺堏摦丅

Z僉乕丗暘妱儗儀儖傪壓偘傑偡丅偨偩偟儗儀儖0埲壓偵偼弌棃傑偣傫丅

X僉乕丗暘妱儗儀儖傪忋偘傑偡丅偨偩偟捀揰僶僢僼傽偺僉儍僷僔僥傿娭學偱儗儀儖8埲忋偵偼弌棃傑偣傫丅

僗儁乕僗僉乕丗僌儕僢僪乮暘妱慄乯偺昞帵丒旕昞帵偟傑偡丅

 

僐乕僪夝愢

DirectX偺塣梡偑栚揑偱偼側偄偺偱丄崱夞偼偁傞掱搙帺桼偵僐乕僨傿儞僌偝偣偰傕傜偄傑偡丅晄梡側僋儔僗傕偁傞偱偟傚偆偑丄帺暘偵偲偭偰晄梡側晹暘偼柍帇偡傟偽偄偄偩偗偺榖偱偡丅崱偼昁梫偠傖側偔偲傕丄偄偮偐栶棫偮壜擻惈傕偁傞偲巚偄丄偁偊偰巆偟偰偍偒傑偟偨丅

壒偱敾抐偡傞応崌傕丄偨傑偵偁傝傑偡丅偦偺応崌DirectSound僋儔僗偑曋棙偱偡丅僒儞僾儖偱偼幚憰偼偟偰偄傑偡偑丄巊梡偼堦愗偟偰偄傑偣傫丅乮wav僼傽僀儖偺儘乕僪曽朄偑暘偐傞傛偆偵僐儊儞僩傾僂僩偟偰巆偟偰偄傞晹暘偼偁傝傑偡乯

 

拲栚偡傋偒晹暘

娭楢偡傞偺偼丄師偺5偮偺僼傽僀儖偩偗偱偡丅

QuadTree.h

QuadTree_Init.cpp

QuadTree.cpp

Capplication.h

Capplication.cpp

 

摿偵QuadTree僋儔僗偑杮幙偱偡丅

偁偲丄懡彮Direct3D僋儔僗傕娭學偡傞偐傕偟傟傑偣傫偑丄杮幙偱偼偁傝傑偣傫丅

 

僌儕僢僪昞帵娭學

僌儕僢僪偺昞帵娭楢偼慡偰QuadTree_Init.cpp撪偱峴偭偰偄傑偡丅

僌儕僢僪昞帵娭學偼丄杮幙揑偵偼晄梫側晹暘偱偡丅敾掕傪偡傞偵偁偨傝僌儕僢僪偑昞帵偝傟偰偄傞昁梫偑偁傞傢偗偱偼側偔丄壜帇壔偟偰奐敪幰偑妋擣偡傞偙偲偑栚揑偱偡丅

僌儕僢僪偼儔僀儞扨埵偱儗儞僟儕儞僌偟傑偡丅傑偢弶婜壔帪偵慡偰偺儔僀儞傪弶婜壔偟偰偟傑偄傑偡丅偮傑傝儔僀儞偺捀揰孮傪慡偰寁嶼偟偰丄僶僢僼傽偵曐懚偟傑偡丅

儗儞僟儕儞僌偺嵺偼丄Direct3D僋儔僗偺CDIRECT3D::RenderWireCell娭悢偵偦偺僶僢僼傽傪搉偟傑偡丅Direct3D僋儔僗懁偼扨弮偵DrawPirimitiveUP偵偍偗傞D3DPT_LINELIST庤弴偱捀揰孮傪儔僀儞偲偟偰儗儞僟儕儞僌偟傑偡丅

岺晇偟偰偄傞偲偙傠偲尵偊偽丄4暘妱偡傞偺偵儔僀儞傪乬2杮偟偐乭巊梡偟偰偄側偄偲偄偆偲偙傠偱偟傚偆偐丅

側偵傕岺晇偟側偄偱扨弮偵峫偊傞偲丄4暘妱偡傞偙偲偵傛傝憹偊傞儔僀儞偼4x4=16杮偵側傝傑偡偑丄偦傟偱偼敋敪揑側儔僀儞悢傂偄偰偼捀揰悢偵側偭偰偟傑偄傑偡丅

師偺恾傪尒偰偔偩偝偄丅

8-7

 

忋偺峫偊偐偨偼丄乽4暘妱偩偐傜巕傪4屄嶌傞丅乿偲偄偆傕偺偱丄巕1屄偵偮偒4杮偺儔僀儞偑昁梫側偺偱慡晹偱16杮偺儔僀儞偲側偭偰偟傑偄傑偡丅

壓偺峫偊曽偼丄暥帤捠傝乽暘妱偡傞慄傪堷偔乿偲偄偆傕偺偱丄偙傟偱偁傟偽2杮偺慄偱4暘妱偱偒傑偡丅杮僒儞僾儖偼壓偺曽朄偵傛傝暘妱偟偰偄偒傑偡丅

 

椺偊偽杮僒儞僾儖偱暘妱儗儀儖3偺忬懺偱偼丄枛抂僙儖偼64屄偵側傝傑偡丅

埨堈側曽朄偱儔僀儞傪嶌惉偡傞偲256杮偵傕側傝傑偡丅

8-8

 

偲偙傠偑丄2杮偺暘妱慄偱4暘妱偟偰偄偔偲丄摨偠暘妱儗儀儖3丄枛抂僙儖64屄偱傕昁梫側儔僀儞偼42杮偱懌傝傑偡丅

8-9

栘峔憿偲嵞婣傪慻傒崌傢偣偰丄僗儅乕僩偵僐乕僨傿儞僌偱偒傑偟偨丅栘偱偁傞偙偲偑儔僀儞嶌惉帪偵傕栶棫偮傢偗偱偡丅

 

QuadTree_Init.cpp偱偺棳傟傪恾帵偡傞偲師偺傛偆偵側傝傑偡丅

8-10

 

 

斖埻僥僗僩娭學

斖埻僥僗僩娭學偼慡偰QuadTree.cpp撪偵幚憰偟偰偄傑偡丅

傗偭偰偄傞偙偲偼斾妑揑扨弮偱丄偟偐傕丄栘偺嵞婣僐乕僪側偺偱僐乕僪偼旕忢偵偡偭偒傝僐儞僷僋僩偵側偭偰偄傑偡丅

 

QuadTree.cpp撪偺僐乕僪偼丄僐儊儞僩傪娷傔62峴偟偐側偄偺偱慡僐乕僪傪嵹偣傑偡丅

#include "QuadTree.h"

//

//BOOL QUAD_TREE::CellTestSub(CELL* pNode,D3DXVECTOR3* pvPos,CELL** ppCurrentNode)

//

BOOL QUAD_TREE::CellTestSub(CELL* pNode,D3DXVECTOR3* pvPos,CELL** ppCurrentNode)

{

        *ppCurrentNode=NULL;

        //偦偺僙儖偺斖埻奜側傜丄偦偺僙儖偺巕懛僙儖偺斖埻撪側傢偗偑側偄偺偱丄巕偺挷嵏偵偼恑傑側偄

        if(pvPos->x < pNode->vMin.x || pvPos->x > pNode->vMax.x

                || pvPos->z < pNode->vMin.z || pvPos->z >pNode->vMax.z)

        {              

                return FALSE;

        }

        *ppCurrentNode=pNode;

 

        //巕僲乕僪傪嵞婣偱挷傋傞

        if(pNode->pChild[0]!=NULL)

        {

                //姰慡4暘栘側偺偱pChild[0]NULL偱側偗傟偽丄偦偺懠3偮偺巕傕NULL偱偼側偄

                if(CellTestSub(pNode->pChild[0],pvPos,ppCurrentNode))

                {

                        return TRUE;

                }

                if(CellTestSub(pNode->pChild[1],pvPos,ppCurrentNode))

                {

                        return TRUE;

                }

                if(CellTestSub(pNode->pChild[2],pvPos,ppCurrentNode))

                {

                        return TRUE;

                }

                if(CellTestSub(pNode->pChild[3],pvPos,ppCurrentNode))

                {

                        return TRUE;

                }

        }      

        return TRUE;

}

//

//HRESULT QUAD_TREE::CellTest(D3DXVECTOR3*pvMyPos,D3DXVECTOR3* pvTargetPos,BOOL* pboInside)

//

HRESULT QUAD_TREE::CellTest(D3DXVECTOR3*pvMyPos,D3DXVECTOR3* pvTargetPos,BOOL* pboInside)

{

 

        //帺暘偑偄傞僙儖

        CELL *pMyCell=NULL;

        CellTestSub(m_pRootNode,pvMyPos,&pMyCell);

        //憡庤偑偄傞僙儖

        CELL *pTargetCell=NULL;

        CellTestSub(m_pRootNode,pvTargetPos,&pTargetCell);

 

        //2偮偺僙儖偺傾僪儗僗偑摨偠乮摨偠僙儖乯側傜TRUE傪曉偡

        if(pMyCell == pTargetCell)

        {

                *pboInside=TRUE;

        }

        else

        {

                *pboInside=FALSE;

        }      

        return S_OK;

}

偳偆偱偡偐丠丂旕忢偵抁偄偲偼巚偄傑偣傫偐丠

杮僒儞僾儖偱偼傓偟傠丄敾掕偵偲偭偰昁梫偱偼側偄壜帇壔偺偨傔偺僐乕僪乮QuadTree_Init.cpp撪僐乕僪乯偑懡偔側偭偰偄傞奿岲偵側偭偰偄傑偡丅

偝偰丄僋儔僗奜晹偐偨斖埻僥僗僩傪峴偆偵偼丄傑偢CellTest娭悢傪僐乕儖偟傑偡丅CellTest娭悢偼嵞婣偟傑偣傫丅僒僽娭悢CellTestSub偵傛傝帺暘偲憡庤偺僲乕僪乮埵抲偟偰偄傞僙儖乯傪摿掕偟傑偡丅

偦傟偑暘偐傟偽丄帺暘偲憡庤偺僲乕僪偑摨偠偐堎側傞偐偱丄偍側偠椞堟偵偄傞偐偳偆偐敾抐偱偒傑偡丅

CellTestSub娭悢偼嵞婣偟側偑傜僲乕僪傪憱嵏偟偰偄偒丄巜掕偝傟偨嵗昗偺僲乕僪傪尒偮偗丄偦偺傾僪儗僗傪曉偟傑偡丅

偟偨偑偭偰丄僲乕僪傪憱嵏偟偰偄傞CellTestSub偺傎偆偑偳偪傜偐偲偄偆偲杮幙晹暘偱偡丅

憱嵏偟側偑傜偦偺嵗昗偑斖埻撪偐偳偆偐偺敾抐偼師偺恾偺傛偆偵峴偭偰偄偒傑偡丅

8-11

 

9復丂僆僋僩僩儕乕偵傛傞嬻娫暘妱

9-1

 

9-2

 

僒儞僾儖僾儘僕僃僋僩丂ch09 僆僋僩僩儕乕椞堟暘妱

 

僆僋僩僩儕乕偼僋傾僢僪僩儕乕偲杮幙揑偵偼慡偔摨偠偱偡丅

巕僲乕僪傪4偮偐傜8偮偵憹傗偟偨偲偄偆儃儕儏乕儉偺曄峏偺傒偲峫偊偰嵎偟巟偊偁傝傑偣傫丅

幚嵺丄偙偺僒儞僾儖偼侾偐傜嶌惉偟偨偺偱偼側偔僋傾僢僪僩儕乕僒儞僾儖偺巕僲乕僪傪8偮偵憹傗偟偨偩偗偁傝丄偁偲偺曄峏揰偲偄偊偽暯柺偐傜嬻娫偵側傞偺偱僋傾僢僪僩儕乕偱偼堦掕抣偵偟偰偄偨Y惉暘傪敾抐偵壛偊偨偙偲偔傜偄偱偡丅嶌惉偵偼2帪娫傕偐偐偭偰偄傑偣傫丅偦偺偆偪敿暘埲忋偼摦嶌妋擣偺帪娫側偺偱幚幙揑偵偼30暘掱搙偱弌棃忋偑偭偨僒儞僾儖偱偡丅

僐乕僪傪尒偰傕傜偊傟偽丄峔憿偼100%摨偠偱偁傞偙偲偑傢偐傞偱偟傚偆丅

巕僲乕僪偑8偮偁傞偨傔丄忕挿偵側傞偺偱僐乕僪偼嵹偣傑偣傫丅

僆僋僩僩儕乕偵偮偄偰夝愢偡傞偙偲偼側偵傕偁傝傑偣傫丅慡偰僋傾僢僪僩儕乕偺復偱夝愢偟偰偄傑偡丅

尨棟丄僌儕僢僪偺嶌惉丄僒儞僾儖偺撪梕丄僼傽僀儖偲張棟撪梕偺懳墳丄娭悢偺宷偑傝丄僉乕憖嶌丄慡偰偼僋傾僢僪僩儕乕偲摨偠偱偡丅

側偍丄暘妱儗儀儖偺忋尷偼僋傾僢僪僩儕乕僒儞僾儖傛傝掅偔偟偰偄傑偡丅摉慠偱偡偑丄摨偠暘妱儗儀儖偵偍偗傞捀揰偺悢偼棫曽懱偺傎偆偑憹偊傞偐傜偱偡丅

 

10復丂奒憌OBB偵傛傞徴撍敾掕

10-1

 

僒儞僾儖僾儘僕僃僋僩丂ch10 奒憌OBB

 

OBB偼嫬奅儃儕儏乕儉偺拞偱偼嵟傕惛搙偑崅偄傕偺偱偡偑丄偝傜偵僕僆儊僩儕偺宍忬偵僼傿僢僩偝偣偨偄応崌偼OBB傪奒憌峔憿偵偡傞偙偲偵側傞偱偟傚偆丅

晹暘偛偲偵偦傟偧傟OBB傪帩偨偣傞偙偲偵傛傝丄偙傑偐側敾掕偑壜擻偵側傞偺偼憐憸偱偒傞偱偟傚偆丅摉慠丄晹暘傪嵶偐偔偟偰偄偗偽惛搙偼忋偑偭偰偄偒傑偡丅

 

10-2

 

 

僒儞僾儖偺僉乕憖嶌

栴報僉乕媦傃僀儞僒乕僩丄僨儕乕僩僉乕丗暔懱B乮奃怓傾僯儊乕僔儑儞儊僢僔儏乯偺慜屻嵍塃忋壓偺堏摦

僗儁乕僗僉乕丗儃僢僋僗偺昞帵丒旕昞帵

 

 

僐乕僪夝愢

偪傚偆偳Direct3D偺傾僯儊乕僔儑儞儊僢僔儏偑帺桼栘偵傛傞奒憌峔憿側偺偱丄杮僒儞僾儖偼偦偺棳傟傪棙梡偟OBB傪屄乆偺僷乕僣儊僢僔儏偵帩偨偣偰偄傑偡丅

 

OBB偦偺傕偺偵娭傞夝愢偼GAME CODING vol.1偱夝愢偟偰偄傑偡偺偱妱垽偟傑偡丅

OBB傪奒憌偵偡傞偺偼丄Direct3D傾僯儊乕僔儑儞偺庤弴偲傑偭偨偔摨偠偱偡丅

 

僷乕僣儊僢僔儏偺弶婜壔偼CreateFrame娭悢丄僷乕僣OBB偺弶婜壔偼CreateFrameBBox娭悢

僷乕僣儊僢僔儏偺儗儞僟儕儞僌偼DrawFrame娭悢丄僷乕僣OBB偺儗儞僟儕儞僌偼RenderBBoxTree娭悢

 

偲偄偆傛偆偵側偭偰偄偰丄偦傟偧傟偺娭悢偺奒憌憱嵏峔憿偼偦傟偧傟帡偰偄傑偡丅

偦傟偧傟偺娭悢偵偍偄偰丄扨偵乬僷乕僣儊僢僔儏乭偲乬OBB儊僢僔儏乭偑堎側傞偩偗偲巚偭偰傕偄偄偱偟傚偆丅

偦偟偰寢壥偲偟偰丄偦傟偧傟偺僷乕僣儊僢僔儏偵儃僢僋僗(OBB)傪偔偭偮偗偨奿岲偵側傞偲尵偭偨傜暘偐傝堈偄偱偟傚偆偐丅

OBB偺弶婜壔傕儗儞僟儕儞僌傕僷乕僣儊僢僔儏偵偍偗傞弶婜壔偲儗儞僟儕儞僌偲傎偲傫偳摨偠偱偡丅

僷乕僣儊僢僔儏偼恊僲乕僪偺巔惃傪師乆偲宲彸偟偰偔傢偗偱偡偑丄偦傟偲慡偔摨偠宲彸傪OBB偵傕偐偗傑偡丅偦偆偡傟偽偦傟偧傟偺OBB偼懳墳偡傞僷乕僣儊僢僔儏偵尒崌偭偨巔惃偵側偭偰偔傟傞偲偄偆傢偗偱偡丅

 

Main.h

//昁梫側僿僢僟乕僼傽僀儖偺僀儞僋儖乕僪

#include<stdio.h>

#include <windows.h>

#include <d3dx9.h>

//昁梫側儔僀僽儔儕僼傽僀儖偺儘乕僪

#pragma comment(lib,"d3d9.lib")

#pragma comment(lib,"d3dx9.lib")

// 僔儞儃儖掕媊媦傃儅僋儘

#define WINDOW_WIDTH 800

#define WINDOW_HEIGHT 600

#define SAFE_DELETE(p) { if(p) { delete (p);     (p) = NULL; } }

#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p) = NULL; } }

#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p) = NULL; } }

#define THING_AMOUNT 2

//儐乕僓乕掕媊僨乕僞宆

struct BBOX

{

        D3DXVECTOR3 vMax;

        D3DXVECTOR3 vMin;

        D3DXVECTOR3 vPivot;

        D3DXVECTOR3 vWorldPivot;

        D3DXVECTOR3 vAxisX;

        D3DXVECTOR3 vAxisY;

        D3DXVECTOR3 vAxisZ;

        FLOAT fLengthX;

        FLOAT fLengthY;

        FLOAT fLengthZ;

        D3DXMATRIX mRotation;

        TCHAR Name[MAX_PATH+1];

        BBOX()

        {

                ZeroMemory(this,sizeof(BBOX));

                vAxisX=D3DXVECTOR3(1,0,0);

                vAxisY=D3DXVECTOR3(0,1,0);

                vAxisZ=D3DXVECTOR3(0,0,1);

        }

};

 

struct THING

{      

        LPD3DXFRAME pFrameRoot;

    LPD3DXANIMATIONCONTROLLER pAnimController;

        LPD3DXMESH pMesh;

        LPD3DXMESH* ppBBoxMesh;

        D3DMATERIAL9* pMeshMaterials;

        D3DMATERIAL9* pBBoxMeshMaterials;

        LPDIRECT3DTEXTURE9* pMeshTextures;

        DWORD dwNumMaterials;

        D3DXVECTOR3 vecPosition;

        D3DXMATRIX matRotation;

        D3DXMATRIX matWorld;

        DWORD dwCurrentNode;

        DWORD dwNumNode;

        BBOX* pBBox;

        FLOAT fYaw;

        FLOAT fPitch;

 

        THING()

        {

                ZeroMemory(this,sizeof(THING));

                D3DXMatrixIdentity(&matRotation);

                D3DXMatrixIdentity(&matWorld);

        }

};

//攈惗僼儗乕儉峔憿懱 (偦傟偧傟偺儊僢僔儏梡偺嵟廔儚乕儖僪峴楍傪捛壛偡傞乯

struct MYFRAME: public D3DXFRAME

{

    D3DXMATRIX CombinedTransformationMatrix;

};

//攈惗儊僢僔儏僐儞僥僫乕峔憿懱(

//僐儞僥僫乕偑僥僋僗僠儍傪暋悢帩偰傞傛偆偵億僀儞僞乕偺億僀儞僞乕傪捛壛偡傞乯

struct MYMESHCONTAINER: public D3DXMESHCONTAINER

{

    LPDIRECT3DTEXTURE9*  ppTextures;

};

//X僼傽僀儖撪偺傾僯儊乕僔儑儞奒憌傪撉傒壓偟偰偔傟傞僋儔僗傪攈惗偝偣傞丅

//ID3DXAllocateHierarchy偼攈惗偡傞偙偲憐掕偟偰愝寁偝傟偰偄傞丅

class MY_HIERARCHY: public ID3DXAllocateHierarchy

{

public:

        MY_HIERARCHY(){

                dwNumNode=0;

        }

    STDMETHOD(CreateFrame)(THIS_ LPCSTR , LPD3DXFRAME *);

    STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR ,CONST D3DXMESHDATA* ,CONST D3DXMATERIAL* ,

                CONST D3DXEFFECTINSTANCE* , DWORD , CONST DWORD *, LPD3DXSKININFO , LPD3DXMESHCONTAINER *);

    STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME );

    STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER );

        DWORD dwNumNode;

};

//娭悢僾儘僩僞僀僾偺愰尵

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HRESULT InitD3d(HWND);

HRESULT InitThing(THING *,LPSTR,D3DXVECTOR3*);

VOID Render();

VOID RenderThing(THING*);

RenderBBoxTree(THING* ,LPD3DXFRAME,LPD3DXMATRIX);

HRESULT InitBBox(LPDIRECT3DDEVICE9 ,THING* );

HRESULT CreateFrameBBox(LPDIRECT3DDEVICE9 ,LPD3DXFRAME ,THING* );

BOOL OBBCollisionDetection(DWORD*,DWORD*,THING* ,THING* );

BOOL OBBCollisionDetectionEachBBox(BBOX* ,BBOX* );

BOOL CompareLength(BBOX* ,BBOX* ,D3DXVECTOR3* ,D3DXVECTOR3* );

VOID RenderMeshContainer(LPD3DXMESHCONTAINER , LPD3DXFRAME );

VOID UpdateFrameMatrices(LPD3DXFRAME , LPD3DXMATRIX );

VOID DrawFrame(LPD3DXFRAME );

VOID RenderString(LPSTR ,INT,INT);

VOID FreeDx();

 

Main.cpp

#include "Main.h"

//僌儘乕僶儖側僀儞僗僞儞僗傪愰尵

LPDIRECT3D9 pD3d = NULL;

LPDIRECT3DDEVICE9 pDevice = NULL;

LPD3DXFONT pFont = NULL;

BOOL boRenderBox=TRUE;

THING Thing[THING_AMOUNT+1];

MY_HIERARCHY cHierarchy;

TCHAR szMeshFilename[MAX_PATH+1];

 

//

//INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)

//傾僾儕働乕僔儑儞偺僄儞僩儕乕娭悢

INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR szStr,INT iCmdShow)

{

        HWND hWnd = NULL;

        MSG msg;

        // 僂傿儞僪僂偺弶婜壔

        static char szAppName[] = "栴報丄僀儞僒乕僩丄僨儕乕僩僉乕丗堏摦丂僗儁乕僗僉乕丗昞帵僩僌儖";    

     WNDCLASSEX  wndclass;

 

     wndclass.cbSize           = sizeof (wndclass);

     wndclass.style              = CS_HREDRAW | CS_VREDRAW;

     wndclass.lpfnWndProc    = WndProc;

     wndclass.cbClsExtra      = 0;

     wndclass.cbWndExtra     = 0;

     wndclass.hInstance        = hInst;

     wndclass.hIcon             = LoadIcon (NULL, IDI_APPLICATION);

     wndclass.hCursor          = LoadCursor (NULL, IDC_ARROW);

     wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);

     wndclass.lpszMenuName = NULL;

     wndclass.lpszClassName = szAppName;

     wndclass.hIconSm         = LoadIcon (NULL, IDI_APPLICATION);

 

     RegisterClassEx (&wndclass);

 

     hWnd = CreateWindow (szAppName,szAppName,WS_OVERLAPPEDWINDOW,  

                    0,0,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInst,NULL);      

 

    ShowWindow (hWnd,SW_SHOW);

    UpdateWindow (hWnd);

        // 僟僀儗僋僩俁D偺弶婜壔娭悢傪屇傇

        if(FAILED(InitD3d(hWnd)))

        {

                return 0;

        }

        // 儊僢僙乕僕儖乕僾

    ZeroMemory( &msg, sizeof(msg) );

    while( msg.message!=WM_QUIT )

     {

                 if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )

         {

                         TranslateMessage( &msg );

             DispatchMessage( &msg );

         }

         else

                 {             

                         Render();                     

                 }                   

         }

         // 儊僢僙乕僕儖乕僾偐傜敳偗偨傜僆僽僕僃僋僩傪慡偰奐曻偡傞

         FreeDx();

         // OS偵栠傞乮傾僾儕働乕僔儑儞傪廔椆偡傞乯

     return (INT)msg.wParam;

}

//

//LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)

// 僂傿儞僪僂僾儘僔乕僕儍娭悢

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMsg,WPARAM wParam,LPARAM lParam)

{      

        switch(iMsg)

        {

                case WM_DESTROY:

                        PostQuitMessage(0);

                return 0;

                case WM_KEYDOWN:

                switch((CHAR)wParam)

                {

                        case VK_ESCAPE:

                                PostQuitMessage(0);

                        return 0;      

                        case VK_SPACE:

                                boRenderBox==TRUE ? boRenderBox=FALSE : boRenderBox=TRUE;

                                break;

                        case VK_LEFT:

                                Thing[1].vecPosition.x-=0.2f;

                        break;

                        case VK_RIGHT:

                                Thing[1].vecPosition.x+=0.2f;

                        break; 

                        case VK_UP:

                                Thing[1].vecPosition.z+=0.2f;       

                        break; 

                        case VK_DOWN:

                                Thing[1].vecPosition.z-=0.2f;

                        break;

                        case VK_INSERT:

                                Thing[1].vecPosition.y+=0.2f;       

                        break; 

                        case VK_DELETE:

                                Thing[1].vecPosition.y-=0.2f;

                        break;                 

                }

                break;

        }

        return DefWindowProc (hWnd, iMsg, wParam, lParam);     

}

//

//HRESULT InitD3d(HWND hWnd)

//僟僀儗僋僩3D偺弶婜壔娭悢

HRESULT InitD3d(HWND hWnd)

{

        // Direct3D乿僆僽僕僃僋僩偺嶌惉

        if( NULL == ( pD3d = Direct3DCreate9( D3D_SDK_VERSION ) ) )

        {

                MessageBox(0,"Direct3D偺嶌惉偵幐攕偟傑偟偨","",MB_OK);

        return E_FAIL;

        }

        // DIRECT3D僨僶僀僗乿僆僽僕僃僋僩偺嶌惉

        D3DPRESENT_PARAMETERS d3dpp;

        ZeroMemory( &d3dpp, sizeof(d3dpp) );  

        d3dpp.BackBufferFormat =D3DFMT_UNKNOWN;

        d3dpp.BackBufferCount=1;

        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;      

        d3dpp.Windowed = TRUE;

    d3dpp.EnableAutoDepthStencil = TRUE;

    d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 

 

        if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

    {

                if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

                {      

                        MessageBox(0,"HAL儌乕僪偱DIRECT3D僨僶僀僗傪嶌惉偱偒傑偣傫\nREF儌乕僪偱嵞帋峴偟傑偡",NULL,MB_OK);

                        if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,

                                      D3DCREATE_HARDWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

                        {                              

                                if( FAILED( pD3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,

                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                      &d3dpp, &pDevice ) ) )

                                {

                                        MessageBox(0,"DIRECT3D僨僶僀僗偺嶌惉偵幐攕偟傑偟偨",NULL,MB_OK);                  

                                        return E_FAIL;

                                }

                        }

                }

        }

        // X僼傽僀儖枅偵儊僢僔儏傪嶌惉偡傞

        InitThing(&Thing[0],"monster.x",&D3DXVECTOR3(0,0,10));

        InitThing(&Thing[1],"monster2.x",&D3DXVECTOR3(0,0,0)); 

        // 儊僢僔儏偛偲偺僶僂儞僨傿儞僌儃僢僋僗乮嫬奅媴乯偺嶌惉

 

        InitBBox(pDevice,&Thing[0]);

        InitBBox(pDevice,&Thing[1]);

        // Z僶僢僼傽乕張棟傪桳岠偵偡傞

    pDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); 

        // 僇儕儞僌偼偟側偄

        pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

        // 儔僀僩傪桳岠偵偡傞

        pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

        // 傾儞價僄儞僩儔僀僩乮娐嫬岝乯傪愝掕偡傞

        pDevice->SetRenderState( D3DRS_AMBIENT, 0x00555555 );

        // 僗儁僉儏儔乮岝戲斀幩乯傪桳岠偵偡傞

        pDevice->SetRenderState(D3DRS_SPECULARENABLE,TRUE);

        //儃僢僋僗傪摟柧偵儗儞僟儕儞僌偟偨偄偺偱傾儖僼傽僽儗儞僨傿儞僌傪愝掕偡傞

        pDevice->SetRenderState ( D3DRS_ALPHABLENDENABLE, TRUE );      

        pDevice->SetRenderState ( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );

        pDevice->SetRenderState ( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

        pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );

        //暥帤楍儗儞僟儕儞僌偺弶婜壔

        if(FAILED(D3DXCreateFont(pDevice,0,10,FW_REGULAR,       NULL,   FALSE,SHIFTJIS_CHARSET,

                OUT_DEFAULT_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_MODERN, "tahoma", &pFont))) return E_FAIL;

 

        return S_OK;

}

//

//HRESULT InitThing(THING *pThing,LPSTR szXFileName,D3DXVECTOR3* pvecPosition)

//

HRESULT InitThing(THING *pThing,LPSTR szXFileName,D3DXVECTOR3* pvecPosition)

{

        cHierarchy.dwNumNode=0;

        // 儊僢僔儏偺弶婜埵抲

        memcpy(&pThing->vecPosition,pvecPosition,sizeof(D3DXVECTOR3));

        // X僼傽僀儖偐傜儊僢僔儏傪儘乕僪偡傞

        if( FAILED(

        D3DXLoadMeshHierarchyFromX(szXFileName, D3DXMESH_MANAGED, pDevice, &cHierarchy,

                                                          NULL, &pThing->pFrameRoot, &pThing->pAnimController)))

    {

            MessageBox(NULL, "X僼傽僀儖偺撉傒崬傒偵幐攕偟傑偟偨",szXFileName, MB_OK);

            return E_FAIL;  

    }  

        pThing->dwNumNode=cHierarchy.dwNumNode;

        return S_OK;

}

 

//

//VOID Render()

//X僼傽僀儖偐傜撉傒崬傫偩儊僢僔儏傪儗儞僟儕儞僌偡傞娭悢

VOID Render()

{

         // 價儏乕僩儔儞僗僼僅乕儉乮儚乕儖僪嵗昗仺僇儊儔嵗昗傊偺曄姺乯

     D3DXVECTOR3 vecEyePt( 15.0f, 15.0f,-10.0f );  //僇儊儔乮帇揰乯埵抲

     D3DXVECTOR3 vecLookatPt( 0, 5 , 5 );//拲帇埵抲

     D3DXVECTOR3 vecUpVec( 0.0f, 1.0f, 0.0f );//忋曽埵抲

     D3DXMATRIX matView;

     D3DXMatrixLookAtLH( &matView, &vecEyePt, &vecLookatPt, &vecUpVec );

     pDevice->SetTransform( D3DTS_VIEW, &matView );

         // 僾儘僕僃僋僔儑儞僩儔儞僗僼僅乕儉乮僇儊儔嵗昗仺僗僋儕乕儞嵗昗傊偺曄姺乯

     D3DXMATRIX matProj;

     D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, (FLOAT)WINDOW_WIDTH/(FLOAT)WINDOW_HEIGHT, 0.1f, 100.0f );

     pDevice->SetTransform( D3DTS_PROJECTION, &matProj );    

 

        pDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,

                 D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

 

         if( SUCCEEDED( pDevice->BeginScene() ) )

         {

                 for(DWORD i=0;i<THING_AMOUNT;i++)

                 {                     

                         RenderThing(&Thing[i]);

                 }     

                 DWORD IndexA,IndexB;

                 if( OBBCollisionDetection(&IndexA,&IndexB,&Thing[0],&Thing[1]) )

                 {

                         TCHAR sz[200];

                         RenderString("徴撍偟偰偄傑偡\n嫬奅儃儕儏乕儉偑廳側偭偰偄傞偲偄偆偙偲偱偡",10,10);     

                         sprintf(sz,"暔懱A懁偺儃僢僋僗:%s \n暔懱B懁偺儃僢僋僗:%s",Thing[0].pBBox[IndexA].Name,Thing[1].pBBox[IndexB].Name);

                         RenderString(sz,10,50);       

                 }

                 pDevice->EndScene();

         }     

         pDevice->Present( NULL, NULL, NULL, NULL );   

 

         Thing[0].pAnimController->AdvanceTime(0.0001,NULL);

         Thing[1].pAnimController->AdvanceTime(0.00005,NULL);

}

//

//VOID RenderThing(THING* pThing)

//

VOID RenderThing(THING* pThing)

{

        //儚乕儖僪僩儔儞僗僼僅乕儉乮儘乕僇儖嵗昗仺儚乕儖僪嵗昗傊偺曄姺乯

        D3DXMATRIX matWorld,matPosition;

         D3DXMatrixIdentity(&matWorld);

         D3DXMatrixTranslation(&matPosition,pThing->vecPosition.x,pThing->vecPosition.y,

                 pThing->vecPosition.z);

         D3DXMatrixMultiply(&matWorld,&matWorld,&matPosition);

  

         pThing->matWorld=matWorld;    

         // 儔僀僩傪偁偰傞 敀怓偱岝戲斀幩偁傝偵愝掕

         D3DXVECTOR3 vecDirection(-1,-0.5,0);

     D3DLIGHT9 light;

     ZeroMemory( &light, sizeof(D3DLIGHT9) );

     light.Type       = D3DLIGHT_DIRECTIONAL;

     light.Diffuse.r  = 1.0f;

     light.Diffuse.g  = 1.0f;

     light.Diffuse.b  = 1.0f;   

         light.Specular.r=1.0f;

         light.Specular.g=1.0f;

         light.Specular.b=1.0f;

     D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDirection );

     light.Range       = 200.0f;

     pDevice->SetLight( 0, &light );

     pDevice->LightEnable( 0, TRUE );

 

         UpdateFrameMatrices(pThing->pFrameRoot, &matWorld);

         DrawFrame(pThing->pFrameRoot);

 

         //丂偦偺Thing偵娭傞僶僂儞僨傿儞僌儃僢僋僗偺儗儞僟儕儞僌

         if(boRenderBox)

         {

                 pThing->dwCurrentNode=0;

                 RenderBBoxTree(pThing,pThing->pFrameRoot,&matWorld);  

         }

}

//

//

//丂僶僂儞僨傿儞僌儃僢僋僗偺儗儞僟儕儞僌

RenderBBoxTree(THING* pThing,LPD3DXFRAME pFrameBase ,LPD3DXMATRIX pParentMatrix)

{

        MYFRAME *pFrame = (MYFRAME*)pFrameBase;

 

        if (pFrame->pFrameSibling != NULL)

    {

        RenderBBoxTree(pThing,pFrame->pFrameSibling,pParentMatrix);

    }

    if (pFrame->pFrameFirstChild != NULL)

    {

        RenderBBoxTree(pThing,pFrame->pFrameFirstChild,&pFrame->CombinedTransformationMatrix);

    }

 

        if (pParentMatrix != NULL)

        {

        D3DXMatrixMultiply(&pFrame->CombinedTransformationMatrix, &pFrame->TransformationMatrix, pParentMatrix);

        }

    else

        {

        pFrame->CombinedTransformationMatrix = pFrame->TransformationMatrix;

        }

        if(pFrame->pMeshContainer !=NULL)

        {

                pDevice->SetTexture( 0,NULL );

                pDevice->SetMaterial( pThing->pBBoxMeshMaterials);

                //僆僽僕僃僋僩嬻娫偱尨揰偑拞怱偲偼尷傜側偄偺偱丄曗惓

 

                        D3DXMATRIX mWorld;

                D3DXVECTOR3 vPivot=pThing->pBBox[pThing->dwCurrentNode].vPivot;

                D3DXMatrixTranslation(&mWorld,vPivot.x,vPivot.y,vPivot.z);             

                pDevice->SetTransform( D3DTS_WORLD, &(mWorld*pFrame->CombinedTransformationMatrix) );

 

                //儚乕儖僪嵗昗宯偲偟偰偺儃僢僋僗拞怱傪曐懚偟偰偍偔(偦傟偧傟偺儃僢僋僗偺夞揮峴楍偑OBB敾掕偺嵺偵昁梫側偨傔乯

                D3DXVec3TransformCoord(&vPivot,&vPivot,&pFrame->CombinedTransformationMatrix);

                pThing->pBBox[pThing->dwCurrentNode].vWorldPivot=vPivot;

 

                //巔惃峴楍偺夞揮晹暘偺傒拪弌(偦傟偧傟偺儃僢僋僗偺夞揮峴楍偑OBB敾掕偺嵺偵昁梫側偨傔乯

                D3DXMATRIX m,m2;

                m2=pFrame->CombinedTransformationMatrix;

                D3DXMatrixIdentity(&m);

                m._11=m2._11;

                m._12=m2._12;

                m._13=m2._13;

                m._21=m2._21;

                m._22=m2._22;

                m._23=m2._23;

                m._31=m2._31;

                m._32=m2._32;

                m._33=m2._33;

                pThing->pBBox[pThing->dwCurrentNode].mRotation=m;

                //儗儞僟儕儞僌

                pThing->ppBBoxMesh[pThing->dwCurrentNode]->DrawSubset(0);

                pThing->dwCurrentNode++;       

        }

}

//

//VOID RenderMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase)

//僼儗乕儉撪偺偦傟偧傟偺儊僢僔儏傪儗儞僟儕儞僌偡傞

VOID RenderMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase)

{

    MYMESHCONTAINER *pMeshContainer = (MYMESHCONTAINER*)pMeshContainerBase;

    MYFRAME *pFrame = (MYFRAME*)pFrameBase;

    UINT iMaterial;

 

    pDevice->SetTransform(D3DTS_WORLD, &pFrame->CombinedTransformationMatrix);

 

    for (iMaterial = 0; iMaterial < pMeshContainer->NumMaterials; iMaterial++)

    {

        pDevice->SetMaterial( &pMeshContainer->pMaterials[iMaterial].MatD3D );

        pDevice->SetTexture( 0, pMeshContainer->ppTextures[iMaterial] );

        pMeshContainer->MeshData.pMesh->DrawSubset(iMaterial);

    }

}

//

//VOID DrawFrame(LPD3DXFRAME pFrame)

//暋悢偺儊僢僔儏偐傜惉傞僼儗乕儉傪儗儞僟儕儞僌偡傞丅

VOID DrawFrame(LPD3DXFRAME pFrame)

{

    LPD3DXMESHCONTAINER pMeshContainer;

 

    pMeshContainer = pFrame->pMeshContainer;

    while (pMeshContainer != NULL)

    {

        RenderMeshContainer(pMeshContainer, pFrame);

 

        pMeshContainer = pMeshContainer->pNextMeshContainer;

    }

 

    if (pFrame->pFrameSibling != NULL)

    {

        DrawFrame(pFrame->pFrameSibling);

    }

 

    if (pFrame->pFrameFirstChild != NULL)

    {

        DrawFrame(pFrame->pFrameFirstChild);

    }

}

//

//VOID UpdateFrameMatrices(LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix)

//僼儗乕儉撪偺儊僢僔儏枅偵儚乕儖僪曄姺峴楍傪峏怴偡傞

VOID UpdateFrameMatrices(LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix)

{

    MYFRAME *pFrame = (MYFRAME*)pFrameBase;    

 

    if (pParentMatrix != NULL)

        {

        D3DXMatrixMultiply(&pFrame->CombinedTransformationMatrix, &pFrame->TransformationMatrix, pParentMatrix);

        }

    else

        {

        pFrame->CombinedTransformationMatrix = pFrame->TransformationMatrix;

        }

 

    if (pFrame->pFrameSibling != NULL)

    {

        UpdateFrameMatrices(pFrame->pFrameSibling, pParentMatrix);

    }

 

    if (pFrame->pFrameFirstChild != NULL)

    {

        UpdateFrameMatrices(pFrame->pFrameFirstChild, &pFrame->CombinedTransformationMatrix);

    }

}

//

//VOID RenderString(LPSTR szStr,INT iX,INT iY)

// 忣曬昞帵梡儖乕僠儞

VOID RenderString(LPSTR szStr,INT iX,INT iY)

{

        RECT rect={iX,iY,0,0};

        //暥帤楍偺僒僀僘傪寁嶼

        pFont->DrawText(NULL,szStr,-1,&rect,DT_CALCRECT,NULL);

        // 偦偺僒僀僘偱儗儞僟儕儞僌

        pFont->DrawText(NULL,szStr,-1,&rect,DT_LEFT | DT_BOTTOM,0xff00ff00);

}

//

//HRESULT MY_HIERARCHY::CreateFrame(LPCTSTR Name, LPD3DXFRAME *ppNewFrame)

//僼儗乕儉傪嶌惉偡傞

HRESULT MY_HIERARCHY::CreateFrame(LPCTSTR Name, LPD3DXFRAME *ppNewFrame)

{

    HRESULT hr = S_OK;

    MYFRAME *pFrame;

    *ppNewFrame = NULL;

 

    pFrame = new MYFRAME;

    if (pFrame == NULL)

    {

                return E_OUTOFMEMORY;   

    }

        pFrame->Name=new TCHAR[lstrlen(Name) + 1];     

    if (!pFrame->Name)

        {

                return E_FAIL;

        }

        strcpy(pFrame->Name,Name);

 

    D3DXMatrixIdentity(&pFrame->TransformationMatrix);

    D3DXMatrixIdentity(&pFrame->CombinedTransformationMatrix);

    pFrame->pMeshContainer = NULL;

    pFrame->pFrameSibling = NULL;

    pFrame->pFrameFirstChild = NULL;

    *ppNewFrame = pFrame;

    pFrame = NULL;

    delete pFrame;

 

    return S_OK;

}

//

//HRESULT MY_HIERARCHY::CreateMeshContainer

//儊僢僔儏僐儞僥僫乕傪嶌惉偡傞

HRESULT MY_HIERARCHY::CreateMeshContainer(LPCSTR Name, CONST D3DXMESHDATA* pMeshData,

                            CONST D3DXMATERIAL* pMaterials, CONST D3DXEFFECTINSTANCE* pEffectInstances,

                                                        DWORD NumMaterials, CONST DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo,

                            LPD3DXMESHCONTAINER *ppMeshContainer)

{

 

        dwNumNode++;

    HRESULT hr;

    MYMESHCONTAINER *pMeshContainer = NULL;

    INT iFacesAmount;

    INT iMaterial;

    LPDIRECT3DDEVICE9 pDevice = NULL;

    LPD3DXMESH pMesh = NULL;

    *ppMeshContainer = NULL;

 

    pMesh = pMeshData->pMesh;

    pMeshContainer = new MYMESHCONTAINER;

    if (pMeshContainer == NULL)

    {

        return E_OUTOFMEMORY;

    }

    ZeroMemory(pMeshContainer, sizeof(MYMESHCONTAINER));

 

        pMeshContainer->Name=new TCHAR[lstrlen(Name) + 1];     

    if (!pMeshContainer->Name)

        {

                return E_FAIL;

        }

        strcpy(pMeshContainer->Name,Name);

    pMesh->GetDevice(&pDevice);

    iFacesAmount = pMesh->GetNumFaces();

 

    // 摉奩儊僢僔儏偑朄慄傪帩偨側偄応崌偼朄慄傪捛壛偡傞

    if (!(pMesh->GetFVF() & D3DFVF_NORMAL))

    {

        pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;

        hr = pMesh->CloneMeshFVF( pMesh->GetOptions(),

                                    pMesh->GetFVF() | D3DFVF_NORMAL,

                                    pDevice, &pMeshContainer->MeshData.pMesh );

        if (FAILED(hr))

                {

                        return E_FAIL;

                }

 

        pMesh = pMeshContainer->MeshData.pMesh;

        D3DXComputeNormals( pMesh, NULL );

    }

    else

    {

        pMeshContainer->MeshData.pMesh = pMesh;

        pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;

        pMesh->AddRef();

    }

    pMeshContainer->NumMaterials = max(1, NumMaterials);

    pMeshContainer->pMaterials = new D3DXMATERIAL[pMeshContainer->NumMaterials];

    pMeshContainer->ppTextures = new LPDIRECT3DTEXTURE9[pMeshContainer->NumMaterials];

    pMeshContainer->pAdjacency = new DWORD[iFacesAmount*3];

    if ((pMeshContainer->pAdjacency == NULL) || (pMeshContainer->pMaterials == NULL))

    {

        return E_OUTOFMEMORY;

    }

 

    memcpy(pMeshContainer->pAdjacency, pAdjacency, sizeof(DWORD) * iFacesAmount*3);

    memset(pMeshContainer->ppTextures, 0, sizeof(LPDIRECT3DTEXTURE9) * pMeshContainer->NumMaterials);

 

    if (NumMaterials > 0)           

    {

        memcpy(pMeshContainer->pMaterials, pMaterials, sizeof(D3DXMATERIAL) * NumMaterials);

 

        for (iMaterial = 0; iMaterial < NumMaterials; iMaterial++)

        {

            if (pMeshContainer->pMaterials[iMaterial].pTextureFilename != NULL)

            {

                TCHAR strTexturePath[MAX_PATH];

                strcpy( strTexturePath,  pMeshContainer->pMaterials[iMaterial].pTextureFilename );

                if( FAILED( D3DXCreateTextureFromFile( pDevice, strTexturePath,

                                                        &pMeshContainer->ppTextures[iMaterial] ) ) )

                    pMeshContainer->ppTextures[iMaterial] = NULL;

                pMeshContainer->pMaterials[iMaterial].pTextureFilename = NULL;

            }

        }

    }

    else

    {

        pMeshContainer->pMaterials[0].pTextureFilename = NULL;

        memset(&pMeshContainer->pMaterials[0].MatD3D, 0, sizeof(D3DMATERIAL9));

        pMeshContainer->pMaterials[0].MatD3D.Diffuse.r = 0.5f;

        pMeshContainer->pMaterials[0].MatD3D.Diffuse.g = 0.5f;

        pMeshContainer->pMaterials[0].MatD3D.Diffuse.b = 0.5f;

        pMeshContainer->pMaterials[0].MatD3D.Specular = pMeshContainer->pMaterials[0].MatD3D.Diffuse;

    }  

    *ppMeshContainer = pMeshContainer;

    pMeshContainer = NULL;

 

    if (pMeshContainer != NULL)

    {

        DestroyMeshContainer(pMeshContainer);

    }

        SAFE_RELEASE( pDevice );

 

    return S_OK;

}

//

//HRESULT MY_HIERARCHY::DestroyFrame(LPD3DXFRAME pFrameToFree)

//僼儗乕儉傪攋婞偡傞

HRESULT MY_HIERARCHY::DestroyFrame(LPD3DXFRAME pFrameToFree)

{

    SAFE_DELETE_ARRAY( pFrameToFree->Name );

    SAFE_DELETE( pFrameToFree );

    return S_OK;

}

//

//HRESULT MY_HIERARCHY::DestroyMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase)

//儊僢僔儏僐儞僥僫乕傪攋婞偡傞

HRESULT MY_HIERARCHY::DestroyMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase)

{

    INT iMaterial;

    MYMESHCONTAINER *pMeshContainer = (MYMESHCONTAINER*)pMeshContainerBase;

 

    SAFE_DELETE_ARRAY( pMeshContainer->Name );

    SAFE_DELETE_ARRAY( pMeshContainer->pAdjacency );

    SAFE_DELETE_ARRAY( pMeshContainer->pMaterials );

 

    if (pMeshContainer->ppTextures != NULL)

    {

        for (iMaterial = 0; iMaterial < pMeshContainer->NumMaterials; iMaterial++)

        {

            SAFE_RELEASE( pMeshContainer->ppTextures[iMaterial] );

        }

    }

 

    SAFE_DELETE_ARRAY( pMeshContainer->ppTextures );

    SAFE_RELEASE( pMeshContainer->MeshData.pMesh );

 

    SAFE_DELETE( pMeshContainer );

    return S_OK;

}

//

//VOID FreeAnim(LPD3DXFRAME pFrame)

//奒憌撪丄慡偰偺DirectX僆僽僕僃僋僩傪儕儕乕僗偡傞

VOID FreeAnim(LPD3DXFRAME pFrame)

{

        if(pFrame->pMeshContainer != NULL)

        {                      

 

                cHierarchy.DestroyMeshContainer(pFrame->pMeshContainer);

        }      

       

    if (pFrame->pFrameSibling != NULL)

    {

        FreeAnim(pFrame->pFrameSibling);

    }

 

    if (pFrame->pFrameFirstChild != NULL)

    {

        FreeAnim(pFrame->pFrameFirstChild);

    }

}

//

//VOID FreeDx()

// 嶌惉偟偨DirectX僆僽僕僃僋僩偺奐曻

VOID FreeDx()

{

        SAFE_RELEASE( pFont );

        for(DWORD i=0;i<THING_AMOUNT;i++)

        {

                FreeAnim(Thing[i].pFrameRoot);

                cHierarchy.DestroyFrame(Thing[i].pFrameRoot);

                SAFE_RELEASE( Thing[i].pAnimController);

                for(DWORD k=0;k<Thing[i].dwNumNode;k++)

                {              

                        SAFE_RELEASE( Thing[i].ppBBoxMesh[k]);                 

                }

                SAFE_DELETE_ARRAY(Thing[i].pBBox);

        }

       

        SAFE_RELEASE( pDevice );

        SAFE_RELEASE( pD3d );

}

 

OBB.cpp

#include "Main.h"

//

//HRESULT InitBBox(LPDIRECT3DDEVICE9 pDevice,THING* pThing)

//儃僢僋僗偺寁嶼偍傛傃儃僢僋僗傪壜帇壔偡傞偨傔偵儃僢僋僗儊僢僔儏傪嶌惉偡傞

HRESULT InitBBox(LPDIRECT3DDEVICE9 pDevice,THING* pThing)

{      

        pThing->pBBox=(BBOX*) new BBOX[pThing->dwNumNode];

        pThing->ppBBoxMesh=(LPD3DXMESH*) new LPD3DXMESH[pThing->dwNumNode];

 

        for(DWORD i=0;i<pThing->dwNumNode;i++)

        {

                pThing->ppBBoxMesh[i]=NULL;

        }

 

        CreateFrameBBox(pDevice,pThing->pFrameRoot,pThing);

 

        //儃僢僋僗儊僢僔儏偺儅僥儕傾儖丂敀怓丄敿摟柧丄岝戲嫮

        pThing->pBBoxMeshMaterials = new D3DMATERIAL9;

        pThing->pBBoxMeshMaterials->Diffuse.r=1.0f;

        pThing->pBBoxMeshMaterials->Diffuse.g=1.0f;

        pThing->pBBoxMeshMaterials->Diffuse.b=1.0f;    

        pThing->pBBoxMeshMaterials->Diffuse.a=0.3f;

        pThing->pBBoxMeshMaterials->Ambient=pThing->pBBoxMeshMaterials->Diffuse;       

        pThing->pBBoxMeshMaterials->Specular.r=1.0f;

        pThing->pBBoxMeshMaterials->Specular.g=1.0f;

        pThing->pBBoxMeshMaterials->Specular.b=1.0f;

        pThing->pBBoxMeshMaterials->Emissive.r=0.1f;

        pThing->pBBoxMeshMaterials->Emissive.g=0.1f;

        pThing->pBBoxMeshMaterials->Emissive.b=0.1f;

        pThing->pBBoxMeshMaterials->Power=120.0f;      

 

        return S_OK;

}

//

//

///

HRESULT CreateFrameBBox(LPDIRECT3DDEVICE9 pDevice,LPD3DXFRAME pFrame,THING* pThing)

{

        if (pFrame->pFrameSibling != NULL)

    {

        CreateFrameBBox(pDevice,pFrame->pFrameSibling,pThing);

    }

 

    if (pFrame->pFrameFirstChild != NULL)

    {

        CreateFrameBBox(pDevice,pFrame->pFrameFirstChild,pThing);

    }

 

        if(pFrame->pMeshContainer == NULL)

        {

                return S_OK;

        }

       

        D3DXVECTOR3 vMax,vMin;

        //儘僢僋偟偰嵟戝嵟彫傪摼傞

        LPDIRECT3DVERTEXBUFFER9 pVB=NULL;

        BYTE* pVertices = NULL;

        LPD3DXMESH pMesh=pFrame->pMeshContainer->MeshData.pMesh;

 

        if(FAILED(pMesh->GetVertexBuffer( &pVB )))

        {

                return E_FAIL;

        }

        if(FAILED(pVB->Lock( 0, 0, (VOID**)&pVertices, 0 )))

        {

                SAFE_RELEASE( pVB );

                return E_FAIL;

        }

        if(FAILED(D3DXComputeBoundingBox( (D3DXVECTOR3*)pVertices, pMesh->GetNumVertices(),

                                   D3DXGetFVFVertexSize(pMesh->GetFVF()), &vMin,&vMax )))

        {

                pVB->Unlock();

                return E_FAIL;

        }

        pVB->Unlock();

        SAFE_RELEASE( pVB );

        //

        pThing->pBBox[pThing->dwCurrentNode].vMax=vMax;

        pThing->pBBox[pThing->dwCurrentNode].vMin=vMin;

        pThing->pBBox[pThing->dwCurrentNode].vPivot=(vMax+vMin) /2;

        strcpy(pThing->pBBox[pThing->dwCurrentNode].Name,pFrame->Name);

        D3DXVECTOR3 vLength;

        vLength=vMax-vMin;

        SAFE_RELEASE(pThing->ppBBoxMesh[pThing->dwCurrentNode]);

        if(FAILED(D3DXCreateBox(pDevice,vLength.x,vLength.y,vLength.z,&pThing->ppBBoxMesh[pThing->dwCurrentNode],NULL)))

        {

                return E_FAIL;

        }

        //幉儀僋僩儖偲幉偺挿偝乮偙偺応崌儃僢僋僗偺曈偺挿偝乯傪弶婜壔偡傞

        pThing->pBBox[pThing->dwCurrentNode].fLengthX=(vMax.x-vMin.x) / 2;

        pThing->pBBox[pThing->dwCurrentNode].fLengthY=(vMax.y-vMin.y) / 2;

        pThing->pBBox[pThing->dwCurrentNode].fLengthZ=(vMax.z-vMin.z) / 2;

       

        pThing->dwCurrentNode++;

 

        return S_OK;

}

//

//

//OBB偵傛傞徴撍敾掕丅徴撍偟偰偄傞応崌偼TRUE傪丄棧傟偰偄傞応崌偼FALSE傪曉偡丅

BOOL OBBCollisionDetection(DWORD* pIndexA,DWORD* pIndexB,THING* pThingA,THING* pThingB)

{      

        for(DWORD i=0;i<pThingA->dwNumNode;i++)

        {

                for(DWORD k=0;k<pThingB->dwNumNode;k++)

                {

                        if(OBBCollisionDetectionEachBBox(&pThingA->pBBox[i],&pThingB->pBBox[k]))

                        {

                                *pIndexA=i;

                                *pIndexB=k;

                                return TRUE;

                        }

                }

        }

        return FALSE;

}

//

//BOOL OBBCollisionDetection(THING* pThingA,THING* pThingB)

//

BOOL OBBCollisionDetectionEachBBox(BBOX* pBBoxA,BBOX* pBBoxB)

{      

        //儃僢僋僗偺嫍棧儀僋僩儖乮拞怱偲拞怱傪寢傫偩儀僋僩儖乯

        D3DXVECTOR3 vDistance = pBBoxB->vWorldPivot - pBBoxA->vWorldPivot;

        //暘棧幉

        D3DXVECTOR3 vecSeparate;

        //偦傟偧傟偺儘乕僇儖婎掙幉儀僋僩儖偵丄偦傟偧傟偺夞揮傪斀塮偝偣傞

        pBBoxA->vAxisX=D3DXVECTOR3(1,0,0);

        pBBoxA->vAxisY=D3DXVECTOR3(0,1,0);

        pBBoxA->vAxisZ=D3DXVECTOR3(0,0,1);

 

        pBBoxB->vAxisX=D3DXVECTOR3(1,0,0);

        pBBoxB->vAxisY=D3DXVECTOR3(0,1,0);

        pBBoxB->vAxisZ=D3DXVECTOR3(0,0,1);

 

        D3DXVec3TransformCoord(&pBBoxA->vAxisX,&pBBoxA->vAxisX,&pBBoxA->mRotation);

        D3DXVec3TransformCoord(&pBBoxA->vAxisY,&pBBoxA->vAxisY,&pBBoxA->mRotation);

        D3DXVec3TransformCoord(&pBBoxA->vAxisZ,&pBBoxA->vAxisZ,&pBBoxA->mRotation);

 

        D3DXVec3TransformCoord(&pBBoxB->vAxisX,&pBBoxB->vAxisX,&pBBoxB->mRotation);

        D3DXVec3TransformCoord(&pBBoxB->vAxisY,&pBBoxB->vAxisY,&pBBoxB->mRotation);

        D3DXVec3TransformCoord(&pBBoxB->vAxisZ,&pBBoxB->vAxisZ,&pBBoxB->mRotation);

        //儃僢僋僗A偺儘乕僇儖婎掙幉傪婎弨偵偟偨丄乭塭乭偺嶼弌乮3僷僞乕儞乯

        {              

                //X幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxA->vAxisX,&vDistance)) return FALSE;

                //Y幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxA->vAxisY,&vDistance)) return FALSE;

                //Z幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxA->vAxisZ,&vDistance)) return FALSE;

        }

        //儃僢僋僗B偺儘乕僇儖婎掙幉傪婎弨偵偟偨丄乭塭乭偺嶼弌乮3僷僞乕儞乯

        {

                //X幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxB->vAxisX,&vDistance)) return FALSE;

                //Y幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxB->vAxisY,&vDistance)) return FALSE;

                //Z幉傪暘棧幉偲偟偨応崌

                if(!CompareLength(pBBoxA,pBBoxB,&pBBoxB->vAxisZ,&vDistance)) return FALSE;

        }

        //偍屳偄偺婎掙幉摨巑偺奜愊儀僋僩儖傪婎弨偵偟偨丄乭塭乭偺嶼弌乮9僷僞乕儞乯

        {

                //儃僢僋僗AX

                {

                        //偲丂儃僢僋僗BX幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisX,&pBBoxB->vAxisX);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BY幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisX,&pBBoxB->vAxisY);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BZ幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisX,&pBBoxB->vAxisZ);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                }

                //儃僢僋僗AY

                {

                        //偲丂儃僢僋僗BX幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisY,&pBBoxB->vAxisX);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BY幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisY,&pBBoxB->vAxisY);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BZ幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate,&pBBoxA->vAxisY,&pBBoxB->vAxisZ);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                }

                //儃僢僋僗AZ

                {

                        //偲丂儃僢僋僗BX幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisZ,&pBBoxB->vAxisX);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BY幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisZ,&pBBoxB->vAxisY);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                        //偲丂儃僢僋僗BZ幉偲偺奜愊儀僋僩儖傪暘棧幉偲偟偨応崌

                        D3DXVec3Cross( &vecSeparate, &pBBoxA->vAxisZ,&pBBoxB->vAxisZ);

                        if(!CompareLength(pBBoxA,pBBoxB,&vecSeparate,&vDistance)) return FALSE;

                }

        }

        return TRUE;

}

//

//BOOL CompareLength(BBOX* pboxA,BBOX* pboxB,D3DXVECTOR3* pvecSeparate,D3DXVECTOR3* pvecDistance)

//乽嫍棧乿偑乽俀偮偺塭偺崌寁乿傛傝戝偒偄応崌乮旕徴撍乯偼FALSE  摍偟偄偐彫偝偄応崌乮徴撍乯偼TRUE

// 偙偺娭悢偼丄OBBCollisionDetection娭悢偺傒偵屇傃弌偝傟傞僒僽儖乕僠儞

BOOL CompareLength(BBOX* pboxA,BBOX* pboxB,D3DXVECTOR3* pvecSeparate,D3DXVECTOR3* pvecDistance)

{

        //乭暘棧幉忋偱偺乭儃僢僋僗俙偺拞怱偐傜儃僢僋僗俛偺拞怱傑偱偺嫍棧

        FLOAT fDistance=fabsf( D3DXVec3Dot( pvecDistance, pvecSeparate) );

        //暘棧幉忋偱儃僢僋僗A偺拞怱偐傜嵟傕墦偄儃僢僋僗A偺捀揰傑偱偺嫍棧

        FLOAT fShadowA=0;

        //暘棧幉忋偱儃僢僋僗B偺拞怱偐傜嵟傕墦偄儃僢僋僗B偺捀揰傑偱偺嫍棧

        FLOAT fShadowB=0;              

        //偦傟偧傟偺儃僢僋僗偺乭塭乭傪嶼弌

        fShadowA = fabsf( D3DXVec3Dot( &pboxA->vAxisX, pvecSeparate ) * pboxA->fLengthX)+

                fabsf( D3DXVec3Dot( &pboxA->vAxisY, pvecSeparate ) * pboxA->fLengthY)+

                fabsf( D3DXVec3Dot( &pboxA->vAxisZ, pvecSeparate ) * pboxA->fLengthZ);

 

        fShadowB = fabsf( D3DXVec3Dot( &pboxB->vAxisX, pvecSeparate ) * pboxB->fLengthX)+

                fabsf( D3DXVec3Dot( &pboxB->vAxisY, pvecSeparate ) * pboxB->fLengthY)+

                fabsf( D3DXVec3Dot( &pboxB->vAxisZ, pvecSeparate ) * pboxB->fLengthZ);

        if(fDistance > fShadowA + fShadowB)

        {

                return FALSE;

        }

        return TRUE;

}

 

11復丂僾儘僌儗僢僔僽儊僢僔儏傪棙梡偟偨敾掕梡僕僆儊僩儕

 

僒儞僾儖僾儘僕僃僋僩丂ch11 敾掕梡P儊僢僔儏

 

僴僀億儕僑儞偺儊僢僔儏偵懳偟儗僀敾掕傪偡傞偲偄偆偙偲偼廳偨偄張棟偱偡丅億儕僑儞偑懡偗傟偽懡偄傎偳儗僀偲嶰妏宍偺敾掕夞悢偑憹偊傞偺偱摉慠偱偡丅

偦偙偱丄僶僇惓捈偵偦偺傑傑偺儊僢僔儏偵懳偟儗僀傪摉偰傞偺偱偼側偔丄偦偺僕僆儊僩儕偺乬僾儘僌儗僢僔僽儊僢僔儏乭偵儗僀傪摉偰傞偲僼儗乕儉儗乕僩傪壱偖偙偲偑弌棃傑偡丅

僾儘僌儗僢僔僽儊僢僔儏偼丄杮棃偺僆儕僕僫儖僕僆儊僩儕偐傜億儕僑儞悢傪嶍尭偟偨掅億儕僑儞僶乕僕儑儞傪抜奒揑偵偄偔偮偐帩偪傑偡丅偦偺抜奒悢傪懡偔偡傟偽奺儗儀儖偺儊僢僔儏娫偱偺億儕僑儞検偺憹尭暆偼彮側偔側傝傑偡偑摨帪偵僾儘僌儗僢僔僽儊僢僔儏慡懱偺儊儌儕巊梡検偑憹壛偟傑偡丅媡偵抜奒悢傪彮側偔偡傟偽奺儗儀儖偺儊僢僔儏娫偱偺億儕僑儞悢偺嵎偼戝偒偔側傝丄摨帪偵僾儘僌儗僢僔僽儊僢僔儏慡懱偲偟偰偺儊儌儕検偼憡懳揑偵彮側偔側傝傑偡丅偨偩偟捠忢偺儊僢僔儏傛傝偼摉慠儊儌儕巊梡検偼戝偒偔側傞偙偲偵曄傢傝偼桳傝傑偣傫丅側偍丄偙偺傛偆側乬抜奒乭偼LODLevel Of Detail乯偲屇偽傟傑偡丅

壗傟偵偟偰傕丄偦傟傜偺儀僗僩僶儔儞僗傪朷傓偺偱偁傟偽丄偦偺帪偺忬嫷偵傛傝嵟揔側儗儀儖悢傪尒偮偗傞偲偄偆偙偲偵側傞偱偟傚偆丅

杮僒儞僾儖偱偼丄Direct3DD3DXIntersect娭悢偵傛傝儗僀傪摉偰偰偄傑偡丅D3DXIntersect偑堷悢偵偲傞偺偼BaseMesh僆僽僕僃僋僩偱偡偐傜丄僾儘僌儗僢僔僽儊僢僔儏乮偺奺儗儀儖偛偲偺儊僢僔儏乯偱傕敾掕偼壜擻偱偡丅

 

師偺4枃偺恾偼僒儞僾儖偺僉儍僾僠儍夋憸偱偡丅偙傟傜偐傜柧傜偐側傛偆偵丄徻嵶儗儀儖偺掅偄儊僢僔儏傎偳fps偑崅偄偙偲偑妋擣偱偒傑偡丅

 

僒儞僾儖偺愢柧

11-1

 

11-2

 

11-3

 

11-4

 

儗儀儖0fps偑嵟傕崅偄偱偡偑丄宍忬偑僆儕僕僫儖偲偐側傝堎側傞偺偱丄偝偡偑偵巊偊傑偣傫丅

堦曽丄儗儀儖1埲崀偼尒偨栚偑傎偲傫偳乮偲偄偆偐傑偭偨偔乯曄傢傜側偄傛偆偵尒偊傑偡丅偟偨偑偭偰偙偺応崌偼儗儀儖1偺儊僢僔儏傪敾掕偵巊梡偡傞偺偑儀僗僩偱偟傚偆丅

傕偪傠傫丄偄傠偄傠側儊僢僔儏偵偮偄偰忢偵儗儀儖1偑儀僗僩偱偁傞偲偄偆偙偲偼柍偄偲巚偄傑偡丅巐妏偭傐偄儊僢僔儏偱偁傟偽儗儀儖0偱廫暘側応崌傕偁傞偱偟傚偆偟丄恖懱側偳偺儊僢僔儏偼儗儀儖3偁偨傝偐傜偠傖側偄偲巊偊側偄応崌傕偁傞偲巚偄傑偡丅偝傜偵杮僒儞僾儖偱偼暘妱悢傪5偵偟偰偄傑偡偑丄暘妱悢偵傛偭偰傕摨偠儊僢僔儏偱儀僗僩側儗儀儖偑曄傢偭偰偔傞偐傕偟傟傑偣傫丅

 

僉乕憖嶌

Z,X僉乕丗儗儀儖偺尭彮丒憹壛

栴報僉乕丗儗僀偺堏摦

 

僐乕僪夝愢

椺偵傛偭偰帺桼婥傑傑偵嶌惉偟偨僾儘僕僃僋僩側偺偱僼傽僀儖悢偑懡偔側偭偰偄傑偡偑丄拲栚偡傞晹暘偼傕偪傠傫Direct3D僋儔僗媦傃傾僾儕働乕僔儑儞僋儔僗偺傒偱偡丅偨偩丄偦傕偦傕DirectX偺塣梡偺夝愢偱偼側偔LOD娗棟偵傛傞儗僀敾掕偺崅懍壔偑杮幙側偺偱丄僐乕僪偺夝愢偼偁傑傝堄枴偑偁傝傑偣傫丅

奣梫偲棳傟偩偗夝愢偟傑偡偑丄偙偺僐乕僪帺懱偼壗偐偵棳梡偱偒傞偱偟傚偆丅乮岎揰偺嶼弌晹暘側偳乯

 

傑偢丄X僼傽僀儖傪捠忢偺儊僢僔儏偲偟偰撉傒崬傒傑偡丅

偦偺儊僢僔儏偐傜僾儘僌儗僢僔僽儊僢僔儏傪嶌惉偟傑偡丅

儗僀偲偺岎嵎敾掕偵偼丄偦偺僾儘僌儗僢僔僽儊僢僔儏撪偺奺儗儀儖儊僢僔儏傪巊梡偟傑偡丅

杮僒儞僾儖偱偼丄儗儞僟儕儞僌偵傕僾儘僌儗僢僔僽儊僢僔儏撪偺儊僢僔儏傪巊梡偟偰偄傑偡偑丄杮棃偼傕偲偺儊僢僔儏傪儗儞僟儕儞僌偡傋偒偱偡丅敾掕梡偺儊僢僔儏偼儗儞僟儕儞僌偡傞偙偲偑栚揑偱偼側偔丄敾掕偵巊梡偡傞偙偲偑栚揑側傢偗偱偡偐傜丄壜帇壔偟偰妋擣偡傞偲偒埲奜偼儗儞僟儕儞僌偡傞昁梫偼偁傝傑偣傫丅

偮傑傝晛捠偼

儗儞僟儕儞僌偼捠忢儊僢僔儏乮僆儕僕僫儖偺儊僢僔儏乯傪巊梡偟丄

徴撍敾掕摍偵偼僾儘僌儗僢僔僽儊僢僔儏撪偺掅億儕僑儞儊僢僔儏傪巊梡偡傞丅

偲偄偆宍偵側傝傑偡丅

 

幚嵺偺僐乕僪偺棳傟偼師偺偲偍傝偱偡丅

 

CAPPLICATION::Initialize()CDIRECT3D::Init()丂僂傿儞僪僂偺嶌惉偲Direct3D偺弶婜壔丅

CAPPLICATION::Initialize() CDIRECT3D::InitPThing()X僼傽僀儖偺儘乕僪丅僾儘僌儗僢僔僽儊僢僔儏偺嶌惉丅

CAPPLICATION::RenderScene()丂儗儞僟儕儞僌丅

 

側偍丄CDIRECT3D::InitThing()CDIRECT3D::InitPThing()偑偁傝傑偡偑丄CDIRECT3D::InitThing()P偑晅偄偰偄側偄傎偆乯偼僾儘僌儗僢僔僽儊僢僔儏傪惗惉偟側偄捠忢儊僢僔儏偵摿壔偟偨傕偺偱偁傞偺偱巊梡偟偰偄傑偣傫丅

 

12復丂僷僢僠僼傽僀儖

僒儞僾儖僾儘僕僃僋僩丂ch12 僷僢僠僾儘僌儔儉丂僷僢僠僨乕僞嶌惉

僒儞僾儖僾儘僕僃僋僩丂ch12 僷僢僠僾儘僌儔儉丂僷僢僠僾儘僌儔儉杮懱

僷僢僠僾儘僌儔儉偁傞偄偼僷僢僠僼傽僀儖偲屇偽傟傞傕偺偼丄婛懚僾儘僌儔儉偵懳偟壗傜偐偺傾僢僾僨乕僩偁傞偄偼僶僌僼傿僢僋僗傪帠屻揑偵巤偡僾儘僌儔儉偺偙偲偱偡丅

僶僌僼傿僢僋僗偑栚揑偱偁傟偽僷僢僠乮傎偙傠傃傪偁偰偑偆乯偱偁傝丄傾僢僾僨乕僩偺応崌偱偁傟偽僷僢僠乮忺傝傪晅偗懌偡乯偲偄偆堄枴偵側傝丄偳偪傜偵偟偰傕僷僢僠偲偼曋棙側尵梩偱偡偹丅

僂傿儞僪僂僘偺乬僒乕價僗僷僢僋乭傕僷僢僠僾儘僌儔儉偲尵偊傑偡丅

偙偙偱偼僷僢僠僾儘僌儔儉傪幚嵺偵嶌偭偰傒傑偟傚偆丅

僷僢僠僾儘僌儔儉偑杮戣偱偁傞偺偱丄乽僷僢僠傪偐偗傞曽偺僾儘僌儔儉乿偼懠垽傕側偄傕偺傪梡堄偟傑偟偨丅僐儞僜乕儖傾僾儕偱丄1暘傕偁傟偽嶌傟傞傛偆側戙暔偱偡丅

12-1

 

偦傟傪僷僢僠僾儘僌儔儉偵傛傝傾僢僾僨乕僩偟傑偡丅傾僢僾僨乕僩偲尵偭偰傕師偺傛偆偵曄壔偝偣傞偩偗偱偡丅

12-2

 

偟偐偟丄杮僒儞僾儖偱懠垽傕側偄偺偼傕偪傠傫乽僷僢僠傪揔梡偡傞儌僕儏乕儖懁乿偱偁偭偰丄僷僢僠僾儘僌儔儉帺懱偼暿偺傕偭偲戝偒側僾儘僌儔儉偵傕巊梡偱偒傑偡丅乮婯柾丄暋嶨偝偵娭傜偢婡擻偟傑偡丅乯

偙偺僷僢僠僾儘僌儔儉偼乽僇儞僷僯乕僂僅乕僘2004乿偺傾僢僾僨乕僩偱巊梡偟偰偄偨傕偺偱偁傝丄惈擻偼幚徹嵪傒偱偡丅偨偩偟丄僇儞僷僯乕僂僅乕僘2004偺僷僢僠偼儗僕僗僩儕偺嶲徠婡擻偑偁傝傑偡偑杮僒儞僾儖偱偼徣偄偰偄傑偡丅

儗僕僗僩儕偺捛壛丒嶍彍摍偵偮偄偰偼13復偺乽僀儞僗僩乕儔乕乿偱夝愢偟傑偡丅

撉幰偼丄側傫傜偐偺僾儘僌儔儉傪2偮梡堄偟乮慡偔堎側傞僾儘僌儔儉偱傕壜乯2偮偺僾儘僌儔儉偵偮偄偰偺僷僢僠傪嶌惉偟偰傒偰偔偩偝偄丅

 

尨棟

偙偙偱偼僷僢僠傪偐偗傞慜偺僾儘僌儔儉傪媽儌僕儏乕儖丄怴偟偄僾儘僌儔儉傪怴儌僕儏乕儖偲屇傃傑偡丅怴儌僕儏乕儖偼僷僢僠傪偐偗偰弌棃忋偑偭偨怴偟偄傾僢僾僨乕僩儌僕儏乕儖偲摨堦偱偁傞偲傕尵偊傑偡丅

僷僢僠僾儘僌儔儉偺嶌惉偼丄戝偒偔2抜奒偺僼僃乕僘偵暘偐傟傑偡丅

 

1抜栚偼丄怴媽儌僕儏乕儖偺嵎暘僨乕僞傪嶌惉偡傞偙偲丅

2抜栚偼丄嵎暘僨乕僞傪儕僜乕僗偲偟偰撪晹偵庢傝崬傫偩幚峴僼傽僀儖丄偡側傢偪僷僢僠僾儘僌儔儉傪嶌惉偟傑偡丅

 

偮傑傝1抜栚偺嵎暘僨乕僞嶌惉梡偺幚峴僼傽僀儖傕偁傞傢偗偱偡丅偟偨偑偭偰杮僒儞僾儖偺僾儘僕僃僋僩偼2偮偁傝傑偡丅侾偮偼嵎暘僨乕僞嶌惉梡偺幚峴僼傽僀儖傪價儖僪偡傞僾儘僕僃僋僩丄2偮栚偱傛偆傗偔僷僢僠僾儘僌儔儉傪價儖僪偡傞僾儘僕僃僋僩偱偡丅

 

嵎暘僨乕僞偺嶌惉

嵎暘僨乕僞偺嶌惉偼丄乽僷僢僠僨乕僞嶌惉乿僾儘僕僃僋僩偺傎偆偱峴偄傑偡丅

幚偼丄杮復偺栚揑偺90%埲忋偼偙偺嵎暘僨乕僞偺嶌惉偵偁傝傑偡丅

嵎暘僨乕僞偲偄偆偲2偮偺儌僕儏乕儖偺乬堘偆晹暘偺傒乭偲偄偆報徾傪庴偗傞偲巚偄傑偡偑丄惓妋偵尵偆偲傕偆彮偟忣曬傪帩偭偰偄傑偡丅

偝偰丄嵎暘僨乕僞偼偳偆嶌惉偡傞偺偱偟傚偆丠丂傑偨偳偺傛偆側宍偑岠棪揑側偺偱偟傚偆丠

 

岠棪揑偐偼暿偲偟偰丄偡偖偵巚偄偮偔偺偼師偺傛偆側曽朄偱偟傚偆丅

12-3

 

堦弖偙傟偱傕忋庤偔偄偔偲姶偠傑偡偑丄偡偖偵廳戝側寚娮偵婥晅偒傑偡丅

偨偲偊偽丄愭摢僶僀僩偺偨偭偨1僶僀僩偑堎側偭偰偄傞偲丄巆傝偺僶僀僩偑摨堦偩偲偟偰傕嵎暘僨乕僞偺僒僀僘偼怴儌僕儏乕儖偲摨堦偺僒僀僘偵側偭偰偟傑偄傑偡丅

 

12-4

偙偺恾偱偼9僶僀僩偟偐偁傝傑偣傫偑丄椺偊偽1儊僈僶僀僩偱偁傞応崌偼偳偆偱偟傚偆丅偨偭偨1僶僀僩偺堘偄丄傎傫偺1僶僀僩暘僘儗偰偄傞偩偗偱僒僀僘偼嵟埆1儊僈僶僀僩偵側偭偰偟傑偄傑偡丅偟偐傕僨乕僞揑偵偼慡偔摨偠偱偁偭偰傕娭學偁傝傑偣傫丅1儊僈拞偺1僶僀僩偱偡偐傜99.999904%摨堦偺僾儘僌儔儉偺嵎暘偑嵟埆偱怴儌僕儏乕儖偲摨堦偵側傞偲偄偆偺偼柧傜偐偵柍懯偱偡傛偹丅

僒僀僘偺栤戣傕偦偆偱偡偑丄幚偼偦傫側傫偙偲傛傝傕傕偭偲怺崗側栤戣偑偁傞偙偲偵婥晅偔偱偟傚偆偐丠

偙偺傛偆偵偟偰弌棃偨僷僢僠僨乕僞偼儌僕儏乕儖偦偺傕偺偲偄偭偰傕偄偄戙暔偱偡丅偟偨偑偭偰偦傟傪撪曪偟偨僷僢僠僾儘僌儔儉傪攝晍偡傞偲偄偆偙偲偼乬怴儌僕儏乕儖傪攝晍偟偰偄傞乭傛偆側傕偺偱偡丅偮傑傝丄僷僢僠僾儘僌儔儉偺堄枴偑慡偔柍偔側傞偽偐傝偱偼側偔丄媽儌僕儏乕儖傪帩偨側偄恖暔偵傛傞堘朄僐僺乕傪彆挿偡傞寢壥偵側傝偐偹傑偣傫丅

偦偙偱丄杮僒儞僾儖偱偼偙偺傛偆側庤朄偼偲傜偢丄乽僽儘僢僋乿偲偄偆奣擮傪梡偄偰偄傑偡丅

惗偺僶僀僫儕乕僨乕僞傪嵎暘僨乕僞偲偡傞偺偱偼側偔丄乽堦抳偟偰偄傞晹暘乿丄偦偟偰乽晄堦抳側晹暘乿偺乽忣曬乿傪僽儘僢僋偲偄偆榑棟扨埵偵奿擺偟傑偡丅堦抳偟偰偄晹暘偵偍偄偰丄僽儘僢僋偵擖傟傞偺偼偁偔傑偱傕乽忣曬乿尵偆側傟偽僀儞僨僢僋僗偱偁傝丄惗偺僶僀僫儕乕僨乕僞傪捈愙奿擺偟傑偣傫丅僷僢僠僾儘僌儔儉偑僷僢僠傪峴偆嵺偵偼丄媽儌僕儏乕儖撪偺摉奩僽儘僢僋偑巜偡晹埵偐傜僶僀僫儕乕僨乕僞傪嵞棙梡偟傑偡丅偨偩偟丄晄堦抳晹暘偵偮偄偰偼惗偺僶僀僫儕乕僨乕僞傪巊偄傑偡丅

嵎暘僼傽僀儖偵奿擺偝傟傞偺偼婎杮揑偵乬僽儘僢僋乭偱偡丅僽儘僢僋峔憿懱偺僒僀僘偼偣偄偤偄17僶僀僩偱偡偐傜丄惗偺僶僀僫儕傪奿擺偡傞傛傝傕偐側傝僐儞僷僋僩偵側傝傑偡丅

僽儘僢僋偺巜偡斖埻偼壜曄挿偱偡丅僒儞僾儖偱偼僨僼僅儖僩偱16僶僀僩乣160僶僀僩偵偟偰偄傑偡丅偙傟偼僜乕僗忋偱曄峏壜擻偱偡丅偱偡偺偱捈姶揑偵偼丄嵟埆偱傕惗偺僶僀僫儕乕偵斾傋16暘偺1偺僒僀僘丄嵟崅偱160暘偺1偵側傞偙偲偵側傝傑偡丅偨偩丄僽儘僢僋峔憿懱偦偺傕偺偺僒僀僘偑偁傞偺偱幚嵺偵偼懡彮堎側傝傑偡丅

12-5

 

 

僷僢僠僾儘僌儔儉偺嶌惉

嵎暘僨乕僞偑弌棃偰偝偊偄傟偽丄僷僢僠僾儘僌儔儉偺嶌惉偼帄嬌娙扨偱偡丅

嵎暘僨乕僞傪儕僜乕僗偲偟偰僷僢僠僾儘僌儔儉撪偵撪曪偟丄嵎暘僨乕僞偵奿擺偝傟偰偄傞僨乕僞偺弴斣偵婡夿揑偵僨乕僞偺僐僺乕傪峴偊偽偄偄偩偗偱偡丅

梫偡傞偵丄乽扨弮偵嵎暘僨乕僞偺嶌惉偲僨乕僞偺棳傟傪媡偵偡傟偽乿怴儌僕儏乕儖偑弌棃忋偑傝傑偡丅

 

12-6

 

傑偨丄

乽僄儞僪儐乕僓乕偑帩偭偰偄傞媽儌僕儏乕儖偐傜巊偊傞偲偙傠偼嵟戝尷棳梡偟偰丄晄堦抳晹暘偼巇曽偑柍偄偺偱僶僀僫儕乕偱梡堄偡傞丅乿

偲偄偆偙偲偱偡丅

 

僐乕僪夝愢

 

嵎暘僨乕僞偺嶌惉

嵎暘僨乕僞偺嶌惉僼僃乕僘偼丄乽僷僢僠僨乕僞嶌惉乿僾儘僕僃僋僩偺傎偆偱偡丅

僼傽僀儖偺僆乕僾儞傗僼傽僀儖僟僀傾儘僌昞帵摍偺晹暘偼偳偆偱傕椙偄晹暘偱偁傝丄廳梫側偺偼CreateData娭悢媦傃FindMatching娭悢偩偗偱偡丅

 

CreateData娭悢偼暥帤捠傝丄嵎暘僨乕僞傪嶌惉偟傑偡丅

堦抳丒晄堦抳晹暘偺挷嵏丄堦抳晹暘偵懳偡傞僽儘僢僋偺嶌惉傪峴偭偨偁偲丄spt僼傽僀儖偵棊偲偟傑偡丅

側偍spt偲偄偆奼挘巕偼昅幰偑揔摉偵峫偊偨傕偺側偺偱揔媂曄峏偟偰傕峔偄傑偣傫丅dat偱傕壗偱傕偄偄偱偡丅

FindMatching娭悢偼CreateData娭悢撪晹偐傜偺傒僐乕儖偝傟傞僒僽儖乕僠儞偱偡丅偦偺柤偺偲偍傝堦抳晹暘傪尒偮偗傑偡丅

struct BLOCK

{

        BYTE bFlag;

        DWORD dwNewAddress;

        DWORD dwOldAddress;

        DWORD dwSize;

};

 

CreateData()娭悢

BOOL CreateData()

{

        DWORD loop1,loop2,loop3,loop4;

        BYTE temp;

 

        DWORD dwBlock=0;

        DWORD dwSize;

        DWORD dwAdd;

        DWORD dwTemp;

        HRESULT hr=0;

        DWORD dwTotalSize=0;

        DWORD ratio=g_dwNewSize/100;

        if(ratio==0) ratio=1;

 

        dwMaxSize=sizeof(BLOCK)*10;

        dwMinSize=sizeof(BLOCK);

        printf("\n斾妑扨埵 %d僶僀僩",dwMaxSize);

        printf("\n斾妑扨埵偺嵟彫弅彫抣 %d僶僀僩",dwMinSize);

        printf("\n************丂俀偮偺僼傽僀儖傪斾妑偟偰偄傑偡 ****************\n");

 

        // 傑偢丄嵟弶偵堦抳偡傞僽儘僢僋傪挷傋傞

 

        dwAdd=0;

        loop4=0;

        loop2=0;

        dwSize=dwMaxSize;

        for(loop1=0;loop1<g_dwNewSize;loop1++)

        {                      

                if((loop1!=0) && ((loop1 % ratio)==0))

                {

                        printf(".");

                }

       

                if((loop1!=0) && ((loop1 % (ratio*10))==0))

                {

                        printf(" %d%%姰椆丂僽儘僢僋悢 %d",loop1/ratio,dwBlock);           

                        dwTemp=0;

                        for(loop3=0;loop3<g_dwNewSize;loop3++)

                        {

                                if(g_Buffer[loop3]==1) dwTemp++;

                        }

                        printf(" 堦抳棪丗%3.2f %%",((double)dwTemp/(double)g_dwNewSize)*100);

                        printf(" %d昩丄%d\n",(clock()-timer)/1000,((clock()-timer)/1000)/60);

                }                      

 

                dwSize=dwMaxSize;      

               

                if(g_Buffer[loop1]==0)

                {

jump:;

                        hr=FindMatching(loop1,loop2,dwSize,g_dwOldSize,g_dwNewSize,&dwSize,&dwAdd);

                        switch(hr)

                        {

                        case HR_TOOFAR2:

                                loop2++;

                                goto jump;

                                break;

                        case HR_TOOFAR:

                                loop2=0;

                                break;

                        case HR_OVERRANGE:

                                loop2=0;

                                break;         

                        case HR_ALREADYCHECKED:

                                loop2=0;

                                break;

                        case HR_UNMATCH:                               

                                loop2++;                       

                                goto jump;

                                break;

                        case HR_MATCH:                 

                                ChildBlock[dwBlock].dwOldAddress=loop2;

                                ChildBlock[dwBlock].dwNewAddress=loop1;

                                ChildBlock[dwBlock].dwSize=dwSize;

                                FillBuffer(ChildBlock[dwBlock].dwNewAddress,ChildBlock[dwBlock].dwOldAddress,ChildBlock[dwBlock].dwSize);

                                dwBlock++;     

                                loop2=loop1;

                                break;

               

                        case HR_SIZETOOBIG:    

                                loop2=0;

                                break;                 

                        }

                }

        }

 

        // 堦抳僽儘僢僋傪惉宍偡傞乮廳側偭偰傞暔偱僽儘僢僋奐巒揰偑愭偵偁傞傕偺傪巆偡乯

        printf("\n****************埑弅張棟拞***********************\n");

        temp=1;

        while(temp==1)

        {

                temp=0;

                for(loop1=0;loop1<dwBlock;loop1++)

                {

                        for(loop2=0;loop2<dwBlock;loop2++)

                        {

                                if(loop1 == loop2) continue;

 

                                if((ChildBlock[loop1].bFlag!=ERACE) && (ChildBlock[loop2].bFlag!=ERACE)

                                        && (ChildBlock[loop1].dwNewAddress<=ChildBlock[loop2].dwNewAddress)

                                        && ((ChildBlock[loop1].dwNewAddress+ChildBlock[loop1].dwSize)>=ChildBlock[loop2].dwNewAddress))

                                {

                                        if((ChildBlock[loop2].dwNewAddress-ChildBlock[loop1].dwNewAddress)

                                                ==(ChildBlock[loop2].dwOldAddress-ChildBlock[loop1].dwOldAddress))// 媧廂偡傞偲偒偼媧廂偝傟傞懁偺OldAddress偑楢懕惈偑偁傞昁梫偑偁傞乮楢懕偟偰側偄壜擻惈偑偁傞偺偱乯

                                        {

                                                temp=1;

                                                ChildBlock[loop2].bFlag=ERACE;

                                                ChildBlock[loop1].dwSize=

                                                        (ChildBlock[loop2].dwNewAddress+ChildBlock[loop2].dwSize)-ChildBlock[loop1].dwNewAddress;

                                        }

                                }                      

                        }              

                }

        }      

 

        printf("\n埑弅慜偺僽儘僢僋悢亖%d\n",dwBlock);

 

        temp=1;

        while(temp==1)

        {

                temp=0;

                for(loop1=0;loop1<dwBlock;loop1++)

                {

                        if(ChildBlock[loop1].bFlag==ERACE)

                        {

                                temp=1;

                                ExchangeBlock(loop1,dwBlock-1);

                                dwBlock--;

                        }

                }

        }

 

        printf("\n埑弅屻偺僽儘僢僋悢亖%d\n",dwBlock);

 

        dwTemp=0;

        for(loop1=0;loop1<g_dwNewSize;loop1++)

        {

                if(g_Buffer[loop1]==1) dwTemp++;

        }

        printf("\n堦抳棪丗%3.2f %%\n",((double)dwTemp/(double)g_dwNewSize)*100);

 

 

        // spt僼傽僀儖傪嶌惉偡傞

        // (弌椡儌僕儏乕儖偺偨傔偺堦抳僨乕僞晹暘偼屆偄儌僕儏乕儖偐傜傕偭偰偔傞)

        //乮拲堄乯乭偙偙偱彂偒崬傫偩弴斣乭偱丄僷僢僠僾儘僌儔儉嶌惉懁偱撉傒崬傓偙偲丅

 

        _chdir(dir);//僾儘僌儔儉偑偳偙偵偁傠偆偲丄spt僼傽僀儖偼僾儘僕僃僋僩僼僅儖僟偵弌椡偡傞丅乮揔媂曄峏偡傞偙偲乯

        FILE *fp; 

        fp=fopen("PatchData.spt","wb");

        if(fp==NULL) return FALSE;

        fwrite(&g_dwNewSize,sizeof(DWORD),1,fp);// 怴儌僕儏乕儖僒僀僘

        fwrite(&dwBlock,sizeof(DWORD),1,fp);// 堦抳僽儘僢僋悢

        for(loop1=0;loop1<dwBlock;loop1++)

        {

                fwrite(&ChildBlock[loop1],sizeof(BLOCK),1,fp);

        }

 

        g_dwUnmatchSize=0;

        for(loop1=0;loop1<g_dwNewSize;loop1++)

        {

                if(g_Buffer[loop1]==0)

                {

                        g_dwUnmatchSize++;

                }

        }

        fwrite(&g_dwUnmatchSize,sizeof(DWORD),1,fp);

 

        for(loop1=0;loop1<g_dwNewSize;loop1++)

        {

                if(g_Buffer[loop1]==0)

                {

                        fwrite(&g_bNewData[loop1],1,1,fp);

                }

        }

 

        fclose(fp);

 

        return TRUE;

}

 

FindMatching娭悢

HRESULT FindMatching(DWORD StartNew,DWORD StartOld,DWORD dwSize,DWORD dwOldSize

                                         ,DWORD dwNewSize,DWORD *Size,DWORD *dwAdd)

{

        DWORD loop1,loop2;

        DWORD temp;

 

        if((StartNew<StartOld) && ((StartOld-StartNew)>(g_dwNewSize/10))) return HR_TOOFAR;

        if((StartNew>StartOld) && ((StartNew-StartOld)>(g_dwNewSize/10))) return HR_TOOFAR2;

 

        if(StartOld>=g_dwOldSize) return HR_OVERRANGE;

        if(StartNew>=g_dwNewSize) return HR_OVERRANGE;

        if(StartNew+dwSize>=g_dwNewSize)

        {

                return HR_SIZETOOBIG;

        }

        if(StartOld+dwSize>=g_dwOldSize)

        {

                return HR_SIZETOOBIG;

        }

 

        loop2=StartOld;

 

        temp=0;

        for(loop1=StartNew;loop1<StartNew+dwSize;loop1++)

        {              

                if((g_bNewData[loop1]!=g_bOldData[loop2]) || (g_OldBuffer[loop2]==1))

                {

                        if(temp<dwMinSize)

                        {

                                *dwAdd=temp;

                                return HR_UNMATCH;

                        }

                        else

                        {                              

                                *Size=temp;

                                return HR_MATCH;

                        }

                }              

                loop2++;

                temp++;

        }

        return HR_MATCH;

}

 

CreateData娭悢偼丄幚峴懍搙偵偮偄偰夵慞偺梋抧偑偁傞偱偟傚偆丅4儊僈僶僀僩掱搙偺僾儘僌儔儉娫偱偺嵎暘僨乕僞傪嶌惉偡傞偺偵1,2帪娫偼偐偐傝傑偡丅

僷僢僠僨乕僞偺嶌惉偵偐偐傞帪娫偼僄儞僪儐乕僓乕偵偼柍娭學偱偁傞偺偱丄椡媄偱僐乕僨傿儞僌偟偨偺偑棟桼偱偡丅傑偨丄僷僢僠偺嶌惉嶌嬈偲偄偆傕偺偑丄偦偆偦偆壗夞傕峴偆傕偺偱偼側偄偲偄偆偺傕椡媄偱椙偐偭偨棟桼偱傕偁傝傑偡丅

偨偩丄乬僜乕僗偺尒堈偝乭偼傓偟傠椡媄偺傎偆偑桪傟偰偄傑偡丅傕偭偲傕5擭慜偵僐乕僨傿儞僌偟偰偄傞偲偒偵偼杮偱夝愢偡傞側偳偲偼巚偭偰偄側偐偭偨偺偱偡偑乧

偪傚偆偳杮彂偱偼丄僜乕僩傗僷僞乕儞儅僢僠儞僌偵偍偄偰怓乆側傾儖僑儕僘儉傪夝愢偟偰偄傞偺偱丄偦傟傜偺僥僋僯僢僋傪嬱巊偟偰崅懍壔偡傞偺傕桳堄媊偐偲巚偄傑偡丅

偦偺巇帠偼撉幰偵擟偣傑偡丅婃挘偭偰崅懍壔偑弌棃偨傜惀旕嫵偊偰偔偩偝偄丅

ms@kamaada7.com

www.kamada7.com

傕偪傠傫丄僜乕僗傪尒偣偰偔偩偝偄偲偼尵偄傑偣傫丅乽偙偙傑偱崅懍壔偟偨傛両乿偲偩偗嫵偊偰傕傜偊傟偽偦傟偩偗偱婐偟偄偱偡丅

 

僷僢僠僾儘僌儔儉偺嶌惉

尨棟偱傕弎傋偨傛偆偵丄僷僢僠僾儘僌儔儉杮懱偺傎偆偼丄戝偟偨偙偲偁傝傑偣傫丅婡夿揑偵僨乕僞傪楢寢偡傞偩偗偱偡丅

億僀儞僩偼OpenResource()娭悢偲CreateModule()娭悢偱偡丅

struct BLOCK

{

        BYTE bFlag;

        DWORD dwNewAddress;

        DWORD dwOldAddress;

        DWORD dwSize;

};

僽儘僢僋峔憿懱偺掕媊偼丄嵎暘僨乕僞嶌惉懁偲慡偔摨堦偱側偗傟偽側傝傑偣傫丅偦偆偱側偄偲撉傒崬傒偺嵺偵僶僀僩偑僘儗偰梊婜偟側偄寢壥偵側傝傑偡丅

 

OpenResource()娭悢偼儕僜乕僗偮傑傝嵎暘僨乕僞傪奐偒丄偦偺僨乕僞傪慡偰僌儘乕僶儖曄悢偵奿擺偡傞偺偑巇帠偱偡丅

偦偟偰CreateModule()偼偦傟傜偺僌儘乕僶儖曄悢傪傕偲偵怴儌僕儏乕儖傪惗惉偟傑偡丅

BOOL OpenResource()

{

        HRSRC hrs=NULL;

        HGLOBAL hg=NULL;

        BYTE *p_res=NULL;

        FILE *fp;

        DWORD loop1,loop2;

 

        hrs=FindResource(NULL,"PATCH","SPT");

        if(!hrs)

        {

                printf("\n儕僜乕僗偑尒偮偐傝傑偣傫偱偟偨丅\n");

                return FALSE;

        }

        hg=LoadResource(NULL,hrs);

        if(!hg)

        {

                printf("\n儕僜乕僗傪撉傒崬傔傑偣傫偱偟偨丅\n");

                return FALSE;

        }

 

        DWORD dwResSize=SizeofResource(NULL,hrs);

 

        p_res=(BYTE*)LockResource(hg);

        if(!p_res)

        {

                printf("\n儕僜乕僗傪儘僢僋偱偒傑偣傫偱偟偨丅\n");

                return FALSE;

        }      

 

        //僼傽僀儖僒僀僘傪僨乕僞(spt)偐傜庢摼

        memcpy(&g_dwNewSize,p_res,sizeof(DWORD));

        p_res+=sizeof(DWORD);

        //僼傽僀儖僒僀僘暘偺儊儌儕妋曐

        g_bBuffer=new BYTE[g_dwNewSize];

        g_bNewData=new BYTE[g_dwNewSize];

        g_bOldData=new BYTE[g_dwNewSize];

 

        ZeroMemory(g_bBuffer,g_dwNewSize);

        ZeroMemory(g_bNewData,g_dwNewSize);

        ZeroMemory(g_bOldData,g_dwNewSize);

        //堦抳悢乮僽儘僢僋悢乯傪(spt)偐傜庢摼       

        memcpy(&g_dwNumMatch,p_res,sizeof(DWORD));

        p_res+=sizeof(DWORD);

        //僽儘僢僋偺儊儌儕妋曐

        Block=new BLOCK[g_dwNumMatch];

        //僽儘僢僋偺撉傒崬傒

        for(loop1=0;loop1<g_dwNumMatch;loop1++)

        {

                memcpy(&Block[loop1],p_res,sizeof(BLOCK));

                p_res+=sizeof(BLOCK);

        }      

        //晄堦抳僒僀僘傪僨乕僞(spt)偐傜庢摼

        memcpy(&g_dwUnmatchSize,p_res,sizeof(DWORD));

        p_res+=sizeof(DWORD);

        //晄堦抳僒僀僘暘偺儊儌儕妋曐

        g_bUnmatchData=new BYTE[g_dwUnmatchSize];

        //晄堦抳晹暘偺僨乕僞傪撉傒崬傓

        for(loop1=0;loop1<g_dwUnmatchSize;loop1++)

        {

                memcpy(&g_bUnmatchData[loop1],p_res,sizeof(BYTE));

                p_res+=sizeof(BYTE);

        }

       

        for(loop1=0;loop1<g_dwNumMatch;loop1++)

        {

                for(loop2=Block[loop1].dwNewAddress;loop2<Block[loop1].dwNewAddress+Block[loop1].dwSize;loop2++)

                {      

                        g_bBuffer[loop2]=1;

                }      

        }

       

 

        return TRUE;

}

 

BOOL CreateModule()

{

        DWORD loop1,loop2;     

        DWORD temp;

        FILE *fp;

 

        for(loop1=0;loop1<g_dwNumMatch;loop1++) // 堦抳晹暘偵偮偄偰丄媽儌僕儏乕儖偐傜僨乕僞傪摼傞

        {

                temp=Block[loop1].dwNewAddress;

                for(loop2=Block[loop1].dwOldAddress;loop2<Block[loop1].dwOldAddress+Block[loop1].dwSize;loop2++)

                {      

                        g_bNewData[temp]=g_bOldData[loop2];

                        temp++;

                }

        }

 

        loop2=0;

        for(loop1=0;loop1<g_dwNewSize;loop1++) // 晄堦抳晹暘偵偮偄偰丄spt僼傽僀儖偐傜僨乕僞傪撉傒崬傓

        {

                if(g_bBuffer[loop1]==0)

                {

                        g_bNewData[loop1]=g_bUnmatchData[loop2];

                        loop2++;

                }      

        }

 

        _chdir(dir);

        fp=fopen(g_szFileName,"wb");

       

        if(fp==NULL)

        {

                return FALSE;

        }

        fwrite(g_bNewData,g_dwNewSize,1,fp);

       

        fclose(fp);

 

        return TRUE;

}

 

13復丂偦偺懠Tips

13-1丂傾僗僉乕偲儚僀僪暥帤偺敾暿

13-1

13-2

僒儞僾儖僾儘僕僃僋僩柤丂ch13 偦偺懠丂敿妏偲慡妏偺崿嵼

 

ANSI暥帤乮ASCII暥帤偲傕屇偽傟傞乯偼丄7價僢僩僐乕僪偱昞尰偝傟傞暥帤偱偡丅偄傢備傞乬敿妏暥帤乭偲巚偭偰傕峔偄傑偣傫丅僐乕僪偼偨偭偨7價僢僩側偺偱庢傝摼傞抣偼0偐傜127傑偱偱偡偑丄32斣偐傜126斣傑偱偑塸悢帤丒婰崋傪娷傓壜帇偱偒傞暥帤偱丄偦傟埲奜偼惂屼暥帤偲尵偭偰丄偨偄偰偄偼乬崟偄巐妏乭側偳偲偟偰偟偐尒偊傑偣傫丅

ANSI暥帤僐乕僪偺僉儍僷僔僥傿偱偼傕偪傠傫擔杮岅偺傛偆偵朿戝側庬椶偺暥帤偼昞偣側偄偺偱丄擔杮岅偼乮弶婜偺崰乯JIS擔杮岅僐乕僪偵傛傝昞尰偝傟傑偟偨丅

JIS擔杮岅僐乕僪偼丄敿妏偲慡妏偺崿嵼傪2僶僀僩偺乬奐巒僐乕僪乭偲2僶僀僩偺乬廔椆僐乕僪乭偵傛傝敾暿偟傑偡丅偟偐偟丄偦偺曽朄偩偲嵟埆堦偮偺擔杮岅暥帤偵懳偟6僶僀僩傕梫偟偰偟傑偄傑偡丅

偦偙偱怴偨偵峫偊弌偝傟偨偺偑乬僔僼僩JIS擔杮岅僐乕僪乭偱偡丅僔僼僩JIS偼敿妏暥帤偵偼1僶僀僩丄慡妏暥帤偵偼2僶僀僩偟偐梫偟傑偣傫丅偟偐傕丄奐巒丄廔椆僐乕僪側偳柍偔偲傕敿妏偲慡妏偑崿嵼偟偰偄偰傕敾暿偱偒傑偡丅

偦偺巇慻傒偼偳偆側偭偰偄傞偺偱偟傚偆丠

敿妏偺応崌偼丄偦偺傑傑昞帵偟傑偡丅偙傟偼偄偄偱偟傚偆丅

偦偟偰慡妏暥帤偵偼丄愭摢1僶僀僩偑128埲忋偺抣偵側傞偺偱丄偦傟偵傛傝慡妏偱偁傞偙偲偑敾抐偱偒傑偡丅

敿妏偼128埲忋偱偁傞昁梫偑側偄丄128埲忋偺抣偵偼側傝摼側偄偺偱偙偺傛偆側敾暿偑壜擻偵側傝傑偡丅

13-3

 

僜乕僗偼旕忢偵抁偔丄偨偭偨偙傟偩偗偱偡丅

VOID main()

{

        BYTE c[3]={0};

 

        FILE* fp=fopen("Text.txt","rt");

 

        if(fp != NULL)

        {

                while(!feof(fp) )

                {                      

                        fread(&c[0],1,1,fp);                   

                        if(c[0]>=128)仼偙偙偩偗偑億僀儞僩両

                        {                              

                                fread(&c[1],1,1,fp);           

                                printf("%s",c);        

                        }

                        else

                        {

                                printf("%c",c[0]);

                        }                      

                }              

                fclose(fp);

        }      

}

1僶僀僩偑128埲忋偱偁傞側傜擔杮岅側偺偱2僶僀僩撉傒崬傒丄偦傟埲奜偱偁傟偽ANSI偲偄偆偙偲側偺偱1僶僀僩偟偐撉傒崬傒傑偣傫丅

側偍丄MS-DOS傗僂傿儞僪僂僘偼僔僼僩JIS僐乕僪傪嵦梡偟偰偄傑偡偑丄UNIX宯偼EUC僐乕僪傪嵦梡偟偰偄傑偡丅EUC僐乕僪偺応崌丄愭摢僶僀僩偼0xA1161乯埲忋偵側傝傑偡丅

 

13-2丂嵤搙傪壓偘傞

13-4丂捠忢乮僇儔乕乯

 

13-5丂敀崟偵乮巻柺偱敾傞偐側丠乯

僒儞僾儖僾儘僕僃僋僩柤丂ch13 偦偺懠丂嵤搙傪棊偲偡

 

嵤搙偼丄堦斒揑偵師偺岞幃偵傛傝媮傔傑偡丅

 

嵤搙=0.299*R+0.587*G+0.114*B;

R,G,BRGB奺惉暘乯

 

偙偺傛偆偵RGB惉暘傪嬒摍偵憹尭偝偣傞偲偄偆傢偗偱偼側偄偙偲偵拲堄偟偰偔偩偝偄丅

 

僒儞僾儖偱偼Direct3D偺僺僋僙儖僔僃乕僟乕傪巊梡偟偰丄儊僢僔儏偺嵤搙傪棊偲偟偰偄傑偡丅

擮偺偨傔僐乕僪傪宖嵹偟傑偡偑丄億僀儞僩偼僔僃乕僟乕僐乕僪撪丄師偺晹暘偩偗偱偡丅

float Y=0.299*R+0.587*G+0.114*B;

 

ChromaShader.fx

///////////////////////////////////////////////////////////////////////////////////

//宆掕媊

///////////////////////////////////////////////////////////////////////////////////

struct VS_OUT

{

    float4 Position : POSITION;

    float3 Light : TEXCOORD0;

    float3 Normal : TEXCOORD1;

    float3 View : TEXCOORD2;

};

///////////////////////////////////////////////////////////////////////////////////

//僌儘乕僶儖

///////////////////////////////////////////////////////////////////////////////////

float4 Color;

float Chroma;

texture Tex;

 

float4x4 matWVP;

float4x4 matWorld;

float4 vecLightDir;

float4 vecEye;

float4 Diffuse={0,0,0,0};

 

 

sampler Sampler = sampler_state

{      

        Texture = (Tex);

        MinFilter = LINEAR;

    MagFilter = LINEAR;

    MipFilter = NONE;

    AddressU = Clamp;

    AddressV = Clamp;

};

///////////////////////////////////////////////////////////////////////////////////

//僶乕僥僢僋僗丒僔僃乕僟乕

///////////////////////////////////////////////////////////////////////////////////

VS_OUT VS(float4 Pos : POSITION, float3 Normal : NORMAL)

{

    VS_OUT Out = (VS_OUT)0;

    Out.Position = mul(Pos, matWVP);

    Out.Light = vecLightDir;          

    float3 PosWorld = normalize(mul(Pos, matWorld));

    Out.View = vecEye - PosWorld;     

    Out.Normal = mul(Normal, matWorld);

 

        return Out;

}

///////////////////////////////////////////////////////////////////////////////////

//僺僋僙儖丒僔僃乕僟乕

///////////////////////////////////////////////////////////////////////////////////

float4 PS(VS_OUT In,float4 Col : COLOR,float2 TexCoord : TEXCOORD) : COLOR

{

        float3 Normal = normalize(In.Normal);

    float3 LightDir = normalize(In.Light);

    float3 ViewDir = normalize(In.View);

    float4 NL = saturate(dot(Normal, LightDir));

   

    float3 Reflect = normalize(2 * NL * Normal - LightDir); //斀幩儀僋僩儖偺岞幃捠傝

    float4 specular = pow(saturate(dot(Reflect, ViewDir)), 4);

   

   

        float4 Color=tex2D(Sampler,TexCoord );

       

        float R=Color.r;

       float G=Color.g;

       float B=Color.b;

 

       float Y=0.299*R+0.587*G+0.114*B;

       

        float4 TexTerm;

        float4 PhongTerm;

        float4 FinalColor;

       

        TexTerm.r=R+ (Y-R) * ((100-Chroma)/100);

        TexTerm.g=G+ (Y-G) * ((100-Chroma)/100);

        TexTerm.b=B+ (Y-B) * ((100-Chroma)/100);       

        TexTerm.a=1;

       

        PhongTerm=Diffuse * NL + specular;

 

        FinalColor=TexTerm + PhongTerm;

       

        return FinalColor;     

}

///////////////////////////////////////////////////////////////////////////////////

// 僥僋僯僢僋

///////////////////////////////////////////////////////////////////////////////////

technique tecChroma

{

    pass p0

    {  

        PixelShader  = compile ps_2_0 PS();

    }

}

側偍僶乕僥僢僋僗僔僃乕僟乕偼堦墳幚憰偼偟偰偄傑偡偑丄幚嵺偵偼巊梡偟偰偄傑偣傫丅

 

Main.cpp

        //嵤搙偺曄峏

        pEffect->SetTechnique("tecChroma");

        pEffect->Begin( NULL, 0 );     

 

        pEffect->SetFloat("Chroma",Chroma);

        //儚乕儖僪丒價儏乕丒僾儘僕僃僋僔儑儞峴楍傪搉偡

        D3DXMATRIX mW,mV,mP;

        mW=pThing->matWorld;

        pDevice->GetTransform(D3DTS_VIEW,&mV);

        pDevice->GetTransform(D3DTS_VIEW,&mV);

       

        pEffect->SetMatrix("matWVP",(D3DXMATRIX*)&(mW*mV*mP)); 

        //儚乕儖僪峴楍傪搉偡                             

        pEffect->SetMatrix("matWorld",&mW);

        //儔僀僩偺曽岦儀僋僩儖傪搉偡 亙曐棷亜惓妋偵偼丄幚嵺偵巊梡偟偰偄傞儔僀僩偺埵抲傪偄傟傞偙偲

        pEffect->SetVector("vecLightDir",&D3DXVECTOR4(-1,-1,-1,0));

        //帇揰埵抲乮僇儊儔埵抲乯傪搉偡

        pEffect->SetVector("vecEye",(D3DXVECTOR4*)&D3DXVECTOR4(g_fCameraX,g_fCameraY,g_fCameraZ,0));   

         // 儗儞僟儕儞僌

         for( DWORD i=0; i<pThing->dwNumMaterials; i++ )

     {

                 pEffect->SetFloatArray("Diffuse", (FLOAT*)&pThing->pMeshMaterials[i] .Diffuse,3);                     

                 pEffect->SetTexture("Tex",pThing->pMeshTextures[i]);          

                 pEffect->BeginPass(0);

                 pThing->pMesh->DrawSubset( i );

                 pEffect->EndPass();

         }                            

         pEffect->End();

}

 

 

13-3丂儊儌儕乕儕乕僋

Direct3D僐乕僪傪彂偔偲偒丄乬2偮偺応強偱偺儊儌儕乕儕乕僋乭偵偮偄偰峫偊側偔偰偼側傝傑偣傫丅

堦偮偼丄捠忢偺応強偱偺儊儌儕乕儕乕僋丅偮傑傝傾僾儕働乕僔儑儞撪偱偺僸乕僾妋曐(new)偲奐曻乮delete摍乯傪懳偱揔惓偵峴偭偰偄傞偐偲偄偆偙偲偱偡丅

偙偺儊儌儕乕儕乕僋偼師偺傛偆偵揔摉側応強偵_CrtSetDbgFlag()僐乕僪傪憓擖偟丄僨僶僢僌幚峴偡傟偽専弌偡傞偙偲偑偱偒傑偡丅

INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, INT )

{

        //儊儌儕乕儕乕僋昞帵

        _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

 

椺偊偽丄

DWORD* dwVal=new DWORD[3];

側偳偲偟偨偲偒丄delete  dwVal;傪偟側偄偲丄僨僶僢僌廔椆帪偵弌椡僂傿儞僪僂偼師偺傛偆偵儊儌儕乕儕乕僋傪曬崘偟傑偡丅

13-6

DOWRD3屄側偺偱43=12Byte偑奐曻偝傟偰偄側偄偲偄偆偙偲傪曬崘偟偰偄傑偡丅

 

偦偟偰丄傕偆堦偮偁傝傑偡丅DirectX僒乕僶乕偑偳偙偐偵妋曐偟偨儊儌儕乕偺儕乕僋偱偡丅

摉慠傾僾儕撪偱delete側偳偼弌棃傑偣傫丅偦傕偦傕偄偮妋曐偟偰偄傞偺偐傕乮椙偄堄枴偱乯晄柧偱偡丅

偲偼尵偭偰傕奐曻偟偰傗傞偺偼傾僾儕懁偐傜偺側傫傜偐偺巜椷偵傛傝傑偡丅嬶懱揑偵尵偆偲乬COM僆僽僕僃僋僩偺嶲徠僇僂儞僩傪揔惓偵僛儘乭偵偟偰傗傞偙偲偱偁傝丄傑偨傾僾儕偵偼偦偺愑擟偑偁傝傑偡丅尵偆側傟偽傾僾儕懁偐傜偼娫愙揑偵偟偐俠俷俵僒乕僶乕偺儊儌儕奐曻傪峴偊側偄傢偗偱偡丅

COM僆僽僕僃僋僩偵偼昁偢Release儊僜僢僪偑幚憰偝傟偰偄傑偡丅傾僾儕懁偼嶲徠僇僂儞僩偑僛儘偵側傝傛偆偵Release()儊僜僢僪傪僐乕儖偡傞偙偲偵側傝傑偡丅Release儊僜僢僪傪偁傞掱搙埨慡偵峴偆傛偆偵SAFE_RELEASE()儅僋儘偑掕媊偝傟偰偄傞偺偼椙偔尒偐偗傞偱偟傚偆丅

乮側偍丄COM偺徻嵶偵偮偄偰偼僎乕儉僐乕僨傿儞僌vol.1偱暘偐傝堈偔夝愢偟偰偄傑偡丅乯

 

DirectX僒乕僶乕懁偱偺儊儌儕乕儕乕僋偺専弌偼僐儞僩儘乕儖僷僱儖偱偺愝掕偵埶懚偟傑偡丅

師偺傛偆偵丄Break On MemoryLeak偵僠僃僢僋傪擖傟偰偍偗偽専弌偱偒傑偡丅媡偵尵偆偲偙偺愝掕傪偟偰偄側偄偲儊儌儕乕儕乕僋偑婲偒偰傕暘偐傝傑偣傫丅

13-7

 

 

傾僾儕廔椆帪偵師偺傛偆側儊僢僙乕僕傪弌偟傑偡丅偙偺儊僢僙乕僕偼僨僶僢僌幚峴丄僨僶僢僌柍偟幚峴偵娭傜偢弌偰偔傟傑偡丅

13-8

 

側偍丄DirectX SDK February2006傪僀儞僗僩乕儖偡傞偲僐儞僩儘乕儖僷僱儖偺DireectX傾僀僐儞偑徚偊丄偟偐傕VisualStudi2005忋偱偺愝掕僷僱儖偱傕傎偲傫偳偺僠僃僢僋儃僢僋僗偑慖戰晄壜忬懺偵側偭偰偟傑偆偲偄偆尰徾傪妋擣偟偰偄傑偡丅

December2005埲慜偵SDK偱偼偙偙傛偆側尰徾偼婲偒傑偣傫偺偱丄傕偟崱屻偙偺尰徾偑夝徚偝傟側偄傛偆偱偁傟偽丄December2005埲慜偵SDK傪嵞僀儞僗僩乕儖偟偨傎偆偑偄偄偱偟傚偆丅

 

13-4丂僀儞僗僩乕儔乕乮旘傇捁屻傪戺偝偢両乯

愄偼僀儞僗僩乕儔乕傪帺暘偱嶌惉偡傞昁梫丒堄媊偑偁傝傑偟偨偑丄嵟嬤偱偼VisualStudio偱僂傿儞僪僂僘僀儞僗僩乕儔乕傪娙扨偵嶌惉偡傞偙偲偑弌棃傞偺偱偦傟傪棙梡偡傞偙偲偑懡偄偲巚偄傑偡丅

偨偩丄VisualStudio偱傕姰慡帺摦偱嶌偭偰偔傟傞傢偗偱偼側偄偺偱丄乬僀儞僗僩乕儖乭偲偼偦傕偦傕壗側偺偐丠丂偳偺傛偆側張棟偑偁傞偺偐丠傪戝懱偱傕抦偭偰偄傞偙偲偼戝愗偱偡丅

 

僀儞僗僩乕儖偺庡梫側栚揑偼摉慠僼傽僀儖傪僐僺乕偡傞偙偲偱偡丅尵偆傑偱傕柍偔偙傟偼昁偢峴偄傑偡傛偹丅

偦偟偰丄偦傟埲奜偺愝掕偼僆僾僔儑儞偱偼偁傝傑偡偑丄儐乕僓乕偺棙曋惈偺偨傔偵晛捠偼師偺偙偲傪峴偄傑偡丅

 

儊僨傿傾偐傜僴乕僪僨傿僗僋傊偺僼傽僀儖僐僺乕乮昁恵乯

僗僞乕僩儊僯儏乕偵摉奩傾僾儕偺僄儞僩儕乕傪搊榐

僨僗僋僩僢僾忋偵摉奩傾僾儕傊偺僔儑乕僩僇僢僩傪攝抲

僐儞僩儘乕儖僷僱儖搊榐乮僜僼僩僂僃傾偺捛壛丒嶍彍偵摉奩傾僾儕偺僄儞僩儕乕傪搊榐乯

壗傜偐偺儗僕僗僩儕搊榐乮偦偺懠丄傾僾儕撈帺偺忣曬乯

 

儊僨傿傾偐傜僴乕僪僨傿僗僋傊偺僼傽僀儖僐僺乕偼Win32API CopyFile娭悢偱峴偄丄

僔儑乕僩僇僢僩娭學偼IshellLink僀儞僞乕僼僃僀僗偲IpersistFile僀儞僞乕僼僃僀僗偵傛傝峴偄傑偡丅僔儑乕僩僇僢僩偼僗僞乕僩儊僯儏乕媦傃僨僗僋僩僢僾忋偵攝抲偟傑偡丅乮僨僗僋僩僢僾忋傊偺攝抲偼儐乕僓乕偑慖戰偱偒傞傛偆偵偟傑偡乯

儗僕僗僩儕偺搊榐偼RegSetValueEx娭悢偱峴偄丄摿偵僐儞僩儘乕儖僷僱儖撪偺乽僜僼僩僂僃傾偺捛壛丒嶍彍乿偐傜帺暘偺僎乕儉傪傾儞僀儞僗僩乕儖偱偒傞傛偆偵偡傞偨傔偵丄

RegSetValueEx(hkey,"UninstallString",0,REG_SZ,(CONST BYTE*)str,lstrlen(str));

側偳偲偟偰儗僕僗僩儕愝掕偟傑偡丅