Pull to refresh

Генератор судоку на JavaScript (13 строчек)

После наплыва постов про реализацию различных игрушек на JavaScript в 30 строчек, решил тоже внести свой вклад в общее дело «30 строчек». Решил немного отойти от игр и реализовать генерацию судоку на JavaScript, но не уложился в 30 строчек. Надеюсь, что это маленькое недоразумение, не омрачит великое соревнование 30 строчек. Раньше доводилось писать скрипты для Corel Draw, которые генерировали 9 судоку на лист и создавали целый журнал. Оставалось только печатать и раздавать всем желающим.



Возможности:
  • генерация судоку случайным образом
  • ввод чисел (с проверкой на ввод числа) в пустые ячейки
  • 13 строчек с учетом html и css


Принцип работы


Для генерации судоку используется подготовленны шаблон, который хранится в виде строки. Раньше я использовал несколько шаблонов, но для данного случая вполне сгодится и один. Немного странным образом организую перемешивание массива с цифрами от 1 до 9. Этот массив потребуется для замены цифр в шаблоне. Далее начинаем формировать таблицу. Используя шаблон и массив для замены цифр формируем ячейки, не забывая создавать текстовые поля для ввода.

Код


Код можно было еще ужать и объединить некоторые строки, но мне кажется такой вариант более удобный для восприятия.

Сам код
<style>#sudoku td{border:1px solid #cdcdcd;background:#f8f8f8;padding: 5px 10px;margin:0;} #sudoku .l {margin:0;padding:0;} #sudoku input{height:30px;width:30px;border:0 none;text-align:center;}</style>
<table id="sudoku" cellspacing="0">
<script type="text/javascript">
	var field = '0681594327597283416342671589934157268278936145156842973729318654813465792465729831';
	var arr = Array(1,2,3,4,5,6,7,8,9);
	for (var j=0;j<9;j++) arr.push(arr.splice((Math.random() * arr.length), 1));
	for (var i=1;i<82;i++) { 
		if (i%9==1) document.write('<tr>');
		document.write( (Math.random()*10>5) ? '<td>'+arr[field.substr(i,1)-1] + '</td>' : '<td class="l"><input type="text" size="1" maxlength="1" onkeydown = "javascript: return ((event.keyCode>47)&&(event.keyCode<58))"></td>' );
		if (i%9==0) document.write('</tr>');
	}
</script>
</table>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.