Я пишу приложение Sudoku и в настоящее время работаю над алгоритмом генерации игр. Мне удалось выяснить, как быстро генерировать решение (не решить). Однако я наткнулся на то, как удалить некоторые числа, чтобы фактически превратить их в головоломку. Мой первый склонность состояла в том, чтобы случайным образом удалить определенное количество ячеек на основе сложности, но это не правильный алгоритм, потому что он часто делает головоломку, которая является неразрешимой или имеет несколько решений. Это также может генерировать головоломки, которые не отражают запрошенную сложность. < /P>
Вот код, который у меня есть до сих пор. Я удалил большую часть нерелевантного кода, но если вы хотите увидеть что -то, что не реализовано, но используется ниже, пожалуйста, дайте мне знать. Я также могу дать свою попытку принять метод головоломки < /code>, если вы хотите, но я выбрал немедленно публиковать его, так как он явно неправильно (даже если это «работает»). < /P>
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sudoku
{
public class Game
{
public enum Difficulty
{
VeryEasy,
Easy,
Medium,
Difficult,
Evil
}
private readonly int?[,] _currentItems = new int?[9,9];
private readonly int?[,] _solution = new int?[9,9];
private readonly int?[,] _startingItems = new int?[9,9];
private readonly Difficulty _difficulty;
public Game(Difficulty difficulty)
{
_difficulty = difficulty;
GenerateSolution();
Puzzlefy();
}
private void GenerateSolution()
{
var random = new Random();
var availableNumbers = new Stack(81);
var x = 0;
var y = 0;
availableNumbers.Push(AllowableNumbers(_solution, 0, 0).ToList());
while (x < 9 && y < 9)
{
var currentAvailableNumbers = AllowableNumbers(_solution, x, y).ToList();
availableNumbers.Push(currentAvailableNumbers);
// back trace if the board is in an invalid state
while (currentAvailableNumbers.Count == 0)
{
_solution[x, y] = null;
availableNumbers.Pop();
currentAvailableNumbers = availableNumbers.Peek();
x -= y >= 1 ? 0 : 1;
y = y >= 1 ? y - 1 : 8;
}
var index = random.Next(currentAvailableNumbers.Count);
_solution[x, y] = currentAvailableNumbers[index];
currentAvailableNumbers.RemoveAt(index);
x += y < 8 ? 0 : 1;
y = y < 8 ? y + 1 : 0;
}
}
private void Puzzlefy()
{
CopyCells(_solution, _startingItems);
// remove some stuff from _startingItems
CopyCells(_startingItems, _currentItems);
}
}
}
< /code>
Я не ищу код, скорее алгоритм. Как я бы удалил числа из решения, чтобы превратить их в головоломку?
Подробнее здесь: https://stackoverflow.com/questions/148 ... t-a-puzzle
Удаление ячеек из раствора судоку, чтобы сделать его головоломкой ⇐ C#
Место общения программистов C#
-
Anonymous
1758995199
Anonymous
Я пишу приложение Sudoku и в настоящее время работаю над алгоритмом генерации игр. Мне удалось выяснить, как быстро генерировать решение (не решить). Однако я наткнулся на то, как удалить некоторые числа, чтобы фактически превратить их в головоломку. Мой первый склонность состояла в том, чтобы случайным образом удалить определенное количество ячеек на основе сложности, но это не правильный алгоритм, потому что он часто делает головоломку, которая является неразрешимой или имеет несколько решений. Это также может генерировать головоломки, которые не отражают запрошенную сложность. < /P>
Вот код, который у меня есть до сих пор. Я удалил большую часть нерелевантного кода, но если вы хотите увидеть что -то, что не реализовано, но используется ниже, пожалуйста, дайте мне знать. Я также могу дать свою попытку принять метод головоломки < /code>, если вы хотите, но я выбрал немедленно публиковать его, так как он явно неправильно (даже если это «работает»). < /P>
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sudoku
{
public class Game
{
public enum Difficulty
{
VeryEasy,
Easy,
Medium,
Difficult,
Evil
}
private readonly int?[,] _currentItems = new int?[9,9];
private readonly int?[,] _solution = new int?[9,9];
private readonly int?[,] _startingItems = new int?[9,9];
private readonly Difficulty _difficulty;
public Game(Difficulty difficulty)
{
_difficulty = difficulty;
GenerateSolution();
Puzzlefy();
}
private void GenerateSolution()
{
var random = new Random();
var availableNumbers = new Stack(81);
var x = 0;
var y = 0;
availableNumbers.Push(AllowableNumbers(_solution, 0, 0).ToList());
while (x < 9 && y < 9)
{
var currentAvailableNumbers = AllowableNumbers(_solution, x, y).ToList();
availableNumbers.Push(currentAvailableNumbers);
// back trace if the board is in an invalid state
while (currentAvailableNumbers.Count == 0)
{
_solution[x, y] = null;
availableNumbers.Pop();
currentAvailableNumbers = availableNumbers.Peek();
x -= y >= 1 ? 0 : 1;
y = y >= 1 ? y - 1 : 8;
}
var index = random.Next(currentAvailableNumbers.Count);
_solution[x, y] = currentAvailableNumbers[index];
currentAvailableNumbers.RemoveAt(index);
x += y < 8 ? 0 : 1;
y = y < 8 ? y + 1 : 0;
}
}
private void Puzzlefy()
{
CopyCells(_solution, _startingItems);
// remove some stuff from _startingItems
CopyCells(_startingItems, _currentItems);
}
}
}
< /code>
Я не ищу код, скорее алгоритм. Как я бы удалил числа из решения, чтобы превратить их в головоломку?
Подробнее здесь: [url]https://stackoverflow.com/questions/14858994/removing-cells-from-a-sudoku-solution-to-make-it-a-puzzle[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия