Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 15.07.2018
Сообщений: 9

Крестики-Нолики

20.07.2018, 01:15. Показов 3110. Ответов 5

Студворк — интернет-сервис помощи студентам
Программисты, помогите пожалуйста!
Пытаюсь сделать крестики - нолики на PascalABC.NET, но столкнулся с проблемой, что "бот" делает то, что ему запрещается делать. Звучит странно, но если запустить программу, то всё станет понятно, я думаю)
Имею двумерный массив и заполняю его 1,2 и 0, где 1-мой ход, 2-ход бота, 0-пустая клетка. Но получается, что "бот" порой заполняет те клетки, которые закрыты пользователем или им самим, хотя по коду, он так делать не должен или я что-то не понимаю в этой жизни)
Помогите, кто шарит.
Да, код страшный, но я учусь ток в 9 классе и на что-то более красивое пока не способен)
И да, программу доделал не до конца, поэтому в плане побед, проигрышей, ничьей и тд ещё не готово. Но вот эта проблема с "ботом" не даёт мне продвинуться дальше, так что не серчайте)
Заранее Спасибо за помощь!

Кодик чуток ниже


Pascal
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
uses crt;
 
label youchoice;
var
  zone: array[1..3, 1..3] of integer;   //строка - столбец
  play: boolean;
  who, x, y: byte;
 
procedure startgame;
var
  i: integer;
  zone: array[1..3, 1..3] of integer;
begin
  textbackground(green);
  clrscr;
  setwindowsize(20, 20);
  textcolor(yellow);
  for i := 1 to 5 do 
  begin
    gotoxy(2, i);
    write('*');
    gotoxy(4, i);
    write('*');
  end;
  gotoxy(1, 2);
  for i := 1 to 5 do write('*');
  gotoxy(1, 4);
  for i := 1 to 5 do write('*');
  textcolor(white);
  zone[3, 1] := 0;
  zone[3, 2] := 0;
  zone[3, 3] := 0;
  zone[2, 1] := 0;
  zone[2, 2] := 0;
  zone[2, 3] := 0;
  zone[3, 1] := 0;
  zone[3, 2] := 0;
  zone[3, 3] := 0;
end;
 
procedure control;
var
  zone: array[1..3, 1..3] of integer;
  sim: char;
begin
  if keypressed then begin
    sim := readkey;
    case sim of
      '1': 
        begin
          gotoxy(1, 5);
          write('x');
          zone[3, 1] := 1;
          play := false;
        end;
      '2': 
        begin
          gotoxy(3, 5);
          write('x');
          zone[3, 2] := 1;
          play := false;
        end;
      '3': 
        begin
          gotoxy(5, 5);
          write('x');
          zone[3, 3] := 1;
          play := false;
        end;
      '4': 
        begin
          gotoxy(1, 3);
          write('x');
          zone[2, 1] := 1;
          play := false;
        end;
      '5': 
        begin
          gotoxy(3, 3);
          write('x');
          zone[2, 2] := 1;
          play := false;
        end;
      '6': 
        begin
          gotoxy(5, 3);
          write('x');
          zone[2, 3] := 1;
          play := false;
        end;
      '7': 
        begin
          gotoxy(1, 1);
          write('x');
          zone[1, 1] := 1;
          play := false;
        end;
      '8': 
        begin
          gotoxy(3, 1);
          write('x');
          zone[1, 2] := 1;
          play := false;
        end;
      '9': 
        begin
          gotoxy(5, 1);
          write('x');
          zone[1, 3] := 1;
          play := false;
        end;
    end;
  end;
end;
 
procedure botcontrol;
label newplacebot;
var
  zone: array[1..3, 1..3] of integer;
  sim: byte;
begin
  newplacebot:
  delay(1000);
  sim := random(9) + 1;
  case sim of
    1: 
      begin
        if (zone[3, 1] <> 1) and (zone[3, 1] <> 2) then begin
          gotoxy(1, 5);
          write('0');
          zone[3, 1] := 2;
        end else goto newplacebot;
      end;
    2: 
      begin
        if (zone[3, 2] <> 1) and (zone[3, 2] <> 1) then begin
          gotoxy(3, 5);
          write('0');
          zone[3, 2] := 2;
        end else goto newplacebot;
      end;
    3: 
      begin
        if (zone[3, 3] <> 1) and (zone[3, 3] <> 2) then begin
          gotoxy(5, 5);
          write('0');
          zone[3, 3] := 2;
        end else goto newplacebot;
      end;
    4: 
      begin
        if (zone[2, 1] <> 1) and (zone[2, 1] <> 2) then begin
          gotoxy(1, 3);
          write('0');
          zone[2, 1] := 2;
        end else goto newplacebot;
      end;
    5: 
      begin
        if (zone[2, 2] <> 1) and (zone[2, 2] <> 2) then begin
          gotoxy(3, 3);
          write('0');
          zone[2, 2] := 2;
        end else goto newplacebot;
      end;
    6: 
      begin
        if (zone[2, 3] <> 1) and (zone[2, 3] <> 2) then begin
          gotoxy(5, 3);
          write('0');
          zone[2, 3] := 2;
        end else goto newplacebot;
      end;
    7: 
      begin
        if (zone[1, 1] <> 1) and (zone[1, 1] <> 2) then begin
          gotoxy(1, 1);
          write('0');
          zone[1, 1] := 2;
        end else goto newplacebot;
      end;
    8: 
      begin
        if (zone[1, 2] <> 1) and (zone[1, 2] <> 2) then begin
          gotoxy(3, 1);
          write('0');
          zone[1, 2] := 2;
        end else goto newplacebot;
      end;
    9: 
      begin
        if (zone[1, 3] <> 1) and (zone[1, 3] <> 2) then begin
          gotoxy(5, 1);
          write('0');
          zone[1, 3] := 2;
        end else goto newplacebot;
      end;
  end;
end;
 
 
 
begin
  startgame;
  who := random(2) + 1;
  youchoice:                  
  if (who = 1) then begin
    gotoxy(1, 7);
    write('Your Choice!');
    play := true;
    repeat
      control;
    until play <> true;
  end;
  who := 2;
  if (who = 2) then begin
    gotoxy(1, 7);
    write('Bot Choice! ');
    botcontrol;
    who := 1;
    goto youchoice;
  end;
  
  
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2018, 01:15
Ответы с готовыми решениями:

Крестики-нолики: плохо прорисовываются "нолики"
Я, наверное, всех уже достал своей игрой, но я опять напоролся на подводный камень. Игра - крестики-нолики. Баг - нолики рисуются как-то...

Крестики и нолики
Ребят, нужно сделать чтобы крестики и нолики нажимались мышкой и в конце было кто победил и кто проиграл uses GraphABC, ABCButtons; ...

Крестики-нолики
помогите очень надо написал программу игры крестики нолики на 1 игрока с машиной

5
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
20.07.2018, 12:10
Лучший ответ Сообщение было отмечено Rautmazar как решение

Решение

Во-первых, чтобы работал режим отладки, необходимо сначала писать программу без использования модуля crt.
Только после того, как простая версия (с использованием read и без украшений) будет работать на все 100, можно приступать к её воплощению в оконном режиме.

Во-вторых, использование goto вносит путаницу в читаемость кода.

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

В-четвёртых, вместо того, чтобы каждый раз в процедуре botcontrol использовать двойное условие „if (zone[3, 1] <> 1) and (zone[3, 1] <> 2) then begin“ можно было просто сравнить с нулём!

В-пятых, чтобы не использовать девять раз один и тот же код в операторе case (в процедурах control и botcontrol), эту часть кода можно вынести в процедуры и/или функции, в качестве параметров которым задавать координаты экрана и массива.
А ещё лучше эти координаты вынести в константный массив и брать от туда!

Самое главное:
Вы снова, как и в „Змейке“, пытаетесь написать программу не задумываясь о результатах.
Поступаете как говорил герой Витаргана в «Чародеях»: „Нужно видеть цель, верить в себя и не замечать препятствий!“

Добавлено через 1 час 52 минуты
Попробую написать игру:

Что нам может понадобиться?

Первое — это собственно массив, в котором будет храниться поле игры.
Ну и ещё, не плохо бы добавить счётчик шагов.

Еще в программе потребуется датчик случайных чисел. Поэтому сразу инициализируем его:
Pascal
1
2
3
4
5
6
7
8
var
  a : array [0..2, 0..2] of Integer;
  Step : Integer;
 
begin
  Randomize;
  
end.
Добавлено через 6 минут
На случай, если нам необходимо будет зацикливать программу, то потребуется обнуление массива и счётчика.
Ну и сразу же добавим процедуру вывода массива в виде игрового поля:
Pascal
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
var
  a : array [0..2, 0..2] of Integer;
  Step : Integer;
 
procedure Init;
begin
  for var row := 0 to 2 do
    for var col := 0 to 2 do
      a[row, col] := 0;
  Step := 0;
end;
 
function coord(row, col : Integer) := Chr(row * 3 + col + 49);
function f(row, col : Integer) : Char := a[row, col] > 0 ? String('XO')[a[row, col]] : coord(row, col);
 
procedure Draw;
begin
  WriteLn('+---+---+---+');
  for var row := 0 to 2 do
    WriteLn($'| {f(row,0)} | {f(row,1)} | {f(row,2)} |{NewLine}+---+---+---+');
end;
 
begin
  Randomize;
  Init;
  Draw;
  
end.
Если ячейка уже занята, то выводим «X» — крестик или «O» — нолик.
Ещё не занятые ячейки игрового поля выводятся соответствующими цифрами — это типа подсказка…

Добавлено через 4 минуты
Теперь нужно создать цикл, в котором будет происходить игра.
Для этого нам, наверное, понадобится переменная, которая будет определять чей сейчас ход.
Ну и создадим сразу заготовки функции проверки выигрышного состояния и процедур, которые будут отвечать за ход компьютера и человека:
Pascal
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
var
  a : array [0..2, 0..2] of Integer;
  Step : Integer;
 
procedure Init;
begin
  for var row := 0 to 2 do
    for var col := 0 to 2 do
      a[row, col] := 0;
  Step := 0;
end;
 
function coord(row, col : Integer) := Chr(row * 3 + col + 49);
function f(row, col : Integer) : Char := a[row, col] > 0 ? String('XO')[a[row, col]] : coord(row, col);
 
procedure Draw;
begin
  WriteLn('+---+---+---+');
  for var row := 0 to 2 do
    WriteLn($'| {f(row,0)} | {f(row,1)} | {f(row,2)} |{NewLine}+---+---+---+');
end;
 
function ThereIsAWin : Boolean;
begin
  Result := True;
end;
 
procedure BotStep;
begin
end;
 
procedure HumanStep;
begin
end;
 
begin
  Randomize;
  Init;
  Draw;
  
  // Кто первый ходит
  var StepByBot := Random(2) = 1;
  WriteLn('Первым ходит бот = ', Not StepByBot); // Потому, что в цикле будет инвертировано
  
  repeat
    Step += 1; StepByBot := Not StepByBot;
    
    if StepByBot then // Ход за ботом
      BotStep
    else // Ход за человеком
      HumanStep;
      
    Draw;
  until ThereIsAWin or (Step = 9); // Кто-то выиграл или все 9 ячеек занято
  
end.
Добавлено через 3 минуты
Это только заготовки.
Теперь их нужно наполнить.
Сначала посмотрим, как должен ходить компьютер.

Думаю, что для начала достаточно простого датчика случайных чисел.
Т.е. получим случайные координаты поля и, если они не заняты, то установим в него «Х».
Это легко:
Pascal
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure BotStep;
begin
  var Ok := False;
  repeat
    var(row, col) := (Random(3), Random(3));
    Ok := a[row, col] = 0;
    if Ok then
      begin
        a[row, col] := 1;
        WriteLn('Ход компьютера: ', coord(row, col));
      end;
  until Ok;
end;
Добавлено через 5 минут
С человеком дела обстоят немного сложнее.
Ибо придётся контролировать правильность ввода:
— должна быть введена только одна цифра от 1 до 9
— нужна обработка правильности ввода
— нужна проверка незанятости ячейки
Получается как-то так:
Pascal
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure HumanStep;
begin
  var Ok := False;
  repeat
    var c := ReadLnString('Ваш ход:').Trim;
    if (c.Length = 1) and ('123456789'.IndexOf(c[1]) > -1) then
      begin
        var t := c.ToInteger - 1;
        var(row, col) := (t div 3, t mod 3);
        Ok := a[row, col] = 0;
        if Ok then
          a[row, col] := 2
        else
          WriteLn('Эта ячейка уже занята. Повторите ход.');
      end
    else
      WriteLn('Ход — это цифра от 1 до 9 ещё не занятой ячейки. Повторите ход.');
  until Ok;
end;
Добавлено через 3 минуты
Остаётся запрограммировать ThereIsAWin — кто же выиграл?

Думаю, что циклы здесь не нужны.
Вполне можно обойтись простыми проверками: 2 диагонали + 3 горизонтали + 3 вертикали.
Pascal
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function ThereIsAWin : Boolean;
begin
  Result := True;
  if (a[0,0] > 0) and (a[0,0] = a[1,1]) and (a[0,0] = a[2,2]) then Exit;
  if (a[0,2] > 0) and (a[0,2] = a[1,1]) and (a[0,2] = a[2,0]) then Exit;
  
  if (a[0,0] > 0) and (a[0,0] = a[0,1]) and (a[0,0] = a[0,2]) then Exit;
  if (a[1,0] > 0) and (a[1,0] = a[1,1]) and (a[1,0] = a[1,2]) then Exit;
  if (a[2,0] > 0) and (a[2,0] = a[2,1]) and (a[2,0] = a[2,2]) then Exit;
 
  if (a[0,0] > 0) and (a[0,0] = a[1,0]) and (a[0,0] = a[2,0]) then Exit;
  if (a[0,1] > 0) and (a[0,1] = a[1,1]) and (a[0,1] = a[2,1]) then Exit;
  if (a[0,2] > 0) and (a[0,2] = a[1,2]) and (a[0,2] = a[2,2]) then Exit;
  Result := False;
end;
Добавлено через 2 минуты
Ну и кто же выиграл?
Pascal
93
94
95
96
97
98
99
  if ThereIsAWin then
    if StepByBot then
      WriteLn('Вы проиграли!')
    else
      WriteLn('Вы выиграли!')
  else
    WriteLn('Ничья!');
Добавлено через 2 минуты
Пусть тот, кто ходит первым, всегда ставит «Х», а второй — «O».
В дух местах программы вместо присвоения 1 и 2 соответственно, напишем так: „a[row, col] := (Step + 1) mod 2 + 1“

Добавлено через 2 минуты
Ну вот и готовая программа:
Pascal
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
var
  a : array [0..2, 0..2] of Integer;
  Step : Integer;
 
procedure Init;
begin
  for var row := 0 to 2 do
    for var col := 0 to 2 do
      a[row, col] := 0;
  Step := 0;
end;
 
function coord(row, col : Integer) := Chr(row * 3 + col + 49);
function f(row, col : Integer) : Char := a[row, col] > 0 ? String('XO')[a[row, col]] : coord(row, col);
 
procedure Draw;
begin
  WriteLn('+---+---+---+');
  for var row := 0 to 2 do
    WriteLn($'| {f(row,0)} | {f(row,1)} | {f(row,2)} |{NewLine}+---+---+---+');
end;
 
function ThereIsAWin : Boolean;
begin
  Result := True;
  if (a[0,0] > 0) and (a[0,0] = a[1,1]) and (a[0,0] = a[2,2]) then Exit;
  if (a[0,2] > 0) and (a[0,2] = a[1,1]) and (a[0,2] = a[2,0]) then Exit;
  
  if (a[0,0] > 0) and (a[0,0] = a[0,1]) and (a[0,0] = a[0,2]) then Exit;
  if (a[1,0] > 0) and (a[1,0] = a[1,1]) and (a[1,0] = a[1,2]) then Exit;
  if (a[2,0] > 0) and (a[2,0] = a[2,1]) and (a[2,0] = a[2,2]) then Exit;
 
  if (a[0,0] > 0) and (a[0,0] = a[1,0]) and (a[0,0] = a[2,0]) then Exit;
  if (a[0,1] > 0) and (a[0,1] = a[1,1]) and (a[0,1] = a[2,1]) then Exit;
  if (a[0,2] > 0) and (a[0,2] = a[1,2]) and (a[0,2] = a[2,2]) then Exit;
  Result := False;
end;
 
procedure BotStep;
begin
  var Ok := False;
  repeat
    var(row, col) := (Random(3), Random(3));
    Ok := a[row, col] = 0;
    if Ok then
      begin
        a[row, col] := (Step + 1) mod 2 + 1;
        WriteLn('Ход компьютера: ', coord(row, col));
      end;
  until Ok;
end;
 
procedure HumanStep;
begin
  var Ok := False;
  repeat
    var c := ReadLnString('Ваш ход:').Trim;
    if (c.Length = 1) and ('123456789'.IndexOf(c[1]) > -1) then
      begin
        var t := c.ToInteger - 1;
        var(row, col) := (t div 3, t mod 3);
        Ok := a[row, col] = 0;
        if Ok then
          a[row, col] := (Step + 1) mod 2 + 1
        else
          WriteLn('Эта ячейка уже занята. Повторите ход.');
      end
    else
      WriteLn('Ход — это цифра от 1 до 9 ещё не занятой ячейки. Повторите ход.');
  until Ok;
end;
 
begin
  Randomize;
  Init;
  Draw;
  
  // Кто первый ходит
  var StepByBot := Random(2) = 1;
  WriteLn('Первым ходит бот = ', Not StepByBot); // Потому, что в цикле будет инвертировано
  
  repeat
    Step += 1; StepByBot := Not StepByBot;
    
    if StepByBot then // Ход за ботом
      BotStep
    else // Ход за человеком
      HumanStep;
      
    Draw;
  until ThereIsAWin or (Step = 9); // Кто-то выиграл или все 9 ячеек занято
  
  if ThereIsAWin then
    if StepByBot then
      WriteLn('Вы проиграли!')
    else
      WriteLn('Вы выиграли!')
  else
    WriteLn('Ничья!');
end.
Добавлено через 19 минут
Осталось только научить бота закрывать человеку возможность выиграть.

Добавлено через 19 минут
Можно сильно не заморачиваться. Тупо проверить все возможные варианты:
Pascal
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
procedure BotStep;
  procedure x(row, col, b : Integer);
  begin
    a[row, col] := b;
    WriteLn('Ход компьютера: ', coord(row, col));
  end;
begin
  var v := Step mod 2 + 1; // У человека на предыдущем ходу было такое значение
  var b := (Step + 1) mod 2 + 1; // А бот этим ходом должен поставить
  // Если бот должен выиграть
  // Главная диагональ
  if (a[0,0] = b) and (a[1,1] = b) and (a[2,2] = 0) then begin x(2,2,b); Exit; end;
  if (a[0,0] = b) and (a[1,1] = 0) and (a[2,2] = b) then begin x(1,1,b); Exit; end;
  if (a[0,0] = 0) and (a[1,1] = b) and (a[2,2] = b) then begin x(0,0,b); Exit; end;
  // Побочная диагональ
  if (a[0,2] = b) and (a[1,1] = b) and (a[2,0] = 0) then begin x(2,0,b); Exit; end;
  if (a[0,2] = b) and (a[1,1] = 0) and (a[2,0] = b) then begin x(1,1,b); Exit; end;
  if (a[0,2] = 0) and (a[1,1] = b) and (a[2,0] = b) then begin x(0,2,b); Exit; end;
  // Горизонтали
  for var row := 0 to 2 do
    begin
      if (a[row,0] = b) and (a[row,1] = b) and (a[row,2] = 0) then begin x(row,2,b); Exit; end;
      if (a[row,0] = b) and (a[row,1] = 0) and (a[row,2] = b) then begin x(row,1,b); Exit; end;
      if (a[row,0] = 0) and (a[row,1] = b) and (a[row,2] = b) then begin x(row,0,b); Exit; end;
    end;
  // Вертикали
  for var col := 0 to 2 do
    begin
      if (a[0,col] = b) and (a[1,col] = b) and (a[2,col] = 0) then begin x(2,col,b); Exit; end;
      if (a[0,col] = b) and (a[1,col] = 0) and (a[2,col] = b) then begin x(1,col,b); Exit; end;
      if (a[0,col] = 0) and (a[1,col] = b) and (a[2,col] = b) then begin x(0,col,b); Exit; end;
    end;
  
  // Если человек может выиграть
  // Главная диагональ
  if (a[0,0] = v) and (a[1,1] = v) and (a[2,2] = 0) then begin x(2,2,b); Exit; end;
  if (a[0,0] = v) and (a[1,1] = 0) and (a[2,2] = v) then begin x(1,1,b); Exit; end;
  if (a[0,0] = 0) and (a[1,1] = v) and (a[2,2] = v) then begin x(0,0,b); Exit; end;
  // Побочная диагональ
  if (a[0,2] = v) and (a[1,1] = v) and (a[2,0] = 0) then begin x(2,0,b); Exit; end;
  if (a[0,2] = v) and (a[1,1] = 0) and (a[2,0] = v) then begin x(1,1,b); Exit; end;
  if (a[0,2] = 0) and (a[1,1] = v) and (a[2,0] = v) then begin x(0,2,b); Exit; end;
  // Горизонтали
  for var row := 0 to 2 do
    begin
      if (a[row,0] = v) and (a[row,1] = v) and (a[row,2] = 0) then begin x(row,2,b); Exit; end;
      if (a[row,0] = v) and (a[row,1] = 0) and (a[row,2] = v) then begin x(row,1,b); Exit; end;
      if (a[row,0] = 0) and (a[row,1] = v) and (a[row,2] = v) then begin x(row,0,b); Exit; end;
    end;
  // Вертикали
  for var col := 0 to 2 do
    begin
      if (a[0,col] = v) and (a[1,col] = v) and (a[2,col] = 0) then begin x(2,col,b); Exit; end;
      if (a[0,col] = v) and (a[1,col] = 0) and (a[2,col] = v) then begin x(1,col,b); Exit; end;
      if (a[0,col] = 0) and (a[1,col] = v) and (a[2,col] = v) then begin x(0,col,b); Exit; end;
    end;
 
  // Ну и ход рандомом
  var Ok := False;
  repeat
    var(row, col) := (Random(3), Random(3));
    Ok := a[row, col] = 0;
    if Ok then x(row, col, b);
  until Ok;
end;
Ну и всё!
1
0 / 0 / 0
Регистрация: 15.07.2018
Сообщений: 9
20.07.2018, 17:58  [ТС]
Воу
Огромное Спасибо, что настолько сильно заморочились и помогли мне
Сейчас буду всё это подробно разбирать и пытаться принять в свою юную голову)
Ещё раз Огромное Спасибо!
Очень приятно, когда профессионалы помогают в твоих начинаниях
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
21.07.2018, 13:33
Rautmazar, чтобы писать крестики-нолики не надо быть профессионалом.
0
0 / 0 / 0
Регистрация: 15.07.2018
Сообщений: 9
21.07.2018, 14:51  [ТС]
Ну мне кажется, что и одного года обучения программирования в школе тоже не достаточно
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
22.07.2018, 05:54
Rautmazar, достатоно, но, с учетом того, что Вы сами будете практиковаться, разумеется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2018, 05:54
Помогаю со студенческими работами здесь

Игра крестики-нолики
Сталкиваюсь с этой проблемой не первый раз. Суть проблемы в том,что когда я пытаюсь прописать код крестика на виртуальную клавишу enter ,...

Крестики нолики с компьютером
Никак не могу понять, как довести ее до ума. Не получается сделать так, чтобы игроки ходили нормально(а то, начинаю игру, ходит компьютер,...

Игра: Крестики-нолики
program tictac; uses GraphAbc, ABCobjects; var mas: array of rectangleABC; wx, wy, ww, wh, k, hod, c1, c2: integer; ...

Крестики-нолики: критика кода
program crozz; uses graphabc; procedure paintfield; var x1, y1, x2, y2, x3, y3, x4, y4: integer; begin ...

Крестики-нолики: исправить код
Процедура getcoordinates работает неправильно. Только для клеток 3,6,7,8,9 program crozz; uses graphabc; procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru