OLE клиент-сервер – Крестики-ноликиDelphi , Технологии , OLEOLE клиент-сервер – Крестики-ноликиАвтор: 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). Форма Вот разбивка кода: Создание формы
Процедура Выход
Процедура Выбор уровня сложности
Процедура О программе
Процедура Тег к координатам
Процедура Координаты к контролу
Функция SB Click
Процедура Новая игра
Процедура Результат игры
Процедура Код предоставляет базовое реализацию клиент-серверной игры Tic-Tac-Toe с использованием OLE. Однако есть несколько областей, где код может быть улучшен:
В целом, этот проект демонстрирует базовое понимание программирования на языке Delphi и технологии OLE. С дальнейшим обновлением и улучшением он имеет потенциал стать более robust и привлекательной клиент-серверной игрой. "Пример реализации клиент-серверной игры Крестики-нолики с использованием технологии OLE". Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |