ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #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();
         }
       }
     }
Designed by Tistory.