'분류 전체보기'에 해당되는 글 39건

  1. 2017.09.11 CON PACK
  2. 2017.09.07 list 자르기
  3. 2017.09.07 정의된 키워드에 함축된 의미
  4. 2017.09.06 range 함수 / 2차원 리스트 일괄 초기화 1
  5. 2017.09.06 문자열 나누기
  6. 2017.09.05 static 멤버
  7. 2017.09.05 const
  8. 2017.09.02 private, protected, public
  9. 2017.09.02 inline
  10. 2017.08.27 system("cls") / SetConsoleCursorPosition
posted by 구로보루 2017. 9. 11. 21:20

 

 고전게임 PACKMAN을 모방해서 콘솔에 구현한 게임이다. 단순히 CONSOLE PACKMAN을 따서 CON PACK이라 명칭...

 

 지금까지 항상 포폴을 만들 때 AI를 구현하기 조금 꺼려져서 오프라인 2인용 혹은 네트워크를 구현하거나 이런식 이였는데 처음으로 길을 따라다니며 움직이는 허접하지만 AI를 구현해 본 게임이다.

 

 사실 스테이지마다 적이 늘어나고 맵 모양도 다르게 하려 했는데 파일 입출력도 잘 안되고 너무 노가다 작업이라 그냥 포기하고 적만 늘어나게 했다.

 

 3일 잡고 만들려고 한 게임인데 게으름피우다가 일주일이나....ㅠ.ㅠ

 

'포폴 > C/C++' 카테고리의 다른 글

FLYA  (1) 2017.08.06
posted by 구로보루 2017. 9. 7. 23:53

 python에서는 리스트를 인덱스 기준으로 간단하게 자를 수 있다.

사용 방법은 리스트[시작할 인덱스 : 끝낼 인덱스] 이렇게 사용한다.

 

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

으로 정의하고

 a[  : 5 ] 이렇게 사용하면 앞부분이 생략되면 처음부터(뒷부분이 생략되면 당연히 마지막까지) 0번 인덱스부터 4번 인덱스까지를 잘라서 [1, 2, 3, 4, 5]를 반환한다.

 a[ 5 : ] 는 5번부터 마직막까지인 [6, 7, 8, 9, 10]을 반환한다.

 a[ 3 : 7 ] 은 3번 인덱스부터 6번 즉 [4, 5, 6, 7]을 반환하게 된다.

 

'공부 > Python' 카테고리의 다른 글

import  (0) 2018.02.23
함수인자  (0) 2017.11.09
range 함수 / 2차원 리스트 일괄 초기화  (1) 2017.09.06
문자열 나누기  (0) 2017.09.06
posted by 구로보루 2017. 9. 7. 23:25

 이번에 API를 공부하기 시작했다. API를 직접 배워보지는 않았지만 여리저리 코드를 짜보면서 함수를 사용해본적은 많았는데 사용하면서 그 이름에서 무슨의미인지는 모르고 그냥 그런가 보다하면서 사용했었다. 그런데 이번에 이렇게 정의된 키워드에 함축된 의미가 있어서 이를 알면 되게 편해진다고 했다. 우선 지금까지 확인된 의미를 정리해보면

 

H : handler

LP : long pointer

W : 유니코드

STR : string

SZ : 문자열

WND : 윈도우

FN: 함수

DC : 그림판(?)

 

 등등... 하나 하나 의미를 함축하고 있다.

 

 이런식으로만 써 놓으면 잘 모르겠으니 이를 조합하면 그 의미를 통해 쉽게 이 키워드가 무엇인지 알 수 있다.

 

LPSTR : 포인터를 의미하는 LP와 string을 의미하는 STR이 조합되었으니 string 포인터가 된다.

 

LPWSTR : 위에서 string 포인터인데 유니코드를 의미하는 W가 사이에 들어갔으니 유니코드

 

string 포인터가 되고 이는 유니코드의 특성상 한 코드에 2byte씩 할당된 string 포인터가 된다.

 

HDC : H가 핸들러이고, DC가 그림판이니 이는 윈도우에 그림을 그리기 위한 핸들러이다.

 

HWND : 역시 wnd가 윈도우 이므로 윈도우 핸들러가 된다.

 

그리고 클래스 멤버를 사용할 때 역시 이를 통해 쉽게 의미를 알 수 있다. lpfnWndProc 같은 경우는 윈도우 프로시져 함수 포인터라는 의미를 함축하고 있게 된다.(Proc가 확실이 무슨의미인지는 아직...)

 

아직은 이정도만 확인했지만 앞으로 API를 하면서 확인되면 더 추가해서 정리해야 겠다.

posted by 구로보루 2017. 9. 6. 22:55

 python에서 반복문을 돌리려고 보면 C/C++이랑은 반복횟수를 지정하는데 약간 차이가 있다.

일반적으로

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

이런식으로 0부터 9까지 반복을 돌릴 수가 있다.

하지만 python에서는 이게 매우 간소화되어서

for i in range(10)

이렇게 해결이 가능하다.

 

 여기서 사용하는 range함수는 range(초기값, 조건값, 증감값) 이렇게 인자로 전달받고, 만약 증감값이 없다면 +1이 기본으로 사용된다. 그리고 초기값도 없으면 0이 기본이다.

만약, 15부터 시작해서 5보다 큰 숫자를 전부 출력하고 싶으면

for i in range(15, 5, -1) :

print(i)

 이렇게 값을 지정하여 출력할 수 있다.

 

 또 for문과 range를 활용해서 2차원리스트를 일괄적으로 초기화하기도 편해진다.

l = [[0]*5 for _ in range(5)]

 이런식으로 작성하면 5열 5행짜리 2차원 리스트가 전부 0으로 초기화 된다.

l = [[0]*5]*5

 이렇게 코드를 작성해도 똑같이 5열 5행 2차원 리스트가 생성은 되지만 위의 반복문을 사용한 것과는 다른점이 만약 아래의 방법을 사용했다면 [0. 0. 0. 0. 0]의 리스트가 5개가 복사되는 형식이 되어 레퍼런스 위주의 python은 2차원 리스트 내에서 각 행이 다르더라도 열이 같으면 같은 주소를 같게 되어 하나만 수정해도 아래의 사진처럼 일괄적으로 수정된다. 그러므로 2차원 리스트를 일괄적으로 초기화 할 때는 위의 방법을 추천한다.

 

 

 처음 python 할때는 굉장히 적응이 안됬었는데 이제는 C/C++할 때 헷갈릴 정도로 금방 익숙해지더라.

'공부 > Python' 카테고리의 다른 글

import  (0) 2018.02.23
함수인자  (0) 2017.11.09
list 자르기  (0) 2017.09.07
문자열 나누기  (0) 2017.09.06
posted by 구로보루 2017. 9. 6. 00:03

 split()함수는 파이썬에서 문자열을 분활하는 함수이다.

만약 전달인자로 아무 값도 넣어 주지 않으면 공백을 기준으로 문자열을 분활한다.

전달인자로 특정값을 지정하면 그 값을 기준으로 문자열을 나누게 된다.

 

 

 

 여기서 split을 사용하면 인덱스를 기준으로 값이 몇개가 되든 리스트로 변형되어 전부 저장되는데 CJava에서는 그냥 발견하면 한번 자르고 나몰라라 하는것을 생각하면 너무도 편한 기능이다.

'공부 > Python' 카테고리의 다른 글

import  (0) 2018.02.23
함수인자  (0) 2017.11.09
list 자르기  (0) 2017.09.07
range 함수 / 2차원 리스트 일괄 초기화  (1) 2017.09.06
posted by 구로보루 2017. 9. 5. 23:07

 class를 만들다 보면 static 키워드를 사용해야 할 때가 있다. static 키워드는 해당 범위 내에서 정적으로 선언되어 해당 영역을 호출, 반환을 반복해도 지워지지 않고 일정한 값을 유지할 수 있게 한다.

 

 

 위에서 처럼 함수로 static 키워드를 사용할 수 있고 작성한 클래스에서도 static 키워드를 사용할 수 있다.

 우선 classstatic 멤버변수는 모든 객체가 공유하기 위한 변수를 만들때 사용한다. 이 객체가 생성된 숫자라든가 혹은 생성자를 private으로 만들고 딱 하나만 존재하게 만드는 싱글톤 객체라든가....

 그리고 class에서 static 멤버함수도 생성할 수 있는데, 이 static 멤버함수는 오직 classstatic 멤버변수만 사용할 수 있게 하는 키워드가 된다.

 추가로 멤버변수의 접근을 막는 const의 키워드를 멤버함수에 추가한다 해도 static 멤버변수는 접근이 가능하다.

 

 

 위에서 언급한 싱글톤 객체 기본모양 생성..

 

 

'공부 > C++(STL)' 카테고리의 다른 글

반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
const  (0) 2017.09.05
private, protected, public  (0) 2017.09.02
inline  (0) 2017.09.02
posted by 구로보루 2017. 9. 5. 01:13

 일반적으로 const는 변수 값을 변경하는 것을 막기 위한 상수화 키워드이다.

변수에 const가 쓰여서 상수화 시키는 경우가 많은데 포인터를 사용하게 되면 const의 위치에 따라 의미가 바뀔 수 있다.

 

우선,

 const int a = 10;

을 만들었다고 하면 지금부터 a는 10을 저장하고 있는 변수이다.

 

만약 일반 변수가 아닌 포인터에서 const가 사용된다고 하면

 const int * a;

 int * const a;

이런식으로 나올 수 있다.

먼저 cosnt int * aa가 가르키고 있는 데이터를 변경할 수 없다는 의미이다.

그리고 int * const aa를 상수화 시킨다는 의미로 한번 주소값을 저장하면 계속 그 주소값만 가질 수 있다는 의미가 된다.

 

 

 

 const는 클래스에서 멤버함수를 설정할 때도 사용될 수 있다. 대표적으로

const int func();

int func() const;

가 있다.

여기서도 위치에 따라 의미가 다른데 먼저 const int func()은 상수화 값을 반환한다는 의미이다.

그리고 int func() const는 이 함수를 사용할 때 멤버변수의 값들을 상수화 시킨다는 의미이다.

 

 

 추가로 const 자료형을 반환하는 함수에서 만약 포인터가 아닌 일반 자료형으로 반환하는 경우는 주소값을 통한 초기화가 아닌 값 자체를 복사하는것으로 const가 있으나 없으나 똑같이 작동한다.

'공부 > C++(STL)' 카테고리의 다른 글

반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
static 멤버  (0) 2017.09.05
private, protected, public  (0) 2017.09.02
inline  (0) 2017.09.02
posted by 구로보루 2017. 9. 2. 15:17

 class를 선언하면 접근자를 새성해야 한다. 접근자의 경우는 private, protected, public 세가지의 경우가 있다.

public의 경우 class 내부와 외부 어디서든 접근이 가능하다.

protectedclass 내부와 상속관계에 있는 자식 class에서도 접근이 가능하다.

private는 내부에서만 접근이 가능하다.

 

 class를 상속할 때 위의 명령어를 통해 아래처럼 접근지시자를 설정할 수 있다.

 

class A

{

.....

};

 

class B : public A

{

......

};

 

 B class A class를 상속하고 있는데 publicprotectedprivate르 바꿔서 접근권한을 변경하여 상위클래스의 접근권한이 변경된다.

 

public 상속 :

public -> public

protected -> protected

private -> X

 

protected 상속 :

public -> protected

protected -> protected

private -> X

 

private 상속 :

public -> private

protected -> private

private -> X

 

 

'공부 > C++(STL)' 카테고리의 다른 글

반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
static 멤버  (0) 2017.09.05
const  (0) 2017.09.05
inline  (0) 2017.09.02
posted by 구로보루 2017. 9. 2. 14:29

 inline은 함수의 구현부분이 간결할 때 해당 함수가 호출되는 부분을 호출이 아닌 코드가 그대로 옮겨지도록 한다. 이를 통해 함수 호출에 대한 비용소모를 줄여주어 더욱 효율적으로 실행되게 한다.

 

 class의 멤버함수를 inline으로 지정해야 할 경우 class 내부에서 함수를 정의하면 해당 코드의 비용에 따라 자동으로 inline을 추가해준다. (for, while 같은 반복문은 inline으로 지정되지 않는다!) 반면 외부에서 지정할 경우는 inline을 명시해 주어야 한다.

 

 

 이 글을 쓰다가 작년에 누군가가 class 선언과 정의로 파일을 나누었을 때 inline이 적용되지 않는다고 질문을 한게 기억났다. 그때는 그냥 그런가보다 했다가 이번에 생각나서 찾아보니 inline은 컴파일에 의하여 동작한다. 그런데 컴파일이 파일단위로 실행되기 때문에 선언과 정의로 파일을 분활하면 오류가 발생한다. 그러므로 inline을 사용하려면 반드시 같은 파일에서 정의해야 한다.

 

 

 inline과 관련된 키워드로 __inline과 __forceinline이 있는데 __inline의 경우는 inline과 동일하게 작동하여 컴파일러가 효율성을 분석해 자동으로 동작하게 한다. 반면 __forceinline의 경우는 컴파일러의 분석을 무시하고 무조건 inline을 실행하도록 하는 키워드이다.

'공부 > C++(STL)' 카테고리의 다른 글

반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
static 멤버  (0) 2017.09.05
const  (0) 2017.09.05
private, protected, public  (0) 2017.09.02
posted by 구로보루 2017. 8. 27. 17:31

 c를 통해 콘솔창으로 뭔가를 만들다 보면 화면을 지웠다가 다시 만들어야 되는 경우가 많다. 그래서 system함수에 cls를 통해사 하는 경우가 많은데 우선 system함수는 콘솔창에 명령어를 입력하게 해준다. 예를 들어 cls는 콘솔창을 모두 지우는 명령어이다.

 

 

 이런식으로 코드를 사용하게 되면 콘솔창에서 출력할 때 한번출력하고 지우는 형식으로 되어 마지막 15만 출력된다.

 

 그런데 이 함수를 사용할 경우 콘솔창에서 지우고 다시 쓰고를 반복하게 되어서 엄청 깜빡거리게 된다.

 

 이를 해결하기 위해서 사용한 함수가 SetConsoleCursorPosition이다. 이 함수는 콘솔창에 출력할 커서의 위치를 조정할 수 있다.

 

 

 콘솔창의 핸들러와 커서의 위치를 인자로 전달하는데 위의 코드처럼 0, 0 으로 설정하면 콘솔창의 맨 처음위치로 이동하게 된다. system("cls")처럼 지웠다가 출력하는게 아닌 커서의 위치를 이동시켜 이미 출력된 화면의 위에 덮어쓰는 형식으로 출력되기 때문에 만약 콘솔창에서 출력하는 화면의 변화가 적다면 깜빡거림이 훨씬 덜한것을 볼 수 있다.

'공부 > C' 카테고리의 다른 글

글자색 설정하기  (1) 2017.08.27
for문 증감문에 전위연산자와 후위연산자의 차이  (0) 2017.07.27
for / while  (0) 2017.07.20
선행처리기  (0) 2017.07.19
#define / const  (0) 2017.07.19