게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c++ 코알못이 질문드립니다... 좀 긴 코드인데요.
게시물ID : programmer_10664짧은주소 복사하기
작성자 : 반갑습네다
추천 : 0
조회수 : 640회
댓글수 : 8개
등록시간 : 2015/06/01 02:27:25
옵션
  • 본인삭제금지
할 게 없어서 저번에 뱀게임 만들고,

갤러그 게임 만드는데...

도중에 팅깁니다..!!!

디버그할 때 중단되는 지점이 여러 곳에서 중단되는데, 에러메세지는 같습니다.

~~에서 액세스 위반이 발생했습니다. 라고 뜹니다.

http://blog.daum.net/sbshope/7787945 
라는 블로그에서 보니

예가 두 가지가 있더라구요.

첫번째 예는 포인터를 안써서 아닐거라 생각이 들고,,

두번째 예는 자주 겪던 일이라 아닐거라 생각이 들었을 뿐더러, 디버그할 때 중단되는 지점이 배열을 안쓰는 부분에서 중단됩니다!!!

이를 어떻게 해야할까요..?

짠 건 5시간인데 디버깅만 5시간을 넘게하고 있네용..

아! 대충 보시고 코드 짜는 방식이 괜찮은지만 봐주셔도 감사하겠습니다!

#include <windows.h>
#include <iostream>
#include <conio.h>
#include <random>
#include <time.h>
#include <string>
using namespace std;
#define LEFT 75
#define RIGHT 77
#define UP 72 
#define DOWN 80
#define OBJ_NUM 10
void gotoxy(int x, int y)
{
COORD pos = { x, y }; 
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
char pan[50][20];//O는 적을 말하고, M은 본인을 말함
struct POSITION{
int x=25;
int y=5;
};
class BULLET{
public:
BULLET(){};
POSITION pos; //총알의 좌표
int isON = 0; //총알 활성화되었는지?
int origin_speed = 3; //총알의 속도
int speed = origin_speed;
char attack = 'i'; //총알의 모양
void bulletmove(){ //총알 이동
if (attack == 'i'){ //나의 것
if (isON=1){
gotoxy(pos.x, pos.y); printf(" "); pan[pos.x][pos.y] = ' ';
if (pos.y < 1){
isON = 0;
return;
}
pos.y--;
if (pan[pos.x][pos.y] == 'O'){//총알이 관통 안하게
isON = 0;
pan[pos.x][pos.y] = 'i';
return;
}
gotoxy(pos.x, pos.y); printf("i"); pan[pos.x][pos.y] = 'i';
}
}
else { //적의 것
gotoxy(pos.x, pos.y); printf(" "); pan[pos.x][pos.y] = ' ';
if (pos.y > 19){
isON = 0;
return;
}
pos.y++;
gotoxy(pos.x, pos.y); printf("%c", attack); pan[pos.x][pos.y] = attack;
}
}
};
class SHIP{
public:
static int del_s;//적 제거수
SHIP(){}
BULLET bullet[5]; //총알 최대 5개
SHIP(int r, char att, string sh, int x, int y){
for (int i = 0; i < 5; i++){
bullet[i].origin_speed = r;
bullet[i].attack = att;
}
ship = sh;
pos.x = x;
pos.y = y;
}
string getship(){
return ship;
}
void AI(){//양 옆으로 이동하는 AI
if (!isON) return; //죽으면 이동안함
if (direction == RIGHT){
if (pos.x + 5 > 50) {
direction = LEFT;
return;
}
else if (pan[pos.x + 5][pos.y] != ' ') {
direction = LEFT;
return;
}
else{
gotoxy(pos.x, pos.y);
printf("     "); pan[pos.x][pos.y] = ' '; pan[pos.x + 1][pos.y] = ' '; pan[pos.x + 2][pos.y] = ' '; pan[pos.x + 3][pos.y] = ' '; pan[pos.x + 4][pos.y] = ' ';
pos.x++;
gotoxy(pos.x, pos.y);
printf("mmVmm"); pan[pos.x][pos.y] = 'O'; pan[pos.x + 1][pos.y] = 'O'; pan[pos.x + 2][pos.y] = 'O'; pan[pos.x + 3][pos.y] = 'O'; pan[pos.x + 4][pos.y] = 'O';
}
}
if (direction == LEFT){
if (pos.x - 1 < 1){
direction = RIGHT;
return;
}
else if (pan[pos.x - 1][pos.y] != ' '){
direction = RIGHT;
return;
}
else{
gotoxy(pos.x, pos.y);
printf("     "); pan[pos.x][pos.y] = ' '; pan[pos.x + 1][pos.y] = ' '; pan[pos.x + 2][pos.y] = ' '; pan[pos.x + 3][pos.y] = ' '; pan[pos.x + 4][pos.y] = ' ';
pos.x--;
gotoxy(pos.x, pos.y);
printf("mmVmm"); pan[pos.x][pos.y] = 'O'; pan[pos.x + 1][pos.y] = 'O'; pan[pos.x + 2][pos.y] = 'O'; pan[pos.x + 3][pos.y] = 'O'; pan[pos.x + 4][pos.y] = 'O';
}
}
}
void die(){
if (opp == 0){
isON = 0; //목숨이 다함
del_s++;
gotoxy(70, 10);
printf("%d", SHIP::del_s);
return;
}
for (int i = 0; i < 5; i++){
if (pan[pos.x + i][pos.y] == 'i'){
opp--;
gotoxy(pos.x, pos.y);
printf("     ");
pan[pos.x][pos.y] = ' ';
pan[pos.x + 1][pos.y] = ' ';
pan[pos.x + 2][pos.y] = ' ';
pan[pos.x + 3][pos.y] = ' ';
pan[pos.x + 4][pos.y] = ' ';
}
}

} //총알에 맞았는지
POSITION pos; //우주선의 좌표
int origin_speed = 10 + rand() % 10;//양옆 이동스피드
int speed = origin_speed;
int isON = 1; //활성화되었는지?
int opp = 3; //목숨, 적은 목숨이 3개
int origin_bull_go = 50 + rand() % 30;//총알이 나가는 간격
int bull_go = origin_bull_go;
private:
int direction = RIGHT;//양옆 이동방향
string ship = "wWAWw";//우주선의 모양
};
int SHIP::del_s = 0;
SHIP mySHIP;
int main(){
srand(unsigned int(time(NULL)));
for (int i = 0; i < 50; i++){
for (int j = 0; j < 20; j++){
pan[i][j] = ' ';
}
}
SHIP obj[OBJ_NUM] = 
{ SHIP(5 + rand() % 5, '!', "mmVmm", 4, 6), SHIP(5 + rand() % 5, '!', "mmVmm", 4, 5),
SHIP(5 + rand() % 5, '!', "mmVmm", 24, 1), SHIP(5 + rand() % 5, '!', "mmVmm", 34, 3) ,
SHIP(5 + rand() % 5, '!', "mmVmm", 24, 2), SHIP(5 + rand() % 5, '!', "mmVmm", 44, 1) ,
SHIP(5 + rand() % 5, '!', "mmVmm", 14, 3), SHIP(5 + rand() % 5, '!', "mmVmm", 24, 7) ,
SHIP(5 + rand() % 5, '!', "mmVmm", 14, 4), SHIP(5 + rand() % 5, '!', "mmVmm", 34, 5) };
for (int i = 0; i < 22; i++){
gotoxy(55, i); printf("#");
}
for (int i = 0; i < 55; i++){
gotoxy(i, 21); printf("#");
}
mySHIP.pos.x = 25;
mySHIP.pos.y = 18;
int gameover = 0;
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
cout << mySHIP.getship();
pan[mySHIP.pos.x][mySHIP.pos.y] = 'M';
pan[mySHIP.pos.x + 1][mySHIP.pos.y] = 'M';
pan[mySHIP.pos.x + 2][mySHIP.pos.y] = 'M';
pan[mySHIP.pos.x + 3][mySHIP.pos.y] = 'M';
pan[mySHIP.pos.x + 4][mySHIP.pos.y] = 'M';
for (int i = 0; i < OBJ_NUM; i++){ //맨처음 적 모양 생성
gotoxy(obj[i].pos.x, obj[i].pos.y);
cout << obj[i].getship();
pan[obj[i].pos.x][obj[i].pos.y] = 'O';
pan[obj[i].pos.x + 1][obj[i].pos.y] = 'O';
pan[obj[i].pos.x + 2][obj[i].pos.y] = 'O';
pan[obj[i].pos.x + 3][obj[i].pos.y] = 'O';
pan[obj[i].pos.x + 4][obj[i].pos.y] = 'O';
}
gotoxy(57, 10);
printf("적 제거 수 : 0");
while (gameover == 0){
Sleep(15);
for (int i = 0; i < 5; i++)
if (pan[mySHIP.pos.x+i][mySHIP.pos.y] == '!')
gameover = 1;
for (int i = 0; i < OBJ_NUM; i++){
if (obj[i].isON==1){
obj[i].die(); //적이 총알에 맞았는지
}
if (--obj[i].bull_go == 0 && obj[i].isON==1){//bullet shot
obj[i].bull_go = obj[i].origin_bull_go;
for (int j = 0; j < 5; i++){
if (obj[i].bullet[j].isON==0){
obj[i].bullet[j].pos.x = obj[i].pos.x + 2;
obj[i].bullet[j].pos.y = obj[i].pos.y + 1;
gotoxy(obj[i].bullet[j].pos.x, obj[i].bullet[j].pos.y);
printf("!");
obj[i].bullet[j].isON = 1;
break;
}
}
}
if (--obj[i].speed == 0){//obj ship move
obj[i].AI();
obj[i].speed = obj[i].origin_speed;
}
}
for (int i = 0; i < OBJ_NUM; i++){//obj ship bullet
for (int j = 0; j < 5; j++){
if (obj[i].bullet[j].isON==1){
if (--obj[i].bullet[j].speed == 0){
obj[i].bullet[j].speed = obj[i].bullet[j].origin_speed;
obj[i].bullet[j].bulletmove();
}
}
}
}
for (int i = 0; i < 5; i++){//my ship bullet
if (mySHIP.bullet[i].isON==1){
if (--mySHIP.bullet[i].speed == 0){
mySHIP.bullet[i].speed = mySHIP.bullet[i].origin_speed;
mySHIP.bullet[i].bulletmove();
}
}
}
if (_kbhit()){ //이동, 공격
int tmp = _getch();
if (tmp == LEFT && mySHIP.pos.x > 0){
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("     "); pan[mySHIP.pos.x][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = ' ';
mySHIP.pos.x--;
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("wWAWw"); pan[mySHIP.pos.x][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = 'M';
}
else if (tmp == RIGHT && mySHIP.pos.x < 50){
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("     "); pan[mySHIP.pos.x][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = ' ';
mySHIP.pos.x++;
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("wWAWw"); pan[mySHIP.pos.x][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = 'M';
}
else if (tmp == UP&&mySHIP.pos.y > 10){
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("     "); pan[mySHIP.pos.x][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = ' ';
mySHIP.pos.y--;
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("wWAWw"); pan[mySHIP.pos.x][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = 'M';
}
else if (tmp == DOWN&&mySHIP.pos.y < 20) {
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("     "); pan[mySHIP.pos.x][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = ' '; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = ' ';
mySHIP.pos.y++;
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("wWAWw"); pan[mySHIP.pos.x][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 1][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 2][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 3][mySHIP.pos.y] = 'M'; pan[mySHIP.pos.x + 4][mySHIP.pos.y] = 'M';
}
else if (tmp == 'x'){
for (int i = 0; i < 5; i++){
if (mySHIP.bullet[i].isON==0){
mySHIP.bullet[i].pos.x = mySHIP.pos.x + 2;
mySHIP.bullet[i].pos.y = mySHIP.pos.y - 1;
gotoxy(mySHIP.pos.x + 2, mySHIP.pos.y - 1);
printf("i");
mySHIP.bullet[i].isON = 1;
break;
}
}
}
}
if (SHIP::del_s == OBJ_NUM){//적의 수만큼 잡았을 때
printf("\n게임 클리어!\n스페이스 바를 누르면 종료합니다.\n");
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
break;
}
}
if (gameover == 1){
system("cls");
printf("적 제거 수 : %d", SHIP::del_s);
gotoxy(mySHIP.pos.x, mySHIP.pos.y);
printf("\n게임 오버\n스페이스 바를 누르면 종료합니다.\n");
}
while (_getch() != ' '){};
return 0;
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호