C#

050_SnakeBite(C#)

iwannabebackendexpert 2022. 6. 18. 19:45

SnakeBite게임을 만들어보자.

	Random r = new Random();
        Ellipse[] snake = new Ellipse[30];
        Ellipse egg;
        int W = 10; // 뱀과 알의 크기 (Ellipse)
        int visibleCount =5;
        DispatcherTimer dt = new DispatcherTimer();
        Stopwatch sw = new Stopwatch();
        string move = "";

랜덤 객체 생성 ( 알위치를 랜덤하게 정하기 위해서 이다.)

Elipse snake는 뱀의 최대 크기를 30으로 정하는것 

visibleCount = 5; 뱀의 최대크기는 30인데 처음 게임 시작하였을 때 보이는 알을 5개로 정하였음.

 

public Game()
        {
            InitializeComponent();
            InitEgg();
            InitSnake();
            dt.Interval = new TimeSpan(0, 0, 0, 0, 100); // 0.1초
            dt.Tick += Dt_Tick;

        }

 각종 시작 초기 함수들.

 private void Dt_Tick(object sender, EventArgs e)
        {
            for (int i = visibleCount; i > 0; i--)
                snake[i].Tag = (Point)snake[i - 1].Tag; //이전 태그를 따라감

            Point q = (Point)snake[0].Tag; // 뱀 머리

            if (move == "U")
                snake[0].Tag = new Point(q.X, q.Y - W);
            else if (move == "D")
                snake[0].Tag = new Point(q.X, q.Y + W);
            else if (move == "L")
                snake[0].Tag = new Point(q.X - W, q.Y);
            else if (move == "R")
                snake[0].Tag = new Point(q.X + W, q.Y);
            EatEgg();
            DrawSnake();

            TimeSpan ts = sw.Elapsed;
            txtTime.Text = ts.ToString();

        }

DispatcherTimer의 dt_Tick은 한번씩의 틱마다 수행되는 코드들이다.

for문은 visibleCount들은 제일 앞의 Tag를 따라가는 것들이다. 즉 머리가 이동할때 뒤의 몸들은 머리를 따라가게되어있다.

 

 //뱀이 알을 먹었는지 처리
        private void EatEgg()
        {
            Point pE = (Point)egg.Tag;
            Point pS = (Point)snake[0].Tag;

            if(pE.X == pS.X && pE.Y == pS.Y)
            {
                egg.Visibility = Visibility.Hidden;
                visibleCount++;
                if(visibleCount > 12)
                {
                    MessageBox.Show("Game End!");
                    Close();
                }
                snake[visibleCount - 1].Visibility = Visibility.Visible;
                txtScore.Text = "Eggs = " + (visibleCount - 5);
                InitEgg();
            }
        }

 

Point형의 pointEgg 객체 

Point형의 pointSnake 객체

 

미리 설정한 총 길이가 12가 될때까지 알을 먹으면 숨겨진 총 30의 배열중 하나씩 보이게 됨.

초기의 몸 5 칸 + 알을 먹은 7개   = 12

총 7개 먹으면 게임이 끝나게 된다.

 private void DrawSnake()
        {
            for (int i = 0; i < visibleCount; i++)
            {
                Point p = (Point)snake[i].Tag;
                Canvas.SetLeft(snake[i], p.X);
                Canvas.SetTop(snake[i], p.Y);
            }
        }

 

private void InitSnake()
        {
            //뱀의 머리위치
            int x = r.Next((int)(field.Width / W));
            int y = r.Next((int)(field.Height / W));

           
            
            for (int i = 0; i < 30; i++)
            {
                snake[i] = new Ellipse();
                snake[i].Width = W;
                snake[i].Height = W;
                snake[i].Stroke = Brushes.Black;

               
                if (i % 5 == 0)
                    snake[i].Fill = Brushes.Green;
                else
                    snake[i].Fill = Brushes.Gold;

                snake[0].Fill = Brushes.Chocolate;
                snake[i].Tag = new Point(x * W, (y + i) * W); // 뱀의 꼬리 길이때문에 y에 i만큼 +
                field.Children.Add(snake[i]);
                Canvas.SetLeft(snake[i], x * W);
                Canvas.SetTop(snake[i], (y + i) * W);
            }

            for (int i = visibleCount; i < 30; i++)
                snake[i].Visibility = Visibility.Hidden;

        }

초기에 뱀 설정하기

5개 마다 뱀의 몸 초록색으로 나머지는 금색으로 설정

뱀의 꼬리 길이때문에 y+1만큼 더함.

 

 

 

private void InitEgg()
        {
            egg = new Ellipse();
            egg.Width = W;
            egg.Height = W;
            egg.Stroke = Brushes.Black;
            egg.Fill = Brushes.Red;

            int x = r.Next((int)field.Width / W); //40
            int y = r.Next((int)field.Height / W); // 30

            egg.Tag = new Point(x*W, y*W);
            field.Children.Add(egg);

            Canvas.SetLeft(egg, x * W);
            Canvas.SetTop(egg, y * W);

        }

위의 initSnake함수와 마찬가지로

랜덤으로 알의 위치를 정하는 메소드인데

화면크기에 따라서 x,y의 범위가 달라진다.

그리고 알을 화면상에 Add함.

private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            dt.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 = "";
                dt.Stop();

            }
        }

키보드 조작으로 뱀을 이동시키는 메소드.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace _050_SnakeBite
{
    /// <summary>
    /// Game.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class Game : Window
    {
        Random r = new Random();
        Ellipse[] snake = new Ellipse[30];
        Ellipse egg;
        int W = 10; // 뱀과 알의 크기 (Ellipse)
        int visibleCount =5;
        DispatcherTimer dt = new DispatcherTimer();
        Stopwatch sw = new Stopwatch();
        string move = "";

        public Game()
        {
            InitializeComponent();
            InitEgg();
            InitSnake();
            dt.Interval = new TimeSpan(0, 0, 0, 0, 100); // 0.1초
            dt.Tick += Dt_Tick;

        }

        private void Dt_Tick(object sender, EventArgs e)
        {
            for (int i = visibleCount; i > 0; i--)
                snake[i].Tag = (Point)snake[i - 1].Tag; //이전 태그를 따라감

            Point q = (Point)snake[0].Tag; // 뱀 머리

            if (move == "U")
                snake[0].Tag = new Point(q.X, q.Y - W);
            else if (move == "D")
                snake[0].Tag = new Point(q.X, q.Y + W);
            else if (move == "L")
                snake[0].Tag = new Point(q.X - W, q.Y);
            else if (move == "R")
                snake[0].Tag = new Point(q.X + W, q.Y);
            EatEgg();
            DrawSnake();

            TimeSpan ts = sw.Elapsed;
            txtTime.Text = ts.ToString();

        }

        //뱀이 알을 먹었는지 처리
        private void EatEgg()
        {
            Point pE = (Point)egg.Tag;
            Point pS = (Point)snake[0].Tag;

            if(pE.X == pS.X && pE.Y == pS.Y)
            {
                egg.Visibility = Visibility.Hidden;
                visibleCount++;
                if(visibleCount > 12)
                {
                    MessageBox.Show("Game End!");
                    Close();
                }
                snake[visibleCount - 1].Visibility = Visibility.Visible;
                txtScore.Text = "Eggs = " + (visibleCount - 5);
                InitEgg();
            }
        }

        private void DrawSnake()
        {
            for (int i = 0; i < visibleCount; i++)
            {
                Point p = (Point)snake[i].Tag;
                Canvas.SetLeft(snake[i], p.X);
                Canvas.SetTop(snake[i], p.Y);
            }
        }

        private void InitSnake()
        {
            //뱀의 머리위치
            int x = r.Next((int)(field.Width / W));
            int y = r.Next((int)(field.Height / W));

           
            
            for (int i = 0; i < 30; i++)
            {
                snake[i] = new Ellipse();
                snake[i].Width = W;
                snake[i].Height = W;
                snake[i].Stroke = Brushes.Black;

               
                if (i % 5 == 0)
                    snake[i].Fill = Brushes.Green;
                else
                    snake[i].Fill = Brushes.Gold;

                snake[0].Fill = Brushes.Chocolate;
                snake[i].Tag = new Point(x * W, (y + i) * W); // 뱀의 꼬리 길이때문에 y에 i만큼 +
                field.Children.Add(snake[i]);
                Canvas.SetLeft(snake[i], x * W);
                Canvas.SetTop(snake[i], (y + i) * W);
            }

            for (int i = visibleCount; i < 30; i++)
                snake[i].Visibility = Visibility.Hidden;

        }

        private void InitEgg()
        {
            egg = new Ellipse();
            egg.Width = W;
            egg.Height = W;
            egg.Stroke = Brushes.Black;
            egg.Fill = Brushes.Red;

            int x = r.Next((int)field.Width / W); //40
            int y = r.Next((int)field.Height / W); // 30

            egg.Tag = new Point(x*W, y*W);
            field.Children.Add(egg);

            Canvas.SetLeft(egg, x * W);
            Canvas.SetTop(egg, y * W);

        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            dt.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 = "";
                dt.Stop();

            }
        }
    }
}

 

'C#' 카테고리의 다른 글

049_Rotation_Clock_C#  (0) 2022.06.12
048_WPF_Clock_C#  (0) 2022.06.12
047_Form_Clock_C#  (0) 2022.06.09
046_Matching Game(그림 맞추기 게임)_C#  (0) 2022.06.09
045_ECG,PPG(Gragh Control)  (0) 2022.06.09