'2014/01'에 해당되는 글 185건
- 2014.01.14 [런게임] 유니티 3D로 러너 게임 만들기 - GUI 설정
- 2014.01.14 [런게임] 유니티 3D로 러너 게임 만들기 - 파워업!
- 2014.01.14 [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기
- 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버
- 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작
- 2014.01.13 프로그래머를 위한 책
- 2014.01.13 Code Complete
- 2014.01.13 게임프로그래머를 위한 자료구조와 알고리즘
- 2014.01.13 Introduction to Algorithms
- 2014.01.13 [펌][자료구조] 연결리스트 (Linked List) - 개념과 구현
GUI 설정
부스터 아이템 작업을 완료 했습니다. 하지만 부스터 아이템을 몇개 가지고 있는지 알수있는 방법은 플레이어가 그것을 기억하는수 밖에 없습니다. 이 방법을 개선하려면 GUI를 통해서 화면에 표시하는 방법이 있습니다. 아이템 개수 뿐만아니라 얼마나 이동했는지 또한 표시할수있씁니다.
GUIText를 생성하고 GUI의 자식으로 둡니다. 위치는 (0.01, 0.99, 0), Anchor 는 upper left, font size 20 그리고 normal style로 설정하니다. 이름은 Boosts Text입니다..
Distance Text도 생성합니다. 위치는 (0.5, 0.99, 0), font size 30 그리고 bold style.Anchor 는upper center.
GUIManager 에 두개의 변수를 선언하고 할당합니다.
public GUIText boostsText, distanceText, gameOverText, instructionsText, runnerText;

GUIManager 를 수정할수 있게 스테틱 변수와 함수들을 만듭니다. 아래와 같이 스테틱 함수를 만들면 어디서든 접근이 가능합니다. private static GUIManager instance;
void Start () {
instance = this;
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
gameOverText.enabled = false;
}
public static void SetBoosts(int boosts){
instance.boostsText.text = boosts.ToString();
}
public static void SetDistance(float distance){
instance.distanceText.text = distance.ToString("f0");
}Runner 에서 위에 함수를 호출해서 값들을 변경해줍니다. void Update () {
if(Input.GetButtonDown("Jump")){
if(touchingPlatform){
rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
touchingPlatform = false;
}
else if(boosts > 0){
rigidbody.AddForce(boostVelocity, ForceMode.VelocityChange);
boosts -= 1;
GUIManager.SetBoosts(boosts);
}
}
distanceTraveled = transform.localPosition.x;
GUIManager.SetDistance(distanceTraveled);
if(transform.localPosition.y < gameOverY){
GameEventManager.TriggerGameOver();
}
}
private void GameStart () {
boosts = 0;
GUIManager.SetBoosts(boosts);
distanceTraveled = 0f;
GUIManager.SetDistance(distanceTraveled);
transform.localPosition = startPosition;
renderer.enabled = true;
rigidbody.isKinematic = false;
enabled = true;
}
public static void AddBoost(){
boosts += 1;
GUIManager.SetBoosts(boosts);
}
'유니티 > 스크립트' 카테고리의 다른 글
| [런게임] 유니티 3D로 러너 게임 만들기 - 완성본 (0) | 2014.01.14 |
|---|---|
| [런게임] 유니티 3D로 러너 게임 만들기 - 파티클 이펙트 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 설정 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 파워업! (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버 (0) | 2014.01.13 |
파워업
공중 부스터를 가능하게하는 파워업 아이템을 만들어보자. 우리는 랜덤하게 회전하는 큐브를 길 위에 생성할수 있습니다. 우리는 한가지의 부스터 큐브를 사용할것이며 이것은 재사용 됩니다.
Booster 폴더를 만듭니다. Booster Mat 이름의 material 생성합니다 . 우리는 메트리얼 쉐이더를 Specular shader 로 설정하고, Main Color은 녹색 (0, 255, 0) 으로 설정합니다 그리고 specular color 색상은 하얀색으로 설정합니다.
cube를 생성하고, 이름은Booster로 그리고 scale은 각각 0.5로 설정합니다. 충돌하기 쉽게 콜라이더의 크기는 1.5로 설정합니다.
콜라이더의 Is Trigger field에 체크합니다. 왜냐하면 Runner이 충돌에 영향을 받지 않아야 되기 때문입니다.(IS Trigger 체크시 통과됨)

using UnityEngine; public class Booster : MonoBehaviour { public Vector3 offset, rotationVelocity; public float recycleOffset, spawnChance; }

SpawnIfAvailable 메서드를 Booster 에 추가합니다. 부스터 아이템을 배치하려면 길의 좌표가 필요합니다. 일단은 비워 두겠습니다.public void SpawnIfAvailable(Vector3 position){ }
PlatformManager 에 Booster를 할당할수 있도록 변수를 선언합니다. Recycle 메서드에서 PlaceIfAvailable 메서드를 호출합니다. public Booster booster;
private void Recycle () {
Vector3 scale = new Vector3(
Random.Range(minSize.x, maxSize.x),
Random.Range(minSize.y, maxSize.y),
Random.Range(minSize.z, maxSize.z));
Vector3 position = nextPosition;
position.x += scale.x * 0.5f;
position.y += scale.y * 0.5f;
booster.SpawnIfAvailable(position);
Transform o = objectQueue.Dequeue();
o.localScale = scale;
o.localPosition = position;
int materialIndex = Random.Range(0, materials.Length);
o.renderer.material = materials[materialIndex];
o.collider.material = physicMaterials[materialIndex];
objectQueue.Enqueue(o);
nextPosition += new Vector3(
Random.Range(minGap.x, maxGap.x) + scale.x,
Random.Range(minGap.y, maxGap.y),
Random.Range(minGap.z, maxGap.z));
if(nextPosition.y < minY){
nextPosition.y = minY + maxGap.y;
}
else if(nextPosition.y > maxY){
nextPosition.y = maxY - maxGap.y;
}
}
SpawnIfAvailable 메서드에서 위치를 설정하고 활성화 시켜줍니다. 그리고 게임오버인 경우에는 비활성화 시켜주고 함수가 호출되기 전에도 비활성화를 시켜줍니다. void Start () {
GameEventManager.GameOver += GameOver;
gameObject.SetActive(false);
}
public void SpawnIfAvailable (Vector3 position) {
if(gameObject.activeSelf || spawnChance <= Random.Range(0f, 100f)) {
return;
}
transform.localPosition = position + offset;
gameObject.SetActive(true);
}
private void GameOver () {
gameObject.SetActive(false);
}Update 메서드에서는 부스터 아이템을 회전 시키며, 일정 위치를 넘어갔을시에는 부스터 아이템을 비활성화 시켜줍니다. void Update () {
if(transform.localPosition.x + recycleOffset < Runner.distanceTraveled){
gameObject.SetActive(false);
return;
}
transform.Rotate(rotationVelocity * Time.deltaTime);
}
OnTriggerEnter 을 Booster에 더합니다. 이 메서드는 콜라이더가 충돌될때 호출됩니다. 현재 부스터 아이템과 부딪힐수있는건 Runner밖에 없기 때문에 다른 처리는 해주지 않습니다. Runner 에 스테틱 메서드인 AddBoost 을 만들어 주고 이것을 사용하겠습니다. void OnTriggerEnter () {
Runner.AddBoost();
gameObject.SetActive(false);
}AddBoost 를 메서드를 만들어 줍니다. private static int boosts;
private void GameStart () {
boosts = 0;
distanceTraveled = 0f;
transform.localPosition = startPosition;
renderer.enabled = true;
rigidbody.isKinematic = false;
enabled = true;
}
public static void AddBoost () {
boosts += 1;
}public Vector3 boostVelocity, jumpVelocity; void Update () { if(Input.GetButtonDown("Jump")){ if(touchingPlatform){ rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange); touchingPlatform = false; } else if(boosts > 0){ rigidbody.AddForce(boostVelocity, ForceMode.VelocityChange); boosts -= 1; } } distanceTraveled = transform.localPosition.x; if(transform.localPosition.y < gameOverY){ GameEventManager.TriggerGameOver(); } }

'유니티 > 스크립트' 카테고리의 다른 글
| [런게임] 유니티 3D로 러너 게임 만들기 - 파티클 이펙트 (0) | 2014.01.14 |
|---|---|
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 설정 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 파워업! (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작 (0) | 2014.01.13 |
이벤트 사용하기
우리의 게임이벤트는 제대로 동작한다, 이제 Runner를 고려할 시간입니다..
우리는 Runner 가 게임 시작전에는 안보이길 원합니다. 그리고 중력의 영향을 받지 않길 원하니다. 우리는 Start 메서드에서 이벤트를 설정하고, 각각의 함수에서 값들을 조정합니다.
아래는 Runner 스크립트 입니다.
private Vector3 startPosition; void Start () { GameEventManager.GameStart += GameStart; GameEventManager.GameOver += GameOver; startPosition = transform.localPosition; renderer.enabled = false; rigidbody.isKinematic = true; enabled = false; } private void GameStart () { distanceTraveled = 0f; transform.localPosition = startPosition; renderer.enabled = true; rigidbody.isKinematic = false; enabled = true; } private void GameOver () { renderer.enabled = false; rigidbody.isKinematic = true; enabled = false; }
PlatformManager 도 마찬가지로 수정합니다.
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
objectQueue = new Queue<Transform>(numberOfObjects);
for (int i = 0; i < numberOfObjects; i++) {
objectQueue.Enqueue((Transform)Instantiate(
prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
}
enabled = false;
}
private void GameStart () {
nextPosition = startPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
enabled = true;
}
private void GameOver () {
enabled = false;
}SkylineManager 도 마찬가지로 아래와 같이 수정합니다. void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
objectQueue = new Queue<Transform>(numberOfObjects);
for(int i = 0; i < numberOfObjects; i++){
objectQueue.Enqueue((Transform)Instantiate(
prefab, new Vector3(0f, 0f, -100f), Quaternion.identity));
}
enabled = false;
}
private void GameStart () {
nextPosition = startPosition;
for(int i = 0; i < numberOfObjects; i++){
Recycle();
}
enabled = true;
}
private void GameOver () {
enabled = false;
}

'유니티 > 스크립트' 카테고리의 다른 글
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 설정 (0) | 2014.01.14 |
|---|---|
| [런게임] 유니티 3D로 러너 게임 만들기 - 파워업! (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임 이벤트들 (0) | 2014.01.13 |
게임 오버
void Start () {
GameEventManager.GameStart += GameStart;
GameEventManager.GameOver += GameOver;
gameOverText.enabled = false;
}
private void GameOver () {
gameOverText.enabled = true;
instructionsText.enabled = true;
enabled = true;
}Runner 에 추가하고 값을 -6으로 설정합니다,그리고 이것을 체크하여 그 밑으로 떨어지면 gameOver 이벤트를 발생하게 합니다. public float gameOverY;
void Update () {
if(touchingPlatform && Input.GetButtonDown("Jump")){
rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
touchingPlatform = false;
}
distanceTraveled = transform.localPosition.x;
if(transform.localPosition.y < gameOverY){
GameEventManager.TriggerGameOver();
}
}
'유니티 > 스크립트' 카테고리의 다른 글
| [런게임] 유니티 3D로 러너 게임 만들기 - 파워업! (0) | 2014.01.14 |
|---|---|
| [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기 (0) | 2014.01.14 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임 이벤트들 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 길의 종류 (0) | 2014.01.13 |
GUI 와 게임 시작
현재 우리는 game start 이벤트를 가지고 있습니다. GUI를 생성하고 매니저 클래스에서 이것을 사용할 것입니다.
우리의 scene에 텍스트 라벨을 하나 더할것 입니다. 우리가 오브젝트 그룹들을 편리하게 관리하기 위해서, 빈 게임 오브젝트를 만들고 포지션은 (0,0,0)으로 설정하고 이것의 이름을 GUI라고 정합니다. 빈 게임 오브젝트에 guiText 컴포넌트를 생성하고 하위에 추가합니다. (Component / Rendering / GUIText). GUIText의 Anchor 필드값을 middle center로 맞춥니다.
첫번째 오브젝트의 이름은 Game Over Text 이고, Text 필드값에 "GAME OVER"를 입력하고 Font Size는 40, Font Style은 bold로 설정합니다. 위치를 (0.5, 0.2, 0)로 수정하면 화면의 밑에 나타날 것입니다.
두번째 오브젝트의 이름은 Instructions Text이고, 또한 bold로 맞추고 font size는 20, 그리고 text필드에는 "press Jump (x or space) to play"를 설정합니다. 위치는 (0.5, 0.1, 0)로 수정합니다.
세번째 오브젝트는 Runner Text이고, text "RUNNER"이고, 스타일 bold, 그리고 font size 는 60으로 설정하고. 위치는 (0.5, 0.5, 0)로 설정합니다.
GUIManager 클래스를 생성하고 Managers 폴더에 집어넣고 GUIText 변수들을 만듭니다. 새로운 오브젝트 GUI Manager를 생성하고 스크립트를 컴포넌트에 붙입니다. 그리고 매너저의 하위 에
붙입니다. 그리고 각 텍스트 오브젝트를 필드에 할당해줍니다.
using UnityEngine; public class GUIManager : MonoBehaviour { public GUIText gameOverText, instructionsText, runnerText; }




Start 메서드에서는 gameOverText 를 enabled를 false로 설정하여 보이지 않게 설정하고, Update 메서드에서는 점프 버튼을 누를시 game-start event 상태로 변경되게 됩니다. void Start () {
gameOverText.enabled = false;
}
void Update () {
if(Input.GetButtonDown("Jump")){
GameEventManager.TriggerGameStart();
}
}GameStart. 우리는 이 메서드를 사용해서 text를 없어지게 할것이다. Update 메서드에서도 더이상 호출이 되지 않습니다. private void GameStart () {
gameOverText.enabled = false;
instructionsText.enabled = false;
runnerText.enabled = false;
enabled = false;
}GameStart 메서드를 우리의 매니저 클래스에 더해줍니다. void Start () {
GameEventManager.GameStart += GameStart;
gameOverText.enabled = false;
}'유니티 > 스크립트' 카테고리의 다른 글
| [런게임] 유니티 3D로 러너 게임 만들기 - 이벤트 사용하기 (0) | 2014.01.14 |
|---|---|
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 게임 이벤트들 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 길의 종류 (0) | 2014.01.13 |
| [런게임] 유니티 3D로 러너 게임 만들기 - 점프와 점프 실패 (0) | 2014.01.13 |
Code Complete - Steve McConnell
The Art of Computer Programming - Knuth
Structure and Interpretation of Computer Programs - Hal Abelson's, Jerry Sussman's and Julie Sussman's
The Pragmatic Programmer
'보고싶은책' 카테고리의 다른 글
| 안드로이드 NDK 책 (0) | 2014.01.15 |
|---|---|
| “Game Programming Gems 1권 – 3.3 A* 길찾기 알고리즘의 기초” (0) | 2014.01.14 |
| 프로그래머를 위한 책 (0) | 2014.01.13 |
| Code Complete (0) | 2014.01.13 |
| 게임프로그래머를 위한 자료구조와 알고리즘 (0) | 2014.01.13 |
| Introduction to Algorithms (0) | 2014.01.13 |
Code Complete
'보고싶은책' 카테고리의 다른 글
| “Game Programming Gems 1권 – 3.3 A* 길찾기 알고리즘의 기초” (0) | 2014.01.14 |
|---|---|
| 프로그래머를 위한 책 (0) | 2014.01.13 |
| Code Complete (0) | 2014.01.13 |
| 게임프로그래머를 위한 자료구조와 알고리즘 (0) | 2014.01.13 |
| Introduction to Algorithms (0) | 2014.01.13 |
| [IT 서적]시작하세요 cocos2d 아이폰 게임 프로그래밍! - 초보자를 위한 책 (0) | 2014.01.13 |
게임프로그래머를 위한 자료구조와 알고리즘
'보고싶은책' 카테고리의 다른 글
| 프로그래머를 위한 책 (0) | 2014.01.13 |
|---|---|
| Code Complete (0) | 2014.01.13 |
| 게임프로그래머를 위한 자료구조와 알고리즘 (0) | 2014.01.13 |
| Introduction to Algorithms (0) | 2014.01.13 |
| [IT 서적]시작하세요 cocos2d 아이폰 게임 프로그래밍! - 초보자를 위한 책 (0) | 2014.01.13 |
| 실전 유니티 3D 입문과 완성UNITY 3D 4.2 이상 (0) | 2014.01.06 |
Introduction to Algorithms 일단 적어놓자
알고리즘책 입문서로 많이 추천
'보고싶은책' 카테고리의 다른 글
| Code Complete (0) | 2014.01.13 |
|---|---|
| 게임프로그래머를 위한 자료구조와 알고리즘 (0) | 2014.01.13 |
| Introduction to Algorithms (0) | 2014.01.13 |
| [IT 서적]시작하세요 cocos2d 아이폰 게임 프로그래밍! - 초보자를 위한 책 (0) | 2014.01.13 |
| 실전 유니티 3D 입문과 완성UNITY 3D 4.2 이상 (0) | 2014.01.06 |
| 5가지 실전 게임으로 배우는 코코스2d-x (0) | 2014.01.06 |
출처 : http://blog.naver.com/PostView.nhn?blogId=keloc&logNo=40154090761
지난 시간에는 스택과 큐의 개념과 배열로 각각 구현을 해봤습니다. 이번에 살펴 볼 연결리스트(Linked List)는 정적인 배열과 달리 동적인 자료구조로 필요한 경우 할당하여 사용하고 필요가 없어지면 해제하는 식으로 메모리 관리가 가능하기 때문에 메모리를 절약할 수 있다는 장점이 있습니다.

[연결리스트의 기본구조 : 단순 연결리스트]
연결리스트(링크드리스트 : Linked List)의 개념
연결리스트는 노드(Node)와 링크(Link)로 구성되며, 노드는 실제 정보를 담고 있는 하나의 단위이고, 링크는 노드간의 위치정보를 저장하고 있어 연결리스트의 순서를 유지할 수 있도록 하는 연결고리로 이해 하시면 됩니다.
연결리스트는 각 노드별 링크의 개수와 연결 상태에 따라 다양한 형태로 구성 될 수 있는데요. 단순 연결리스트, 환형 연결리스트, 이중 연결리스트, 이중 환형 연결리스트 등으로 나눌 수 있습니다.
단순 연결리스트 (Simple Linked List)
단순 연결리스트는 위 그림과 같이 선형적으로 한방향인 리스트의 형태로서 가장 많이 쓰이는 형태입니다. 여기서 리스트의 시작과 끝을 가리키는 노드가 필요한데요, 각각 머리(Head)와 꼬리(Tail)이라는 이름의 노드로 항상 존재하게 됩니다.
앞서 본 선형 구조의 자료구조인 스택과 큐에서처럼 연결리스트에도 노드의 추가, 삭제, 탐색 등의 연산이 있습니다. 여기서는 각각을 insert, delete, find라고 부르겠습니다.
0. 노드 정의
연결리스트의 노드는 단순히 정수형 데이터 하나만 가진다고 가정하고, 다음과 같이 정의 할 수 있습니다.
typedef struct _node{
int key;
struct _node *next;
}node;
초보자들은 구조체 정의에 _node의 포인터에 당황하실지도 모르겠습니다만, 구조체에서 이런 재귀 정의는 가능하며, 이 의미는 _node라는 구조체 타입을 가리키는 포인터 즉, 다음 노드를 가리킨다는 사실을 아셔야 합니다.
1. 연결리스트 초기화
연결리스트의 초기상태는 머리(이하 Head)와 꼬리(이하 Tail)가 연결된 형태로 다음과 같은 모양을 가지고 있습니다.

[빈 연결리스트]
위와 같이 연결리스트가 비어 있을 경우는 Head가 Tail을 Tail은 그 자신을 가리키는 형태가 되어 있어야 합니다.
node *head, *tail;
void init_list (void) {
head = (node *)malloc(sizeof(node));
tail = (node *)malloc(sizeof(node));
head->next = tail;
tail->next = tail;
}
2. 연결리스트의 노드추가 - 삽입 : insert_next
연결리스트의 삽입(이하 insert)은 다음과 같은 순서로 진행됩니다.

(가) 초기 모양 (t는 head를 가리킴)

(나) L node를 생성합니다. (s가 가리킴)

(다) L node가 t의 다음 node를 가리킵니다. (s->next = t->next)

(라) t의 다음 node 를 L node로 로 변경합니다. (t->next=s)
위와 같은 과정을 구현하면 다음과 같습니다.
node *insert_next (int key, node *t) {
node *s;
s = (node *)malloc(sizeof(node));
s->key = key;
s->next = t->next;
t->next = s;
return s;
}
3. 연결리스트의 노드삭제 - delete_next
연결리스트의 삭제(이하 delete)는 다음과 같은 순서로 진행됩니다.

(가) 초기상태 (삭제 전 Node를 t가 가리킴)

(나) 삭제 대상 Node에 임시 포인터 (s= t->next)

(다) 삭제 전 Node의 다음 포인터 (t->next = t->next->next)

(라) 삭제 대상 노드 해제 (free(s))
코드로 구현하면,,,
int delete_next (node *t) {
node *s;
if (t->next == tail)
return 0;
s = t->next; // (나)
t->next = t->next->next; // (다)
free(s); // (라)
return 1;
}
4. 연결리스트 Node 검색 : find
위와 같이 특정한 key의 다음 Node에 연산을 위해서는 Node를 찾는 연산이 필요한데요. 이는 Head에서 Tail까지 주어진 key가 맞는지 확인 후 return해 주면 됩니다. 바로 코드를 볼께요.
node *find_node (int key) {
node *s;
s = head->next; // head->next가 연결리스트의 첫 node
while (s->key != key && s != tail) // 찾는 key가 맞거나 tail이면 끝
s = s->next; // 다음 node로
return s;
}
find_node함수의 return값을 보고 tail이면 검색에 실패, 아니면 성공입니다. 쉽죠?
연결리스트의 개념을 이해할 때, Node를 그려가면서 연산(insert, delete)을 직접 손으로 해보는게 좋습니다. 주의할 점은 링크의 연결과 제거 그리고 Node의 메모리 해제의 순서가 달라지면 링크가 끊어져 버리는 오류가 발생할 수 있습니다.
예를 들어 다음과 같은 경우를 보죠.
(가) insert 하려는 s node를 다음 node에 먼저 연결하지 않은 경우

(나) 삭제하려는 Node s의 메모리를 먼저 해제한 경우

이와 같은 실수를 하지 않도록 주의 하시길 바라면서 연결리스트(단순연결리스트)에 대한 설명을 마치겠습니다.
다음시간에는 환형연결리스트와 이중연결리스트에 대해서 알아보겠습니다.
[출처] [자료구조] 연결리스트 (Linked List) - 개념과 구현|작성자 keloc
'잡다한것들전부 > 기타' 카테고리의 다른 글
| MS Word 당구장 표시 (0) | 2014.01.17 |
|---|---|
| 맥에서 스크린샷 캡쳐하기 (0) | 2014.01.17 |
| [펌][자료구조] 연결리스트 (Linked List) - 개념과 구현 (0) | 2014.01.13 |
| [펌] A* 알고리즘 (A Star Algorithm ) (0) | 2014.01.13 |
| 길찾기 알고리즘 소스들 (0) | 2014.01.13 |
| [펌] 초보자를 위한 A* 알고리즘 (기초개념 설명 및 소스) (0) | 2014.01.13 |



Programming Pearls by Jon Bentley (생각하는 프로그래밍)
The Mythical Man-Month by Frederick Brook (맨먼스 미신)
Game programming gems......
Game programming gems...... 전 이 씨리즈가 재밌고 볼만하던데요.
게임 프로그래밍에서 실제 필요한 유용한 테크닉들을 프로그래밍/수학/알고리즘/인공지능/ 등 5개 색션으로 나누어
글 묶음 형식으로 만들어 둔 책입니다.
꼭 게임 프로그래밍을 하지 않더라도 충분히 재밌고 유용하다고 생각합니다.
code complete
effective c++
more effective c++
effective STL
등도 읽어봤는데
저책들도 좋지만 다시읽어보고 싶은 책을 고르라면 주저없이 GPG를 찍겠습니다.
gpgstudy.com이란 이책을 주제로 모인 사이트도 있고
http://www.gpgstudy.com/gpgiki/GpgPreview?style=simple 여기에서 몇몇글들을 미리 맛볼 수 있습니다.
* 1부 프로그래밍 일반 - 1.2 객체 조합식 게임 프레임웍 (Scott Patterson, Next Generation Entertainment )
* 2부 수학 - 2.4 사원수의 압축 (Mark Zarb-Adami, Muckyfoot Productions)
* 3부 인공지능 - 3.5 AI 에이전트, 객체, 퀘스트를 위한 확장성있는 트리거 시스템 (Steve Rabin, Nintendo of America, Inc.)
* 4부 그래픽 프로그래밍 - 4.13 법선 맵을 이용한 곡면 흉내내기 (Oscar Blasco, Aside Software )
* 5부 네트웍 및 멀티플레이어 - 5.6 보안 소켓 (Pete Isensee, Microsoft Corporation)
* 6부 오디오 - 6.1 Ogg Vorbis를 이용한 오디오 압축 (Jack Moffitt, Xiph.org Foundation)
GPG 2 미리보기
* 1부 프로그래밍 일반 - 1.12 윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델 (Javier F. Otaegui, Sabarasa Entertainment)
* 2부 수학 - 2.1 부동소수점 비법들: IEEE 부동소수점을 통한 성능 향상 (Yossarian King, Electronic Arts Canada )
* 3부 인공지능 - 3.1 AI 최적화 전략들 (Steve Rabin, Nintendo of America)
* 4부 기하 관리 - 4.2 맞물린 타일들을 이용한 단순화된 지형 시스템 (Greg Snook)
* 5부 그래픽 디스플레이 - 5.1 카툰 렌더링: 실시간 외곽선 변 검출 및 렌더링 (Carl S. Marshall, Intel Architecture Labs)
* 6부 오디오 프로그래밍 - 6.1 게임 오디오 설계 패턴 (Scott Patterson)
1로 갈수록 원론적이고 그 뒤 씨리즈일수록 자잘한 이야기가 나오는데
1->2->3->.. 등등등 순서로 보는 것을 추천합니다..
어떤 분야를 다루는 프로그래머냐에 따라
추천도서의 의미는 다르겠네요.
웹 프로그래머가 크누쓰 책이나 마법사 책을 꼭 읽어야한다고 생각하지는 않습니다만...
분야에 관계없이 추천하고 싶은 책은
pragmatic programmer시리즈 전체와 위에서 말씀하신 고전(맨먼스미신, 소프트웨어 개발의 지혜, 프로그래밍 심리학, Rapid Software Development, 죽음의 행진 등등)이 완전 강추죠.
최근 오픈소스 관련해서 재미있었던 책은 드리밍인 코드 였습니다
------------------------------
모든것은 모든것에 잇닿아 있다.
------------------------------
모든것은 모든것에 잇닿아 있다.