using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
namespace KnightsTour
{
public partial class KnightsTour : Form
{
Size gridSize = new Size(8, 8);
Size cellSize = new Size(50, 50);
// the bitmap images
private Bitmap knight = new Bitmap(typeof(KnightsTour), "knight.png");
/// The game internal data representation
/// If a cell equals:
/// 0 - no image
/// 1 - image 1
/// 2 - image 2
Bitmap[,] gameData;
// variables used when an image is moving across the game window
Point selectedCell = new Point();
Point mousePt = new Point();
Point cellOffset = new Point();
Bitmap selectedImage;
bool moving = false;
public KnightsTour()
{
InitializeComponent();
// for flicker free motion
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
// set the screen size and window position
this.ClientSize = new Size(cellSize.Width * gridSize.Width,
cellSize.Height * gridSize.Height);
this.StartPosition = FormStartPosition.CenterScreen;
// initialize the gameData array
gameData = new Bitmap[gridSize.Width, gridSize.Height];
// set the gameData values all to null
for (int i = 0; i < gridSize.Width; i++)
for (int j = 0; j < gridSize.Height; j++)
gameData[i, j] = null;
// set the left column to img1
for (int j = 0; j < gridSize.Height; j++)
gameData[0, j] = knight;
}
private void KnightsTour_Paint_1(object sender, PaintEventArgs e)
{
selectedImage = knight;
// the graphics device to draw to
Graphics gr = e.Graphics;
// draw the background colour
//gr.FillRectangle(Brushes.Goldenrod, this.ClientRectangle);
// draw the game grid.
for (int i = 0; i < gridSize.Width; i++)
for (int j = 0; j < gridSize.Height; j++)
{
Rectangle cell = new Rectangle(i * cellSize.Width,j * cellSize.Height,
cellSize.Width, cellSize.Height);
if ((i + j) % 2 == 0)
gr.FillRectangle(Brushes.White, cell);
else
gr.FillRectangle(Brushes.Black, cell);
}
if (moving)
gr.DrawImage(selectedImage, mousePt.X - cellOffset.X, mousePt.Y - cellOffset.Y);
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Dispose();
}
private void instructionsToolStripMenuItem_Click(object sender, EventArgs e)
{
instructions instructForm = new instructions();
instructForm.ShowDialog();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
about aboutForm = new about();
aboutForm.ShowDialog();
}
private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Starting New Game", "Notice");
Form form = new Form();
this.Hide();
form = new KnightsTour();
form.Show();
}
private void KnightsTour_MouseDown(object sender, MouseEventArgs e)
{
//determine which cell was chosen
selectedCell = new Point((e.X) / cellSize.Width , (e.Y) / cellSize.Height);
//set the variable which tells if the object is going to be moved
if (selectedCell.X < 0 || selectedCell.Y < 0 || selectedCell.X >= gridSize.Width ||
selectedCell.Y >= gridSize.Height)
{
MessageBox.Show("Invalid Move", "Warning...");
moving = false;
}
else moving = true;
if (moving)//if the image is in motion
{
//record the current mouse location
mousePt = new Point(selectedCell.X, selectedCell.Y);
MessageBox.Show(selectedCell.X.ToString() + "," + selectedCell.Y.ToString(), "Selected Cell...");
//cause the selected knight square to be redrawn
gameData[selectedCell.X * 50,selectedCell.Y * 50] = selectedImage;
RedrawPoint(selectedCell.X, selectedCell.Y);
RedrawCell(selectedCell);
}
}
private void RedrawPoint(int x, int y)
{
Rectangle rect = new Rectangle(x, y, cellSize.Width, cellSize.Height);
Invalidate(rect);
}
private void RedrawCell(Point cell)
{
Rectangle rect = new Rectangle(cell.X * cellSize.Width, cell.Y * cellSize.Height, cellSize.Width, cellSize.Height);
Invalidate(rect);
}
}
}