ncurses에 대한 조언 부탁드립니다~

bjeongh1의 이미지

일단 본문 소스를 보여드릴께요~

#include
#include
#include
#include
#include

#define YMAX 10
#define XMAX 30

int arry[YMAX][XMAX]={{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

typedef struct _node{ //데큐를 구현할 노드
int X;
int Y;
struct _node *prev;
struct _node *next;
}node;

node *head, *tail;

int startx=0, starty=2; //시작을 포인터를 알리기위한 변수 두개
int count=0;
int sum = 0;

void print(void)
{
WINDOW **mywin;
int i,j;
int y,x;

initscr();
start_color();

init_pair(1,COLOR_BLACK,COLOR_RED);
init_pair(2,COLOR_BLACK,COLOR_BLUE);
// init_pair(2 ,COLOR_RED,COLOR_BLACK);
keypad(stdscr,TRUE);
mywin = (WINDOW **)malloc(300*sizeof(WINDOW *));

for (i=0 ; i < YMAX ; i++)
{
y=(i*3)+5;
for (j=0 ; j < XMAX ; j++)
{
if (arry[i][j] == 0)
{
x = (j*3)+20;
mywin[sum] = subwin(stdscr, 3, 3, y, x); //메뉴바윈도우 생성
wborder(mywin[sum], '|', '|', '-', '-', '+', '+', '+', '+');
wrefresh(mywin[sum]);
}
else if (arry[i][j] == 1)
{
x = (j*3)+20;
mywin[sum] = subwin(stdscr, 3, 3, y, x); //메뉴바윈도우 생성
wattron(mywin[sum],COLOR_PAIR(1));
wattron(mywin[sum],A_REVERSE);
wborder(mywin[sum], '|', '|', '-', '-', '+', '+', '+', '+');
wattroff(mywin[sum],COLOR_PAIR(1));
wattroff(mywin[sum],A_REVERSE);
wrefresh(mywin[sum]);
}
else if (arry[i][j] == 3 || arry[i][j] == 8)
{
x = (j*3)+20;
mywin[sum] = subwin(stdscr, 3, 3, y, x); //메뉴바윈도우 생성
wattron(mywin[sum],COLOR_PAIR(2));
wattron(mywin[sum],A_REVERSE);
wborder(mywin[sum], '|', '|', '-', '-', '+', '+', '+', '+');
wattroff(mywin[sum],COLOR_PAIR(2));
wattroff(mywin[sum],A_REVERSE);
wrefresh(mywin[sum]);
}
sum += 1;
}
}
sum = 0;
for (i=0;i {
for (j=0;j {
wrefresh(mywin[sum]);
sum += 1;
}
}
sum = 0;
for (i=0;i {
for (j=0;j {
delwin(mywin[sum]);
sum += 1;
}
}

free(mywin);
endwin();
}

/*데큐 초기화*/
void init_node(void)
{
head = (node*)malloc(sizeof(node));
tail = (node*)malloc(sizeof(node));

head->next = tail;
head->prev = head;
tail->prev = head;
tail->next = tail;
}

/*막다른길이 있을때 되돌아가는 함수*/
void pop_stack(void)
{
node *t; //삭제하고 그 노드를 물릴 포인터변수
int i;

if (head->next==tail) //head->next가 tail를 가르키면 언더플러
return;
t = head->next;
head->next=t->next;
for (i=0;i<1;i++)
{
if (arry[starty-1][startx]==3) //현위치 바로 위
{
arry[starty][startx]=8;
starty--;
}
else if (arry[starty][startx+1]==3) //현위치 바로 오른쪽
{
arry[starty][startx]=8;
startx++;
}
else if (arry[starty+1][startx]==3) //현위치 바로 아래쪽
{
arry[starty][startx]=8;
starty++;
}
else if (arry[starty][startx-1]==3) //현위치 바로 왼쪽
{
arry[starty][startx]=8;
startx--;
}
}
count--;
free(t);
}

/*앞에 길이 막히지 않았을때 가는 함수*/
void put_queue(void)
{
node *t;
t = (node*)malloc(sizeof(node));
if (t == NULL)
exit(1);
t->next=head->next;
t->prev=head;
head->next=t;
head->next->next->prev=t;
t->X=startx;
t->Y=starty;
count++;
}

/*앞에 길이 막히지 않았을때 가고 흔적을 남기고 메모리 삭제하는 함수*/
void get_queue(void)
{
node *t;
t=tail->prev;
if (t==head)
return;

tail->prev=t->prev;
t->prev->next=tail;
printf("(%3d,%3d)\n",t->Y,t->X);
free(t);
}

/*제일 끝에 메모리 삭제하는 함수*/
void clear_queue(void)
{
node *t;
node *s;

t = head->next;
while (t!=tail)
{
s = t;
t = t->next;
free(s);
}
head->next=tail;
tail->prev=head;
}

/*우선순위를 결정해서 이동하는 함수*/
void operator(void)
{
int i,j;
while (1)
{
if (starty == 0)
break;
if (arry[starty-1][startx]==1) //현위치 바로 위
{
put_queue();
arry[starty][startx]=3;
starty--;
}
else if (arry[starty][startx+1]==1) //현위치 바로 오른쪽
{
put_queue();
arry[starty][startx]=3;
startx++;
}
else if (arry[starty+1][startx]==1) //현위치 바로 아래쪽
{
put_queue();
arry[starty][startx]=3;
starty++;
}
else if (arry[starty][startx-1]==1) //현위치 바로 왼쪽
{
put_queue();
arry[starty][startx]=3;
startx--;
}
else if (arry[starty-1][startx]!=1&&arry[starty][startx+1]!=1&&arry[starty+1][startx]!=1&&arry[starty][startx-1]!=1)
pop_stack();
print();
/* for (i=0 ; i {
for (j=0 ; j {
printf("%d",arry[i][j]);
}
printf("\n");
}*/
usleep(30000);
}
}

int main(void)
{
int i;
init_node();
initscr();
start_color();
curs_set(0);

operator();

for (i=0;i<=count;i++)
get_queue();
clear_queue();
free(head);
free(tail);
endwin();
return 0;
}

/*여기서 질문입니다~ 꼭 좀 답변 부탁 드릴께요~ 실행을 시키보시면 알다시피 ncurses에서 실행이 잘 안되네요
그냥 콘솔화면에서는 잘돌아갑니다 근데 이늠이 ncurses에서만 유독 안돌아갑니다 혹시 동적 메모리 관리를 잘못해줬는지
모르겠네요 시원한 답변 기다릴께요 ㅜ.ㅜ */

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.