Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2013, 20:59   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию крестики нолики)

Ребята я че то путаюсь тут в одном месте
123
456
789 нумерация вот такая. все якобы норм только диагонали че то не нравятся запутанно)с помощью b только как раз нахожу цифры нужные.но каша думаю.. если вы про двумерный массив что с ним легче диаг. найти.i+j. i=j.но нумерацией больше выгоды имхо мб ошибаюсь
Код:
var
j,i,x,y,b,c:byte; d:array[1..9] of char;  dx:array[1..3] of string[10];  
begin
for i:=1 to 9 do begin
 readln(x);
   if odd(i) then      {очередь хода}
     d[x]:='x' else
      d[x]:='0';
  if i>4 then {просто лучше проверять после 4го хода) }
  for b:=0 to 2 do begin
   dx[1]:='';   dx[2]:=''; dx[3]:= '';
   if b=1 then c:=3 else if b=2 then c:=1; //два диагонали  различаем
    for j:=1 to 3 do   begin
     dx[1]:=dx[1]+d[b*3+j]; //суммируем по очереди каждую строку  т.е. горизонтально
     dx[2]:=dx[2]+d[((j-1)*3)+1+b]; //суммируем по очереди каждый столбец т.е. вертикально
       if b>0 then begin dx[3]:=dx[3]+d[c];   c:=c+2*b;  end; //Суммируем оба диагонали учитывая главную и  другую короче)
    end;
    for y:=1 to 3 do begin
        if (dx[y]='xxx') or (dx[y]='000') then //проверяем
          begin
              writeln(dx[y][1],' выиграл'); halt;
          end;
    end;
  end;
 end;
end.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 02.09.2013, 14:10   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Наконец-то что-то появилось и "Паскаль" был возрожден!

Так-с..

Код:
for b:=0 to 2 do begin
   if b=1 then c:=3 else if b=2 then c:=1;
А с 0-ем что?

Вобщем, почему не сделать так :
Код:
if (d[1] + d[5] + d[9] = 'xxx') or (d[3] + d[5] + d[9] = 'xxx') then
Или
Код:
if (d[1] = d[5]) and (d[5] = d[9]) then
?

И проще и геморроя меньше..
Poma][a вне форума Ответить с цитированием
Старый 02.09.2013, 20:32   #3
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

Цитата:
Или
Код:

if (d[1] = d[5]) and (d[5] = d[9]) then
да так я делал в начале))просто тогда надо присвоить 5 ому номеру какое нибудь значение чтобы отличить их потому что они итак будут равны в начале а это как то по моему не грамотно кому то показывать ибо я чего то не знаю ))а вот насчет д1+д5+д9 и бла бла)черт я не додумался не знаю почему))спасибо большое!)ато гемор
Код:
if b=1 then c:=3 else if b=2 then c:=1;
с этим уже убил)
только вот
Код:
  for b:=0 to 2 do begin
   dx[1]:='';   dx[2]:=''; 
      dx[3]:=d[1]+d[5]+d[9];
     for j:=1 to 3 do   begin
       dx[1]:=dx[1]+d[b*3+j];        
       dx[2]:=dx[2]+d[((j-1)*3)+1+b];
     end;
только вот хочется более удобно без гемора дать связь на дх 3 чтобы оба диаг были вычислены как и 1,5,9 и 3,5,7. с помощью b или как не знаю.ато со сравнением не по душе чтоли))или же дх4 добавить который вычислить другую диаг. вот и все

Последний раз редактировалось Тамерлан Абилов; 02.09.2013 в 20:41.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 02.09.2013, 21:06   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ох..
Код:
for i := 1 to 3 do begin
    t := a[i*3-2] + a[i*3-1] + a[i*3];
    if (t = 'xxx') or (t = '000') then begin
         WriteLn (t[1] + 'Win'); Halt
    end
end;

t := a[1] + a[5] + a[9];
if (t = 'xxx') or (t = '000') then begin
      WriteLn (t[1] + ' Win')
end;

t := a[3] + a[5] + a[7];
if (t = 'xxx') or (t = '000') then begin
      WriteLn (t[1] + ' Win')
end;
Например так.. только если бы туда проц\функ вставить было бы краше..

Или так :
Код:
a[1] := 'a';
a[4] := 'b';
a[7] := 'c';

for i := 1 to 3 do
     if a[i*3 - 2] = a[i*3-1] = a[i*3] then // ну ессесно это будет не так.. просто времени не много..
;
// и тут так же пляшем с диагоналями
Другой вариант (я - за него)

Код:
readln(x);
   if odd(i) then      {очередь хода}
     d[x]:=1 else
      d[x]:=0;

<..>

if d[1] + d[2] + d[3] = 0 or 3 then // ессесно не так..

// Потом так же с диагоналями
Poma][a вне форума Ответить с цитированием
Старый 02.09.2013, 21:15   #5
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

Код:
for b:=0 to 2 do begin
   dx[1]:='';   dx[2]:='';
    for j:=1 to 3 do   begin
     dx[1]:=dx[1]+d[b*3+j];
     dx[2]:=dx[2]+d[((j-1)*3)+1+b];
    end;
    dx[3]:=d[1]+d[5]+d[9]; dx[4]:=d[3]+d[5]+d[7];
    for y:=1 to 4 do begin
        if (dx[y]='xxx') or (dx[y]='000') then
          begin
              writeln(dx[y][1],' uddu'); halt;
          end;
    end;
  end;
просто как ранее и сказал так более просто другого норм варианта нету))а вот с функцией реально можно как раз так будет кратко очень)) а тут просто на дх добавить и так же сравнить))спасибо все ок извини если тебя так переутомил

Последний раз редактировалось Тамерлан Абилов; 02.09.2013 в 21:18.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 02.09.2013, 21:19   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
извини если тебя так переутомил
Не-не-не.. Сижу просто домашку шпарю..
И кстати, не забудь проинициализировать всю доску в начале игры..
Poma][a вне форума Ответить с цитированием
Старый 02.09.2013, 21:25   #7
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

да постараюсь разукрасить все там)и ещё надо убраться от повторений будет гуд))щя с функ допишу если норм то кину))


Код:
var
j,i,x,y,b:byte; d:array[1..9] of char;  dx:array[1..4] of string[10];   z:array[1..2] of string;
procedure win(t,p,f:char);
begin
z[1]:='xxx'; z[2]:='000';
for j:=1 to 2 do
if (t+p+f=z[j])  then begin
  writeln(z[j][1],' âûèãðàë'); halt;
  end;
end;
begin
for i:=1 to 9 do begin
 readln(x);
   if odd(i) then
     d[x]:='x' else
      d[x]:='0';
  if i>4 then
  for b:=0 to 2 do begin
   win(d[b*3+1],d[b*3+2],d[b*3+3]) ;
    win(d[1+b],d[4+b],d[7+b]) ;
 if b<2 then  win(d[1+b*2],d[5],d[9-b*2]); //а вот  кстати и диаг решил :) 
   end;
end;
end.
почти тоже самое)) но тут циклов меньше и очень понятно))спасибо рома)

Последний раз редактировалось Тамерлан Абилов; 02.09.2013 в 22:18.
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
крестики нолики mixon-21 Помощь студентам 1 04.08.2013 22:13
крестики нолики spydark91 Общие вопросы Delphi 2 08.07.2011 19:19
Крестики-Нолики Jasper92 Помощь студентам 3 01.11.2010 18:35
крестики нолики neformalblack Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 18.04.2010 19:04
крестики нолики neformalblack Qt и кроссплатформенное программирование С/С++ 3 15.04.2010 21:33