Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.10.2019, 18:19
pasha_sliborsky pasha_sliborsky вне форума
Прохожий
 
Регистрация: 04.10.2019
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Игра Крестики-Нолики

Здравствуйте . Вопрос по созданию игры крестики нолики . Сделано так , чтобы можно было ставить крестики Но не знаю как сделать так , чтобы ставились еще и нолики , т.е. ввести второго игрока ( не искусственный интелект). Прошу помощи
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, XPMan;

type
  TForm1 = class(TForm)
    Image1: TImage;
    XPManifest1: TXPManifest;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  C_CellWH = 60; // Длина и ширина одной клетки
  C_CC = 5; // кол-во клеток

type
  TKrestikNolik = (knKrestik,knNolik); // крестик или нолик
  TGorVertDiag = (gvGor,gvVert,gvD1,gvD2,gvAll); // горизонталь или вертикаль
  TPole = array [0..C_CC-1] of array [0..C_CC-1] of Byte;

var
  Form1: TForm1;
  Pl: TPole;

procedure PaintKN(S:TKrestikNolik; CellX,CellY:byte);
function isYes(var P:TPole):byte;


procedure NewGame;

implementation

{$R *.dfm}

procedure PaintKN(S:TKrestikNolik; CellX,CellY:byte);
begin
 Form1.Image1.Canvas.Pen.Width:=3;
 Case S of
  knKrestik: begin
              Form1.Image1.Canvas.Pen.Color:=clRed;
              Form1.Image1.Canvas.MoveTo( (C_CellWH div 8) + CellX*C_CellWH,
                                          (C_CellWH div 8) + CellY*C_CellWH );
              Form1.Image1.Canvas.LineTo( 7*(C_CellWH div 8) + CellX*C_CellWH,
                                          7*(C_CellWH div 8) + CellY*C_CellWH );
              Form1.Image1.Canvas.MoveTo( (C_CellWH div 8) + CellX*C_CellWH,
                                          7*(C_CellWH div 8) + CellY*C_CellWH );
              Form1.Image1.Canvas.LineTo( 7*(C_CellWH div 8) + CellX*C_CellWH,
                                          (C_CellWH div 8) + CellY*C_CellWH );
             end;
  knNolik: begin
            Form1.Image1.Canvas.Pen.Color:=clBlue;
            Form1.Image1.Canvas.Brush.Style:=bsClear;
            Form1.Image1.Canvas.Ellipse( (C_CellWH div 8) + CellX*C_CellWH,
                                         (C_CellWH div 8) + CellY*C_CellWH,
                                          7*(C_CellWH div 8) + CellX*C_CellWH,
                                          7*(C_CellWH div 8) + CellY*C_CellWH  );
           end;
 End;
 
end;

function isYes(var P:TPole):byte;
var i,j:byte; A:Boolean; k,n:byte;
begin
 // проверяем главную диагональ
 k:=0; n:=0;
 for i:=0 to C_CC-1 do
 if p[i,i] = 1 then Inc(k) else if p[i,i] = 2 then Inc(n);
 if k = C_CC then begin Result:=1; Exit; end;
 if n = C_CC then begin Result:=2; Exit; end;
 // проверяем вторую диагональ
 k:=0; n:=0;
 for i:=0 to C_CC-1 do
 if p[i,C_CC-1-i] = 1 then Inc(k) else if p[i,C_CC-1-i] = 2 then Inc(n);
 if k = C_CC then begin Result:=1; Exit; end;
 if n = C_CC then begin Result:=2; Exit; end;
 for i:=0 to C_CC-1 do
  begin
   // вертикаль
   k:=0; n:=0;
   for j:=0 to C_CC-1 do
   if p[i,j] = 1 then Inc(k) else if p[i,j] = 2 then Inc(n);
   if k = C_CC then begin Result:=1; Exit; end;
   if n = C_CC then begin Result:=2; Exit; end;
   // горизонталь
   k:=0; n:=0;
   for j:=0 to C_CC-1 do
   if p[j,i] = 1 then Inc(k) else if p[j,i] = 2 then Inc(n);
   if k = C_CC then begin Result:=1; Exit; end;
   if n = C_CC then begin Result:=2; Exit; end;
  end;
 // проверяем занятость всех клеток
 A:=false;
 for i:=0 to C_CC-1 do
  begin
   for j:=0 to C_CC-1 do
   if P[i,j] = 0 then begin A:=true; Break; end;
   if A then Break;
  end;
 if not A then begin Result:=3; Exit; end;
 Result:=0;
end;


procedure NewGame;
var i:integer;
begin
 Form1.Image1.Picture:=nil;
 Form1.Image1.Canvas.Pen.Color:=clBlack;
 for i:=1 to C_CC-1 do
  begin
   Form1.Image1.Canvas.MoveTo(C_CellWH*i,0);
   Form1.Image1.Canvas.LineTo(C_CellWH*i,Form1.Image1.Height);
   Form1.Image1.Canvas.MoveTo(0,C_CellWH*i);
   Form1.Image1.Canvas.LineTo(Form1.Image1.Width,C_CellWH*i);
  end;
 FillChar(Pl,SizeOf(pl),0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
 Form1.ClientHeight:=C_CellWH*C_CC;
 Form1.ClientWidth:=Form1.ClientHeight;      // C_CellWH*C_CC
 Image1.ClientWidth:=Form1.ClientWidth;
 Image1.ClientHeight:=Image1.ClientWidth;  //Form1.ClientHeight
 Image1.Picture:=nil;
 Image1.Canvas.Pen.Color:=clBlack;
 for i:=1 to C_CC-1 do
  begin
   Image1.Canvas.MoveTo(C_CellWH*i,0);
   Image1.Canvas.LineTo(C_CellWH*i,Image1.Height);
   Image1.Canvas.MoveTo(0,C_CellWH*i);
   Image1.Canvas.LineTo(Image1.Width,C_CellWH*i);
  end;
 FillChar(Pl,SizeOf(pl),0);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Mess:String;
begin
 if Button in [mbRight,mbMiddle] then Exit;
 if Pl[(X div C_CellWH), (Y div C_CellWH)] <> 0 then Exit;
 PaintKN(knKrestik,(X div C_CellWH), (Y div C_CellWH));
 Pl[(X div C_CellWH),(Y div C_CellWH)]:=1;

 End;
   end.
Админ: Пользуемся тегами при оформлении кода!

Вот ссылка самой программы :
https://yadi.sk/d/43Novf9aKfGkRQ

Последний раз редактировалось Admin, 07.10.2019 в 19:20.
Ответить с цитированием
  #2  
Старый 07.10.2019, 21:59
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Честно говоря, лень разбирать все.
Вот идея.
Пусть мы делаем НЕ сетевую версию. Т.е. оба игрока сидят за одним компом. Тогда нам надо 2 набора элементов управления игрока (если они вообще есть) и отдельная переменная, которая будет говорить чья очередь хода. При выполнении хода значение переменной переключается и разрешаются/запрещаются соотв. контролы.
Ответить с цитированием
  #3  
Старый 09.10.2019, 15:30
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

На скорую руку.
Заводим глобальную переменную
Код:
var
  Flag: Boolean = True;
Заворачиваем вызов процедуры рисующей фигуры в case
Код:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Mess: String;
begin
  ...
  case Flag of
    True: PaintKN(knKrestik, (X div C_CellWH), (Y div C_CellWH));
    False: PaintKN(knNolik, (X div C_CellWH), (Y div C_CellWH));
  end;
  ...
End;
А в самой процедуре рисования фигур меняем состояние глобальной переменной.
Код:
  Case S of
    knKrestik:
      begin
        ...
        Flag := False;
      end;
    knNolik:
      begin
        ...
        Flag := True;
      end;
  End;
При таком раскладе первый игрок всегда ходит крестиками.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter