fr

fr


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;


namespace Reversi

{

  public partial class frmReversi : Form

  {

    #region View


    private int squareSize;

    private PictureBox[,] board;

    private Label[] rowLabels;

    private Label[] colLabels;

    private Image freeSquare;

    private Image whiteSquare;

    private Image blackSquare;

    private TextBox moveList;

    private TextBox gameStatus;

    private int move_list_min_width = 50;

    private int padding_for_labels = 20;


    // Обновление вида.

    public void UpdateViews()

    {

      UpdateBoardView();

      UpdateMoveListView();

      UpdateGameStatusView();

      this.Refresh();

    }


    // Обновление статуса игры.

    private void UpdateGameStatusView()

    {

      StringBuilder status = new StringBuilder();

      int blackScore = 0;

      int whiteScore = 0;

      string blackWin = "Выиграл чёрный";

      string whiteWin = "Выиграл белый";

      string questionNew = "Начать новую игру?";

      


      for (int i = 0; i < Model.State.Board.GetLength(0); ++i)

      {

        for (int j = 0; j < Model.State.Board.GetLength(1); ++j)

        {

          switch (Model.State.Board[i, j])

          {

            case GameState.player.WHITE:

              ++whiteScore;

              break;

            case GameState.player.BLACK:

              ++blackScore;

              break;

          }

        }

      }


      switch (Model.State.Current_player)

      {

        case GameState.player.NONE:

          status.AppendLine("Никто");

          break;

        case GameState.player.WHITE:

          status.AppendLine("Белый ходит");

          break;

        case GameState.player.BLACK:

          status.AppendLine("Чёрный ходит");

          break;

        case GameState.player.GAME_OVER:

          status.AppendLine("Конец игры");


          if (blackScore > whiteScore)

          {

            MessageBoxButtons buttons = MessageBoxButtons.YesNo;

            DialogResult result;


            result = MessageBox.Show(blackWin, questionNew, buttons, MessageBoxIcon.Asterisk);


            if (result == System.Windows.Forms.DialogResult.Yes)

            {


              Controller.New();

            }

          }

          else

          {

            MessageBoxButtons buttons = MessageBoxButtons.YesNo;

            DialogResult result;


            result = MessageBox.Show(whiteWin, questionNew, buttons, MessageBoxIcon.Asterisk);


            if (result == System.Windows.Forms.DialogResult.Yes)

            {


              Controller.New();

            }

          }

          break;

      }


      status.AppendLine("Белый: " + whiteScore.ToString());

      status.AppendLine("Чёрный: " + blackScore.ToString());


      gameStatus.Text=status.ToString();

    }


    // Обновление доски.

    private void UpdateBoardView()

    {

      GameState.player[,] model_board = Model.State.Board;

      for (int i = 0; i < model_board.GetLength(0); ++i)

      {

        for (int j = 0; j < model_board.GetLength(1); ++j)

        {

          switch (model_board[i, j])

          {

            case GameState.player.NONE:

              board[i, j].Image = freeSquare;

              break;

            case GameState.player.WHITE:

              board[i, j].Image = whiteSquare;

              break;

            case GameState.player.BLACK:

              board[i, j].Image = blackSquare;

              break;

          }

        }

      }

    }


    // Обновление списка ходов.

    private void UpdateMoveListView()

    {

      moveList.Text = Model.MoveList.ToString();

    }


    // Создание доски, списка ходов и статуса игры.

    private void CreateViews()

    {

      CreateBoardView();

      CreateMoveListView();

      CreateGameStatusView();

    }

     

    // Создание доски.

    private void CreateBoardView()

    {

      squareSize = (System.Math.Min(pnlView.Width - move_list_min_width, pnlView.Height) - (2*padding_for_labels)) / 8;

      board = new PictureBox[8, 8];

      rowLabels = new Label[8];

      colLabels = new Label[8];

      freeSquare = Image.FromFile("square.bmp");

      whiteSquare = Image.FromFile("white.bmp");

      blackSquare = Image.FromFile("black.bmp");

      for (int i = 0; i < 8; ++i)

      {

        rowLabels[i] = new Label();

        rowLabels[i].Text = i.ToString();

        rowLabels[i].Location = new Point(0, padding_for_labels + i*squareSize);

        rowLabels[i].Size = new Size(padding_for_labels, squareSize);

        rowLabels[i].Name = "lblRow" + i.ToString();

        rowLabels[i].TabStop = false;

        rowLabels[i].TextAlign = ContentAlignment.MiddleCenter;

        pnlView.Controls.Add(rowLabels[i]);

        for (int j = 0; j < 8; ++j)

        {

          colLabels[i] = new Label();

          colLabels[i].Text = Convert.ToChar(j+65).ToString();

          colLabels[i].Location = new Point(padding_for_labels + j * squareSize,0);

          colLabels[i].Size = new Size(squareSize,padding_for_labels);

          colLabels[i].Name = "lblCol" + j.ToString();

          colLabels[i].TabStop = false;

          colLabels[i].TextAlign = ContentAlignment.MiddleCenter;

          pnlView.Controls.Add(colLabels[j]);


          board[i, j] = new PictureBox();

          board[i, j].Image = freeSquare;

          board[i, j].Location = new Point(padding_for_labels + i * squareSize, padding_for_labels + j * squareSize);

          board[i, j].Size = new Size(squareSize, squareSize);

          board[i, j].Name = "pBoxBoard" + i.ToString() + j.ToString();

          board[i, j].TabIndex = 0;

          board[i, j].TabStop = false;

          board[i, j].SizeMode = PictureBoxSizeMode.StretchImage;

          board[i, j].Click += board_click;

          board[i, j].Tag = new Point(i, j);

          pnlView.Controls.Add(board[i, j]);

        }

      }

    }


    // Создание списка ходов.

    private void CreateMoveListView()

    {

      moveList = new TextBox();

      moveList.Text = "";

      moveList.TextAlign = HorizontalAlignment.Left;

      moveList.ReadOnly = true;

      moveList.Location = new Point(8*squareSize+(padding_for_labels*2), padding_for_labels);

      moveList.Multiline = true;

      moveList.Name = "txtMoveList";

      moveList.ScrollBars = ScrollBars.Vertical;

      moveList.Size = new Size(System.Math.Max(move_list_min_width, pnlView.Width - (padding_for_labels * 3) - 8 * squareSize), (pnlView.Height - (padding_for_labels*3))/2 );

      moveList.TabStop = false;

      moveList.Visible = true;

      moveList.WordWrap = false;

      pnlView.Controls.Add(moveList);

    }


    // Создание статуса игры.

    private void CreateGameStatusView()

    {

      gameStatus = new TextBox();

      gameStatus.TextAlign = HorizontalAlignment.Left;

      gameStatus.ReadOnly = true;

      gameStatus.Location = new Point(8 * squareSize + (padding_for_labels * 2), (padding_for_labels * 2) + moveList.Height);

      gameStatus.Multiline = true;

      gameStatus.Name = "txtGameStatus";

      gameStatus.Size = new Size(System.Math.Max(move_list_min_width, pnlView.Width - (padding_for_labels * 3) - 8 * squareSize), (pnlView.Height - (padding_for_labels * 3)) / 2);

      gameStatus.TabStop = false;

      gameStatus.Visible = true;

      gameStatus.WordWrap = false;

      gameStatus.Text = "Никто" + Environment.NewLine + "Белый: 0" + Environment.NewLine + "Чёрный: 0";

      pnlView.Controls.Add(gameStatus);

    }

     

    // Обработчик события щелчка.

    private void board_click(object sender, System.EventArgs e)

    {

      Point squareClicked = ((Point)((PictureBox)sender).Tag);      

      Controller.TryMove(squareClicked);

    }

     

    #endregion View


    #region FormStuff


    public frmReversi()

    {

      InitializeComponent();

    }


    // Задание минимального размера и создание доски.

    private void frmReversi_Load(object sender, EventArgs e)

    {

      MinimumSize = Size;

      CreateViews();

    }


    // Обработчик кнопки "Выйти".

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)

    {

      Application.Exit();

    }


    // Создание новой игры.

    private void newGameToolStripMenuItem_Click(object sender, EventArgs e)

    {

      Controller.New();

    }


    // Открыть сохранённую игру.

    private void openGameToolStripMenuItem_Click(object sender, EventArgs e)

    {

      DialogResult doOpen = openFile.ShowDialog();

      if (doOpen == DialogResult.OK)

      {

        Controller.ImportMoves(openFile.FileName);

      }

    }


    // Если выбран файл, загружаем его.

    private void saveGameToolStripMenuItem_Click(object sender, EventArgs e)

    {

      string FileName = getSaveFileName();

      if (FileName != null)

      {

        Controller.ExportMoves(saveFile.FileName);

      }

    }


    // Сохранение игры и получение имени файла.

    private string getSaveFileName()

    {

      string rval = null;

      // Выполняет поиск элементов.

      if (pnlView.Controls.Find("txtMoveList", true)[0].Text != "")

      {

        DialogResult doSave = saveFile.ShowDialog();

        if (doSave == DialogResult.OK)

        {

          rval=saveFile.FileName;

        }

      }

      return rval;

    }


    // Открытие файла справки.

    private void HlpButton_Click(object sender, EventArgs e)

    {

      Help.ShowHelp(this, "Help.chm");

    }

  

    private void AboutText_Click(object sender, EventArgs e)

    {

      About newAbout = new About();

      newAbout.ShowDialog();

    }

    #endregion Form Stuff

  }

}


Report Page