Судоку

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

яет все цифры, поставленные пользователем на пустые ячейки. Таймер отiитывает время, проведенное пользователем в игре. Кнопка Выход позволит пользователю по желанию выйти из программы.

Игровое поле представляет собой квадрат, состоящий из 81 клетки, который в свою очередь состоит из 9 квадратов по 9 клеток. С каждым новым запуском игры заполнение ячеек происходит рандомным образом. Для заполнения игрового поля необходимо поставить курсор в нужную ячейку и в появившемся окне выбрать либо число, которое пользователь хочет поставить, либо очистку ячейки (рис.5). Все введенные значения можно изменять в течение игры.

Рис.2 Начальная форма

Рис.3 Основное поле

Рис.4 Титульный лист

Рис.5 Основное окно с дополнительным окном предложения выбора действия

Код подпрограммы на языке C#

Рассмотрим код программы, выполняющий основную задачу, такую как прорисовку самого поля на игровой форме (рис.3), выполнения проверки и вывода данных.

namespace Судоку

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

bool first_start = false;

int second = 0; // для таймера

int minute = 0;

int x_move = -1; //для mousemove

int y_move = -1; // для mousemove

HelpForm helpform;

Random rnd;

char[] chr;

public Field f;

Sudoku sudok;

public int[,] matr = new int[9, 9];

int x = 1; // для наведения мыши

int y = 1;

private void Form1_Load(object sender, EventArgs e)

{

toolStripTextBox1.Enabled = false;

panel1.Hide();

}

private void panel1_MouseMove(object sender, MouseEventArgs e)

{

x_move = e.X;

y_move = e.Y;

}

private void panel1_MouseClick(object sender, MouseEventArgs e)

{

sudok.pointX = e.X / 41;

sudok.pointY = e.Y / 41;

if (f.matrix[sudok.pointY, sudok.pointX] == 0)

{

helpform = new HelpForm(ref f, ref sudok);

helpform.Show();

helpform.Location = new Point(this.Location.X + e.X - helpform.Width / 2, this.Location.Y + e.Y);

f.Visual();

if (helpform != null) f.DrawNumbers(sudok.new_matrix, Color.Black);

f.DrawNumbers(matr, Color.Red);

}

}

private void Form1_Shown(object sender, EventArgs e)

{

chr = new char[9];

string[] s = new string[9];

StreamReader sr = new StreamReader("судоку.txt");

for (int i = 0; i < 9; i++)

{

s[i] = sr.ReadLine(); // iитали из файла судоку

for (int k = 0; k < 9; k++)

{

chr[k] = s[i][k];

}

}

sr.Close();

rnd = new Random();

sudok = new Sudoku(s);

panel1.Show();

f = new Field(panel1, 9, 40, 9, 9);

f.Visual();

matr = sudok.Separate(s, 9);

f.DrawNumbers(matr, Color.Red);

timer1.Start();

if(f!=null && helpform!=null)

f.pressed = helpform.rezult;

}

private void timer1_Tick(object sender, EventArgs e)

{

if (helpform != null && helpform.closed)

{

f.DrawNumbers(matr, Color.Red);

f.DrawNumbers(sudok.new_matrix, Color.Black);

}

if (!first_start)

{

f.Visual();

f.DrawNumbers(matr, Color.Red);

first_start = true;

}

second++;

if (second == 6000) { minute++; second = 0; }

if (x_move!=-1 &&y_move!=-1)

{

if (Math.Abs((x - x % 41) - (x_move - x_move % 41)) > 39 || Math.Abs((y - y % 41) - (y_move - y_move % 41)) > 39)

{

f.Redraw_Clear(x / 41, y / 41);

f.Redraw_Busy(x_move / 41, y_move / 41, matr);

x = x_move;

y = y_move;

f.RedrawField();

if (helpform != null)

{

f.DrawNumbers(sudok.new_matrix, Color.Black);

}

f.DrawNumbers(matr, Color.Red);

x_move = -1;

y_move = -1;

}

}

if(second0==0)

toolStripTextBox1.Text = minute.ToString() + " : " + ((int)second / 100).ToString();

}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

Application.Exit(); //кнопка выхода

}

private void toolStripLabel1_Click(object sender, EventArgs e)

{

About ab = new About();

ab.Show();

}

private void toolStripLabel2_Click(object sender, EventArgs e)

{

int i = 0;

int prov;

for (i = 0; i < 9; i++)

{

for (int j = 0; j < 9; j++)

{

prov = 0;

if (sudok.matrix[i, j] == sudok.matrix2[i, j]) prov = 1;

else

{

if (sudok.matrix[i, j] == sudok.new_matrix[i, j]) prov = 1;

}

if (prov == 0)

{ i = 11; MessageBox.Show("Имеются не правильно заполненные ячейки, либо не все ещё заполнены!"); j = 11; }

}

}

if (i != 12) MessageBox.Show("Вы всё правильно заполнили!");

}

private void toolStripButton1_Click(object sender, EventArgs e)

{

sudok.new_matrix = new int[9, 9];

f.Visual();

f.DrawNumbers(matr, Color.Red);

}

}

}

Заключение

Рассмотрены принципы создания игровых интерфейсов, принципы создания игровых приложений на языке C# на примере игры Судоку. Рассмотрен один из алгоритмов создания матрицы. В программе используются принципы объектно-ориентированного программирования. Также был создан интерфейс, позволяющий посмотреть информацию об авторе, и проверить правильность заполнения игрового поля.

Возможная разработка программы в будущем:

)Создание таблицы рекордов.

2)Добавление выбора уровня сложности.

3)Ограничение времени игры.

4)Разработка дизайна программы.

Список литературы

1.Мельникова О.И. Лекции по программированию на языках высокого уровня.

2.