ALOT again
This commit is contained in:
Generated
+31
@@ -29,6 +29,8 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
Canvas = new Panel();
|
||||
btnEndGame = new Button();
|
||||
lblLoading = new Label();
|
||||
btnStart = new Button();
|
||||
panel1 = new Panel();
|
||||
txtScore = new TextBox();
|
||||
@@ -41,15 +43,39 @@
|
||||
//
|
||||
Canvas.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
Canvas.BackColor = Color.White;
|
||||
Canvas.Controls.Add(btnEndGame);
|
||||
Canvas.Controls.Add(lblLoading);
|
||||
Canvas.Controls.Add(btnStart);
|
||||
Canvas.Location = new Point(0, 0);
|
||||
Canvas.Name = "Canvas";
|
||||
Canvas.Size = new Size(480, 480);
|
||||
Canvas.TabIndex = 0;
|
||||
//
|
||||
// btnEndGame
|
||||
//
|
||||
btnEndGame.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
btnEndGame.Location = new Point(193, 261);
|
||||
btnEndGame.Name = "btnEndGame";
|
||||
btnEndGame.Size = new Size(94, 29);
|
||||
btnEndGame.TabIndex = 2;
|
||||
btnEndGame.Text = "END GAME";
|
||||
btnEndGame.UseVisualStyleBackColor = true;
|
||||
btnEndGame.Click += button1_Click;
|
||||
//
|
||||
// lblLoading
|
||||
//
|
||||
lblLoading.AutoSize = true;
|
||||
lblLoading.Font = new Font("Segoe UI", 15F);
|
||||
lblLoading.Location = new Point(92, 151);
|
||||
lblLoading.Name = "lblLoading";
|
||||
lblLoading.Size = new Size(296, 35);
|
||||
lblLoading.TabIndex = 1;
|
||||
lblLoading.Text = "Loading data, please wait";
|
||||
//
|
||||
// btnStart
|
||||
//
|
||||
btnStart.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
btnStart.Enabled = false;
|
||||
btnStart.Location = new Point(193, 226);
|
||||
btnStart.Name = "btnStart";
|
||||
btnStart.Size = new Size(94, 29);
|
||||
@@ -96,9 +122,12 @@
|
||||
Controls.Add(Canvas);
|
||||
Name = "Form1";
|
||||
Text = "Snake";
|
||||
FormClosing += Form1_FormClosing;
|
||||
Shown += Form1_Shown;
|
||||
KeyDown += Form1_KeyDown;
|
||||
PreviewKeyDown += Form1_PreviewKeyDown;
|
||||
Canvas.ResumeLayout(false);
|
||||
Canvas.PerformLayout();
|
||||
panel1.ResumeLayout(false);
|
||||
panel1.PerformLayout();
|
||||
ResumeLayout(false);
|
||||
@@ -111,5 +140,7 @@
|
||||
private Label label1;
|
||||
private TextBox txtScore;
|
||||
private Button btnStart;
|
||||
private Label lblLoading;
|
||||
private Button btnEndGame;
|
||||
}
|
||||
}
|
||||
|
||||
+118
-55
@@ -5,75 +5,61 @@ namespace view
|
||||
{
|
||||
public partial class Form1 : Form
|
||||
{
|
||||
Graphics graphics;
|
||||
int line_width = 2;
|
||||
SnakeLevel? CurrentLevel;
|
||||
SnakeLevelLoader level_loader;
|
||||
#region Fields
|
||||
const int line_width = 2; // Width of the table lines
|
||||
SnakeLevel? CurrentLevel; // Current game state
|
||||
SnakeLevelLoader level_loader; // Level loader
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
graphics = Canvas.CreateGraphics();
|
||||
level_loader = new SnakeLevelLoader(Path.Combine(Directory.GetCurrentDirectory(), "levels.json"));
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void Form1_KeyDown(object sender, KeyEventArgs e)
|
||||
#region Draw Funciton
|
||||
/// <summary>
|
||||
/// Draws the current map to the canvas
|
||||
/// </summary>
|
||||
private void Draw()
|
||||
{
|
||||
if (CurrentLevel == null) return;
|
||||
switch (e.KeyCode)
|
||||
{
|
||||
case Keys.Up:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Up;
|
||||
break;
|
||||
case Keys.Down:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Down;
|
||||
break;
|
||||
case Keys.Left:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Left;
|
||||
break;
|
||||
case Keys.Right:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Right;
|
||||
break;
|
||||
case Keys.Escape:
|
||||
if(CurrentLevel.State == SnakeLevel.GameState.Running)
|
||||
CurrentLevel.Pause();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void Draw(SnakeLevel level)
|
||||
{
|
||||
var canvas_size = Math.Min(Canvas.Width, Canvas.Height);
|
||||
graphics = Canvas.CreateGraphics();
|
||||
using Graphics canvas_graphics = Canvas.CreateGraphics();
|
||||
|
||||
using Bitmap bmp = new Bitmap(Canvas.Width, Canvas.Height, canvas_graphics);
|
||||
using Graphics graphics = Graphics.FromImage(bmp);
|
||||
|
||||
graphics.Clear(Color.White);
|
||||
double cell_size = (double)(canvas_size - (level.Size + 1) * line_width) / level.Size;
|
||||
var canvas_size = Math.Min(Canvas.Width, Canvas.Height);
|
||||
|
||||
double cell_size = (double)(canvas_size - (CurrentLevel.Size + 1) * line_width) / CurrentLevel.Size;
|
||||
// vertical lines
|
||||
for (int i = 0; i <= level.Size; i++)
|
||||
for (int i = 0; i <= CurrentLevel.Size; i++)
|
||||
{
|
||||
int x = (int)(i * (cell_size + line_width));
|
||||
graphics.FillRectangle(Brushes.Black, x, 0, line_width, canvas_size);
|
||||
}
|
||||
// horizontal lines
|
||||
for (int i = 0; i <= level.Size; i++)
|
||||
for (int i = 0; i <= CurrentLevel.Size; i++)
|
||||
{
|
||||
int y = (int)(i * (cell_size + line_width));
|
||||
graphics.FillRectangle(Brushes.Black, 0, y, canvas_size, line_width);
|
||||
}
|
||||
// Ssnake
|
||||
foreach (var pos in level.Snake)
|
||||
foreach (var pos in CurrentLevel.Snake)
|
||||
{
|
||||
int x = (int)(cell_size * pos.X + line_width * (pos.X + 1));
|
||||
int y = (int)(cell_size * pos.Y + line_width * (pos.Y + 1));
|
||||
graphics.FillRectangle(Brushes.Green, x, y, (int)cell_size, (int)cell_size);
|
||||
}
|
||||
// snake head
|
||||
int snake_head_x = (int)(cell_size * level.SnakeHead.X + line_width * (level.SnakeHead.X + 1));
|
||||
int snake_head_y = (int)(cell_size * level.SnakeHead.Y + line_width * (level.SnakeHead.Y + 1));
|
||||
int snake_head_x = (int)(cell_size * CurrentLevel.SnakeHead.X + line_width * (CurrentLevel.SnakeHead.X + 1));
|
||||
int snake_head_y = (int)(cell_size * CurrentLevel.SnakeHead.Y + line_width * (CurrentLevel.SnakeHead.Y + 1));
|
||||
graphics.FillRectangle(Brushes.Red, snake_head_x, snake_head_y, (int)cell_size, (int)cell_size);
|
||||
switch (level.SnakeHeadDirection)
|
||||
switch (CurrentLevel.SnakeHeadDirection)
|
||||
{
|
||||
case SnakeLevel.SnakeDirection.Up:
|
||||
graphics.DrawLine(Pens.Black, snake_head_x + (int)cell_size / 2, snake_head_y, snake_head_x + (int)cell_size / 2, snake_head_y + (int)cell_size);
|
||||
@@ -99,7 +85,7 @@ namespace view
|
||||
}
|
||||
|
||||
// obstacles
|
||||
foreach (var pos in level.Obstacles)
|
||||
foreach (var pos in CurrentLevel.Obstacles)
|
||||
{
|
||||
int x = (int)(cell_size * pos.X + line_width * (pos.X + 1));
|
||||
int y = (int)(cell_size * pos.Y + line_width * (pos.Y + 1));
|
||||
@@ -107,12 +93,41 @@ namespace view
|
||||
}
|
||||
|
||||
//eggs
|
||||
foreach (var pos in level.Eggs)
|
||||
foreach (var pos in CurrentLevel.Eggs)
|
||||
{
|
||||
int x = (int)(cell_size * pos.X + line_width * (pos.X + 1));
|
||||
int y = (int)(cell_size * pos.Y + line_width * (pos.Y + 1));
|
||||
graphics.FillRectangle(Brushes.Pink, x, y, (int)cell_size, (int)cell_size);
|
||||
}
|
||||
|
||||
canvas_graphics.DrawImage(bmp, 0, 0);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Form event handlers
|
||||
private void Form1_KeyDown(object sender, KeyEventArgs e)
|
||||
{
|
||||
if (CurrentLevel == null) return;
|
||||
switch (e.KeyCode)
|
||||
{
|
||||
case Keys.Up:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Up;
|
||||
break;
|
||||
case Keys.Down:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Down;
|
||||
break;
|
||||
case Keys.Left:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Left;
|
||||
break;
|
||||
case Keys.Right:
|
||||
CurrentLevel.SnakeHeadDirection = SnakeLevel.SnakeDirection.Right;
|
||||
break;
|
||||
case Keys.Escape:
|
||||
if (CurrentLevel.State == SnakeLevel.GameState.Running)
|
||||
CurrentLevel.Pause();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, EventArgs e)
|
||||
@@ -139,31 +154,86 @@ namespace view
|
||||
}
|
||||
}
|
||||
|
||||
private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
{
|
||||
if (CurrentLevel?.State is SnakeLevel.GameState.Running)
|
||||
{
|
||||
e.IsInputKey = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void Form1_Shown(object sender, EventArgs e)
|
||||
{
|
||||
btnEndGame.Visible = false; // It will trigger a whole repaint the first time it is shown unless this is done
|
||||
level_loader.ReadAllDataAsync().ContinueWith((task) =>
|
||||
{
|
||||
if (!this.IsDisposed) // The form can be closed before the file is loaded
|
||||
{
|
||||
this.Invoke(() =>
|
||||
{
|
||||
if (task.IsCompletedSuccessfully)
|
||||
{
|
||||
lblLoading.Visible = false;
|
||||
btnStart.Enabled = true;
|
||||
btnStart.Focus();
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Failed to read data");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
CurrentLevel = null;
|
||||
btnEndGame.Visible = false;
|
||||
Canvas.Refresh();
|
||||
txtScore.Text = "";
|
||||
}
|
||||
|
||||
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
if (CurrentLevel != null)
|
||||
{
|
||||
if (CurrentLevel.State == SnakeLevel.GameState.Running)
|
||||
{
|
||||
CurrentLevel.Pause();
|
||||
}
|
||||
CurrentLevel = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Game event handlers
|
||||
private void CurrentLevel_GameUpdate(object? sender, EventArgs e)
|
||||
{
|
||||
if (CurrentLevel == null) return;
|
||||
this.Invoke(() =>
|
||||
{
|
||||
if (CurrentLevel != null)
|
||||
{
|
||||
Draw(CurrentLevel);
|
||||
txtScore.Text = CurrentLevel.Score.ToString();
|
||||
}
|
||||
Draw();
|
||||
txtScore.Text = CurrentLevel.Score.ToString();
|
||||
});
|
||||
}
|
||||
|
||||
private void CurrentLevel_GameStateUpdate(object? sender, SnakeLevel.GameState e)
|
||||
{
|
||||
if (CurrentLevel == null) return;
|
||||
this.Invoke(() =>
|
||||
{
|
||||
if (CurrentLevel == null) return;
|
||||
switch (e)
|
||||
{
|
||||
case SnakeLevel.GameState.Running:
|
||||
btnStart.Visible = false;
|
||||
Draw(CurrentLevel);
|
||||
btnEndGame.Visible = false;
|
||||
Draw();
|
||||
break;
|
||||
case SnakeLevel.GameState.Paused:
|
||||
btnStart.Visible = true;
|
||||
btnEndGame.Visible = true;
|
||||
break;
|
||||
case SnakeLevel.GameState.Dead:
|
||||
btnStart.Visible = true;
|
||||
@@ -172,13 +242,6 @@ namespace view
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
||||
{
|
||||
if(CurrentLevel?.State is SnakeLevel.GameState.Running)
|
||||
{
|
||||
e.IsInputKey = true;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
+25
-13
@@ -4,8 +4,15 @@ namespace view
|
||||
{
|
||||
public partial class MapChooser : Form
|
||||
{
|
||||
#region Fields
|
||||
private SnakeLevelLoader _level_loader;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
public StoredSnakeLevel? SelectedLevel { get; private set; }
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
public MapChooser(SnakeLevelLoader level_loader)
|
||||
{
|
||||
this._level_loader = level_loader;
|
||||
@@ -16,7 +23,24 @@ namespace view
|
||||
lstLevels.Items.Add(level.LevelName);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
void ChooseLevel()
|
||||
{
|
||||
if (lstLevels.SelectedIndex == -1)
|
||||
{
|
||||
SelectedLevel = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedLevel = _level_loader.StoredLevels[lstLevels.SelectedIndex];
|
||||
Close();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Event handlers
|
||||
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (lstLevels.SelectedIndex == -1)
|
||||
@@ -48,18 +72,6 @@ namespace view
|
||||
ChooseLevel();
|
||||
}
|
||||
}
|
||||
|
||||
void ChooseLevel()
|
||||
{
|
||||
if (lstLevels.SelectedIndex == -1)
|
||||
{
|
||||
SelectedLevel = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelectedLevel = _level_loader.StoredLevels[lstLevels.SelectedIndex];
|
||||
Close();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,5 +21,50 @@
|
||||
[ 2, 3 ],
|
||||
[ 1, 2 ]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level_name": "Easy",
|
||||
"size": 10,
|
||||
"snake_start_length": 5,
|
||||
"new_egg_round": 2,
|
||||
"egg_limit": 4,
|
||||
"obstacles": [
|
||||
[ 1, 1 ],
|
||||
[ 1, 8 ],
|
||||
[ 8, 1 ],
|
||||
[ 8, 8 ]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level_name": "Medium",
|
||||
"size": 9,
|
||||
"snake_start_length": 5,
|
||||
"new_egg_round": 4,
|
||||
"egg_limit": 2,
|
||||
"obstacles": [
|
||||
[ 1, 1 ],
|
||||
[ 1, 7 ],
|
||||
[ 7, 1 ],
|
||||
[ 7, 7 ]
|
||||
]
|
||||
},
|
||||
{
|
||||
"level_name": "Hard",
|
||||
"size": 7,
|
||||
"snake_start_length": 5,
|
||||
"new_egg_round": 8,
|
||||
"egg_limit": 1,
|
||||
"obstacles": [
|
||||
[ 1, 1 ],
|
||||
[ 1, 2 ],
|
||||
[ 1, 3 ],
|
||||
[ 1, 4 ],
|
||||
[ 1, 5 ],
|
||||
[ 5, 1 ],
|
||||
[ 5, 2 ],
|
||||
[ 5, 3 ],
|
||||
[ 5, 4 ],
|
||||
[ 5, 5 ]
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user