1대1 질문 부탁 드립니다.

1대1 질문 부탁 드립니다.

작성일 2022.10.05댓글 1건
    게시물 수정 , 삭제는 로그인 필요

안녕하세요
여기서 질문 올렸던 사람입니다. 

제가 한번 답변자님의 코드를 변경시켜봤습니다. 
제가 해보고자하는것은  움직이는 별이 충돌하면 그 별은 벽에 붙은채로 고정시키고
다른 별을 소환하는것을해보려하다 안되서 질문 드립니다. 

그리고 일단 네모부분을 1로 그리고 아닌빈공간은 0으로 했습니다. 2차원 배열에 


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define DOWN 50 //아스키코드로 키보드2에 해당.
#define LEFT 52 //아스키코드로 키보드4에 해당. 
#define RIGHT 54 //아스키코드로 키보드6에 해당. 
#define UP 56 //아스키코드로 키보드8에 해당.

#define TRUE 1 //참값인 1을 매크로 상수 TRUE로 대체 
#define FALSE 0 //거짓인 0을 매크로 상수 FALSE로 대체. 

#define STARTX 0 
#define STARTY 0
#define END 20

int x = 10;
int y = 10;
int array[END+1][END+2]; //실시간 현황을 위한 2차원배열
void set(int, int);
COORD get();
void map();
void show();
void del();
int control();
int up();
int down();
int left();
int right();
int IsColl();
void addstar();
void cement();
int main()
{
map(); // 별의 이동하는 제한범위


while (1) {
set(x, y); // 별의 이동의 시작점
show(); // 초기 위치로 별 출력. 
while (1)
{
if (control() == -1) {
addstar();//만약 충돌하면 2차원 배열에 1값으로
//cement(); 만약 별을 굳어지게 하려면 이걸 해줘야 하나 궁금합니다. 
break;
}

}
}

return 0;
}
void cement() {// 별을 굳어지게 하기 위한 함수

}

void addstar() {

COORD pos = get();
int a = pos.X;
int b = pos.Y;
if (a == STARTX) { // 왼쪽 충돌시

array[y][x] = 1;
array[y][x+1] = 1;
}

if (b == END) { //아래 충돌시

array[y][x] = 1;
array[y][x + 1] = 1;
}

if (a == END) { //오른쪽 충돌시


array[y][x] = 1;
array[y][x - 1] = 1;
}

if (b == STARTY) { //위쪽 충돌시

array[y][x] = 1;
array[y][x+1] = 1;
}
}
int IsColl()
{
set(0, 25);

if (x == STARTX) { // 왼쪽 충돌검사

printf("%-20s", "왼쪽벽과 충돌함");
return TRUE;
}

if (y == END) { //아래 충돌검사

printf("%-20s", "아래벽과 충돌함");
return TRUE;
}

if (x == END) { //오른쪽 충돌검사

printf("%-20s", "오른벽과 충돌함");
return TRUE;
}

if (y == STARTY) { //위쪽 충돌검사

printf("%-20s", "위벽과 충돌함");
return TRUE;
}
return FALSE;
}

int control() {

char ch;
int result = 0;
if (kbhit()) {//상하좌우 이동

ch = getch();

switch (ch) {

case UP:

result=up();
break;

case DOWN:

result = down();
break;

case LEFT:

result = left();
break;

case RIGHT:

result = right();
break;
case '0': //만약 0을 누르면 종료되게 추가했습니다.

exit(1);
}
}
return result;
}

int up()
{
del();

y -= 1;

if (IsColl())
{
y += 1;
return -1;
}
show();
}

int down()
{
del();
y += 1;

if (IsColl()) {

y -= 1;
return -1;
}
show();
}

int left()
{
del();

x -= 2;

if (IsColl()) {

x += 2;
return -1;
}
show();
}

int right()
{
del();

x += 2;

if (IsColl()) {

x -= 2;
return -1;
}
show();
}

void show()
{
set(x, y);
printf("★");
}

void del()
{
set(x, y);
printf("  ");
}

void map()
{
int i, j;

for (i = STARTX; i <= END; i++) {
set(i, STARTY);
printf("■");
array[i][STARTY] = 1;
}
for (i = STARTX; i <= END; i++) {
set(i, END);
printf("■");
array[i][END-1] = 1;
}

for (j = STARTY; j <= END; j++) {
set(END, j);
printf("■");
}
for (j = STARTY; j <= END; j++) {
set(STARTX, j);
printf("■");
}
for (j = STARTY; j < END-1; j++) {
array[STARTY][j] = 1;
}
for (j = STARTY; j < END-1; j++) {
array[END][j] = 1;
}
}

void set(int a, int b)
{
COORD pos = { a,b };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

COORD get()
{
int a, b;

CONSOLE_SCREEN_BUFFER_INFO cur;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur);

a = cur.dwCursorPosition.X;
b = cur.dwCursorPosition.Y;
COORD pos = { a,b };

return pos;
}

그래서 
질문은 
void cement() {// 별을 굳어지게 하기 위한 함수

}
이함수를 어떻게 해줘야 별이 궅어질까요??



그리고 이건 다른질문이지만
제가 테트리스랑 지렁이 게임을 짜기위해 좌표에 익숙해지기 위한 연습을 하고 있습니다. 
근데 테트리스 정도는 짤줄 알아야
왕초보에서 초보단계로 갈수 있나요?

그리고 초보에서 중수로 가려면 벽돌깨기내지는 겔러그 비슷한 슈팅게임정도는 만들고 자료구조정도는 할줄 아는단계 인가요???


#지식인 1대1 질문 #네이버 1대1 질문

profile_image 익명 작성일 -

코드가 들여쓰기가 안되어 있어서 어느게 어떤 코드인지는 모르겠으나, 아래는 제가 일부 수정해서 작성한 코드입니다.

내용이 제법 길지만 작성한 프로그램에 대한 결과를 영상으로 첨부하니,

참고하셔서 원하는 프로그램 만드시길 바랍니다.(원래 설명하는 내용이 있는데, 다시 보니, 소리가 안나오는 군요)

어쩃든 글이 길기 때문에, 여유로운 시간에 보시기를 추천드립니다.

그래도 모르는 질문은 의견란에 질문주세요.

우선 질문자님꼐서 작성하신 코드 중, main함수의 안쪽 while구문을 아래처럼 주석처리하는 것으로 시작합니다.

while (1) { if (control() == -1) { // addstar();//만약 충돌하면 2차원 배열에 1값으로 //cement(); 만약 별을 굳어지게 하려면 이걸 해줘야 하나 궁금합니다. break; } }

위의 코드는 필요가 업습니다.

단순히 별 1개만 굳히기를 하실 거면 질문자님께서 굳이 복잡하게 안하셔도됩니다.

일단 별 1개를 굳히기 위해서 배열 array에 접근을 할 것입니다.

배열 array의 각각의 요소는 0 또는 1을 가질 수 있습니다.

그 중에서 1은 벽을 나타내는 데이터로,

방향키를 통해서(질문자님 코드에서는 2,4,6,8) x,y좌표를 우선 적으로 변경하고 나서, IsColl함수를 호출하여 충돌여부를 확인을 하게 될 때, 이때, x,y좌표에 해당하는 인덱스로 배열 array의 요소에 접근을 했을 때, 현재 위치가 1이면, 이것은 현재 벽이 있다는 것을 나타내는 것을 나타내며, 이때는 벽이 있다는 뜻을 나타내는 TRUE을 반환하도록 함수를 다시 만들어야 합니다.

따라서 IsColl함수는 아래처럼 재정의 되어야 합니다.

int IsColl() { if(array[y][x / 2]) { set(0, 24);printf("coll!\n", y, x/2); return TRUE; } else set(0, 24), printf("good!\n", y, x/2); return FALSE; }

<코드1>_재정의한 IsColl함수.

위의 코드에서 set함수나 printf함수는 관심을 가질 부분이 아닙니다.

오로지, if구문의 조건식인 array[y][x / 2]와 return구문만 관심을 가지시면 됩니다.

array[y][x / 2]라는 조건식은 현재 배열의 요소에 접근을 했을 떄, 현재 배열의 요소가 1이면, 벽이 존재한다는 뜻을 나타내는 조건식입니다.

어처피 0이 아닌 값을 모조리 참으로 간주하는 특성을 이용한 조건식이니, 유용하게 쓸 수 있습니다.

그런데 한가지 궁금한것이 있을 건데요.

그건 배열의 인덱스로 배열의 열을 x/2라는 인덱스를 통해서 접근을 하고 있다는 겁니다.

이렇게 하는 이유는 x좌표가 2배씩 증가를 하기 때문에 이에 맞추어 배열의 요소에 접근하도록 현재 x의 값에서 2를 나누어 원래의 배열의 열에 정상적으로 접근하도록 하기 위함입니다.

어쨋든 벽이 존재하면, TRUE를 반환합니다. 즉, 참값을 반환하도록 하는 것입니다.

그러면, 이제, IsColl함수를 호출한

left, right, up, down함수에 대해서 각각 살펴볼게요.

left함수를 먼저 보시면요. 아래처럼 되어있네요?

int left() { del(); x -= 2; if (IsColl()) { x += 2; return -1; } show(); }

자 그럼 left함수가 호출되었을 떄, 그러니깐 질문자님께서 4번키를 눌러서 왼쪽으로 이동시키려고할떄 호출되는 함수겠네요.

그럼 먼저, 현재 위치에 출력된 별을 지우고, x의 좌표를 2감소시킵니다.

그리고 나서, 위의 <코드1>, 재정의한 IsColl함수를 호출하였을 때, 현재 (x,y)좌표에서, x좌표를 2감소한 위치에 해당하는 배열의 요소에 접근을 하여, 해당 값이 1이면, 기존에 별이 출력되었던 왼쪽에는 블록이 존재 한다는 뜻이 되고,

코드1에서 재정의한 IsColl함수에 의해서, 참값을 반환받아서, 위의 left함수에서 if구문을 실행하게 되겟네요.

이때 블록이 존재하는 영역으로 별이 넘어가면 안되니깐, 다시 별을 원래의 위치로 돌려야 겠군요.

left함수는 좌표를 현재 위치에서 왼쪽으로 이동시키는 함수이니깐, y좌표는 그대로고, x좌표만 -2이동되는 함수니깐, 벽을 만났을 때, 원래의 위치로 되돌리기 위해서는 그냥 x의 값을 다시 2를 더해주면 되겠죠?

그래서 일단 함수는 아래처럼 정의가 될 겁니다.

int left() { del(); x -= 2; /*충돌을 하였는가?*/ if (IsColl()) { x += 2; return -1; } show(); }

<코드2>_아직 미정의된 left함수. <- 사용하지 마시오.

그런데, 문제는 충돌을 하고나서는 별이 시멘트처럼 굳고, 새로운 별을 만들어야 한다는 겁니다.

따라서 이때, 질문자님께서 선언하신 cment함수를 마저 정의해보록하죠.

cement함수의 기능을 정의하기 위해서 프로그램의 특성을 알아야 됩니다.

왼쪽으로 이동했을 때, 만약 벽이 존재하면, 현재 별은 시멘트처럼 굳어서 벽처럼되고, 다시 새로운 별이 시멘트가 되어버린 별 바로 오른쪽에 출력되도록 하는데요.

이때, 별을 오른쪽으로 출력하도록 할때, 그 위치가, 허용된 x의 좌표를 넘어가면 안된다는 겁니다.

따라서 시멘트에서는 허용된 영역을 침범하지 않도록 제한하는 기능과,

만약 허용된 영역이라면, 현재 별이 충돌했던 위치에 해당하는 배열의 요소를 1로 셋시키는 함수와 더불어,

현재 충돌한 위치에 별을 출력하는 기능을 넣도록 해줍니다.

그리고, 정상적으로 별을 시멘트로 만들기 성공했다면, 성공했다는 것을 알리는 TRUE를 반환하도록하고,

허용된 영역을 벗어나, 별을 시멘트화 시키지 못했다면, 실패했다는 것을 알리는 FALSE를 반환해줍니다.

따라서 반환형은 void가 아닌 int나 bool을 사용하도록 해줍니다.

따라서 이를 토대로 작성한 cement함수는 아래와 같습니다.

int cement(int x_pos, int y_pos) {// 별을 굳어지게 하기 위한 함수 if(!array[y_pos][x_pos/2]) { array[y][x / 2] = 1; show(); return TRUE; } return FALSE; }

<코드3>_다시 재정의된 cement함수.

그런데 위에서 매개변수로 x_pos, y_pos가 선언되었는데, 이는 앞의 그림에서 설명했듯이, 현재 좌표를 기준으로, 허용된 영역을 벗어났는지 확인하기 위해서 개별적인 좌표를 전달토록 하였습니다.

left함수는 왼쪽부터 채워지니, 오른쪽이 허용된 영역을 벗어나면 안되고,

right함수는 오른쪽부터 채워지니, 왼쪽이 허용된 영역을 벗어나면 안되고,

up함수는 위쪽부터 채워지니, 아래쪽이 허용된 영역을 벗어나면 안되고,

down함수는 아래쪽부터 채워지니, 위쪽이 허용된 영역을 벗어나면 안되므로,

각 함수가 호출되었을 때, 해당 cement함수를 호출하였을 때, 각각 방향키에 따라서 서로 다른 함수들이 호출되었을 때, 각 함수별로, 허용된 영역을 판별하기 위한 좌표가 서로 다르기 때문에, 함수 호출시 좌표를 전달하도록 만든 것입니다.

그리고 해당 함수에서 보시는 것처럼 x의 좌표가 2배씩 증가를 하니, 2로 나눈 상태에서 배열의 요소에 접근을 하는 것을 볼 수 있습니다.

(만약 이걸 무시하고 그냥 array[y][x]로 접근했다가는............................................)

다시 <코드2>를 보시면, 어쨋든 왼쪽으로 이동해서 좌표값을 2감소시킨후 충돌여부를 확인 후 충돌이 되었다면,

다시 2를 증가시켜서 원래의 좌표로 복구 하도록 유도는 하였습니다.

이떄, cement함수를 호출하여, 현재 상황과, 현재 좌표에서 별을 굳혀도 되는지 판별하고, 굳혀도 되면, 별을 굳히도록 처리하도록 작성을 해주는 겁니다.

따라서 left함수가 아래와 같이 정의가 되겠네요.

int left() { del(); x -= 2; /*충돌을 하였는가?*/ if (IsColl()) { x += 2; /*시멘트로 굳히기를 할것인가?*/ if(cement(x + 2,y)) x += 2; //<- 왜 2를 또 증가시키나요? return -1; } show(); }

<코드4>_재정의한 left함수

위의 주석에서 cement함수로 부터 참값을 받아 내면, x의 좌표를 또 2증가 시키는 것으로 나옵니다.

이것은 이제 현재 좌표의 별이 왼쪽의 벽과 충돌을 하였고, 이로 인해 현재의 별은 더이상 작동하지 않는 시멘트처럼 굳으면서, 새로운 별이 생성되는 위치를 지정하기 위해 나타낸 것으로, 시멘트가 된 별 바로 옆에 새로 별이 생성되도록 하기 위하여 처리를 한것입니다.

(질문자님의 기호대로 작성하시면 됩니다.)

어쨋듯, 나머지 함수에 대해서 설명을 드리고 싶으나, 시간상, 글자길이 제한으로 여기까지만 하고,

나머지 함수에 대해서는 제가 각각의 함수를 제시해드릴테니 한 번 분석해보시기 바랍니다.

int right() { del(); x += 2; /*충돌을 하였는가?*/ if (IsColl()) { x -= 2; /*시멘트로 굳히기를 할것인가?*/ if(cement(x - 2,y)) x -= 2; return -1; } show(); }

<코드5>_재정의한 right함수

int up() { del(); y -= 1; /*충돌을 하였는가?*/ if (IsColl()) { y ++; /*시멘트로 굳히기를 할것인가?*/ if(cement(x,y + 1)) y++; return -1; } show(); }

<코드6>_재정의한 up함수

int down() { del(); y += 1; /*충돌을 하였는가?*/ if (IsColl()) { y -- ; /*시멘트로 굳히기를 할것인가?*/ if(cement(x,y - 1)) y--; return -1; } show(); }

<코드7>_재정의한 down함수

아, 물론 함수를 재정의하면서 함수의 선언부도 수정하시기 바랍니다.

그리고 return -1; 구문은 어떤용도로 다셨는지 몰라서 그대로 두었고,

일단 위의 코드 흐름대로 작성한 것입니다.

그리고, 정말 중요한 것 중 하나는 바로 배열의 요소를 1로 초기화를 하는 부분입니다.

배열의 요소를 1로 초기화를 할때, 반드시 처음에 필드가 형성될 때, 테두리 부분에 출력되는 블록의 모양에 맞추어서 배열의 요소를 1로 초기화를 시켜주어야 합니다.

지금 질문자님의 코드는 배열의 테두리 부분 따로, 1로 초기화를 하는 구문을 따로 하셨는데,

그럴 필요가 없이, 그냥 테두리 부분을 출력할 때 , 같이 1로 초기화시켜주면 됩니다.

물론, x의 인덱스를 조심해야 하고요.

아래퍼럼 map함수를 다시 재정의 해주세여.

void map() { int i, j; for (i = STARTX; i <= END / 2; i++) { set(i * 2, STARTY); printf("■"); array[STARTY][i] = 1; set(i * 2, END); printf("■"); array[END][i] = 1; } for (j = STARTY; j <= END; j++) { set(END, j); printf("■"); array[j][END / 2] = 1; set(STARTX, j); printf("■"); array[j][STARTX] = 1; } //*/ }

<코드8>_재정의한 map함수.

보시면 아시겠지만. 변수 i,j를 각각 따로 열과 행을 출력토록 처리하면서 배열의 요소에 1을 대입하도록 하고 있습니다.

이떄 코드8에서 첫번째 if구문은 테두리 가로부분을 출력하는 것으로, i의 값을 END / 2까지 증가시키는 것을 볼수 있습니다.

해당 함수에서 블록을 출력하기 위해서 x의 좌표를 2씩 증가시키면서 2배가 되므로, 2를 나누어 준 것입니다.

아래는 이에 대한 전체 코드와 추가로 스페이스 키를 눌렀을 때, 별을 시멘트화 시키지 않도록 모드를 설정하도록 하였습니다.

그리고 해당 모드 설정에 대한 처리는 질문자님꼐서 질문주신 코드 중 addstar함수에 한번 정의해보았습니다.

또한 control함수에서 스페이스를 입력받도록 하였고, 이때 addstar함수를 호출하여, 스페이스에 대한 실질 처리를 히도록 하였습니다.

addstart함수는요 아래와 같습니다.

void addstar() { BlockMode = (BlockMode + 1) % 2; BlockMode ? printf("이제부터 벽에 부딪칠시 벽돌 생성됩니다. 한번 더 스페이스 누르면 원래대로 돌아갑니다.") : printf("%-90s","스페이스 : 벽돌 생성 모드 설정"); }

BlockMode는 말그대로 별을 시멘트화 시킬 것인지 결정하는 플래그입니다.

따라서 스페이스가 눌려질 때마다 토글기능을 구현한 것이고,

아래는 스페이스 바에 대한 안내문구를 출력하는 구문입니다.

이어서 control함수에서 switch구문에 아래의 구문을 추가해 주시고,

case SPACE : addstar(); break;

BlockMode가 셋이 되면, 당연히 cement함수가 동작하도록 하기 위해서 cement함수 내 if구문의 조건식을 아래처럼 수정해줍니다.

!array[y_pos][x_pos/2] && BlockMode

이제 이를 바탕으로 작성한 코드는 아래와 같습니다.

결과에 대한 영상 첨부합니다.

소리가 나오지 않는 군요.;;;;

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #define DOWN 50 //아스키코드로 키보드2에 해당. #define LEFT 52 //아스키코드로 키보드4에 해당. #define RIGHT 54 //아스키코드로 키보드6에 해당. #define UP 56 //아스키코드로 키보드8에 해당. #define SPACE 32 //아스키코드로 스페이스에 해당. #define TRUE 1 //참값인 1을 매크로 상수 TRUE로 대체 #define FALSE 0 //거짓인 0을 매크로 상수 FALSE로 대체. #define STARTX 0 #define STARTY 0 #define END 20 int BlockMode = 0; int x = 10; int y = 10; int array[END+2][END+2]; //실시간 현황을 위한 2차원배열 void set(int, int); COORD get(); void map(); void show(); void del(); int control(); int up(); int down(); int left(); int right(); int IsColl(); void addstar(); int cement(int, int); int main() { set(0, 26); printf("스페이스 : 벽돌 생성 모드 설정"); map(); // 별의 이동하는 제한범위 while (1) { set(x, y); // 별의 이동의 시작점 show(); // 초기 위치로 별 출력. while (1) { if (control() == -1) { // addstar();//만약 충돌하면 2차원 배열에 1값으로 //cement(); 만약 별을 굳어지게 하려면 이걸 해줘야 하나 궁금합니다. break; } } } return 0; } int cement(int x_pos, int y_pos) {// 별을 굳어지게 하기 위한 함수 if(!array[y_pos][x_pos/2] && BlockMode) { array[y][x / 2] = 1; show(); return TRUE; } return FALSE; } void addstar() { BlockMode = (BlockMode + 1) % 2; set(0, 26); BlockMode ? printf("이제부터 벽에 부딪칠시 벽돌 생성됩니다. 한번 더 스페이스 누르면 원래대로 돌아갑니다.") : printf("%-90s","스페이스 : 벽돌 생성 모드 설정"); } int IsColl() { if(array[y][x / 2]) { set(0, 24);printf("coll!\n", y, x/2); return TRUE; } else set(0, 24), printf("good!\n", y, x/2); return FALSE; } int control() { char ch; int result = 0; if (kbhit()) {//상하좌우 이동 ch = getch(); switch (ch) { case UP: result=up(); break; case DOWN: result = down(); break; case LEFT: result = left(); break; case RIGHT: result = right(); break; case SPACE : addstar(); break; case '0': //만약 0을 누르면 종료되게 추가했습니다. exit(1); } } return result; } int up() { del(); y -= 1; /*충돌을 하였는가?*/ if (IsColl()) { y ++; /*시멘트로 굳히기를 할것인가?*/ if(cement(x,y + 1)) y++; return -1; } show(); } int down() { del(); y += 1; /*충돌을 하였는가?*/ if (IsColl()) { y -- ; /*시멘트로 굳히기를 할것인가?*/ if(cement(x,y - 1)) y--; return -1; } show(); } int left() { del(); x -= 2; /*충돌을 하였는가?*/ if (IsColl()) { x += 2; /*시멘트로 굳히기를 할것인가?*/ if(cement(x + 2,y)) x += 2; return -1; } show(); } int right() { del(); x += 2; /*충돌을 하였는가?*/ if (IsColl()) { x -= 2; /*시멘트로 굳히기를 할것인가?*/ if(cement(x - 2,y)) x -= 2; return -1; } show(); } void show() { set(x, y); printf("★"); } void del() { set(x, y); printf(" "); } void map() { int i, j; /*테두리 가로부분 출력.*/ for (i = STARTX; i <= END / 2; i++) { set(i * 2, STARTY); printf("■"); array[STARTY][i] = 1; set(i * 2, END); printf("■"); array[END][i] = 1; } /*테두리 세로부분 출력.*/ for (j = STARTY; j <= END; j++) { set(END, j); printf("■"); array[j][END / 2] = 1; set(STARTX, j); printf("■"); array[j][STARTX] = 1; } //*/ } void set(int a, int b) { COORD pos = { a,b }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } COORD get() { int a, b; CONSOLE_SCREEN_BUFFER_INFO cur; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur); a = cur.dwCursorPosition.X; b = cur.dwCursorPosition.Y; COORD pos = { a,b }; return pos; }

제컴퓨터가 아니라서 편집기능이 그림판만 존재하고 있습니다.

///아래는 추가적인 질문에 대한 답변.

초보 중수 고수를 나누는 것은 되게 주관적이라 말씀드리기는 애매한데,

보통,

초보라고 하면, 문법은 아마 어느 정도 숙지가 되어 있을 거 같으시고, 일반 기초적인 코딩은 할 수 있으며, 모르는 것은 물어보면서 코딩하는 정도라고 생각해요.

여기서 말하는 기초적인 코딩이라함은, 책의 예제를 안보고 구현하거나, 조금 더 욕심내면, 파일관리나 성적관리 프로그램 등 기초적인 데이터 관리 프로그램을 하는 정도라고 생각합니다.

중수는 어느정도 감을 잡아서, 왠만한 코딩은 혼자서 구현할 수 있으며, 모르는 것은 오픈 소스를 활용하여, 어느정도 자신의 것으로 구현할 수 잇는 정도라고 생각해요.

즉 어느정도 구현능력을 가지고 있고, 응용할 수 있는 힘을 가졌다고 보면 되고요.

고급 프로그래머는

아예 프로그램을 백지 상태로 스스로 구현해볼 수 있는 단계인 거 같습니다.

그리고, 코드 구현시 필요한 부분을 스스로 판단하여, 이와 관련된 이론에 대한 레퍼런스를 잘 활용하는 프로그래머,

그리고, 타인이 작성한 코드를 쉽게 분석해낼 수 있고, 본인이 작성한 코드를 다른사람에게도 확실히 공개 할 수 있을 정도라고 생각합니다.

자료구조라........ 자료구조라함은 사실 지금 배열이나, 자료형 선언 이런 것도 일종의 자료구조입니다.

사실 for문을 통해서 순차적인 접근을 통해서 탐색을 하는 것도 일종의 자료구조지요.

아마 질문자님께서 말씀하시는 부분은 트리 그래프, 스택, 큐, 리스트 등의 구조를 말하겠지만요....

결론부터 말씀드리자면 자료구조를 배우면 좋습니다

프로그램을 구현하더라도 효율적인 구현과 데이터 처리, 조금더 클린한 코드의 작성도 할 수 있겠지요.

그래서 자료구조 공부하실 수 있다면 하는것이 좋다고 생각합니다.

고급 프로그래머가 되기 위해서 하시는게 좋아요.

지금 필요성을 못느끼더라도 나중에 프로그램 작성 중에 언젠가는 필요로 하게 되실 겁니다.

혹여, C++을 하시게 된다면 나중에 STL 표준 템플릿 라이브러리를 쓰면 또 그때가서는

"자료구조 필요없네, 알아서 다 해주네!"라고 하실 수 있겠지만, 알고 쓰는거와 모르고 쓰는거는 차이가 나기에, 공부를 하시는 것이 좋다는 겁니다.

하지만 이제 중급프로그래머로 넘어갔기에, 앞으로는 초보단계에서 경험하지 못했던 다양한 코드를 접목하개 될것이고, 차츰 구현 하시다보면 필요성을 느끼실 거고 그때, 자연스럽게 공부를 하시게 됩니다.

특이한 경우, 코드 구현 중에도 자료구조가 구현되는 경우가 있습니다.

부끄럽지만, 저도 자료구조를 코드의 구현을 통해서 구현이 되었더군요.

물론 부족분이나, 이론적인 부분에 대해서 숙지가 필요햇기에 뒤늦게 자료구조를 공부한 케이스였지요 ...^^;;;;

그래도 적어도 이때는, 이제는, 중급 프로그래머 티를 내야한다는 것이지요.

따라서 결론은 그래요.

중급 프로그래머로 넘어가는 단계에서 자료구조는 여전히 힘들 수 있겟지만, 적어도 선형 자료구조는 숙지는 해야하지 않나가 제 결론입니다.

그리고, 좌표에 적응 하신다고 하셨는데, 테트리스가 구현하기 힘들면, 더 쉬운걸로 해보세요.

하늘에서 별이 떨어진다면, 별 피하기나 공 피하기 같은 단순히 위에서 아래로 투사체가 내려오는 게임정도는 혼자서 구현한다면 초보는 벗어났다고 봅니다.

굳이 게임이 아니더라도 사칙연산계산기를 한번 만들어보셔도 괜찮습니다.

(자료구조를 응용하면 편안하지만, 몰라도 구현은 일단은 가능하기에........,)

여기서 말하는 사칙연산계산기는 일반 계산기처럼 다항식 계산이 되는 계산으로 연산의 우선순위를 고려한 계산기를 말합니다.

그리고 초보에서 중수로 가려면 벽돌깨기내지는 겔러그 비슷한 슈팅게임정도는 만들어야 하는건가요? 에 대한 답변도 애매한데, 요즘 프로그래밍이나 게임 프로그래밍 입문용으로 많이들 만드는 것 같습니다만, 만든다는 게 꼭 질문자님꼐서 안보고 처음 부터 백지상태에서 혼자힘으로 구현하는 것을 의미하는 것이 아니라, 다른 사람이 만든 공개된 코드를 보고 질문자님께서 잘 응용해서 질문자님의 것으로 만들어서 구현할 수 있을 정도면, 충분하다고 봐요.

1대1질문에 대해서

1대1 질문하고 답변받은 질문자가 그 질문들을 아예 삭제할 수 있나요? 지금까지 1대1... 제대로 된 정확한 설명 부탁 드립니다. 일대일 질문도 일대일 질문 받은 사용자가 먼저...

1대1 질문 부탁드립니다.

안녕하세요 지난번에 1번 했던질문이지만 다시한번 부탁드립니다. 1. 지난번에 게임은 적당한코어 영상편집은 다중코어가 왜 유리한지 질문했고 설명을 해주셨습니다. 그때...

1대1 질문 부탁드립니다.

안녕하세요 아빠곰님 3가지만 질문 부탁드리겟습니다. 1. 일단 질문이좀... 양해부탁드립니다. ) 1. 파일시스템은 커널의 일 부분 입니다. 파일 시스템에서 특정 파일을...

1대1 질문 부탁드릴게요

... 추가질문하면 글이 길어질거 같아서 1대1 질문 했습니다. 먼저 질문이 많아서 죄송합니다. IT업계동향을 처음 접하는것이니 양해 부탁드립니다. 1.저기 url에서 보통의 중소...

junk****님께 1대1 질문 드립니다

junk****님에게 1대1 질문 드립니다. 다른 사람은 답변 안달아주셨으면 합니다. 이... 즉, 매운이라는 의미로 쓰였을 때는 辛い가 からい로 발음이 되오니 의미 파악 부탁드립니다....

1대1 질문 부탁드릴게요

어제 1대1 질문 너무 명쾌 했습니다. 감사합니다. 3가지만 부탁드립니다. 1.제가 어제 부팅시 왜 모듈을 쓰냐고 질문 했을떄 답변자님이 모듈" 은 그냥 필요에 따라 넣었다...

안녕하세요 1대1 질문드립니다!! 형

안녕하세요 1대1 질문드립니다!! 1. 형사지원팀에도 여경이 꽤 있나요? 보안계... 이 부서만 바라보고 있고 정말 들어가고 싶은데 조언 같은 거 있으면 부탁드려도 될까요ㅠㅠ...

1대1 질문 부탁드립니다.

안녕하세요 답변이 너무 좋으셔서 1대1 질문 드렸습니다. 3가지만 부탁합니다. 파일시스템은 커널레벨에서 작동하는거고 일반 프로세스는 사용자레벨에서 작동하는...

1대1 질문 부탁드립니다.

... 2가지만 질문드릴게요 1. 가상메모리를사용하면... 하냐고 질문한적이있엇습니다 왜 1개의 코어에 3개의스레드는안되고 4개의 스레드는 안되냐 이런질문을 했죠...

1대1 질문 부탁 드립니다.

안녕하세요 1대1 질문 부탁 드립니다. void fun(const char** pa); int main() { const char* a[3] = { "aaaa", "bbbb", "cccc", }; fun(a); return 0; } void fun(const char** pa) { int i = 0; while...