-
[게임알고리즘] 3-3강 링크 리스트[DSU] 게임알고리즘 2026. 3. 22. 12:15728x90
3-2강에서 구현된 링크 리스트를 활용해서,
- 링크 리스트 객체에 몬스터들을 추가하고, 객체가 파괴될때 모든 몬스터가 파괴됨.
- 추가된 몬스터는 2-1강에서 학습한 Sort 구조체로 정렬.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596#include "NodeMgt.h"#include "Sort.h"#include <time.h>struct Monster{char* name;int ap, dp, y;Monster(const char* n){char* t = new char[strlen(n) + 1];strcpy(t, n);name = t;y = rand() % 1080;}virtual ~Monster(){printf("Monster(%s)\n", name);delete name;}virtual void paint(float dt) = 0;};struct Dog : Monster{Dog(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Dog::paint(%d)\n", y);}};struct Cat : Monster{Cat(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Cat::paint(%d)\n", y);}};struct Monkey : Monster{Monkey(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Monkey::paint(%d)\n", y);}};void cbMonster(void* data){Monster* m = (Monster*)data;delete m;};int main() {// loadsrand(time(NULL));Monster** monster = new Monster*[3];monster[0] = new Dog("DSU");monster[1] = new Cat("Me");monster[2] = new Monkey("You");NodeMgt* monsterList = new NodeMgt(cbMonster);for(int i=0; i<3; i++)monsterList->add(monster[i]);Sort s;// loop//for(int i=0; i<monsterList.count; i++)// monsterList->paint(0.0f);for(int i=0; i<monsterList->count; i++){Monster* m = (Monster*)monsterList->at(i);s.add( m, m->y );}s.update();for(int i=0; i<monsterList->count; i++){Monster* m = (Monster*)s.get(i);m->paint(0.0f);}// freedelete monsterList;return 0;}cs 온라인 컴파일에서 바로 실행해볼 수 있는 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349#include <stdio.h>#include <string.h>#include <stdlib.h>#include <time.h>// =================================================// Sort.h// =================================================struct Data {void* data;float y;};struct Sort{Sort(int max = 300);virtual ~Sort();void init();void add(void* data, float y);void* get(int index);void update();Data* data;int num;};// =================================================// NodeMgt.h// =================================================struct Node{void* data;Node* prev;};typedef void (*MethodNodeMgt)(void* data);struct NodeMgt{Node* last;int count;MethodNodeMgt method;NodeMgt(MethodNodeMgt m);virtual ~NodeMgt();void add(void* data);void add(int index, void* data);void del(int index);bool del_(void* data);void del(void* data);void delAll();void* at(int index);};// =================================================// Main.cpp// =================================================struct Monster{char* name;int ap, dp, y;Monster(const char* n){char* t = new char[strlen(n) + 1];strcpy(t, n);name = t;y = rand() % 1080;}virtual ~Monster(){printf("Monster(%s)\n", name);delete name;}virtual void paint(float dt) = 0;};struct Dog : Monster{Dog(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Dog::paint(%d)\n", y);}};struct Cat : Monster{Cat(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Cat::paint(%d)\n", y);}};struct Monkey : Monster{Monkey(const char* n) : Monster(n) { }virtual void paint(float dt){printf("Monkey::paint(%d)\n", y);}};void cbMonster(void* data){Monster* m = (Monster*)data;delete m;};int main() {// loadsrand(time(NULL));Monster** monster = new Monster*[3];monster[0] = new Dog("DSU");monster[1] = new Cat("Me");monster[2] = new Monkey("You");NodeMgt* monsterList = new NodeMgt(cbMonster);for(int i=0; i<3; i++)monsterList->add(monster[i]);Sort s;// loop//for(int i=0; i<monsterList.count; i++)// monsterList->paint(0.0f);for(int i=0; i<monsterList->count; i++){Monster* m = (Monster*)monsterList->at(i);s.add( m, m->y );}s.update();for(int i=0; i<monsterList->count; i++){Monster* m = (Monster*)s.get(i);m->paint(0.0f);}// freedelete monsterList;return 0;}// =================================================// Sort.cpp// =================================================Sort::Sort(int max){data = new Data[max];num = 0;}Sort::~Sort(){delete data;}void Sort::init(){num = 0;}void Sort::add(void* data_, float y){Data* d = &data[num];num++;d->data = data_;d->y = y;}void* Sort::get(int index){return data[index].data;}void Sort::update(){int k = num-1;for(int i=0; i<k; i++){for(int j=1+i; j<num; j++){if( data[i].y > data[j].y ){Data t = data[i];data[i] = data[j];data[j] = t;}}}}// =================================================// NodeMgt.cpp// =================================================NodeMgt::NodeMgt(MethodNodeMgt m){last = NULL;count = 0;method = m;}NodeMgt::~NodeMgt(){delAll();}void NodeMgt::add(void* data){Node* n = new Node;n->data = data;n->prev = last;last = n;count++;}void NodeMgt::add(int index, void* data){int i = count - 1;if( index==i ){add(data);return;}for(Node* p = last; p; p = p->prev, i--){if(i==index){Node* n = new Node;n->data = data;n->prev = p->prev;p->prev = n;count++;return;}}printf("failed to insert node\n");}void NodeMgt::del(int index){int i = count - 1;for(Node* p = last,* back = NULL; p;back = p, p = p->prev, i--){if(i==index){if( back )back->prev = p->prev;else// if( last==NULL )last = p->prev;if( method )method(p->data);delete p;count--;return;}}}#if 0bool NodeMgt::del_(void* data){for(Node* p = last, * back = NULL; p;back = p, p = p->prev){if( p->data==data ){if( back )back->prev = p->prev;elselast = p->prev;if( method )method(p->data);delete p;count--;return true;}}return false;}void NodeMgt::del(void* data){while(del_(data));}#elsevoid NodeMgt::del(void* data){for(Node* p = last, * back = NULL; p;)//back = p, p = p->prev){if( p->data==data ){if( back )back->prev = p->prev;elselast = p->prev;//back = back;// 000Node* bk = p->prev;// 111if( method )method(p->data);delete p;p = bk;count--;}else{back = p;// 000p = p->prev;// 111}}}#endifvoid NodeMgt::delAll(){for(Node* p = last; p; ){Node* bk = p->prev;if( method )method(p->data);delete p;p = bk;}last = NULL;count = 0;}void* NodeMgt::at(int index){int i = count - 1;for(Node* p = last; p; p = p->prev, i--){if( i==index )return p->data;}return NULL;}cs 
매일매일 열심히 게임 개발하고 있습니다 '[DSU] 게임알고리즘' 카테고리의 다른 글
[게임알고리즘] 4-2강 링크 리스트 (0) 2026.03.27 [게임알고리즘] 4-1강 링크리스트 (0) 2026.03.27 [게임알고리즘] 3-2강 링크 리스트 (0) 2026.03.22 [게임알고리즘] 3-1강 링크 리스트 (0) 2026.03.22 [게임알고리즘] 2-2강 정렬 실습 예제 (0) 2026.03.13

