실습) 다음 시나리오에 맞게 프로그램을 작성하시오. 시나리오
학사 학생
마법 학생마법 학생은 내부적으로 지팡이가 있다.
운동 학생 |
*2019년 공주대에서 |
실습 결과
StuValue.cs
namespace 학사_마법_운동
{
/// <summary>
/// 학생 값을 정의한 정적 클래스
/// </summary>
internal static class StuValue
{
/// <summary>
/// 최소 HP:0
/// </summary>
internal const int MIN_HP=0;
/// <summary>
/// 최대 HP:200
/// </summary>
internal const int MAX_HP = 200;
/// <summary>
/// 디폴트 HP:100
/// </summary>
internal const int DEF_HP = 100;
/// <summary>
/// 최소 IQ:0
/// </summary>
internal const int MIN_IQ = 0;
/// <summary>
/// 최대 IQ:200
/// </summary>
internal const int MAX_IQ = 200;
/// <summary>
/// 디폴트 IQ:100
/// </summary>
internal const int DEF_IQ = 100;
/// <summary>
/// 최소 스트레스:0
/// </summary>
internal const int MIN_STRESS = 0;
/// <summary>
/// 최대 스트레스:100
/// </summary>
internal const int MAX_STRESS = 100;
/// <summary>
/// 디폴트 스트레스:0
/// </summary>
internal const int DEF_STRESS = 0;
/// <summary>
/// 최소 연속으로 공부한 횟수:0
/// </summary>
internal const int MIN_SCNT = 0;
/// <summary>
/// 최대 연속으로 공부한 횟수:5
/// </summary>
internal const int MAX_SCNT = 5;
/// <summary>
/// 디폴트 연속으로 공부한 횟수:0
/// </summary>
internal const int DEF_SCNT = 0;
}
}
Student.cs
using System;
namespace 학사_마법_운동
{
/// <summary>
/// 학생 클래스 - 추상 클래스
/// </summary>
internal abstract class Student
{
string name;//이름(생성 시 전달)
readonly int no;//주민번호(순차적 부여)
int hp;//체력: 100 (최소 0, 최대 200)
/// <summary>
/// 체력 속성 - 가져오기
/// </summary>
public int Hp
{
get
{
return hp;
}
protected set
{
if(value<StuValue.MIN_HP)
{
value = StuValue.MIN_HP;
}
if(value> StuValue.MAX_HP)
{
value = StuValue.MAX_HP;
}
hp = value;
}
}
int iq;//지력
/// <summary>
/// 지력 속성 - 가져오기
/// </summary>
public int IQ
{
get
{
return iq;
}
protected set
{
if(value<StuValue.MIN_IQ)
{
value = StuValue.MIN_IQ;
}
if(value>StuValue.MAX_IQ)
{
value = StuValue.MAX_IQ;
}
iq = value;
}
}
int stress;//스트레스
/// <summary>
/// 스트레스 속성 - 가져오기
/// </summary>
public int Stress
{
get
{
return stress;
}
protected set
{
if(value<StuValue.MIN_STRESS)
{
value = StuValue.MIN_STRESS;
}
if(value>StuValue.MAX_STRESS)
{
value = StuValue.MAX_STRESS;
}
stress = value;
}
}
int scnt;//연속으로 공부한 횟수
/// <summary>
/// 연속으로 공부한 횟수 속성 - 가져오기
/// </summary>
protected int Scnt
{
get
{
return scnt;
}
private set
{
if(value>StuValue.MAX_SCNT)
{
value = StuValue.MAX_SCNT;
}
scnt = value;
}
}
static int lastno;//가장 최근에 부여한 주민번호
/// <summary>
/// 학생 생성자
/// </summary>
/// <param name="name">학생 이름</param>
internal Student(string name)
{
this.name = name;
iq = StuValue.DEF_IQ;
hp = StuValue.DEF_HP;
stress = StuValue.DEF_STRESS;
scnt = StuValue.DEF_SCNT;
lastno++;
no = lastno;
}
//internal abstract Anything(); 파생 클래스에서 반드시 재정의하세요.
/// <summary>
/// 음료를 마시다.
/// </summary>
internal virtual void Drink()
{
Console.WriteLine("{0} 마시다.", this);
scnt = 0;
}
/// <summary>
/// 잠을 자다.
/// </summary>
internal virtual void Sleep()//파생 클래스에서 재정의 할 수 있어요.
{
Console.WriteLine("{0} 잠자다.", this);
scnt = 0;
}
/// <summary>
/// 공부하다.
/// </summary>
internal virtual void Study()
{
Console.WriteLine("{0} 공부하다.", this);
Scnt= scnt+1;
}
/// <summary>
/// 노래하다.
/// </summary>
internal virtual void Sing()
{
Console.WriteLine("{0} 노래하다.", this);
scnt = 0;
}
/// <summary>
/// 강의를 받다.
/// </summary>
internal virtual void ListenLecture()
{
Console.WriteLine("{0} 강의받다.", this);
Scnt= scnt + 1;
}
/// <summary>
/// 휴식하다.
/// </summary>
internal virtual void Relax()
{
Console.WriteLine("{0} 휴식하다.", this);
scnt = 0;
}
/// <summary>
/// ToString 메서드 재정의
/// </summary>
/// <returns>번호와 이름</returns>
public override string ToString()
{
return string.Format("<{0},{1}>",no,name);
}
}
}
SStudent.cs
using System;
namespace 학사_마법_운동
{
/// <summary>
/// 학사 학생 - 학생 클래스에서 파생
/// </summary>
internal class SStudent : Student
{
int dummy;//더미 뇌는 생성 시 0 이며 공부한 횟수가 5의 배수가 될 때마다 1씩 증가
int study_cnt;//공부한 횟수
public SStudent(string name):base(name)
{
}
internal override void Drink()
{
//음료 섭취
//체력 5회복, 지력: 10감소 , 스트레스: 2증가
base.Drink();
Hp += 5;
IQ -= 10;
Stress += 2;
}
internal override void ListenLecture()
{
//강의를 받다.
//체력 3소모, 지력: scnt 증가, 스트레스: scnt증가
base.ListenLecture();
Hp -= 3;
IQ += Scnt;
Stress += Scnt;
}
internal override void Relax()
{
//휴식하다.
//체력 3회복, 스트레스: 25감소
base.Relax();
Hp += 3;
Stress -= 25;
}
internal override void Sing()
{
//노래하다.
//체력 10 소모, 지력: 5 - scnt감소, 스트레스: 5 - scnt증가
base.Sing();
Hp -= 10;
IQ -= 5 - Scnt;
Stress += 5 - Scnt;
}
internal override void Sleep()
{
//잠자다.
//체력 10회복, 스트레스: 5감소
base.Sleep();
Hp += 10;
Stress -= 5;
}
internal override void Study()
{
//공부하다.
//체력 5소모, 지력: scnt + 더미 뇌 증가, 스트레스: 2감소
base.Study();
Hp -= 5;
IQ += Scnt + dummy;
Stress -= 2;
study_cnt++;
if(study_cnt %5 == 0)
{
dummy++;
}
}
/// <summary>
/// 책을 읽다.
/// </summary>
internal void Reading()
{
//독서하다.
//더미 뇌 1증가, 스트레스: 5감소
Console.WriteLine("{0} 독서하다.", this);
dummy++;
Stress -= 5;
}
}
}
MStudent.cs
using System;
namespace 학사_마법_운동
{
/// <summary>
/// 마법 학생 - 학생 클래스에서 파생
/// </summary>
internal class MStudent : Student
{
int stick;//지팡이
/// <summary>
/// 생성자
/// </summary>
/// <param name="name">학생 이름</param>
public MStudent(string name):base(name)
{
}
/// <summary>
/// 음료를 마시다.
/// </summary>
internal override void Drink()
{
//음료 섭취
//체력 5 + 지팡이 회복, 지력: 10 - 지팡이 감소, 스트레스: 2감소
base.Drink();
Hp += 5 + stick;
IQ -= 10 - stick;
Stress -= 2;
}
/// <summary>
/// 강의받다.
/// </summary>
internal override void ListenLecture()
{
//강의를 받다.
//체력 2소모, 지력: scnt 증가, 스트레스: 5증가
base.ListenLecture();
Hp -= 2;
IQ += Scnt;
Stress += 5;
}
/// <summary>
/// 휴식하다.
/// </summary>
internal override void Relax()
{
//휴식하다.
//체력 3회복, 스트레스: 25감소
base.Relax();
Hp += 3;
Stress -= 25;
}
/// <summary>
/// 노래하다.
/// </summary>
internal override void Sing()
{
//노래하다.
//체력 10 - 지팡이 소모, 지력: 5감소, 스트레스: 5감소
base.Sing();
Hp -= 10 - stick;
IQ -= 5;
Stress -= 5;
}
/// <summary>
/// 잠을 자다.
/// </summary>
internal override void Sleep()
{
//잠자다.
//체력 10회복, 스트레스: 5감소
base.Sleep();
Hp += 10;
Stress -= 5;
}
/// <summary>
/// 공부하다.
/// </summary>
internal override void Study()
{
//공부하다.
//체력 3소모, 지력: scnt 증가, 스트레스: 3증가
base.Study();
Stress -= 3;
IQ += Scnt;
Stress += 3;
}
/// <summary>
/// 여행가다.
/// </summary>
internal void Travel()
{
//마법 여행을 가다.
//지팡이 1증가
Console.WriteLine("{0} 여행 가다.", this);
stick++;
}
}
}
PStudent.cs
using System;
namespace 학사_마법_운동
{
/// <summary>
/// 운동 학생 - 학생 클래스에서 파생
/// </summary>
internal class PStudent : Student
{
int air;
public PStudent(string name):base(name)
{
}
internal override void Drink()
{
//음료 섭취
//체력 5 회복, 지력: 3 감소, 스트레스: 2감소
base.Drink();
Hp += 5;
IQ -= 3;
Stress -= 2;
}
internal override void Relax()
{
//휴식하다.
//체력 8회복, 스트레스: 25감소
base.Relax();
Hp += 8;
Stress -= 25;
}
internal override void ListenLecture()
{
//강의를 받다.
//체력 1소모, 지력: scnt / 2 증가,
//air :5 감소, air*3만큼 스트레스 감소
base.ListenLecture();
Hp -= 1;
IQ += Scnt / 2;
air -= 5;
Stress -= air * 3;
}
internal override void Sing()
{
//노래하다.
//체력 5소모, 지력: 2증가, 스트레스: 5감소
base.Sing();
Hp -= 5;
IQ += 2;
Stress -= 5;
}
internal override void Sleep()
{
//잠자다.
//체력 10회복, 스트레스: 5감소
base.Sleep();
Hp += 10;
Stress -= 5;
}
internal override void Study()
{
//공부하다.
//체력 2소모, 지력: scnt / 2 증가,
//air 3 감소, air*3만큼 스트레스 감소
base.Study();
Hp -= 2;
IQ += Scnt / 2;
air -= 3;
Stress -= air * 3;
}
/// <summary>
/// 춤을 추다.
/// </summary>
internal void Dance()
{
//춤을 추다.
//체력 5소모, 지력: 3증가, air 1증가
Console.WriteLine("{0} 춤을 추다.", this);
Hp -= 5;
IQ += 3;
air++;
}
}
}
Application.cs
using System;
namespace 학사_마법_운동
{
/// <summary>
/// 응용 클래스 - 학사, 마법, 운동 학생 테스트 용도
/// </summary>
internal class Application
{
Student[] stues = new Student[3];
/// <summary>
/// 실행하다.
/// </summary>
internal void Run()
{
//프로그램이 시작하면서 학사 학생과 운동 학생, 마법 학생을 한 명씩 생성
stues[0] = new SStudent("공부잘");
stues[1] = new MStudent("휘리릭");
stues[2] = new PStudent("빨라요");
//학생을 생성 후 전체 학생에게 강의=>자습 => 잠자기 => 휴식하기 => 음료마시기 => 노래하기 순으로 진행
//(각 단계마다 학생 정보를 출력)
StartLecture();
SelfStudy();
TurnOff();
TeaTime();
Party();
GoToNoRaeRoom();
}
private void GoToNoRaeRoom()
{
//노래하기
//노래하기에서는 해당 학생이 운동 학생이면 춤추게 지시함
for (int i = 0; i<stues.Length;i++)
{
stues[i].Sing();
PStudent ps = stues[i] as PStudent;
if(ps!=null)
{
ps.Dance();
}
ViewStuInfo(stues[i]);
}
}
private void ViewStuInfo(Student student)
{
Console.WriteLine("=== {0} === ", student);
Console.WriteLine(" 지력:{0}, 체력:{1} 스트레스:{2}", student.IQ, student.Hp, student.Stress);
}
private void Party()
{
//음료마시기
for (int i = 0; i < stues.Length; i++)
{
stues[i].Drink();
ViewStuInfo(stues[i]);
}
}
private void TeaTime()
{
//휴식하기
//휴식하기에서는 해당 학생이 마법 학생이면 여행도 지시함
for (int i = 0; i < stues.Length; i++)
{
stues[i].Relax();
MStudent ms = stues[i] as MStudent;
if(ms != null)
{
ms.Travel();
}
ViewStuInfo(stues[i]);
}
}
private void TurnOff()
{
//잠자기
for (int i = 0; i < stues.Length; i++)
{
stues[i].Sleep();
ViewStuInfo(stues[i]);
}
}
private void SelfStudy()
{
//자습
//자습하기에서는 해당 학생이 학사 학생이면 독서도 지시함
for (int i = 0; i < stues.Length; i++)
{
stues[i].Study();
SStudent ss = stues[i] as SStudent;
if(ss != null)
{
ss.Reading();
}
ViewStuInfo(stues[i]);
}
}
private void StartLecture()
{
//강의
for (int i = 0; i < stues.Length; i++)
{
stues[i].ListenLecture();
ViewStuInfo(stues[i]);
}
}
}
}
Program.cs
namespace 학사_마법_운동
{
class Program
{
static void Main(string[] args)
{
Application app = new Application();
app.Run();
}
}
}
*버그는 각자가 잡아 보시길...*
'언어 자료구조 알고리즘 > 프로그래밍 실습' 카테고리의 다른 글
[C# 실습] 반도체 장비 관리 프로그램 - 1. 단일체 패턴 표현 (0) | 2020.09.21 |
---|---|
[C# 실습] 반도체 장비 관리 프로그램 (0) | 2020.09.21 |
[C#] 컬렉션(Dictionary) 실습 - 도서 관리 프로그램 (0) | 2019.08.10 |
[C#] 상속과 다형성, 인터페이스 실습 - 도형 (0) | 2019.08.10 |
[C#] 컬렉션 실습 - IList 인터페이스 구현 약속한 컬렉션 (0) | 2019.08.09 |
[C#] 상속과 다형성 - 상품, 할인상품 (0) | 2019.08.08 |
[C#] 상속과 다형성 실습 - 밴드(음악가, 피아니스트, 드러머) (0) | 2019.08.08 |
[C#] 캡슐화 - 학생 클래스 정의, 인덱서 포함 (0) | 2019.08.08 |
[C#] 캡슐화 실습 - 학생 클래스 (0) | 2019.08.08 |
[C#] 캡슐화 실습 - 복소수 정의(멤버 필드와 멤버 속성) (0) | 2019.08.08 |