хранение и обновление 2d массива в состоянии приложения в Asp.Net MVC 3 - PullRequest
0 голосов
/ 07 марта 2012

Я планирую создать простую браузерную игру на основе запросов ajax. У меня есть карта, которая состоит из 10x10 делений на клиенте. На сервере у меня есть массив [10,10], который представляет состояние моих div-ов, поэтому, например, если клиент нажимает на определенный div, ajax-запрос отправляется в фоновом режиме, обновляя мой массив и вставляя число 1 в правильная позиция массива. Исходя из этой идеи, я хочу, чтобы все клиенты видели одну и ту же карту, поэтому я подумал о том, чтобы сохранить массив моей карты в состоянии приложения (если нет лучшего способа сделать это), потому что, как мы все знаем, состояние приложения является общим для всех клиентов. Поэтому мой вопрос заключается в том, как мне это сделать, или как мне на самом деле добраться до состояния приложения в Asp.Net MVC. Я много искал и не мог найти правильный способ вставки данных в состояние приложения в Asp.Net MVC 3, особенно двухмерный массив, который немного усложняет задачу. Мой код до сих пор работает более или менее без использования состояния приложения. Я имею в виду, что каждый раз, когда я создаю новый экземпляр массива карты, и я возвращаю этот экземпляр с сервера клиенту, что неправильно, потому что я просто хочу создать одну карту и вернуть ту же карту всем, и это часть, на которой я стою.

// когда пользователь посещает мой сайт

 public class HomeController : Controller
{

    public MapModel mapModel = new MapModel();

    public ActionResult Index()
    {

        return View(mapModel);
    }

}

// Ajax-запрос, когда пользователь нажимает на элемент div (плитку карты)

$(".mapTile").click(function () {
        var xx = $(this).attr("y");
        var yy = $(this).attr("x");

        $("#info").text($(this).attr("x"));
        var tile = {
            X: xx,
            Y: yy,
            Value: 1
        };

        $.ajax({
            beforeSend: function () { ShowAjaxLoader(); },
            url: "/Game/ShowTiles",
            type: "POST",
            contentType: "application/json;charset=utf-8",
            dataType: "json",
            data: JSON.stringify(tile),
            success: function (data) {
                HideAjaxLoader(), $.each(data, function (index, item) {
                    if (item.Value === 1) {                       
                        var xCordinate = item.X;
                        var yCordinate = item.Y;
                        $("#" + yCordinate + xCordinate).css("background-color", "red");
                    }
                });
            },
            error: function () { showErrorMsg(); }
        });
    });

// Мои модели

// Модель карты

public class MapModel
{

    private TileModel[,] mapTilesArray;

    public TileModel[,] MapTilesArray
    {
        get
        {
            return mapTilesArray;
        }
        set
        {
            mapTilesArray = value;
        }

    }
    public MapModel()
    {
        MapTilesArray = new TileModel[10,10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                MapTilesArray[i, j] = new TileModel();
            }
        }
    }

}

// Модель плитки

public class TileModel
    {
        public int X{ get; set; }
        public int Y{ get; set; }
        public int Value { get; set; }

    }

// Мой игровой контроллер

 [HttpPost]
    public JsonResult ShowTiles(TileModel tile)
    {
        MapModel map = new MapModel();
        map.MapTilesArray[tile.X, tile.Y].Value = 1;
        map.MapTilesArray[tile.X, tile.Y].X = tile.X;
        map.MapTilesArray[tile.X, tile.Y].Y = tile.Y;

        return Json(map.MapTilesArray);
    }

1 Ответ

1 голос
/ 07 марта 2012

Сделайте вашу переменную MapModel статической. Он будет сохраняться при разных запросах, и вы сможете поделиться одной и той же информацией со всеми пользователями.

Изменить эту строку

public MapModel mapModel = new MapModel();

с этим

private static MapModel mapModel = new MapModel();

и не возвращайте новую карту с каждым ajax-запросом, просто верните свою статическую переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...