대학교 3학년때 텀프로젝트로 만들었던 농산물 관리 프로그램을 소개하려고 합니다.
객체지향 프로그래밍 수업을 참여하면서 만들었던 텀프로젝트로 학부생의 수준에서 구현하였다는 것을 알아주셨으면 합니다.
1. 텀프로젝트 설계하기
텀프젝트르 진행하기 전 나는 무엇을 만들 것인지 설계해보는 시간을 가졌다.
당시에는 모여봐요 동물의숲이 유행하던 시절이였고, 거기에서 무트코인 요소가 하나의 밈으로 유행하였다.
매주 일요일에 방문하는 무파니 npc에게 무를 산다.
무의 가격은 매주 변화하며
플레이어는 이를 월요일부터 토요일까지 상점에 가격이 비싼날에 판매하면된다.
이를 생각해서 판든 텀프로젝트가 바로 "농산물 관리 프로그램"이다.
아무래도 교수님이나 다른 사람들에게 소개를 해야하기 때문에 제목은 무트코인을 살리거나 그럴 수는 없었고
모두가 이해하기 쉽게 만들었다.
교수님께서 강조하셨던 것은 클래스를 설계하고 객체를 설계하는 과정이라고 하셨다.
과제 상세 설명
프로젝트 제목: 농산물 수요예측 및 판매 시뮬레이션
과제 개요: 농수산물을 저렴한 가격에 매입, 혹은 직접 재배하여, 물류비용과 고객에 수요에 맞춰 적절한 가격을 설정하여, 판매하는 시뮬레이션 게임이다.
과제 동작 상세 설명: 1차 생산자가 수확한 농작물은 유통회사를 통해 한 곳에 모이게 되고, 물류회사를 통해 타지역으로 이동하게 된다. 그 후 각 지역의 유통업체들은 다시 물류회사를 통해 각 지역의 마트나 슈퍼에 납품하게된다. 유통회사에서는 가격을 올리게 되는 요인, 가격을 낮추게 되는 요인, 손해를 보게 되는 요인이 있다. 해당 시뮬레이션을 통해 유통회사의 입장에서 여러가지 다양한 요인에 따라 적절한 가격을 책정하는 것이 목표가 된다.
만약 이보다 더 복잡한 작업이 가능하다면, 시뮬레이션 플레이어는 1차 생산자의 역할도 하게되어, 자신이 직접 농산품을 생산하고 유통망을 통해 판매를 진행할 수도 있으나, 우선은 매입과 매도를 담당하는 유통회사의 역할만 구현하고, 시간이 남을 경우 구현하도록 하겠다.
해당 과제의 동작을 한가지 예를 들어보자. 일요일마다 방문하는 농부의 밭에서 농부는 감자가 풍년이라 개당 100원에 유통업체에 판매를 한다. 유통업체는 감자를 100개 매입한다. 감자는 유통업체의 창고에 쌓이게 되고, 적절한 때를 기다린다. 월요일날 감자의 소비자가는 개당 400원이다. 뉴스에 따르면 감자가 풍년이라 저렴한 가격에 판매가 가능 할 것이라고 한다. 물류 비용은 트럭에는 감자를 50개만 실어 나를 수 있고, 기름값에 따라 다르지만 오늘은 8000원이다. 그러면 시뮬레이션 플레이어는 감자 100개의 물류비용 16000원과 감자의 매입가 10000원에 감자가 풍년이라 가격이 떨어질 것이라 생각하여 마진 10000원만 추가하여 총 36000원 감자는 개당 360원에 판매를 결정한다. 감자는 다음날 소비자에게 도착한다.
화요일날 감자가 너무 풍년이라 가격이 300원까지 폭락하였다. 360원은 너무 비싸게 측정된 것이다. 이에 감자를 모두 판매하지 못하고 80%만 판매되고, 나머지는 폐기처분된다.
만약 월요일에 가격을 300~330원 이하로 판매하였다면, 감자를 모두 판매할 수 있었을 것이다.
뉴스에서 감자의 가격이 계속 떨어지는 불안한 소식만 들린다면 유통업체는 창고에 감자를 계속 보관할 수 있다. 그러나 이는 시뮬레이션 게임의 재미를 크게 떨어뜨릴 위험이 있기 때문에 모든 야채는 일요일이되면 상하게되고, 폐기처분한다.
감자는 한가지 예시일 뿐이다. 채소나 과일의 종류는 여러가지가 될 수도 있다. 플레이어는 마진을 통해 물류트럭을 더 구매할 수도 있고, 창고를 늘릴 수도 있다. 또한 플레이어의 모든 플레이 진행사항은 저장되어 이어하기가 가능하다.
과제 동작 상세 설명에서 객체
농산물, 유통회사, 물류회사, 농산물의 가격이 변하는 원인, 기름값의 가격이 변하는 원인, 소비자가의 가격이 변하는 원인, 가격, 요일, 농부의 밭, 감자, 창고, 감자가 풍년, 물류비용, 기름값, 트럭, 플레이어가 결정한 판매가격, 소비자가 원하는 가격, 물류트럭, 저장하기, 유통업체의 자산, 유통업체의 재고, 시뮬레이션 플레이어의 정보, 플레이어의 레벨(창고나 트럭을 더 늘린다.)
비슷한 객체끼리 묶는다.
1. 농산물, 감자, 가격
2. 농부, 농부가 생산한 농산물, 농산물의 가격
2. 유통회사, 창고, 유통업체의 자산, 유통업체의 재고
3. 월요일, 화요일 ~ 일요일
4. 물류회사, 기름값, 물류트럭, 가격
5. 기름값이 변하는 원인, 농산물의 매수가격이 변하는 원인, 농산물의 소비자가격이 변하는 원인
6. 소비자가격, 플레이어가 결정한 판매가격, 농작물의 가격
클래스 설계
-> 농작물의 이름과 가격을 가지는 클래스
농작물의 이름(예: 감자)
농작물의 가격(예 100원)
-> 생산자(농부)의 클래스
농부가 생산한 농산물
농부가 원하는 농산물의 판매가격
농부가 원하는 농산물의 판매가격의 이유
-> 유통회사의 클래스
유통회사의 창고(현재의 재고)
유통회사의 자산(현재의 재산)
유통회사의 레벨(재고를 더 보유할 수 있는, 한 번에 더 많이 팔 수 있는)
유통회사가 납품하길 원하는 가격
물류회사로부터 받아온 납품을 위한 물류가격
요일에 따라서 다른 행동(일요일은 매입, 나머지 요일은 매도)
-> 물류회사의 클래스
물류회사의 트럭
물류회사의 물류비용
물류비용의 변화 원인
기름값
-> 소비자 클래스
소비자가 생각하는 가격
소비자가 생각하는 가격의 원인
-> 가격의 변화 원인을 가지는 클래스
가격이 변화하는 원인
가격이 %변화할 것인가 하는 변수
-> 플레이어의 정보 (유통업체를 운영하는 플레이어)
플레이어의 이름
플레이어의 레벨
플레이어의 재산
-> 파일 입출력을 담당하는 클래스
파일을 txt나 바이너리 파일로 저장하는 클래스
파일을 txt나 바이너리 파일로 불러오는 클래스
-> 개발자 모드 클래스
농부가 판매하게될 농산품을 늘리기
가격이 변하는 원인들을 추가하기
(물류가격의 변화원인, 판매가격의 변화원인, 소비자가격의 변화원인)
-> 메인클래스
게임시작
이어하기
게임방법
개발자모드
종료하기
결과물
깃헙 링크 첨부
brainKimDu/JAVA_TermProjeck: Agricultural product management program (korean) (github.com)
게임시작을 누르면 게임을 시작한다.
그러면 기존의 userdata는 삭제되고 새로운 userdata가 생성된다.
게임을 시작해보자
물건을 매입하고 적절한 요일에 판매한다. 정말 간단한 게임이다.
매주 일요일은 물건을 매입하는 날이다.
매주 물건이 바뀌고 물건의 가격이 변동된다. 이를 이제 구매하면된다.
그러면? 물건을 저렴하게 매입할때까지 다음주로 계속가면되겠네?
그래서 매주 유지비를 결제하게 만들었다.
매입하기를 눌러보자.
이번주는 고구마를 판매한다.
가격변화원인에 따라 변동퍼센트만큼 가격이 오른 상태
375원에 매입을 할지 말지 고민하면된다.
여기서는 프로그램 설명을 위해 돈이 되는대로 구매를 해보겠다.
구매를 확정하고 월요일로 넘어가자.
월요일이다. 레벨업을 하면 트럭의 개수가 늘어난다.
트럭의 개수에 따라 매입할 수 있는 물품의 양이 늘어난다 (유지비도 증가한다.)
매도하기를 눌러 판매를 해보자.
플레이어는 물류가격을 고려해야하며
가격변화요인도 고려해야한다.
여기서 무트코인과는 다르게 조금더 재미있는 요소를 넣었다.
바로 내가 얼마에 팔지 결정을 하는 것.
가격을 완전히 맞추면 100% 판매를 하고
오차범위에 따라 팔리는 양이 조절되게 된다.
결과적으로 너무 가격을 올려 팔면 판매에 실패한다.
그래고 이 모든 과정은 30초이내에 진행되어야 한다. 그렇지 못하면 트럭이 출발해버리고
강제로 다음날로 이동해야한다.
글을 쓰느라 트럭이 출발해버려 다음날로 이동해보자.
20개를 500원에 판매했다.
가격이 조금 벗어났나보다. 80%는 팔리고 20%는 폐기되었다.
(만약 가격변화원인이 좋지 않다면, 분산매도도 가능하다.)
재고가 0이되면 강제로 다음주로 이동한다.
그럼 유지비 1000이 결제되면서 다시 이를 반복하면된다.
메인메뉴에서 이어하기를 눌러 언제든지 다시 게임을 할 수 있으며
개발자모드에 대해 설명해보겠다.
플래이어는 3가지의 변화원인과 농작물을 입력할 수 있다.
다양한 원인들을 저장할 수 있으며, 원인들은 모두 txt파일에 저장된다.
재고의 모습
3가지의 물류가격원인 파일과 농작물 파일
이쯤이면 모두 설명이 되었다 생각한다.
지금와서 생각해보면 왜 어려웠을까 생각이 들지만, 삭제하는 것을 구현하지는 못했다.
한달정도 시간이 주어졌는데, 비대면이기도 했고 나갈일도 없었는데,
내가 만든 프로젝트를 만드는게 게임보다 재미있어서 하루에 10시간이상을 투자해서 만들었던 기억이 있다.
(그래서 코드가 4000줄 이상 나온 것으로 기억한다.)
만들고나서 남들이 발표하는 것을 보았는데, 나만큼 만든 사람은 없었다..
(그덕분에 A+을 받은 것 같기도 하다.)
'ㅇ 프로젝트 > (Toy)_project' 카테고리의 다른 글
5. 네이버 API를 이용해서 그래픽카드 특가를 노려보자 (1/2) (0) | 2022.10.02 |
---|---|
4. 세계 테러 데이터 분석하기 (0) | 2022.10.01 |
crawling을 통해 그래픽카드의 특가를 노려보자. (0) | 2022.09.29 |
전기기사 자격증의 데이터를 분석해보자. (0) | 2022.09.27 |
졸작 실시간 영상처리를 이용한 로봇팔 제어 (0) | 2022.08.28 |