이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
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은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
|