-
#13주차 "WPF 지렁이 게임비주얼 프로그래밍 2024. 6. 7. 12:08
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(); } } }
'비주얼 프로그래밍' 카테고리의 다른 글
# 15주차 My SQL (1) 2024.06.17 #12주차 WPF "DockPanel과 WrapPanel" (0) 2024.06.07 #11주차 WPF 디자인 "좋아하는 프로그래밍 언어는?" (0) 2024.06.07 #11주차 WPF 로그인 창 만들기 (0) 2024.06.07 #11주차 WPF 만들기 "버튼을 이용한 디자인" (0) 2024.06.07