Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

OLE клиент-сервер – Крестики-нолики

Delphi , Технологии , OLE

OLE клиент-сервер – Крестики-нолики

Автор: Xavier Pacheco

unit UiMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, ExtCtrls, Menus, TTTServer_TLB, ComCtrls;

type
  TRecord = record
    Wins, Loses, Ties: Integer;
  end;

  TFrmMain = class(TForm)
    SbTL: TSpeedButton;
    SbTM: TSpeedButton;
    SbTR: TSpeedButton;
    SbMM: TSpeedButton;
    SbBL: TSpeedButton;
    SbBR: TSpeedButton;
    SbMR: TSpeedButton;
    SbBM: TSpeedButton;
    SbML: TSpeedButton;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Bevel3: TBevel;
    Bevel4: TBevel;
    MainMenu1: TMainMenu;
    FileItem: TMenuItem;
    HelpItem: TMenuItem;
    ExitItem: TMenuItem;
    AboutItem: TMenuItem;
    SkillItem: TMenuItem;
    UnconItem: TMenuItem;
    AwakeItem: TMenuItem;
    NewGameItem: TMenuItem;
    N1: TMenuItem;
    StatusBar: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure ExitItemClick(Sender: TObject);
    procedure SkillItemClick(Sender: TObject);
    procedure AboutItemClick(Sender: TObject);
    procedure SBClick(Sender: TObject);
    procedure NewGameItemClick(Sender: TObject);
  private
    FXImage: TBitmap;
    FOImage: TBitmap;
    FCurrentSkill: Integer;
    FGameID: Integer;
    FGameServer: IGameServer;
    FRec: TRecord;
    procedure TagToCoord(ATag: Integer; var Coords: TPoint);
    function CoordToCtl(const Coords: TPoint): TSpeedButton;
    procedure DoGameResult(GameRez: GameResults);
  end;

var
  FrmMain: TFrmMain;

implementation

uses UiAbout;

{$R *.DFM}

{$R xo.res}

const
  RecStr = 'Wins: %d, Loses: %d, Ties: %d';

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  // load "X" and "O" images from resource into TBitmaps
  FXImage := TBitmap.Create;
  FXImage.LoadFromResourceName(MainInstance, 'x_img');
  FOImage := TBitmap.Create;
  FOImage.LoadFromResourceName(MainInstance, 'o_img');
  // set default skill
  FCurrentSkill := slAwake;
  // init record UI
  with FRec do
    StatusBar.SimpleText := Format(RecStr, [Wins, Loses, Ties]);
  // Get server instance
  FGameServer := CoGameServer.Create;
  // Start a new game
  FGameServer.NewGame(FGameID);
end;

procedure TFrmMain.ExitItemClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmMain.SkillItemClick(Sender: TObject);
begin
  with Sender as TMenuItem do
  begin
    Checked := True;
    FCurrentSkill := Tag;
  end;
end;

procedure TFrmMain.AboutItemClick(Sender: TObject);
begin
  // Show About box
  with TFrmAbout.Create(Application) do
  try
    ShowModal;
  finally
    Free;
  end;
end;

procedure TFrmMain.TagToCoord(ATag: Integer; var Coords: TPoint);
begin
  case ATag of
    0: Coords := Point(1, 1);
    1: Coords := Point(1, 2);
    2: Coords := Point(1, 3);
    3: Coords := Point(2, 1);
    4: Coords := Point(2, 2);
    5: Coords := Point(2, 3);
    6: Coords := Point(3, 1);
    7: Coords := Point(3, 2);
  else
    Coords := Point(3, 3);
  end;
end;

function TFrmMain.CoordToCtl(const Coords: TPoint): TSpeedButton;
begin
  Result := nil;
  with Coords do
    case X of
      1:
        case Y of
          1: Result := SbTL;
          2: Result := SbTM;
          3: Result := SbTR;
        end;
      2:
        case Y of
          1: Result := SbML;
          2: Result := SbMM;
          3: Result := SbMR;
        end;
      3:
        case Y of
          1: Result := SbBL;
          2: Result := SbBM;
          3: Result := SbBR;
        end;
    end;
end;

procedure TFrmMain.SBClick(Sender: TObject);
var
  Coords: TPoint;
  GameRez: GameResults;
  SB: TSpeedButton;
begin
  if Sender is TSpeedButton then
  begin
    SB := TSpeedButton(Sender);
    if SB.Glyph.Empty then
    begin
      with SB do
      begin
        TagToCoord(Tag, Coords);
        FGameServer.PlayerMove(FGameID, Coords.X, Coords.Y, GameRez);
        Glyph.Assign(FXImage);
      end;
      if GameRez = grInProgress then
      begin
        FGameServer.ComputerMove(FGameID, FCurrentSkill, Coords.X, Coords.Y,
          GameRez);
        CoordToCtl(Coords).Glyph.Assign(FOImage);
      end;
      DoGameResult(GameRez);
    end;
  end;
end;

procedure TFrmMain.NewGameItemClick(Sender: TObject);
var
  I: Integer;
begin
  FGameServer.NewGame(FGameID);
  for I := 0 to ControlCount - 1 do
    if Controls[I] is TSpeedButton then
      TSpeedButton(Controls[I]).Glyph := nil;
end;

procedure TFrmMain.DoGameResult(GameRez: GameResults);
const
  EndMsg: array[grTie..grComputerWin] of string = (
    'Tie game', 'You win', 'Computer wins');
begin
  if GameRez <> grInProgress then
  begin
    case GameRez of
      grComputerWin: Inc(FRec.Loses);
      grPlayerWin: Inc(FRec.Wins);
      grTie: Inc(FRec.Ties);
    end;
    with FRec do
      StatusBar.SimpleText := Format(RecStr, [Wins, Loses, Ties]);
    if MessageDlg(Format('%s! Play again?', [EndMsg[GameRez]]), mtConfirmation,
      [mbYes, mbNo], 0) = mrYes then
      NewGameItemClick(nil);
  end;
end;

end.
Скачать весь проект

Программный проект для клиент-серверной игры Tic-Tac-Toe на языке Delphi с использованием технологии OLE (Object Linking and Embedding). Форма TFrmMain содержит несколько кнопок для сделанных ходов, а также полосу состояния для отображения текущего состояния игры.

Вот разбивка кода:

Создание формы Процедура FormCreate инициализирует игру, загружая изображения "X" и "O" из ресурсов в объекты TBitmap. Она также устанавливает умолчанию уровня сложности, инициализирует запись UI с значениями по умолчанию, получает экземпляр сервера игры и запускает новую игру.

Выход Процедура ExitItemClick просто закрывает форму при клике на пункт меню "Выход".

Выбор уровня сложности Процедура SkillItemClick проверяет, выбрал ли пользователь уровень сложности из меню. Если да, она устанавливает текущий уровень сложности в выбранное значение и отключает все другие уровни сложности.

О программе Процедура AboutItemClick отображает окошко с информацией о игре при клике на пункт меню "О программе".

Тег к координатам Процедура TagToCoord принимает тег (уникальный идентификатор для каждой кнопки) в качестве входного параметра и возвращает соответствующие координаты на игровом поле. Это используется для маппинга кнопок к их позициям на поле.

Координаты к контролу Функция CoordToCtl принимает координаты в виде входного параметра и возвращает соответствующий объект контрола скорости. Это используется для получения контрола скорости, связанного с конкретной позицией на поле.

SB Click Процедура SBClick обрабатывает событие клика для каждого контрола скорости. При клике на кнопку она проверяет, была ли кнопка ранее кликнута (т.е., если уже есть изображение "X" или "O"). Если нет, она загружает соответствующее изображение из ресурсов и отображает его на кнопке.

Новая игра Процедура NewGameItemClick перезапускает игру, создавая новый экземпляр игры с тем же ID, что и текущая игра. Она также сбрасывает все кнопки в их 기본ное состояние (без изображений).

Результат игры Процедура DoGameResult обновляет запись UI на основе результата игры (победа, поражение или ничья). Если игра закончена, она спрашивает пользователя, хочет ли он сыграть снова и перезапускает игру, если ответ положительный.

Код предоставляет базовое реализацию клиент-серверной игры Tic-Tac-Toe с использованием OLE. Однако есть несколько областей, где код может быть улучшен:

  • Обработка ошибок: Код не обрабатывает ошибки или исключения должным образом.
  • Организация кода: Форма TFrmMain содержит много кода, который мог бы быть разделен на более маленькие процедуры или функции для лучшей читаемости и поддерживаемости.
  • Интерфейс пользователя: UI проста и не имеет визуального привлекательного эффекта. Добавление более графических элементов, анимаций или звуковых эффектов могло бы улучшить пользовательский опыт.

В целом, этот проект демонстрирует базовое понимание программирования на языке Delphi и технологии OLE. С дальнейшим обновлением и улучшением он имеет потенциал стать более robust и привлекательной клиент-серверной игрой.

"Пример реализации клиент-серверной игры Крестики-нолики с использованием технологии OLE".


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OLE ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-12 15:28:21/0.0041568279266357/0