4월 15일 학습 내용
구조체
- 절차적 프로그래밍 ex)순서도
-> 1) 순서대로
-> 2) 순서를 '제어'
-> 3) 원하는 기능 구현
추상화
-> 현상을 간략화/기호화/보편화 해서 표현한것
-> 주로 배열, 구조체, 함수를 이용해서 추상화를 한다.
- 추상화가 왜 필요한가
코드는 사람이 짜는 것이기 때문에!
-> 다른 사람이 코드를 해석하기 편리해야 한다.
-> 다른 사람이 인수인계를 받아서 유지보수 하기 편리해야 한다.
-> 다른 사람들과 함께 공동으로 코드를 만들기 편리해야 한다.배열 : 속성이 동일한 여러 개의 데이터를 같은 이름과 순서를 지정한 연속된 번호로 서로 연관 되어 있음을 표시함으로서 추상화함
구조체 : 데이터(자료형)을 실제로 쓰이는 데이터끼리 묶어서 추상화
함수 : 프로세스(코드)를 특정 기능 단위로 묶어서 추상화 한다.최악의 추상화 -> 추상화 단계를 상승시키는 과정
- 구조적 프로그래밍
-> 소스코드의 의도/의미를 파악할 수 있도록 구조적으로 나누는 프로그래밍
-> 데이터 구조화 ex) 배열, 리스트, 구조체 등. (자료구조)
-> 프로세스 구조화 ex) 함수 등. - 객체지향 프로그래밍
구조체
-> 변수를 모아 놓은 집합체
-> 특정 변수들이 무언가의 하위 개념으로 묶일 수 있을 때
ex) studentName[10], studentAge[10], studentKorScore[10] ....
위 변수들은 '학생'의 'XXX'로 나뉘어져있다.
∴ 이름, 나이, 국어점수, 석차 등등을 '학생'이라는 구조체로 묶어서 사용
1. 구조체를 정의하는 위치 : 구조체가 사용되는 함수의 앞에 정의한다.
2. 구조체 정의 방법
struct 구조체 이름{
구조체 안의 하위 변수들
};
ex)
struct student {
string name;
int age;
int homeTown;
int pride;
}seoyeon, jaehyuk; //처럼 구조체 끝나는 중괄호 뒤에 변수를 미리 선언할 수 있다.
// 위에 따르면 name, age, homeTown, pride를 하위변수를 가진 구조체 student형성
- 구조체는 일종의 우리가 새롭게 만든 데이터 형.
3. 구조체 사용 방법
student abcd (구조체를 사용할 변수이름)
abcd.name
abcd.age
abcd.homeTown
abcd.pride
// 형식으로 사용 가능
- 구조체 안에서 사용 가능한 변수
- 일반적인 변수(int, float, string 등), 배열, 먼저 선언된 구조체, 클래스 등 대부분 사용가능
4. 구조체 선언과 초기화
. 기본적으로 구조체 변수의 개념은 배열 변수의 개념과 동일
. int a[3] = { 50, 70, 80 };
. 구조체 변수도 다음과 같이 선언과 같이 초기화를 진행 할 수 있다.
탈출게임 구조체 추가하여 심화버전
#include <iostream>
#include <string>
#include <conio.h>
#include <Windows.h>
using namespace std;
struct player {
int stamina;
char inputMoveKey;
int playerXPosition;
int playerYPosition;
};
struct escape {
int escapeXPosition;
int escapeYPosition;
};
struct field { //0:평지, 1:벽, 2:숲, 3:늪지
int map[20][20];
int mapmemory[20][20];
int wallCount;
int forestCount;
int swampCount;
};
struct control {
bool isClear = false;
int stageCount;
int inputStage;
int failCount;
int fieldCheckNum;
};
int main()
{
system("mode con: cols=100 lines=40");
srand(time(NULL));
int x = 0, y = 0; // for문을 위한 변수
player person = { 60,0,0,0 };
escape escap;
field map;
control menu;
menu.stageCount = 1;
menu.failCount = 0;
cout << "플레이 하고싶은 스테이지의 수를 입력하세요 >> _";
cin >> menu.inputStage;
while (1) {
for (x = 0; x < 20; x++) { //맵 전부 평지화
for (y = 0; y < 20; y++) {
map.map[x][y] = 0;
}
}
x = rand() % 5 + 15;
y = rand() % 5 + 15;
map.map[x][y] = 9;
escap.escapeXPosition = x;
escap.escapeYPosition = y;
person.playerXPosition = 0;
person.playerYPosition = 0;
map.map[person.playerXPosition][person.playerYPosition] = 7;
map.wallCount = 0;
map.forestCount = 0;
map.swampCount = 0;
while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 1사분면 지형처리
x = rand() % 10;
y = rand() % 10;
menu.fieldCheckNum = rand() % 3 + 1;
if (x != 0 && y != 0 && menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3 && map.map[x][y] != 7) {
map.map[x][y] = 1;
map.wallCount++;
}
else if (x != 0 && y != 0 && menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3 && map.map[x][y] != 7) {
map.map[x][y] = 2;
map.forestCount++;
}
else if (x != 0 && y != 0 && menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2 && map.map[x][y] != 7) {
map.map[x][y] = 3;
map.swampCount++;
}
}
map.wallCount = 0;
map.forestCount = 0;
map.swampCount = 0;
while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 2사분면 지형처리
x = rand() % 10;
y = rand() % 10 + 10;
menu.fieldCheckNum = rand() % 3 + 1;
if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3) {
map.map[x][y] = 1;
map.wallCount++;
}
else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3) {
map.map[x][y] = 2;
map.forestCount++;
}
else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2) {
map.map[x][y] = 3;
map.swampCount++;
}
}
map.wallCount = 0;
map.forestCount = 0;
map.swampCount = 0;
while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 3사분면 지형처리
x = rand() % 10 + 10;
y = rand() % 10;
menu.fieldCheckNum = rand() % 3 + 1;
if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3) {
map.map[x][y] = 1;
map.wallCount++;
}
else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3) {
map.map[x][y] = 2;
map.forestCount++;
}
else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2) {
map.map[x][y] = 3;
map.swampCount++;
}
}
map.wallCount = 0;
map.forestCount = 0;
map.swampCount = 0;
while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 4사분면 지형처리
x = rand() % 10 + 10;
y = rand() % 10 + 10;
menu.fieldCheckNum = rand() % 3 + 1;
if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
map.map[x][y] = 1;
map.wallCount++;
}
else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
map.map[x][y] = 2;
map.forestCount++;
}
else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
map.map[x][y] = 3;
map.swampCount++;
}
}
for (x = 0; x < 20; x++) {
for (y = 0; y < 20; y++) {
map.mapmemory[x][y] = map.map[x][y];
}
}
while (1) {
for (x = 0; x < 20; x++) {
for (y = 0; y < 20; y++) {
map.map[x][y] = map.mapmemory[x][y];
}
}
map.map[0][0] = 0;
map.map[person.playerXPosition][person.playerYPosition] = 7;
system("cls");
cout << "\t┌───────────────────────┐" << endl;
cout << "\t│ 남은스태미너 : " << person.stamina << "\t│" << endl;
cout << "\t└───────────────────────┘" << endl;
cout << "\t << " << menu.stageCount << " 스테이지 >>" << endl;
cout << "\t << 남은 기회 - " << 3 - menu.failCount << " >>" << endl;
cout << "\t << 남은 스테이지 - " << menu.inputStage - menu.stageCount << " >>" << endl;
cout << "■■■■■■■■■■■■■■■■■■■■■■" << endl;
for (x = 0; x < 20; x++) {
cout << "■";
for (y = 0; y < 20; y++) {
if (map.map[x][y] == 0) {
cout << " ";
}
else if (map.map[x][y] == 1) {
if (person.playerXPosition - 2 <= x && person.playerXPosition + 2 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
cout << "■";
}
else {
cout << " ";
}
}
else if (map.map[x][y] == 2) {
if (person.playerXPosition - 2 <= x && person.playerXPosition + 2 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
cout << "♠";
}
else {
cout << " ";
}
}
else if (map.map[x][y] == 3) {
if (person.playerXPosition - 2 <= x && person.playerXPosition + 1 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
cout << "▩";
}
else {
cout << " ";
}
}
else if (map.map[x][y] == 7) {
cout << "●";
}
else if (map.map[x][y] == 9) {
cout << "E";
}
}
cout << "■" << endl;
}
cout << "■■■■■■■■■■■■■■■■■■■■■■" << endl;
cout << " ■ : 벽 / : 길(이동시 스태미너 1소모)/ ♠ : 숲(이동시 스태미너 2소모)" << endl;
cout << " ▩ : 늪(이동시 스태미너 3소모) / E : 탈출구" << endl;
cout << "이동 => w : 위 / s : 아래 / a : 왼쪽 / b : 오른쪽" << endl;
person.inputMoveKey = _getch();
if (person.inputMoveKey >= 65 && person.inputMoveKey <= 90) { //입력한게 대문자였을경우 소문자로 변환
person.inputMoveKey += 32;
}
switch (person.inputMoveKey) {
case 'w': //위쪽 이동
if (person.playerXPosition != 0 && map.map[person.playerXPosition - 1][person.playerYPosition] != 1) { //배열에서[0][]일경우 위쪽으로 이동할 수 없어야함
map.map[person.playerXPosition][person.playerYPosition] = 0;
person.playerXPosition--;
if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
person.stamina -= 2;
}
else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
person.stamina -= 3;
}
else
{
person.stamina--;
}
}
break;
case 'a': //왼쪽 이동
if (person.playerYPosition != 0 && map.map[person.playerXPosition][person.playerYPosition - 1] != 1) { //배열에서 [][0]일경우 왼쪽으로 이동 할 수 없어야함
if (map.map[person.playerXPosition][person.playerYPosition - 1] == 5) {
}
map.map[person.playerXPosition][person.playerYPosition] = 0;
person.playerYPosition--;
if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
person.stamina -= 2;
}
else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
person.stamina -= 3;
}
else
{
person.stamina--;
}
}
break;
case 's': //아래쪽 이동
if (person.playerXPosition != 19 && map.map[person.playerXPosition + 1][person.playerYPosition] != 1) { //배열에서 [20][]일경우 아래쪽으로 이동 할 수 없어야함
if (map.map[person.playerXPosition + 1][person.playerYPosition] == 5) {
}
map.map[person.playerXPosition][person.playerYPosition] = 0;
person.playerXPosition++;
if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
person.stamina -= 2;
}
else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
person.stamina -= 3;
}
else
{
person.stamina--;
}
}
break;
case 'd': //오른쪽 이동
if (person.playerYPosition != 19 && map.map[person.playerXPosition][person.playerYPosition + 1] != 1) { //배열에서 [][20]일경우 오른쪽으로 이동 할 수 없어야함
if (map.map[person.playerXPosition][person.playerYPosition + 1] == 5) {
}
map.map[person.playerXPosition][person.playerYPosition] = 0;
person.playerYPosition++;
if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
person.stamina -= 2;
}
else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
person.stamina -= 3;
}
else
{
person.stamina--;
}
}
break;
}
if (person.playerXPosition == escap.escapeXPosition && person.playerYPosition == escap.escapeYPosition) {
person.stamina = 60;
menu.stageCount++;
break;
}
else if (person.stamina <= 0) {
system("cls");
cout << endl << endl;
cout << "\t\t┌───────────────────────────────────────────┐" << endl;
cout << "\t\t│ 탈출에 실패했습니다. 남은 기회 확인 중 │" << endl;
cout << "\t\t└───────────────────────────────────────────┘" << endl;
person.stamina = 60;
menu.failCount++;
Sleep(2000);
break;
}
}
if (menu.stageCount > menu.inputStage) {
menu.isClear = true;
break;
}
else if (menu.failCount > 5) {
menu.isClear = false;
break;
}
}
if (menu.isClear) {
system("cls");
cout << endl;
cout << " ■ ■ ■■ ■ ■ ■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■ ■ ■ ■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■■ ■■ ■ ■ ■■■■" << endl;
cout << endl;
cout << " ■■■■ ■■■ ■■■ ■■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■■■■ ■■■■ ■ ■■■■ ■■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■■■■ ■■■ ■■■ ■ ■ ■ ■■■■" << endl;
cout << endl;
cout << " ■■■ ■ ■■■■ ■■ ■■■ ■ ■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■ ■■■■ ■■■■ ■■■ ■ ■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ " << endl;
cout << " ■■■ ■■■■ ■■■■ ■ ■ ■ ■ ■ ■" << endl << endl;
cout << "\t\t┌────────────────────────────┐" << endl;
cout << "\t\t│ 탈출에 성공했습니다. │" << endl;
cout << "\t\t└────────────────────────────┘" << endl;
}
else {
system("cls");
cout << endl;
cout << " ■ ■ ■■ ■ ■ ■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■ ■ ■ ■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■■ ■■ ■ ■ ■■■■" << endl;
cout << endl;
cout << " ■ ■ ■■ ■■■■■" << endl;
cout << " ■■ ■ ■ ■ ■" << endl;
cout << " ■ ■ ■ ■ ■ ■" << endl;
cout << " ■ ■■ ■ ■ ■" << endl;
cout << " ■ ■ ■■ ■" << endl;
cout << endl;
cout << " ■■■■ ■■■ ■■■ ■■ ■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■■■■ ■■■■ ■ ■■■■ ■■■■ ■■■■" << endl;
cout << " ■ ■ ■ ■ ■ ■ ■" << endl;
cout << " ■■■■ ■■■ ■■■ ■ ■ ■ ■■■■" << endl;
cout << "\t\t┌────────────────────────────┐" << endl;
cout << "\t\t│ 탈출에 실패했습니다. │" << endl;
cout << "\t\t└────────────────────────────┘" << endl;
}
}
Viusal Studio 학습내용
/*
구조체
1. 절차적
2. 구조적
3. 객체지향적
### 추상화 ###
C언어에서 코드를
추상화 하는데 사용되는 삼총사 : 배열, 구조체, 함수
추상화 : 현상을 간략화 / 기호화 / 보편화 해서 표현한것
코드에서 추상화가 필요한 이유 : 코드는 사람이 짜는 것이기 때문에
다른 사람이 코드를 해석하기 편리해야 하고
다른 사람이 인수인계받아서 유지보수 하기 편리해야 하고
다른 사람들과 함께 공동으로 코드를 만들기 편리해야하고
- 배열 : 속성이 동일한 여러 개의 데이터를 같은 이름과 순서를 지정한 연속된 번호로 서로 연관 되어 있음을 표시함으로서 추상화함
- 구조체 : 데이터(자료형)을 실제로 쓰이는 데이터끼리 묶어서 추상화
- 함수 : 프로세스(코드)를 특정 기능 단위로 묶어서 추상화
최악의 추상화 -> 추상화 단계를 상승시키는 과정
string a, b, c; // <- 최악의 추상화
string a[3]; // <- 위보다는 좀 낫다
string name1, name2, name3; // <- 조금 더 나아지고
string studentName[3]; // <- 위의 것보다 의도가 명료하게 드러나기 떄문에 좋은 추상화다.
*/
/*
구조체
- 변수를 모아 놓은 집합체
- 특정 변수들이 무언가의 하위 개념으로 묶일 수 있을 때
- studentName[10], studentAge[10], studentKorScore[10] ....
- 위 변수들은 '학생'의 XXX로
∴ 이름, 나이, 국어점수, 석차 등등을 '학생'이라는 구조체로 묶어서 사용
1. 구조체를 정의하는 위치 : 구조체가 사용되는 함수의 앞에 정의한다.
{ 해당 함수의 바깥쪽 앞(위) }
2. 구조체 정의의 방법
struct 구조체 변수 명 {
구조체 안에 들어갈 하위 변수들;
};
-> 구조체는 일종의 우리가 새롭게 만든 데이터형.
3. 구조체 선언과 초기화
기본적으로 구조체 변수의 개념은 배열 변수의 개념과 동일
int a[3] = { 50, 70, 80 };
구조체 변수도 다음과 같이 선언과 같이 초기화를 진행 할 수 있다.
player.HP = player.HP - monster[n].dmg;
*/
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <Windows.h>
#include <string>
using namespace std;
//구초체 정의 위치
struct score {
int kor;
int eng;
int math;
};
struct student {
string name; //일반 변수 사용 가능
int monthlyScore[10]; //배열도 사용가능
int age;
string homeTown;
int pride;
score myScore; //미리 정의한 구조체도 변수로 사용 가능
}seoyeon,jaehyuk; //처럼 중괄호 뒤에 변수 이름을 미리 선언할 수 있다.
// name, age, homeTown, pride라는 하위 변수를 가지고 있는 student라는 구조체를 정의 한다.
int main() // 지금 우리가 쓰고있는 유일한 함수
{
//구조체 사용 방법
student doil;
doil.name = "박도일"; // 구조체를 사용하는 변수의 이름값
doil.age = 27; //구조체를 사용하는 변수의 나이값
doil.homeTown = "전주"; //구조체를 사용하는 변수의 고향값
doil.pride = 97; //구조체를 사용하는 변수의 자신감값
doil.myScore.eng = 70;
doil.myScore.kor = 75;
doil.monthlyScore[0] = 90;
score myScore = { 50, 80, 90 }; //배열을 초기화 하듯 구조체도 초기화 가능.
cout << myScore.kor << " " << myScore.eng << " " << myScore.math << endl;
//monster a = { "고블린", 79, 55.12f, true, 100 }; 처럼 다양한 변수가 있는 구조체에도 한번에 초기화 가능.
//초간단 실습. student 구조체를 사용해서 자기 자신의 정보를 입력하고 확인해보자.
cout << doil.name << endl;
cout << doil.age << endl;
cout << doil.homeTown << endl;
cout << doil.pride << endl;
cout << doil.monthlyScore[0] << endl;
/*
과제 : 미궁탈출 게임의 업데이트
사용할 수 있는 모든 요소에 구조체를 활용해서 소스코드를 개선하기.
맵 타일에 지형 정보를 넣고(숲, 늪, 평지)
player : 피로도를 넣고
플레이어가 어느 지형에 있는지, 플레이어의 피로도가 얼마인지 (숲-2, 늪-3, 평지-1)
*/
}
Author And Source
이 문제에 관하여(4월 15일 학습 내용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@poker5323/4월-15일-학습-내용저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)