1. public
-> 어디에서든지 해당 변수나 메소드에 접근 가능하고 유니티엔진의 Inspector에 노출
2. private
-> 해당 클래스 내부에서만 사용 가능
3. protected
-> 참조 받은 클래스에서만 사용 가능
4. internal
-> 같은 어셈블리내에서만 public 으로 접근 가능
5. Default
->기본값으로 private으로 선언
1. public
-> 어디에서든지 해당 변수나 메소드에 접근 가능하고 유니티엔진의 Inspector에 노출
2. private
-> 해당 클래스 내부에서만 사용 가능
3. protected
-> 참조 받은 클래스에서만 사용 가능
4. internal
-> 같은 어셈블리내에서만 public 으로 접근 가능
5. Default
->기본값으로 private으로 선언
-물은 풍족한 것 같으면서도 부족해지기 쉽다
-물은 순화자원이어서 관리만 잘하면 지속적으로 이용할 수 있으나, 오염되면 정화하기 위해 다량의 에너지/대가를 사용하게 된다
-물은 그 중요성에 비해 관리가 가장 잘 이루어지고 있지 않은 자원이다
-해수(바닷물)는 일반적으로 사용할 수 없다
-수자원인 담수는 3% : 이 중 얼음 69%, 지하수 30%, 하천수 0.4%
-1950년 이후 세계 물 사용량 5배, 1인당 3배, 지표유출수 54% 사용, 20년후 2배이상 사용 예상
-1992년 11월 세계 물의 날(3월 22일) 제정, '국제 물 심포지엄' 에서는 앞으로 국제분쟁의 원인은 물이 될것이라 경고
-물 낭비에 따른 물 부족이 문제라면, 수요관리가 정책의 최우선 과제가 된다
-강수량 : 수자원 총량(30년 평균강수량x면적), 하천유출량(강수량-증발손실량)을 평가할 수 있는 중요 지표
-세계 연평균 강수량 감소 추세 : 973mm -> 880mm
-국내 1인당 강수총량(1인당 가용 수자원량) : 세계평균 1/5밖에 안됨
-국제인구행동연구소(PAI)의 물 스트레스 지수(1인당 연간 물 사용 가능량) = 연간 하천 유출량/ 인구수, 한국 1500m³으로 물 부족국가로 분류
-세계물포럼(WWF)의 물 빈곤지수(WPI, Water Poverty Indx) : 1인당 가용 수자원량/수자원 접근율/사회경제요소/물이용량/환경 등을 종합 고려, 한국 43위
-세계물포럼 : 세계물위원회(WWC)에서 제창/창설, 3년마다 개최, 영국 생태환경/수물학센터(CEH)를 통해 물 빈곤지수 개발
-한국은 수자원의 47% 이용 : 아시아 대비3배, 댐 건설로 이용률 증가
-취수시설의 상류 이동 -> 오염으로 인해 -> 댐 건설(용수공급/전력생산/홍수조절 등)
-현대식 최초 대형 댐 : 1936년 미국 콜로라도 221m 후버(Hoover)댐, 국내 1943년 청평댐
-댐의 문제점 :
상류/하류 상이의 생태계 단절, 생물의 이동 저해로 생태계 파편화, 자연적인 범람(영양물질 공급책)이 없어 생물종의 감소 초래
담수생태계파괴 - 퇴적물 운반을 막아 강 하구에서 바닷물에 의한 침식작용으로 퇴적토 유실을 보충하지 못함, 수질악화, 수몰민 문제, 안개일수 증가(국지적 기상이변)
-세계야생보호기금(WWF)의 '살아있는 지구 지표' (Linving Planet Index) : 담수지역에서 지표28%감소로 -> 어종 50%감소, 해양 생태학적 다양성 30% 감소
-국내 1997년 동강댐 건설 반대운동 : 환경문제에 대한 인식, 경제 성장중심에서 생태계보전 패러다임 구축으로 전환, 물 절약 범국민운동, 절수기기 개발 촉진
-"댐은 물을 안정적으로 공급하는 유일한 대안이 될 수 없다" -패트릭 맥컬리(Patrick McCully) : 댐의 유입 퇴적물로 저수용량지속적으로 감소
-생활하수/분뇨/축산폐수 수질오염으로 인해 수인성 질병 심각 : 세계 1.4만 ~3만명/일 사망
-공장폐수/농경지 유입 화학물질은 생태계 먹이사슬을 통해 간접적으로 문제 야기:
내분비계 장애물질(환경호르몬) - 중금속 카드뮴(Cd), 수은(Hg), 납(Pb), PCBs
미나마타병 : 메틸수은에 의한 중독
1991년 대구 페놀유출
북극곰의 생식능력 저하
-수돗물 : 취수한 강물을 침전/여과/정수(염소투입)과정
-해양심층수 : 햇빛이 들지않는 깊이 200m이하의 바닷물, 1980년대 개발, 저온안정성/청정성/미네랄/영양성분함유로 다양한상품화
-해양심층수 역시 고갈의 위험성을 안고 있는 잠재적 재생가능 자원이다
-물은 식량문제와 밀접한 연관, 국내 식량 자급20% vs 수입80%
파이썬 활용
클래스, 멤버변수, 메소드, 상속, 다중상속, 메소드, 오버라이딩, pass, super를 활용한 예시 프로젝트
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
from random import *
# 일반 유닛
class Unit:
def __init__(self, name, hp, speed):
self.name = name
self.hp = hp
self.speed = speed
print("{0} 유닛이 생성되었습니다".format(name))
def move(self, location):
print("{0} : {1} 방향으로 이동합니다[속도 {2}]".format(
self.name, location, self.speed))
def damaged(self, damage):
print("{0} : {1} 데미지를 입었습니다".format(self.name, damage))
self.hp -= damage
print("{0} : 현재 체력은 {1} 입니다".format(self.name, self.hp))
if self.hp <= 0:
print("{0} : 파괴되었습니다".format(self.name))
# 공격 유닛
class AttackUnit(Unit):
def __init__(self, name, hp, speed, damage):
Unit.__init__(self, name, hp, speed)
self.damage = damage
def attack(self, location):
print("{0} : {1} 방향으로 적군을 공격합니다 [공격력 {2}]".format(
self.name, location, self.damage))
# 마린
class Marine(AttackUnit):
def __init__(self):
AttackUnit.__init__(self, "마린", 40, 1, 5)
# 스팀팩
def stimpack(self):
if self.hp > 10:
self.hp -= 10
print("{0} : 스팀팩을 사용합니다 (HP 10 감소)".format(self.name))
else:
print("{0} : 체력이 부족하여 스팀팩을 사용하지 않습니다".format(self.name))
class Tank(AttackUnit):
# 시즈모드
seize_developed = False # 시즈 모드 개발 여부
def __init__(self):
AttackUnit.__init__(self, "탱크", 150, 1, 35)
self.seize_mode = False
def set_seize_mode(self):
if Tank.seize_developed == False:
return
# 현재 시즈모드가 아닐 때 -> 시즈모드
if self.seize_mode == False:
print("{0} : 시즈 모드로 전환합니다".format(self.name))
self.damage *= 2
self.seize_mode = True
# 현재 시즈모드 일 때 -> 해제
else:
print("{0} : 시즈 모드로 해제합니다".format(self.name))
self.damage /= 2
self.seize_mode = False
class Flyable:
def __init__(self, flying_speed):
self.flying_speed = flying_speed
def fly(self, name, location):
print("{0} : {1} 방향으로 날아갑니다 [속도 {2}]".format(
name, location, self.flying_speed))
class FlyableAttackUnit(AttackUnit, Flyable):
def __init__(self, name, hp, damage, flying_speed):
AttackUnit.__init__(self, name, hp, 0, damage) # 지상 스피드는 0
Flyable.__init__(self, flying_speed)
def move(self, location):
self.fly(self.name, location)
# 레이스
class Wraith(FlyableAttackUnit):
def __init__(self):
FlyableAttackUnit.__init__(self, "레이스", 80, 20, 5)
self.clocked = False # 클로킹 모드(해제 상태)
def clocking(self):
if self.clocked == True:
print("{0} : 클로킹 모드 해제 합니다".format(self.name))
self.clocked = False
else: # 클로킹 해제 -> 모드 설정
print("{0} : 클로킹 모드 설정 합니다".format(self.name))
self.clocked = True
def game_start():
print("[알림] 새로운 게임을 시작합니다")
def game_over():
print("Player : gg")
print("[Player] 님이 게임에서 퇴장하셨습니다")
# 실제 게임 시작
game_start()
m1 = Marine()
m2 = Marine()
m3 = Marine()
t1 = Tank()
t2 = Tank()
w1 = Wraith()
# 유닛 일괄 관리
attack_units = []
attack_units.append(m1)
attack_units.append(m2)
attack_units.append(m3)
attack_units.append(t1)
attack_units.append(t2)
attack_units.append(w1)
# 전군 이동
for unit in attack_units:
unit.move("1시")
# 탱크 시즈모드 개발
Tank.seize_developed = True
print("[알림] 탱크 시즈모드 개발 완료")
# 공격 모드준비 (마린 : 스팀팩, 탱크 : 시즈 모드 , 레이스 : 클로킹)
for unit in attack_units:
if isinstance(unit, Marine):
unit.stimpack()
elif isinstance(unit, Tank):
unit.set_seize_mode()
elif isinstance(unit, Wraith):
unit.clocking()
# 전국 공격
for unit in attack_units:
unit.attack("1시")
# 전군 피해
for unit in attack_units:
unit.damaged(randint(5, 20)) # 공격은 랜덤으로 받음(5~20)
# 게임 종료
game_over()
|
cs |
출처 유튜브 '나도코딩' [파이썬 코딩 무료강의 (기본편)]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#include<stdbool.h>
#include<time.h>
#define DINO_BOTTOM_Y 12
#define TREE_BOTTOM_Y 20
#define TREE_BOTTOM_X 45
//콘솔 창의 크기와 제목을 지정하는
void SetConsoleView() {
system("mode con:cons=100 lines=25");
system("title Google Dinosaurs. By BlockMask");
}
//커서의 위치를 x,y로 이동하는 함수
void GotoXY(int x, int y) {
COORD Pos;
Pos.X = 2 * x;
Pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
//키보드의 입력을 받고, 입력된 키의 값을 반환하는 함수
int GetKeyDown() {
if (_kbhit() != 0) {
return _getch();
}
return 0;
}
//공룡을 그리는 함수
void DrawDino(int dinoY) {
GotoXY(0, dinoY);
static bool legFlag = true;
printf(" $$$$$$$ \n");
printf(" $$ $$$$ $\n");
printf(" $$$$$$$$$\n");
printf("$ $$$ \n");
printf("$$ $$$$$$$ \n");
printf("$$$ $$$$$$ \n");
printf(" $$ $$$$$$$$$$ \n");
printf(" $$$$$$$$$$$ \n");
printf(" $$$$$$$$$$ \n");
printf(" $$$$$$$$ \n");
printf(" $$$$$$ \n");
if (legFlag) {
printf(" $ $$$ \n");
printf(" $$ ");
legFlag = false;
}
else {
printf(" $$$ $ \n");
printf(" $$ \n");
legFlag = true;
}
}
//나무 그리는 함수
void DrawTree(int treeX) {
GotoXY(treeX, TREE_BOTTOM_Y);
printf("$$$$");
GotoXY(treeX, TREE_BOTTOM_Y + 1);
printf(" $$ ");
GotoXY(treeX, TREE_BOTTOM_Y + 2);
printf(" $$ ");
GotoXY(treeX, TREE_BOTTOM_Y + 3);
printf(" $$ ");
GotoXY(treeX, TREE_BOTTOM_Y + 4);
printf(" $$ ");
}
void DrawGameOver(const int score) {
system("cls");
int x = 22;
int y = 10;
GotoXY(x, y);
printf("==============================");
GotoXY(x, y+1);
printf("========G A M E O V E R=======");
GotoXY(x, y+2);
printf("==============================");
GotoXY(x, y+5);
printf("SCORE : %d", score);
printf("\n\n\n\n\n");
system("pause");
}
//충돌 했으면 true , 아니면 false
bool isCollision(const int treeX, const int dinoY) {
//트리의 x가 공룡의 몸체쪽에 있을때
//공룡의 높이가 충분하지 않다면 충돌
GotoXY(0, 0);
printf("treeX : %d,dinoY : %d", treeX, dinoY);
if (treeX <= 8 && treeX >= 4 && dinoY > 8) {
return true;
}
return false;
}
int main(void) {
SetConsoleView();
while (true) {//게임 루프
bool isJumping = false;
bool isBottom = true;
const int gravity = 3;
int dinoY = DINO_BOTTOM_Y;
int treeX = TREE_BOTTOM_X;
int score = 0;
clock_t start, curr;
start = clock();
while (true) { //한 판에 대한 루프
if (isCollision(treeX, dinoY))
break;
//z가 눌렸고, 바닥이 아닐때만 점프가능
if (GetKeyDown() == 'z' && isBottom) {
isJumping = true;
isBottom = false;
}
//점프중 = y감소
//점프끝 = y증가
if (isJumping) {
dinoY -= gravity;
}
else {
dinoY += gravity;
}
//Y가 계속해서 증가하는걸 막기 위해 바닥을 지정
//Y가 증가한다는 것은 공룡이 아래로 내려온다는 뜻
if (dinoY >= DINO_BOTTOM_Y) {
dinoY = DINO_BOTTOM_Y;
isBottom = true;
}
//점프의 맨위를 찍으면 점프가 끝난 상황
if (dinoY <= 3) {
isJumping = false;
}
//나무가 왼쪽으로 가도록 하고(x의 음수방향)
//나무의 위치가 왼쪽 끝으로 가면 다시 초기 위치로 소환
treeX -= 2; //x축을 줄여서 왼쪽으로 가도록
if (treeX <= 0) { // 0 이되면 (왼벽에 닿으면)
treeX = TREE_BOTTOM_X; //다시 45값을 입력
}
DrawDino(dinoY);
DrawTree(treeX);
curr = clock(); //현재시간 받아오기
if (((curr - start) / CLOCKS_PER_SEC) >= 1) {
score++; //스코어 up
start = clock(); // 시간 시간 초기화
}
Sleep(60);
system("cls"); //clear
//점수출력을 항상출력 해주면서 1초마다 ++
GotoXY(22, 0);
printf("Score : %d", score);
}
//게임 오버
DrawGameOver(score);
}
return 0;
}
|
cs |
system 함수를 사용할 수 있다
Sleep(ms) : ms단위로 시스템을 잠시 멈춘다 (1000ms = 1s)
system("cls") : 콘솔창을 깨끗이 지운다
등등
console and port I/O 의 약자
대표적인 함수로는
int kbhhit : 버퍼에 값이 있으면 1, 없으면 0
(입력이 있었는지 없었는 지 판단하는 함수)
int getch() : 버퍼에 있는 값을 꺼내오는 함수
x,y위치를 가지고 있는 구조체
이 구조체 변수를 만들어서 x,y를 채워 넣어줍니다
2*x 를 넣어주는 이유는 2씩 이동하는게 자연스럽기 때문입니다
상수(constant), const 로 지정하면 그 값을 절대로 바꿀수 없다
(변수와 반대)
시간과 날짜에 대한 함수를 가지고 있습니다
clock() : 프로세서가 소비된 시간을 반환하는 함수(프로그램 실행 시간)
clock_t : clock ticks 의 자료를 담고 있는 자료형으로 clock()의 반환형
clocks_per_sec : 마아크로 초(ms)단위를 초(s)로 나타내려면 clocks_per_sec 으로 나누면 됩니다
*코드출처*
BlockDMask 님
깃허브:
github.com/BlockDMask/Google_Dino
블로그:
https://blockdmask.tistory.com/344
[C언어 게임] 구글 공룡 게임 만들기 (충돌처리 추가)
안녕하세요. BlockDMask 입니다. C언어나 C++을 책만보고 공부만하면 재미가 없잖아요. 그래서 제가 간단한 게임을 만들어서 소개해보려 합니다. 제가 만든 게임이 게임성이 없는 프로그램 일 수 있
blockdmask.tistory.com
| C언어 Up&Down 게임 (0) | 2021.02.26 |
|---|
1) 스택(Stack)은 한쪽으로 들어가서 한쪽으로 나오는 자료 구조(Data Structure) 입니다
즉, 들어가는 곳과 나오는 곳이 동일합니다
2) 이러한 특성 때문에 수식 계산 등의 알고리즘에서 다방면으로 활용됩니다
-PUSH: 스택에 데이터를 넣습니다
-POP: 스택에서 데이터를 빼냅니다
1) 스택(Stack)은 배열을 이용한 구현 방법과 연결 리스트를 이용한 구현 방버븡로 나누어 집니다
2) 가장 기본적인 형태의 자료구조로 구현 난이도는 낮은 편입니다
3) 먼저 배열을 이용한 구현 방법에 대해서 알아보겠습니다
배열을 이용해 스택을 활용한 예시
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10000
#define INF 99999999
int stack[SIZE];
int top = -1; //스택의 최상단
void push(int data) {
if (top == SIZE - 1) { //더 이상 데이터를 못 넣을때
printf("스택 오버플로우가 발생했습니다\n");
return;
}
stack[++top] = data;
}
int pop() {
if (top == -1) { //더 이상 데이터를 못 뺄때
printf("스택 언어플로우가 발생했습니다\n");
return -INF;
}
return stack[top--];
}
void show() {
printf("--- 스택의 최상단 ---\n");
for (int i = top; i >= 0; i--) {
printf("%d\n", stack[i]);
}
printf("--- 스택의 최하단 ---\n");
}
int main (void){
push(7);
push(5);
push(4);
pop();
push(6);
pop();
show();
return 0;
}
|
cs |
연결 리스트를 이용해 스택을 활용한 예시
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define INF 99999999
typedef struct {
int data;
struct Node* next;
}Node;
typedef struct {
Node* top;
} Stack;
void push(Stack* stack, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = stack->top;
stack->top = node;
}
void pop(Stack* stack) {
if (stack-> top == NULL) {
printf("스택 언더플로우가 발생했습니다\n");
return -INF;
}
Node* node = stack->top;
int data = node->data;
stack->top = node->next;
free(node);
return data;
}
void show(Stack* stack) {
Node* cur = stack->top;
printf("--- 스택의 최상단 ---\n");
while (cur != NULL) {
printf("%d\n", cur->data);
cur = cur->next;
}
printf("--- 스택의 최하단 ---\n");
}
int main (void){
Stack s;
s.top = NULL;
push(&s, 7);
push(&s, 5);
push(&s, 4);
pop(&s);
push(&s, 6);
pop(&s);
show(&s);
return 0;
}
|
cs |
이렇게 스택은 배열 , 연결 리스트를 이용해서 구현할 수 있습니다
| 양방향 연결 리스트 (0) | 2021.02.27 |
|---|---|
| 연결 리스트 (0) | 2021.02.17 |
| 자료구조의 개요 (0) | 2021.02.16 |