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 |