언어 자료구조 알고리즘/프로그래밍 실습

[C#실습] 신호등 시뮬레이션

언제나휴일 2017. 9. 28. 10:44
반응형

[C#실습] 신호등 시뮬레이션



사용자로부터 신호등에서 자동차가 이동할 수 있는 시간과 사람이 이동할 수 있는 시간을 입력받아 이에 맞게 신호등 시뮬레이션하는 응용 프로그램이다.


이를 통해 Console 클래스의 여러 멤버를 사용해 보기로 하자.



능력단위

(NCS 기준)

프로그래밍 언어 활용

(2001020215_15v3)

개발기간

2017.09. 28

(1시간)

프로그램 개요

Console클래스의 여러 멤버의 사용법을 익히기 위한 프로젝트로 원하는 화면 좌표로 캐럿을 이동하여 원하는 색상으로 원하는 내용을 출력하는 신호등 시뮬레이션이다.

능력단위 요소 및 수행 준거(훈련내용)

기본문법 활용하기

1.1 응용소프트웨어 개발에 필요한 프로그래밍 언어의 데이터 타입을 적용하여 변수를 사용할 수 있다.

1.2 프로그래밍 언어의 연산자와 명령문을 사용하여 애플리케이션에 필요한 기능을 정의하고 사용할 수 있다.

1.3 프로그래밍 언어의 사용자 정의 자료형을 정의하고 애플리케이션에서 사용할 수 있다.


개인 기술 경력 문서

신호등.docx


 using System;

using System.Threading;

 

namespace 신호등

{

    class Program

    {

        static string[,] msg= new string[3,2] //신호에 따른 출력할 내용 [][메시지]

        {

            {"GREEN ","Don't Walk"},

            {"YELLOW","Don't Walk"},

            {"  RED   ",      " Walk       "}

        };

        static string[] loads = new string[2]//도로를 표현할 내용

        {

            "-----------|---|-----------",

                         "|---|"

        };

        static void Main(string[] args)

        {

            int[] ts = new int []{ 20, 3, 5 }; //시간 배열

            int cnt = 0; //테스트 실험 카운터

            int flag = 0;//신호

           

            Console.Write("녹색등 시간(20~30): ");

            ts[0] = int.Parse(Console.ReadLine());

            if ((ts[0] < 20) || (ts[0] > 30)) //입력한 시간이 범위를 벗어나면

            {

                Console.WriteLine("입력 오류\n");

                return;

            }

            Console.Write("보행시간(5~10): ");

            ts[2] = int.Parse(Console.ReadLine());

            if ((ts[2] < 5) || (ts[2] > 10))//입력한 시간이 범위를 벗어나면

            {

                Console.WriteLine("입력 오류\n");

                return;

            }

            Console.Clear(); //입력받았던 화면 내용을 지운다.

            while (cnt < 10)//신호등은 10 번의 사이클 동안 실험

            {

                for (flag = 0; flag < 3; flag++)//0:녹색, 노랑, 빨강

                {

                    SetColor(flag);

                    DrawMap(flag, ts[flag] * 1000);//그리기(신호, 시간)

                }

                cnt++; //실험 카운터 증가

            }

            Console.ReadKey();

        }

 

        private static void SetColor(int flag)

        {

            switch(flag)

            {

                case 0: Console.ForegroundColor = ConsoleColor.Red; break;

                case 1: Console.ForegroundColor = ConsoleColor.Yellow; break;

                case 2: Console.ForegroundColor = ConsoleColor.Green; break;

            }

        }

 

        private static void DrawMap(int flag, int time_flow)

        {

            Putsxy(10, 1, msg[flag,1]);//위쪽 메시지 출력

            Putsxy(10, 7, msg[flag,1]);//아래쪽 메시지 출력

                                       //도로 출력

            Putsxy(0, 2, loads[0]);

            Putsxy(11, 3, loads[1]);

            Putsxy(0, 4, loads[0]);

            Putsxy(11, 5, loads[1]);

            Putsxy(0, 6, loads[0]);

 

            Putsxy(19, 3, msg[flag,0]);//도로에 신호등 색 출력

            Putsxy(3, 5, msg[flag,0]); //도로에 신호등 색 출력

            DrawTime(time_flow); //남은 시간을 출력

        }

 

        private static void DrawTime(int time_flow)

        {

            while (time_flow > 0)//남은 시간이 있으면

            {

                Console.SetCursorPosition(0, 0);//시간 출력 좌표로 이동

                Console.Write("{0,6:F2}", (float)time_flow / 1000);// 6자리(소수점 이하 2자리)를 출력

                Thread.Sleep(10);//0.01초 멈춤

                time_flow -= 10; //남은 시간을 빼줌

            }

        }

 

 

        private static void Putsxy(int x, int y, string msg)

        {

            Console.SetCursorPosition(x, y);

            Console.Write(msg);

        }

    }

}

 


반응형