Первая строка заполняется случайными неповторяющимися числами от 1 до 9. Далее для каждой следующей строки происходит особая перестановка элементов из первой строки такая, что судоку имеет решение и является верным. Затем в каждом блоке из трех строк (1—3, 4—6, 7—9) происходит случайная перестановка двух строк, если программа выбрала одинаковую строку, то перестановка не происходит, тоже самое делается и с столбцами. Далее переставляем местами 2 случайных блока по горизонтали и по вертикали, по тому же принципу как и строки со столбцами. Затем удаляются лишние клетки. В итоге получается уникальное судоку.
Ниже приведен код из файла Game1:
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using System.IO.IsolatedStorage;
using System.IO;
namespace Sudoku
{
// Класс Field
public class Field
{
// Квадрат
public short Square {get; set;}
// Значение
public short Value {get; set;}
// Стандартное
public bool Standard {get; set;}
// Повтор
public bool Repeat {get; set;}
}
public class Game1: Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
// Объявление переменных
// Текстуры:
Texture2D gameField;
Texture2D doublePoint;
Texture2D standartNumbers, errorNumbers;
Texture2D menuUpdate, menuRecord;
Texture2D [] numbersTexture = new Texture2D [10];
// Массив элементов поля
Field [,] field = new Field [9,9];
// Массив чисел
short [] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// Время текущей игры, рекордное время
int time, tempTime, recordTime;
// Выбранная цифра
byte chouseNum;
// Время в представлении ЧЧ: ММ: СС
string timeString;
bool menuUp, menuRec;
public Game1 ()
{
graphics = new GraphicsDeviceManager (this);
Content.RootDirectory = " Content ";
// Ориектация экрана
graphics.SupportedOrientations = DisplayOrientation. Portrait;
// Разрешение экрана
graphics.PreferredBackBufferWidth = 480;
graphics.PreferredBackBufferHeight = 800;
// На полный экран
graphics.IsFullScreen = true;
// Частота кадра на Windows Phone по умолчанию – 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks (333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds (1);
// Тип жестов – нажатие
TouchPanel. EnabledGestures = GestureType. Tap;
}
protected override void Initialize ()
{
base.Initialize ();
}
// Загрузка контента
protected override void LoadContent ()
{
spriteBatch = new SpriteBatch (GraphicsDevice);
// Загрузка текстур – фон, двоеточие, выделение стандартных и выбранных чисел, выделение ошибок,
// сообщение об обновлении и информация о рекорде
gameField = Content. Load <Texture2D> («GameField»);
doublePoint = Content. Load <Texture2D> («d»);
standartNumbers = Content. Load <Texture2D> («s»);
errorNumbers = Content. Load <Texture2D> («error»);
menuUpdate = Content. Load <Texture2D> («MenuUpdate»);
menuRecord = Content. Load <Texture2D> («MenuRecord»);
// Загрузка текстур цифр
for (short i = 0; i <10; i++)
{
numbersTexture [i] = Content.Load<Texture2D>(i.ToString ());
}
// Созданние массиива объектов класса Field
for (short i = 0; i <9; i++)
{
for