Судоку
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
яет все цифры, поставленные пользователем на пустые ячейки. Таймер от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.