Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.05.2019, 23:12
Новичок на форуме
Отправить личное сообщение для i_fugas Посмотреть профиль Найти все сообщения от i_fugas
 
Регистрация: 12.05.2019
Сообщений: 1

Крестики-нолики
Доброго времени суток. Очень хотелось бы, что бы кто-то поподробней описал алгоритм игры по приведенному ниже коду. Сложно разобраться.
<script>
			"use strict";
			var LogOn = true;
			var player = "X";
			var fieldSize = Math.ceil(Math.min(innerHeight, innerWidth ) * 0.8)
			var field = document.getElementById("field");
			field.style.width = fieldSize + "px";
			field.style.height = fieldSize + "px";
			field.style.fontSize = fieldSize/4 + "px"
			var ceils = CreCeilsArr(document.getElementById("table"));
			function lo9(str, handler){
				if	(!LogOn) return;
				if	(handler) handler(str);
				else console.log(str);
			}
			function RandInt(min, max){
				return Math.floor(min + Math.random() * (max - min + 1));
			}
			function ChangePlayer(player) {
				switch (player) {
					case "X":
						return "O";
					case "O":
						return "X";
				}
			}
			function CreCeilsArr(table) {
				var result = [];
				var index = 0;
				for (var y = 0; y < 3; y++) {
					var row =  document.createElement('tr');
					row.bgColor = '#F1C7A7';
					for (var x = 0; x < 3; x++) {
						result.push(GetCeil(y,x,index++,row));
					}
					table.appendChild(row);
				}
				function GetCeil(y,x,i,parent){
					var ceil = document.createElement('td');
					ceil.id = i;
					ceil.innerText = " ";
					parent.appendChild(ceil);
					return {
						"ceil": ceil,
						"GetVal": function(){
							return this.ceil.innerText || " ";
						},
						"SetVal": function(val){
							this.ceil.innerText = val;
						}
					}
				}
				return result;
			}
			function FindFillLine(){
				var ways = GetSortWays();
				var mask = player + player + player;
				return ways.some(function(way) {
					var str = way[0].GetVal() + way[1].GetVal() + way[2].GetVal();
					return !!~str.indexOf(mask);
				})
			}
			function ChekFieldFill(){
				var ways = GetSortWays();
				return ways.every(function(way) {
					var str = way[0].GetVal() + way[1].GetVal() + way[2].GetVal();
					return !~str.indexOf(" ");
				})
			}
			function MouseClick(element) {
				if(element.srcElement.innerText){
					//animation
					return;
				}
				event.srcElement.innerText = player;
				if (ChekEnd()) return;
				player = ChangePlayer(player);
				
				AI();
				if (ChekEnd()) return;
				player = ChangePlayer(player);
				
				function ChekEnd(){
					if(FindFillLine()){
						alert("Game over.\n\nPlayer " + player + " win!");
						location.reload();
						return true;
					}
					if(ChekFieldFill()){
						alert("Game over. Drow!");
						location.reload();
						return true;
					}
				}
			}
			function GetSortWays() {
				var ways = [];
				ways.push([ceils[0], ceils[1], ceils[2]]);
				ways.push([ceils[3], ceils[4], ceils[5]]);
				ways.push([ceils[6], ceils[7], ceils[8]]);
				ways.push([ceils[0], ceils[3], ceils[6]]);
				ways.push([ceils[1], ceils[4], ceils[7]]);
				ways.push([ceils[2], ceils[5], ceils[8]]);
				ways.push([ceils[0], ceils[4], ceils[8]]);
				ways.push([ceils[6], ceils[4], ceils[2]]);
				return ways;
			}
			function AI() {
				var ways = GetSortWays();
				var priorityWays = [];
				var interimWays;
				var oponent = ChangePlayer(player);
				var mask;
				//
				mask = player + player + " ";
				SearchPriorityWays();
				mask = player + " " + player;
				SearchPriorityWays();
				mask = " " + player + player;
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = oponent + oponent + " ";
				SearchPriorityWays();
				mask = oponent + " " + oponent;
				SearchPriorityWays();
				mask = " " + oponent + oponent;
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = player + " " + " ";
				SearchPriorityWays();
				mask = " " + " " + player;
				SearchPriorityWays();
				mask = " " + player + " ";
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = oponent + " " + " ";
				SearchPriorityWays();
				mask = " " + " " + oponent;
				SearchPriorityWays();
				mask = " " + oponent + " ";
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				
				function SearchMask(arr){
					var str = arr[0].GetVal() + arr[1].GetVal() + arr[2].GetVal();
					return !!~str.indexOf(mask);
				}
				function SearchPriorityWays() {
					if(interimWays = ways.filter(SearchMask)){
						for (var index = 0; index < interimWays.length; index++) {
							priorityWays.push(interimWays[index]);
						}
					}
				}
				function DoMove(priorityWays, player) {
					var randomWayIndex = RandInt(0,priorityWays.length-1);
					var winningWay = priorityWays[randomWayIndex];
					var winningMoves = winningWay.filter(function(item) {return ~item.GetVal().indexOf(" ")});
					var winningMoveIndex = RandInt(0,winningMoves.length-1);
					var winningMove = winningMoves[winningMoveIndex];
					winningMove.SetVal(player);
				}
			}
		</script>
Ответить с цитированием
  #2 (permalink)  
Старый 13.05.2019, 14:19
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

А что конкретно непонятно?
<style>
table {
   width:100%;
   height:100%
}
tr {
   width:100%;
   height:30%
}
td {
   width:30%;
   height:30%;
   text-align:center
}
</style>
<div id='field' >
   <table id='table'>
   </table>
</div>
<script>
			var LogOn = true;
			var player = "X";
			var fieldSize = Math.ceil(Math.min(innerHeight, innerWidth ) * 0.8)
			var field = document.getElementById("field");
			field.style.width = fieldSize + "px";
			field.style.height = fieldSize + "px";
			field.style.fontSize = fieldSize/4 + "px"
			var ceils = CreCeilsArr(document.getElementById("table"));
			function lo9(str, handler){
				if	(!LogOn) return;
				if	(handler) handler(str);
				else console.log(str);
			}
			function RandInt(min, max){
				return Math.floor(min + Math.random() * (max - min + 1));
			}
			function ChangePlayer(player) {
				switch (player) {
					case "X":
						return "O";
					case "O":
						return "X";
				}
			}
			function CreCeilsArr(table) {
				var result = [];
				var index = 0;
				for (var y = 0; y < 3; y++) {
					var row =  document.createElement('tr');
					row.bgColor = '#F1C7A7';
					for (var x = 0; x < 3; x++) {
						result.push(GetCeil(y,x,index++,row));
					}
					table.appendChild(row);
				}
				function GetCeil(y,x,i,parent){
					var ceil = document.createElement('td');
					ceil.id = i;
					ceil.innerText = " ";
                                        ceil.onclick = MouseClick;
                                        parent.appendChild(ceil);     
					return {
						"ceil": ceil,
						"GetVal": function(){
							return this.ceil.innerText || " ";
						},
						"SetVal": function(val){
							this.ceil.innerText = val;
						}
					}
				}
				return result;
			}
			function FindFillLine(){
				var ways = GetSortWays();
				var mask = player + player + player;
				return ways.some(function(way) {
					var str = way[0].GetVal() + way[1].GetVal() + way[2].GetVal();
					return !!~str.indexOf(mask);
				})
			}
			function ChekFieldFill(){
				var ways = GetSortWays();
				return ways.every(function(way) {
					var str = way[0].GetVal() + way[1].GetVal() + way[2].GetVal();
					return !~str.indexOf(" ");
				})
			}
			function MouseClick(event) {
                                console.log(player);
                                var element = event.target;
				if(element.innerText){
					//animation
					return;
				}
				event.srcElement.innerText = player;
				if (ChekEnd()) return;
				player = ChangePlayer(player);
				
				AI();
				if (ChekEnd()) return;
				player = ChangePlayer(player);
				
				function ChekEnd(){
					if(FindFillLine()){
						alert("Game over.\n\nPlayer " + player + " win!");
						location.reload();
						return true;
					}
					if(ChekFieldFill()){
						alert("Game over. Drow!");
						location.reload();
						return true;
					}
				}
			}
			function GetSortWays() {
				var ways = [];
				ways.push([ceils[0], ceils[1], ceils[2]]);
				ways.push([ceils[3], ceils[4], ceils[5]]);
				ways.push([ceils[6], ceils[7], ceils[8]]);
				ways.push([ceils[0], ceils[3], ceils[6]]);
				ways.push([ceils[1], ceils[4], ceils[7]]);
				ways.push([ceils[2], ceils[5], ceils[8]]);
				ways.push([ceils[0], ceils[4], ceils[8]]);
				ways.push([ceils[6], ceils[4], ceils[2]]);
				return ways;
			}
			function AI() {
				var ways = GetSortWays();
				var priorityWays = [];
				var interimWays;
				var oponent = ChangePlayer(player);
				var mask;
				//
				mask = player + player + " ";
				SearchPriorityWays();
				mask = player + " " + player;
				SearchPriorityWays();
				mask = " " + player + player;
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = oponent + oponent + " ";
				SearchPriorityWays();
				mask = oponent + " " + oponent;
				SearchPriorityWays();
				mask = " " + oponent + oponent;
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = player + " " + " ";
				SearchPriorityWays();
				mask = " " + " " + player;
				SearchPriorityWays();
				mask = " " + player + " ";
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				//
				mask = oponent + " " + " ";
				SearchPriorityWays();
				mask = " " + " " + oponent;
				SearchPriorityWays();
				mask = " " + oponent + " ";
				SearchPriorityWays();
				if(priorityWays.length) {
					DoMove(priorityWays, player);
					return;
				}
				
				function SearchMask(arr){
					var str = arr[0].GetVal() + arr[1].GetVal() + arr[2].GetVal();
					return !!~str.indexOf(mask);
				}
				function SearchPriorityWays() {
					if(interimWays = ways.filter(SearchMask)){
						for (var index = 0; index < interimWays.length; index++) {
							priorityWays.push(interimWays[index]);
						}
					}
				}
				function DoMove(priorityWays, player) {
					var randomWayIndex = RandInt(0,priorityWays.length-1);
					var winningWay = priorityWays[randomWayIndex];
					var winningMoves = winningWay.filter(function(item) {return ~item.GetVal().indexOf(" ")});
					var winningMoveIndex = RandInt(0,winningMoves.length-1);
					var winningMove = winningMoves[winningMoveIndex];
					winningMove.SetVal(player);
				}
			}
		</script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пасаны, сделайте крестики нолики, пожалуйста. AgressivePi Javascript под браузер 2 21.11.2018 07:49
Пасаны, сделайте крестики нолики, пожалуйста. Задание на картинке AgressivePi Javascript под браузер 1 19.11.2018 10:26
Крестики нолики на js Lukashev Ваши сайты и скрипты 1 19.06.2017 07:40
Крестики нолики DivMan Events/DOM/Window 2 30.09.2016 14:37
Сравнение элементов массива по столбцам ghost200607 Общие вопросы Javascript 2 01.07.2014 10:05