#13주차 "WPF 지렁이 게임
WPF를 사용하여 지렁이 게임 프로그램을 만들어 보겠
새프로젝트에서 WPF 앱을 선택한다
새 프로젝트를 만들면 매인 디자인 창이 보인다
<Grid>
<Image Source="Images/tulip.jpg" Stretch="Fill"/>
<TextBlock Margin="20 20 0 0">SnakeBite</TextBlock>
<TextBlock Margin="20 35 0 0">Eat 25 Eggs using Arrow Keys</TextBlock>
<TextBlock Margin="20 50 0 0">Press ESC to pause while playing</TextBlock>
<Button Width="100" Height="40"
HorizontalAlignment="Left"
FontSize="20"
x:Name="btnPlay"
Margin="120 200 0 0"
Click="btnPlay_Click">Play</Button>
<Button Width="100" Height="40"
HorizontalAlignment="Left"
FontSize="20"
x:Name="btnQuit"
Margin="300,200,0,0"
Click="btnQuit_Click">Quit</Button>
</Grid>
<Image Source="Images/tulip.jpg" Stretch="Fill"/>
=> 다음은 코드는 삽입할 이미지의 링크와 stretch를Fill로 설정하여 화면에 꽉차게 설정하였다.
Click="btnPlay_Click">Play</Button>와 Click="btnQuit_Click">Quit</Button>에 대한 이벤트 함수 코드
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
Game game = new Game();
game.Show();
}
private void btnQuit_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
위와 같고 이 내용은 시작 버튼을 누를시 다른 폼으로 넘어가는 이벤트 함수와 폼을 닫는 함수이다.
중간 실행 화면
움직이는 그림을 삽입하기 위한 코드
<Grid Height="380" Width="480">
<Canvas x:Name="field" Background="LightSteelBlue">
<TextBlock x:Name="score" Text="Eggs = 0"
Foreground="White" FontSize="14"
Canvas.Left="200" Canvas.Top="20"/>
<TextBlock x:Name="time" Text="Time = 00:00:00"
Foreground="White" FontSize="14"
Canvas.Left="270" Canvas.Top="20"/>
</Canvas>
</Grid>
※ 위의 코드는 10 * 10 사이즈의 검은 테두리에 빨간색으로 채운 알을 Ellipse로 만든 후 생기는 좌표는 필드를 알의 크기로 나눈 좌표중에서 랜덤으로 생성된다.
※ 뱀은 Ellipse의 배열을 사용하여 생성하는데 첫번째 원은 초콜릿색으로 5번째마다 오는 원은 초록색으로 나머지는 금색으로 설정하였다. 그리고 배열의 크기를 30으로 지정하였기에 뱀의 크기가 30보다 커지지 않는다.
※ Window_KeyDown의 이벤트 함수에서는 각 타이머가 실행되고 각 방향키를 누를때마다 그 방향으로 계속해서 움직이도록 설정하였다.
※ 뱀이 알을 먹을때는 뱀의 머리의 좌표와 알의 좌표가 일치할때로 하였으며 기존에 추가한 음성을 재생하고 그 위치에 있던 알을 사라지게 한다. 뱀의 꼬리에 새로 원을 추가하도록 하였다.
전체 CS코드
public partial class Game : Window
{
private Random r = new Random();
private Ellipse[] snakes;
private Ellipse egg;
private int unit = 10;
private int visibleCount = 5;
private DispatcherTimer t = new DispatcherTimer();
private Stopwatch sw = new Stopwatch();
private string move = "";
private int eaten = 0;
private SoundPlayer myPlayer;
public Game()
{
InitializeComponent();
InitSnake();
InitEgg();
t.Interval = new TimeSpan(0, 0, 0, 0, 100);
t.Tick += T_Tick;
myPlayer = new SoundPlayer();
myPlayer.SoundLocation = "../../Sounds/Windows Notify.wav";
}
private void T_Tick(object sender, EventArgs e)
{
for (int i = visibleCount; i > 0; i--)
snakes[i].Tag = (Point)snakes[i - 1].Tag;
Point q = (Point)snakes[0].Tag;
if (move == "U")
snakes[0].Tag = new Point(q.X, q.Y - unit);
else if (move == "D")
snakes[0].Tag = new Point(q.X, q.Y + unit);
else if (move == "L")
snakes[0].Tag = new Point(q.X - unit, q.Y);
else if (move == "R")
snakes[0].Tag = new Point(q.X + unit, q.Y);
DrawSnakes();
Swatch();
EatEgg();
}
private void Swatch()
{
TimeSpan ts = sw.Elapsed;
time.Text = String.Format("Time = {0:00}:{1:00}.{2:00}",
ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
}
private void EatEgg()
{
Point pS = (Point)snakes[0].Tag;
Point pE = (Point)egg.Tag;
if(pS.X == pE.X && pS.Y == pE.Y)
{
myPlayer.Play();
egg.Visibility = Visibility.Hidden;
visibleCount++;
snakes[visibleCount-1].Visibility = Visibility.Visible;
score.Text = "Eggs = " + ++eaten;
if(visibleCount == 10)
{
t.Stop();
sw.Stop();
DrawSnakes();
TimeSpan ts = sw.Elapsed;
string s = String.Format("Time = {0:00}:{1:00}.{2:00}",
ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
MessageBox.Show("Success!! \n" + s + " sec");
this.Close();
}
int x = r.Next(1, 48);
int y = r.Next(1, 38);
egg.Tag = new Point(x * unit, y * unit);
egg.Visibility = Visibility.Visible;
Canvas.SetLeft(egg, x*unit);
Canvas.SetTop(egg, y*unit);
}
}
private void DrawSnakes()
{
for(int i=0; i<visibleCount; i++)
{
Point p = (Point)snakes[i].Tag;
Canvas.SetLeft(snakes[i], p.X);
Canvas.SetTop(snakes[i], p.Y);
}
}
private void InitSnake()
{
snakes = new Ellipse[30];
int x = r.Next(1, 48);
int y = r.Next(1, 38);
for(int i = 0; i < 30; i++)
{
snakes[i] = new Ellipse();
snakes[i].Width = unit;
snakes[i].Height = unit;
snakes[i].Stroke = Brushes.Black;
if(i%5 == 0)
snakes[i].Fill = Brushes.Green;
else
snakes[i].Fill = Brushes.Gold;
snakes[0].Fill = Brushes.Chocolate;
snakes[i].Tag = new Point(x * unit, (y + i) * unit);
field.Children.Add(snakes[i]);
Canvas.SetLeft(snakes[i], x * unit);
Canvas.SetTop(snakes[i], (y + i) * unit);
}
for (int i = visibleCount; i < 30; i++)
snakes[i].Visibility = Visibility.Hidden;
}
private void InitEgg()
{
egg = new Ellipse();
egg.Width = unit;
egg.Height = unit;
egg.Tag = new Point(r.Next(1, 480 / unit) * unit,
r.Next(1, 380 / unit) * unit);
egg.Stroke = Brushes.Black;
egg.Fill = Brushes.Red;
Point p = (Point)egg.Tag;
field.Children.Add(egg);
Canvas.SetLeft(egg, p.X);
Canvas.SetTop(egg, p.Y);
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
// MessageBox.Show("KeyDown");
t.Start();
sw.Start();
if (e.Key == Key.Left)
move = "L";
else if (e.Key == Key.Right)
move = "R";
else if (e.Key == Key.Up)
move = "U";
else if (e.Key == Key.Down)
move = "D";
else if (e.Key == Key.Escape)
{
move = "";
t.Stop();
}
}
}