본문 바로가기

C#/공부

C# 실력 늘리기 9일차

181~182. 원형 시계를 만들어 보자.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Clock
{
    public partial class Form1 : Form
    {
        Matrix matrix = new Matrix();
        PointF[] hf = new PointF[4];
        PointF[] mf = new PointF[4];
        PointF[] sf = new PointF[4];

        public Form1()
        {
            InitializeComponent();
            Init();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
        public void Init()
        {
            hf[0] = new PointF(0, -120);
            hf[1] = new PointF(-7, -100);
            hf[2] = new PointF(0, 0);
            hf[3] = new PointF(7, -100);
            mf[0] = new PointF(0, -170);
            mf[1] = new PointF(-5, -150);
            mf[2] = new PointF(0, 0);
            mf[3] = new PointF(5, -150);
            sf[0] = new Point(0, -190);
            sf[1] = new Point(-2, -160);
            sf[2] = new Point(0, -0);
            sf[3] = new Point(2, -160);
            float startH = DateTime.Now.Hour;
            float startM = DateTime.Now.Minute;
            float startS = DateTime.Now.Second;
            matrix.Reset();
            matrix.Rotate((float)((startH - 1) * 60f * 60f) / 120.0f + startM * 0.5f, MatrixOrder.Append);
            matrix.TransformPoints(hf);
            matrix.Reset();
            matrix.Rotate((float)((startM - 1) * 60f) / 10.0f, MatrixOrder.Append);
            matrix.TransformPoints(mf);
            matrix.Reset();
            matrix.Rotate((float)((startS - 1) * 6.0f), MatrixOrder.Append);
            matrix.TransformPoints(sf);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.TranslateTransform(200f, 200f);   //폼 중앙을 0,0으로 설정
            DrawCircle(g);
            DrawHour(g);
            DrawMinute(g);
            DrawSecond(g);
            base.OnPaint(e);
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Text = "Clock   "+DateTime.Now.Hour+"시 "
                +DateTime.Now.Minute+"분 "+DateTime.Now.Second+"초";
            this.Invalidate();
        }
        private void DrawCircle(Graphics g)
        {
            Pen xPen = new Pen(Color.Black, 2);
            g.DrawArc(xPen, new Rectangle(-200, -200, 400, 400), 0.0f, 360.0f);
            GraphicsPath path = new GraphicsPath();
            Matrix rotateMatrix=new Matrix();
            xPen = new Pen(Color.Black, 1);
            g.DrawArc(xPen, new Rectangle(-195, -195, 390, 390), 0.0f, 360.0f);
            for (int i = 1; i <= 12; i++)
            {
                rotateMatrix.Reset();
                path.Reset();
                path.AddString(i.ToString(), this.Font.FontFamily, 1, 20, new PointF(10.0F, -190.0F),
                    new StringFormat(StringFormatFlags.DirectionRightToLeft));
                rotateMatrix.RotateAt(30.0F * i, new PointF(0f, 0.0F));
                path.Transform(rotateMatrix);
                g.FillPath(new SolidBrush(Color.Black), path);
            }
            path.Dispose();
            xPen.Dispose();
        }
        private void DrawHour(Graphics g)
        {
            matrix.Reset();
            matrix.Rotate(1.0f/120.0f); //초당 1/120도, 60초에 0.5도, 3600초에 30도=1시간
            matrix.TransformPoints(hf);
            g.FillPolygon(new SolidBrush(Color.Red), hf);
        }
        private void DrawMinute(Graphics g)
        {
            matrix.Reset();
            matrix.Rotate(1.0f/10.0f);  //초당 0.1도, 60초에 6도=1분
            matrix.TransformPoints(mf);
            g.FillPolygon(new SolidBrush(Color.Blue), mf);
        }
        private void DrawSecond(Graphics g)
        {
            matrix.Reset();
            matrix.Rotate(6.0f);    //초당 6도 60초에 360도=한바퀴=1분
            matrix.TransformPoints(sf);
            g.FillPolygon(new SolidBrush(Color.LightGreen), sf);
        }
    }
}

 

경과를 빠르게 보여주기위해 타이머 Interval을 100ms로 설정했습니다. 

 

 

 

183~185. 야구게임 만들기: 야구게임을 만들어보자.

 

교재 코드가 너무 비효율적이라서 외형 외에는 참고 없이 만듬

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Baseball
{
    public partial class Form1 : Form
    {
        int inning=1;
        List<int> pitchList = new List<int>();
        List<int> hitList = new List<int>();
        List<Button> btnList = new List<Button>();
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            btnList.Add(btn0);
            btnList.Add(btn1);
            btnList.Add(btn2);
            btnList.Add(btn3);
            btnList.Add(btn4);
            btnList.Add(btn5);
            btnList.Add(btn6);
            btnList.Add(btn7);
            btnList.Add(btn8);
            btnList.Add(btn9);
            btnHit.Enabled = false;
            btnEnable(false);
        }
        public void setPitch()
        {
            pitchList.Clear();
            Random r = new Random(DateTime.Now.Millisecond);
            while (pitchList.Count < 3)
            {
                int tmp = r.Next(10);
                if (!pitchList.Contains(tmp))
                    pitchList.Add(tmp);
            }
        }
        public void setHit(int number, Button btn)
        {
            if (hitList.Count < 3)
            {
                hitList.Add(number);
                btn.Visible = false;
            }
            if (hitList.Count == 3)
                btnHit.Enabled = true;
        }
        public void refree()
        {
            int strike = 0;
            int ball = 0;
            for (int i = 0; i < 3; i++)
            {
                if (pitchList.Contains(hitList[i]))
                {
                    if (hitList[i] == pitchList[i])
                        strike++;
                    else
                        ball++;
                }
            }
            richTextBox1.AppendText(inning+"이닝: "+hitList[0] +"-"+ hitList[1] +"-"+ hitList[2]+" ["
                +strike+" Strike "+ball+" Ball]\n");
            lbResult.Text="["+strike+" Strike "+ball+" Ball]";
            if (strike == 3){
                MessageBox.Show("You Win!");
                btnEnable(false);
                btnHit.Enabled=false;
                lbResult.Text = "   You Win!";
                return;
            }
            inning++;
            if (inning == 10)
            {
                MessageBox.Show("You Lose.");
                btnEnable(false);
                btnHit.Enabled = false;
                lbResult.Text = "   You Lose.";
            }
        }
        private void btnNew_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
            hitList.Clear();
            setPitch();
            btnVisible(true);
            btnEnable(true);
            btnHit.Enabled = false;
            inning = 1;
            lbResult.Text = "   Play Ball!";
        }
        private void btnHit_Click(object sender, EventArgs e)
        {
            refree();
            hitList.Clear();
            btnVisible(true);
            btnHit.Enabled = false;
        }
        private void btnNum_Click(object sender, EventArgs e)
        {
            if (sender as Button == btn0) {setHit(0,btn0);}
            else if (sender as Button == btn1) {setHit(1,btn1);}
            else if (sender as Button == btn2) {setHit(2,btn2);}
            else if (sender as Button == btn3) {setHit(3,btn3);}
            else if (sender as Button == btn4) {setHit(4,btn4);}
            else if (sender as Button == btn5) {setHit(5,btn5);}
            else if (sender as Button == btn6) {setHit(6,btn6);}
            else if (sender as Button == btn7) {setHit(7,btn7);}
            else if (sender as Button == btn8) {setHit(8,btn8);}
            else if (sender as Button == btn9) {setHit(9,btn9);}
        }
        public void btnVisible(bool v)
        {
            foreach (Button b in btnList)
            {
                b.Visible = v;
            }
        }
        public void btnEnable(bool v)
        {
            foreach (Button b in btnList)
            {
                b.Enabled = v;
            }
        }
    }
}

 

제가 숫자야구 고수인게 아니라 생각하는 시간을 편집했습니다...

 

'C# > 공부' 카테고리의 다른 글

C# 실력 늘리기 11일차  (4) 2022.08.02
C# 실력 늘리기 10일차  (0) 2022.08.01
C# 실력 늘리기 8일차  (0) 2022.07.28
C# 실력 늘리기 7일차  (0) 2022.07.27
C# 실력 늘리기 6일차  (0) 2022.07.26