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
수정 아이콘
옛날 책에 있을만한 소스네요;;;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
82327 이런 여성분을 센스 있다고 하는건가요?? [41] AriENai3963 10/05/23 3963
82326 이 나이키 제품 정품인가요? [5] 아웅2438 10/05/23 2438
82325 3주후에 보자는 여자사람의 제안은....긍정의 의미일까요? 부정에 의미일까요? [8] 눈물의 싸이오2459 10/05/22 2459
82324 UPI통신이 통일교 소유인가요? [4] aSlLeR4676 10/05/22 4676
82323 지식인 배너창 정화중입니다 쓸고닦고~ 창이1602 10/05/22 1602
82321 2천만원을 재테크로 어떻게 해야? [5] EastVirus2108 10/05/22 2108
82320 왜 결승때 치킨 얘기가 많이 나오나요?-_-a [17] 창이2654 10/05/22 2654
82319 TV 시청 질문 aibON_cau1818 10/05/22 1818
82318 여성 그룹 시크릿에 관해서 질문을... [5] MC ONX2486 10/05/22 2486
82317 시계 질문이에요 도와주세요~ [5] 영웅의물량2174 10/05/22 2174
82316 4D 상영관 어디어디 있나요? [2] 라우르2532 10/05/22 2532
82315 방금 스타리그 결승 질문입니다~ [8] 언데드네버다1683 10/05/22 1683
82314 오늘 결승전 재방송이나 VOD 등등 질문입니다. [3] 베컴2040 10/05/22 2040
82313 방금 온게임넷 결승전 대한항공 스타리그 영상 나올때 노래가 뭐죠? [1] 박보영♡2175 10/05/22 2175
82312 매너빌드에 대해서... [2] Only유리1826 10/05/22 1826
82311 부스걸질문입니다! [3] 몽키D드래곤2500 10/05/22 2500
82310 네이트온 로그인 기록 질문입니다. [6] abrasax_:JW2784 10/05/22 2784
82309 c++ 능력자분들 저좀 이해할수있게도와주세요 [6] ROMANMAX1721 10/05/22 1721
82308 3~5명이서 할수있는 재밌는워크유즈맵추천좀! [6] Yuki10992 10/05/22 10992
82307 선거유세 몇시까지 가능한가요? [1] 둥이2151 10/05/22 2151
82305 철권 캐릭터 상성 질문입니다. [2] 창천룡2822 10/05/22 2822
82304 일본 드라마와 노래질문~ [5] 유안1925 10/05/22 1925
82303 렌즈 시그마 삼식이, 소니 50 F1.8 SAM 고민이요 [4] 알콜스타2268 10/05/22 2268
목록 이전 다음
댓글

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