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

Delphi Sources



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

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

Здравствуйте . Вопрос по созданию игры крестики нолики . Сделано так , чтобы можно было ставить крестики Но не знаю как сделать так , чтобы ставились еще и нолики , т.е. ввести второго игрока ( не искусственный интелект). Прошу помощи
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

На скорую руку.
Заводим глобальную переменную
Код:
1
2
var
  Flag: Boolean = True;
Заворачиваем вызов процедуры рисующей фигуры в case
Код:
1
2
3
4
5
6
7
8
9
10
11
12
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;
А в самой процедуре рисования фигур меняем состояние глобальной переменной.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
Case S of
  knKrestik:
    begin
      ...
      Flag := False;
    end;
  knNolik:
    begin
      ...
      Flag := True;
    end;
End;
При таком раскладе первый игрок всегда ходит крестиками.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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