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 |