С Новым годом! Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 10.09.2014
Сообщений: 2

Блок-схема

16.12.2014, 22:25. Показов 1019. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, Menus,
Draughts, VChessBoard, Unit1;
type
TfmCheckers = class(TForm)
Timer1: TTimer;
pnRight: TPanel;
MainMenu1: TMainMenu;
miFile: TMenuItem;
miGame: TMenuItem;
miHelp: TMenuItem;
miAbout: TMenuItem;
miExit: TMenuItem;
miStartLocalGame: TMenuItem;
pnChessBoard: TPanel;
lbedBlackName: TLabeledEdit;
lbedWhiteName: TLabeledEdit;
Label1: TLabel;
Label2: TLabel;
stCurrentPlayer: TStaticText;
Label3: TLabel;
stTimer: TStaticText;
miCancelGame: TMenuItem;
procedure miExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure miStartLocalGameClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure miCancelGameClick(Sender: TObject);
procedure miAboutClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
vcbChess:TVisualChessBoard;
PlayerSide, CurrentPlayer:Integer;
IsDraughtChosen:Boolean;
DraughtPosition:TCellPosition;
StrikeMode:Boolean;
PlayTime:Integer;
StartTime:TDateTime;
LocalGame:Boolean;
procedure vcbChessMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure vcbChessMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure vcbChessMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Procedure TrySelectNewDraught(x, y:Integer);
Procedure TryMakeStrike(x, y:Integer);
Procedure SwitchCurrentPlayer;
Function CheckForWin:Integer;
end;
var
fmCheckers: TfmCheckers;
implementation
uses About;
{$R *.dfm}
procedure TfmCheckers.miExitClick(Sender: TObject);
begin
Close;
end;
procedure TfmCheckers.FormCreate(Sender: TObject);
begin
vcbChess:=TVisualChessBoard.Create(pnChe ssBoard);
vcbChess.Parent:=pnChessBoard;
vcbChess.Left:=8;
vcbChess.Top:=8;
vcbChess.Width:=1200;
vcbChess.Height:=1200;
vcbChess.OnMouseMove:=vcbChessMouseMove;
vcbChess.OnMouseDown:=vcbChessMouseDown;
vcbChess.OnMouseUp:=vcbChessMouseUp;

vcbChess.Refresh;
end;

procedure TfmCheckers.FormResize(Sender: TObject);
Var
CellSize:Integer;
begin
If pnChessBoard.Width<pnChessBoard.Height Then
CellSize:=(pnChessBoard.Width-16) div 8
Else
CellSize:=(pnChessBoard.Height-16) div 8;

vcbChess.Left:=8;
vcbChess.Top:=8;
vcbChess.Width:=CellSize*8;
vcbChess.Height:=CellSize*8;
vcbChess.Refresh;
If IsDraughtChosen Then
TrySelectNewDraught(DraughtPosition.X, DraughtPosition.Y);
end;

procedure TfmCheckers.vcbChessMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
Var
xP, yP:Integer;
begin
vcbChess.Cursor:=crDefault;

vcbChess.GetCellNumberByCoord(X, Y, xP, yP);

If vcbChess.Board.GetDraught(xP, yP)<>nil Then
Begin
If vcbChess.Board.GetDraught(xP, yP).Side=PlayerSide Then
vcbChess.Cursor:=crHandPoint
End;
end;

procedure TfmCheckers.vcbChessMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
xP, yP:Integer;
begin
If StrikeMode Then Exit;

vcbChess.GetCellNumberByCoord(X, Y, xP, yP);

If Not(IsDraughtChosen) Then //Если еще нет выбранной шашки
Begin
TrySelectNewDraught(xP, yP);
End
Else Begin //Если уже есть выбранная шашка
If vcbChess.Board.GetDraught(xP, yP)=nil Then
Begin //Если клетка пустая, то обработаем как отпускание мыши
vcbChessMouseUp(Sender, Button, Shift, X, Y);
End
Else Begin //Если там стоит наша шашка, то сбросим выбор и рекурсируем
If vcbChess.Board.GetDraught(xP, yP).Side=PlayerSide Then
Begin
vcbChess.Refresh;
IsDraughtChosen:=False;
vcbChessMouseDown(Sender, Button, Shift, X, Y);
End;
End;
End;
end;

procedure TfmCheckers.vcbChessMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
xP, yP:Integer;
Moves, Strikes, Strickens:TList;
begin
vcbChess.GetCellNumberByCoord(X, Y, xP, yP);

If IsDraughtChosen Then //Если есть выбранная шашка
Begin
//Проверим: можно ли в принципе шагнуть сюда
If vcbChess.Board.GetDraught(xP, yP)<>nil Then Exit;
//Клетка пустая
//Проверим правильность хода в эту клетку
vcbChess.Board.FindMoves(DraughtPosition .X, DraughtPosition.Y, Moves, Strikes, Strickens);
If Strikes.Count=0 Then //Нет рубки - пытаемся просто ходить
Begin
If CheckPosition(xP, yP, Moves)>=0 Then //Ход верен!
Begin
vcbChess.Board.MoveDraught(DraughtPositi on.X, DraughtPosition.Y, xP, yP);
IsDraughtChosen:=False;
vcbChess.Refresh;
vcbChessMouseMove(Sender, Shift, X, Y);

SwitchCurrentPlayer; //Ход сделан - переключем игрока
CheckForWin;
End;
End
Else Begin //Есть возможность рубки - обязательно!
TryMakeStrike(xP, yP);
End;
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
End
Else Begin //Шашка не еще выбрана

End;
end;

Procedure TfmCheckers.TrySelectNewDraught(x, y:Integer);
Var
Moves, Strikes, Strickens:TList;
StrikingDraughts:TList;
Begin
If vcbChess.Board.GetDraught(x, y)=nil Then Exit;
If vcbChess.Board.GetDraught(x, y).Side<>PlayerSide Then Exit;
//Проверим обязательные рубки
StrikingDraughts:=vcbChess.Board.FindStr ikingDraughts(PlayerSide);
If StrikingDraughts.Count>0 Then
Begin
If CheckPosition(x, y, StrikingDraughts)<0 Then
Begin
ClearMoves(StrikingDraughts);
Exit;
End;
End;
ClearMoves(StrikingDraughts);

DraughtPosition.X:=x;
DraughtPosition.Y:=y;
IsDraughtChosen:=True;
//Отрисуем возможные ходы с учетом обязаловки рубки
vcbChess.Board.FindMoves(x, y, Moves, Strikes, Strickens);
If Strikes.Count=0 Then
vcbChess.DrawMoves(Moves, nil)
Else
vcbChess.DrawMoves(nil, Strikes);
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
End;

Procedure TfmCheckers.TryMakeStrike(x, y:Integer);
Var
Moves, Strikes, Strickens:TList;
CP:PCellPosition;
Begin
If Not(IsDraughtChosen) Then Exit;
vcbChess.Board.FindMoves(DraughtPosition .X, DraughtPosition.Y, Moves, Strikes, Strickens);
//Возможна ли рубка в данную клетку
If CheckPosition(x, y, Strikes)>=0 Then //Рубка верна!
Begin //рубим
//Определим срубленную шашку
CP:=Strickens.Items[CheckPosition(x, y, Strikes)];
vcbChess.Board.DeleteDraught(CP^.X, CP^.Y);
//Перескакиваем
vcbChess.Board.MoveDraught(DraughtPositi on.X, DraughtPosition.Y, x, y);
DraughtPosition.X:=x; DraughtPosition.Y:=y;

ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);

//Определим: возможно ли продолжение рубки
vcbChess.Board.FindMoves(DraughtPosition .X, DraughtPosition.Y, Moves, Strikes, Strickens);
If Strikes.Count>0 Then
Begin
StrikeMode:=True; //Установим режим рубки
End
Else Begin
StrikeMode:=False;
SwitchCurrentPlayer; //Закончена рубка - переключим игрока
End;

ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);

vcbChess.Refresh;
End;

If StrikeMode Then
Begin
IsDraughtChosen:=False;
TrySelectNewDraught(DraughtPosition.X, DraughtPosition.Y);
End;

CheckForWin;
End;

Procedure TfmCheckers.SwitchCurrentPlayer;
Begin
If CurrentPlayer=sdWhite Then CurrentPlayer:=sdBlack Else CurrentPlayer:=sdWhite;
If LocalGame Then PlayerSide:=CurrentPlayer;

If CurrentPlayer=sdWhite Then stCurrentPlayer.Caption:='Белые' Else stCurrentPlayer.Caption:='Черные';
If PlayerSide=CurrentPlayer Then
Begin
pnChessBoard.Enabled:=True;
End
Else Begin
pnChessBoard.Enabled:=False;
End;
End;

Function TfmCheckers.CheckForWin:Integer;
Begin
Result:=-1;
//Проверим победу по срубам
If vcbChess.Board.CountDraughts(sdWhite)=0 Then
Begin
Result:=sdBlack;
End;
If vcbChess.Board.CountDraughts(sdBlack)=0 Then
Begin
Result:=sdWhite;
End;
//Проверим победу по блокировкам
If Not(vcbChess.Board.AbleToMove(CurrentPla yer)) Then
If CurrentPlayer=sdWhite Then Result:=sdBlack Else Result:=sdWhite;

If Result<0 Then Exit;
//Game Over!
miCancelGameClick(Self);
Case Result Of
sdWhite: Application.MessageBox('Победила команда "Белых"', 'Победили Белые!', MB_OK+MB_ICONINFORMATION);
sdBlack: Application.MessageBox('Победила команда "Черных"', 'Победили Черные!', MB_OK+MB_ICONINFORMATION);
End;
End;

procedure TfmCheckers.Timer1Timer(Sender: TObject);
begin
// Inc(PlayTime);
// stTimer.Caption:=Format('%d:%.2d:%.2d', [PlayTime div 3600, (PlayTime mod 3600) div 60, (PlayTime mod 3600) mod 60]);
stTimer.Caption:=TimeToStr(Now-StartTime);
end;

procedure TfmCheckers.miStartLocalGameClick(Sender : TObject);
begin
LocalGame:=True;

lbedWhiteName.ReadOnly:=True;
lbedBlackName.ReadOnly:=True;

// PlayTime:=0;
StartTime:=Now;
PlayerSide:=sdWhite;
CurrentPlayer:=sdBlack;
IsDraughtChosen:=False;
StrikeMode:=False;

vcbChess.Board.Respawn;
vcbChess.Refresh;

pnChessBoard.Enabled:=True;

Timer1.Enabled:=True;
SwitchCurrentPlayer;
end;


procedure TfmCheckers.miCancelGameClick(Sender: TObject);
begin
Timer1.Enabled:=False;
pnChessBoard.Enabled:=False;
lbedWhiteName.ReadOnly:=False;
lbedBlackName.ReadOnly:=False;

Application.MessageBox('Игра зкончена', 'Игра закончена', MB_OK+MB_ICONINFORMATION);
end;
procedure TfmCheckers.miAboutClick(Sender: TObject);
begin
Form1.Show;
end;
end.


помогите пожалуйста, мне еще таких же 4 чертить
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2014, 22:25
Ответы с готовыми решениями:

Блок-схема C++
Доброго времени суток. Помогите составить блок-схему для кода. #include &lt;iostream&gt; #include &lt;math.h&gt; using...

Блок схема
Задание: Вводятся числа a и b. Найти количество чисел в диапазоне , у которых последняя цифра равна 7 Текст программы: ...

Блок схема
Блок-схема //--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #include &lt;fstream.h&gt;...

1
16.12.2014, 22:31

Не по теме:

Цитата Сообщение от Alex877 Посмотреть сообщение
мне еще таких же 4 чертить
Круто! Но слезу не выдавите.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2014, 22:31
Помогаю со студенческими работами здесь

Блок схема
Сделать блок схему работы программы офис несколько функций допустим открыть создать вставить текст изменить шрифт

Блок-схема
Помогите нарисовать блок схему (то что ручкой рисовал преподаватель) Должно получиться примерно что-то вроде этого

блок- схема
Один из простейших способов шифровки состоит в табличной замене одного символа на другой. Выбрать некоторую таблицу, разработать способ ее...

Блок-схема
Помогите пожалуйста составить блок- схему: В массиве хранятся данные о количестве осадков в миллиметрах, выпавших в Москве за...

Блок-схема
Турбо поскаль: uses crt; const e=0.001; function F1(x:real):real; begin F1:=x*x end; function F2(x:real):real; begin


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru