PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2010/05/22 21:03:08
Name ROMANMAX
Subject c++ 능력자분들 저좀 이해할수있게도와주세요
c++을 배우고 있는데요

그래서 이번에 먼가 만들어볼려구....하는데..

이소를 가지고 좀더 개조해볼까하는데..

당장 이소스가 이해가 안되내요..잘..

이해좀 할수있게...쉽게쉽게 주석좀 달아주세요''

#include <iostream>
#include <windows.h>
#include <time.h>
#include <conio.h>

using std::cout;
using std::cin;
using std::endl;

#define HEIGHT 20
#define WIDTH 60
#define ZERO 0
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77


//**********************************화면 클레스*************************************************
class Screen {
char bk[HEIGHT][WIDTH];
int key;
public:
Screen();
void SetCh(int _ch) { key = _ch; }
int GetCh() { return key; }
void Show();
};


Screen::Screen()
{int i;
for(i=0; i<HEIGHT; i++) {
  for(int j=0; j<WIDTH; j++) {
   bk[i][j] = ' ';
  }
}
for(i=0; i<HEIGHT; i++) {
  bk[i][ZERO] = '@';
  bk[i][WIDTH-1] = '@';

}
for(i=0; i<WIDTH; i++) {
  bk[ZERO][i] = '@';
  bk[HEIGHT-1][i] = '@';
}
this->Show();
}

void Screen::Show()
{
for(int i=0; i<HEIGHT; i++) {
  for(int j=0; j<WIDTH; j++) {
   cout<<bk[i][j];
  }
  cout<<endl;
}
}

//*******************************뱀 클레스****************************************8
class Snake {
int x;
int y;
int Fx;
int Fy;
int course;
int temp;
Snake * tail;
Snake * next;
public:
Snake();
Snake(Snake * snake);

void SetX(int _x) { x = _x; }
void SetY(int _y) { y = _y; }
void SetCourse(int _course) { course = _course; }
void SetNext(Snake * _next) { next = _next; }

int GetX() { return x; }
int GetY() { return y; }
int GetCourse() { return course; }
Snake * GetNext() { return next; }

void AddX() { x++; }
void AddY() { y++; }
void SubX() { x--; }
void SubY() { y--; }

void Move(Snake * s);
void Cmp(Snake * s);
void Gotoxy(int,int);
void Food();
void Show(Snake *s);
void Del(Snake * s);

Snake * GetThis() { return this; }
Snake * GetTail() { return tail; }
};


Snake::Snake()
{
srand((unsigned int)time(NULL));
x = rand()%50+5;
y = rand()%10+5;
next = NULL;
tail = this;
Gotoxy(x,y);
cout<<"@";
Food();
}

Snake::Snake(Snake * snake)
{
course = snake->course;

switch(course) {
case UP:
  y = snake->y+1;
  x = snake->x;
  break;
case DOWN:
  y = snake->y-1;
  x = snake->x;
  break;
case LEFT:
  x = snake->x+1;
  y = snake->y;
  break;
case RIGHT:
  x = snake->x-1;
  y = snake->y;
  break;
default:
  cout<<"에러!!! 잘못된 방향값이 들어 왔습니다";
  exit(-1);
}

tail = GetThis();
next = NULL;
}

void Snake::Del(Snake * h)
{
Snake * p;
while(h->next != NULL) {
  p = h;
  delete p;
  h = h->next;
}
delete h;
}

void Snake::Food()
{
srand((unsigned int)time(NULL));
Fx = rand()%57+1;
Fy = rand()%18+1;
Gotoxy(Fx,Fy);
cout<<"#";
}

void Snake::Gotoxy(int x, int y){ // 좌표값 얻기
     COORD Cur;
     Cur.X=x;
     Cur.Y=y;
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur);
}

void Snake::Cmp(Snake * s)
{
switch(s->course) {
case UP:
  s->SetY(s->y-1);
  s->SetX(s->x);
  break;
case DOWN:
  s->SetY(s->y+1);
  s->SetX(s->x);
  break;
case LEFT:
  s->SetX(s->x-1);
  s->SetY(s->y);
  break;
case RIGHT:
  s->SetX(s->x+1);
  s->SetY(s->y);
  break;
default:
  cout<<"에러!!! 잘못된 방향값이 들어 왔습니다";
  exit(-1);
}

}

void Snake::Show(Snake * p)
{
while(p->next != NULL) {
  Gotoxy(p->x, p->y);
  cout<<'@';
  p = p->next;
}
Gotoxy(p->x, p->y);
cout<<'@';
}

void Snake::Move(Snake * s) {
Snake * h1 = s;
Snake * h2 = s;
int temp2;

if(x==0 || y==0 || x==WIDTH-1 || y==HEIGHT-1) {
  Gotoxy(0,20);
  cout<<"벽에 부닦쳤습니다."<<endl;
  cout<<"Game Over!!"<<endl;
  exit(0);
}

if(Fx == x && Fy == y) {
  Food();
  Snake * p = new Snake(tail); //추가 생성
  tail->next = p;
  tail = p;
}

h1->temp = s->course;
while(s->next != NULL) {
  Cmp(s);
  if(h1->temp != s->course) {
   temp2 = s->course;
   s->course = h1->temp;
   h1->temp = temp2;
  }
  s = s->next;
}

Cmp(s);  //NULL인 객체 처리

if(h2->next == NULL) {
  ;
} else {
  h2 = h2->next;
  while(h2->next != NULL) {
   if(h1->x == h2->x && h1->y == h2->y) {
    Gotoxy(0,20);
    cout<<"몸통 박치기 하셨습니다."<<endl;
    cout<<"Game Over!!"<<endl;
    exit(0);
   }
   h2 = h2->next;
  }
}

if(h1->temp != s->course) {
  temp2 = s->course;
  s->course = h1->temp;
  h1->temp = temp2;
}

Show(h1);
Sleep(100);
Gotoxy(tail->x, tail->y);
cout<<' ';
}
//***********************************전역변수********************************************
// **********************************메인함수********************************************
int main(void)
{
int ch=0, count=0;
int x,y;

Screen scr;
Snake * head = new Snake();

x = head->GetX();
y = head->GetY();
while(1) {
  if(_kbhit()) {
   scr.SetCh(_getch());
   if(scr.GetCh() == 224)
    scr.SetCh(_getch());
  }
  switch(scr.GetCh()) {
  case RIGHT:
   head->SetCourse(RIGHT);
   head->Move(head);
   break;
  case LEFT:
   head->SetCourse(LEFT);
   head->Move(head);
   break;
  case DOWN:
   head->SetCourse(DOWN);
   head->Move(head);
   break;
  case UP:
   head->SetCourse(UP);
   head->Move(head);
   break;
  case 'q':
   head->Gotoxy(0,20);
   cout<<"프로그램 종료"<<endl;
   return 1;
  default:
   break;
  }
  if(count<1) {
   count++;
   head->Gotoxy(x,y);
   cout<<' ';
  }
}

head->Del(head);
head->Gotoxy(0,20);
return 0;
}


통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
10/05/22 21:12
수정 아이콘
그냥 프로그램을 짜달라고 하세요
10/05/22 21:15
수정 아이콘
최소한 모르는 부분만 발췌하세요

다 올리지 마시구요

스스로 읽으면서 모르겠다 싶은 부분만 올려주시길 바랍니다.
ROMANMAX
10/05/22 21:17
수정 아이콘
그러면 입분만 좀 설명좀
void Snake::Cmp(Snake * s)이함수랑
Snake::Snake(Snake * snake)이거랑
main함수내의 while문 내용만이라두.....설명부탁드립니다
10/05/22 21:27
수정 아이콘
소스 자체가 참 난감하게 짜서 이해를 잘 못하겠는데 Cmp 부분은 Snake 객체에 담겨진 경로를 가지고 있다가 SetX나 Y를 통해 이동 경로를 변경하는 메소드를 실행하는 것이고 생성자에서 Snake의 객체 포인터 변수를 가지고 있는 부분은 Cmp와 같은 역할을 하는것 같습니다.

이것 참 소스가;;;
10/05/22 21:28
수정 아이콘
메인의 while은 입력된 key의 아스키 코드를 가지고 이동 방향 범위를 계산해서 객체에 넣어주는 것 같습니다.

어우-_-;;;소스를 왜 이렇게 짰담;;;
WizardMo진종
10/05/23 12:45
수정 아이콘
옛날 책에 있을만한 소스네요;;;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
82326 이 나이키 제품 정품인가요? [5] 아웅2439 10/05/23 2439
82325 3주후에 보자는 여자사람의 제안은....긍정의 의미일까요? 부정에 의미일까요? [8] 눈물의 싸이오2463 10/05/22 2463
82324 UPI통신이 통일교 소유인가요? [4] aSlLeR4706 10/05/22 4706
82323 지식인 배너창 정화중입니다 쓸고닦고~ 창이1615 10/05/22 1615
82321 2천만원을 재테크로 어떻게 해야? [5] EastVirus2116 10/05/22 2116
82320 왜 결승때 치킨 얘기가 많이 나오나요?-_-a [17] 창이2657 10/05/22 2657
82319 TV 시청 질문 aibON_cau1821 10/05/22 1821
82318 여성 그룹 시크릿에 관해서 질문을... [5] MC ONX2490 10/05/22 2490
82317 시계 질문이에요 도와주세요~ [5] 영웅의물량2175 10/05/22 2175
82316 4D 상영관 어디어디 있나요? [2] 라우르2533 10/05/22 2533
82315 방금 스타리그 결승 질문입니다~ [8] 언데드네버다1686 10/05/22 1686
82314 오늘 결승전 재방송이나 VOD 등등 질문입니다. [3] 베컴2042 10/05/22 2042
82313 방금 온게임넷 결승전 대한항공 스타리그 영상 나올때 노래가 뭐죠? [1] 박보영♡2178 10/05/22 2178
82312 매너빌드에 대해서... [2] Only유리1828 10/05/22 1828
82311 부스걸질문입니다! [3] 몽키D드래곤2502 10/05/22 2502
82310 네이트온 로그인 기록 질문입니다. [6] abrasax_:JW2807 10/05/22 2807
82309 c++ 능력자분들 저좀 이해할수있게도와주세요 [6] ROMANMAX1726 10/05/22 1726
82308 3~5명이서 할수있는 재밌는워크유즈맵추천좀! [6] Yuki11038 10/05/22 11038
82307 선거유세 몇시까지 가능한가요? [1] 둥이2153 10/05/22 2153
82305 철권 캐릭터 상성 질문입니다. [2] 창천룡2825 10/05/22 2825
82304 일본 드라마와 노래질문~ [5] 유안1928 10/05/22 1928
82303 렌즈 시그마 삼식이, 소니 50 F1.8 SAM 고민이요 [4] 알콜스타2274 10/05/22 2274
82302 저도 챔피언스 리그 결승전 질문 [8] wish burn2090 10/05/22 2090
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로