Автор работы: Пользователь скрыл имя, 07 Апреля 2013 в 14:41, курсовая работа
Кроссворд появился в начале 20 века и быстро завоевал популярность во всем мире. Слово кроссворд образовалось из двух английских слов cross - пересечение и word - слово. Решение кроссвордов тренирует память и расширяет кругозор, некоторые типы кроссвордов способствуют развитию сообразительности и ассоциативного мышления. Медики стали использовать кроссворд как успокаивающее средство. Преподаватели тоже применяют кроссворд в своей работе, это позволяет учащимся усваивать знания в игровой форме. Сфера применения кроссвордов постоянно расширяется, кроссворды применяются для тестирования профессиональных качеств.
Бруно Бабэ. Просто и ясно о Borland C++: Пер. с англ. - Москва: БИНОМ, 1994. 400с.
В.В. Подбельский. Язык C++: Учебное пособие. - Москва: Финансы и статистика, 1995. 560с.
Ирэ Пол. Объектно-ориентированное программирование с использованием C++: Пер. с англ. - Киев: НИИПФ ДиаСофт Лтд, 1995. 480с.
Т. Фейсон. Объектно-ориентированное программирование на Borland C++ 4.5: Пер. с англ. - Киев: Диалектика, 1996. 544с.
Т. Сван. Освоение Borland C++ 4.5: Пер. с англ. - Киев: Диалектика, 1996. 544с.
Г. Шилдт. Самоучитель C++: Пер. с англ. - Санкт-Петербург: BHV-Санкт-Петербург, 1998. 620с.
У. Сэвитч. C++ в примерах: Пер. с англ. - Москва: ЭКОМ, 1997. 736с.
К. Джамса. Учимся программировать на языке C++: Пер. с англ. - Москва: Мир, 1997. 320с.
В.А. Скляров. Язык C++ и объектно-ориентированное программирование: Справочное издание. - Минск: Вышэйшая школа, 1997. 480с.
Х. Дейтел, П. Дейтел. Как программировать на C++: Пер. с англ. - Москва: ЗАО "Издательство БИНОМ", 1998. 1024с.
Исходный код приложения.
Main
//----------------------------
#ifndef uMainH
#define uMainH
//----------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include "sSkinProvider.hpp"
#include "sButton.hpp"
#include "sScrollBox.hpp"
//============================
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include "sPanel.hpp"
#include "sSplitter.hpp"
#include <ComCtrls.hpp>
#include <Buttons.hpp>
#include <ImgList.hpp>
#include <Dialogs.hpp>
#include "sSkinProvider.hpp"
#include "acAlphaImageList.hpp"
#include "sCheckBox.hpp"
#include "sEdit.hpp"
#include "sLabel.hpp"
#include "sMemo.hpp"
#include "sPanel.hpp"
#include "sSpeedButton.hpp"
#include "sSplitter.hpp"
#include "sStatusBar.hpp"
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <ImgList.hpp>
#include <DBGrids.hpp>
//----------------------------
class TfrmMain : public TForm
{
__published: // IDE-managed Components
TMainMenu *mm1;
TMenuItem *mniN1;
TsSkinProvider *sknprvdr1;
TStringGrid *Grid;
TsPanel *Panel1;
TsStatusBar *StatusBar;
TsSplitter *Splitter1;
TsPanel *Panel2;
TsAlphaImageList *ImageList;
TsSpeedButton *btn2;
TsPanel *PanelSize;
TsLabelFX *Label1;
TsLabelFX *sLabelFX1;
TsEdit *EditX;
TsEdit *EditY;
TsSpeedButton *btnMode;
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
TMenuItem *mniN2;
TMenuItem *mniN3;
TMenuItem *mniN4;
TsPanel *Panel3;
TsCheckBox *chkH;
TsCheckBox *chkV;
TsSpeedButton *btnClear;
TsSpeedButton *btn1;
TsSpeedButton *btn3;
TDBGrid *DbGridWords;
TsSplitter *Splitter2;
TDBGrid *DbGridWork;
void __fastcall GridDrawCell(TObject *Sender, int ACol, int ARow,
TRect &Rect, TGridDrawState State);
void __fastcall FormShow(TObject *Sender);
void __fastcall btn2Click(TObject *Sender);
void __fastcall EditXChange(TObject *Sender);
void __fastcall EditYChange(TObject *Sender);
void __fastcall GridCellsSize();
void __fastcall btnModeClick(TObject *Sender);
void __fastcall CreateCrossword();
void __fastcall KillCrossword();
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall GridSelectCell(TObject *Sender, int ACol, int ARow,
bool &CanSelect);
void __fastcall SetCell(int C, int R);
void __fastcall mniN4Click(TObject *Sender);
void __fastcall mniN3Click(TObject *Sender);
void __fastcall mniN2Click(TObject *Sender);
void __fastcall btnClearClick(TObject *Sender);
byte __fastcall GetStartPosition(int PosX,int PosY);
bool __fastcall CellBack(int PosX,int PosY);
bool __fastcall CellUp(int PosX,int PosY);
void __fastcall btn1Click(TObject *Sender);
void __fastcall GetMasks();
void __fastcall GetHorizontalMask(int yy,int xx);
void __fastcall GetVerticalMask(int yy,int xx);
void __fastcall btn3Click(TObject *Sender);
void __fastcall SetWord(int Nom,String Dir);
void __fastcall Label1Click(TObject *Sender);
void __fastcall GetWord(int Nom,String Dir);
void __fastcall sLabelFX1Click(TObject *Sender);
void __fastcall DbGridWorkCellClick(TColumn *Column);
void __fastcall WriteWord(int Nom,String Dir);
void __fastcall DbGridWordsCellClick(TColumn *Column);
private: // User declarations
public: // User declarations
__fastcall TfrmMain(TComponent* Owner);
};
//----------------------------
extern PACKAGE TfrmMain *frmMain;
//----------------------------
#endif
//----------------------------
#include <vcl.h>
#pragma hdrstop
#include "uMain.h"
#include "uWords.h"
#include "uDm.h"
//----------------------------
#pragma package(smart_init)
/*
#pragma link "sSkinProvider"
#pragma link "sButton"
#pragma link "sScrollBox"
#pragma link "sPanel"
#pragma link "sSplitter"
#pragma link "sStatusBar"
#pragma link "acAlphaImageList"
#pragma link "sSpeedButton"
//#pragma link "acAlphaHints"
#pragma link "sEdit"
#pragma link "sLabel"
#pragma link "sMemo"
#pragma link "sCheckBox"
*/
#pragma link "sSkinProvider"
#pragma link "acAlphaImageList"
#pragma link "sCheckBox"
#pragma link "sEdit"
#pragma link "sLabel"
#pragma link "sMemo"
#pragma link "sPanel"
#pragma link "sSpeedButton"
#pragma link "sSplitter"
#pragma link "sStatusBar"
#pragma resource "*.dfm"
TfrmMain *frmMain;
const AnsiString sModeShow ="Режим отображения";
const AnsiString sModeDraw ="Режим разметки";
struct WCell
{
char Cell; //0 - Пустое поле // 1 Закрашенная клетка 2 - клетка с буквой
unsigned int Start; // 0 - не начало слова. не 0 - начало слова
char Direction; // 'V' / 'H' /'S'- направление слова (V/H - начало слова, S - не начало слова)
char Letter; // буква
bool Selected;
};
struct WCell1
{
unsigned int Start;
};
WCell **Crossword;
WCell1 *aaa;
enum tMode {tDraw,tShow};
enum tSimmetry {tNone,tVert,tHor,tBoth};
tMode CurrentMode;
tSimmetry Simmetry;
unsigned int CrossX = 5;
unsigned int CrossY = 5;
bool Starting;
void __fastcall TfrmMain::CreateCrossword()
{
Crossword = new WCell*[CrossY];
for(int i=0; i<CrossY; i++)
Crossword[i] = new WCell[CrossX];
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
{
Crossword[i][j].Cell= '2';
Crossword[i][j].Start = 0;
Crossword[i][j].Direction = ' ';
Crossword[i][j].Letter = ' ';
}
}
Grid->Repaint();
}
void __fastcall TfrmMain::KillCrossword()
{
if (Crossword != NULL)
//if (CrossX !=0 && CrossY !=0 && !Starting)
{
for(int i=0; i<CrossY; i++)
delete[] Crossword[i];
delete[] Crossword;
Crossword = NULL;
}
}
//----------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
/*
String pr="MSDataShape.1";
String dpr="Microsoft.Jet.OLEDB.4.0";
AnsiString tmp = ExtractFilePath(Application->
//Получили имя файла ACCESS
const String ConnStr = "Provider=%s;Data Provider=%s;Data Source=%s";
//Строка параметров соединения
if (!Dm->ADOConnection1->
Dm->ADOConnection1->
ARRAYOFCONST((pr,dpr, tmp)));
Dm->ADOConnection1->Open();
//ADOQuery1->Open();
*/
}
//----------------------------
void __fastcall TfrmMain::GridCellsSize()
{
for (int i=0;i<Grid->ColCount;i++) Grid->ColWidths[i] = 30;
for (int i=0;i<Grid->RowCount;i++) Grid->RowHeights[i] = 30;
}
void __fastcall TfrmMain::GridDrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if (Crossword != NULL && ACol<=CrossX && ARow <=CrossY)
{
// Grid->Canvas->CopyMode;
Grid->Canvas->Font->Color = clGreen;
Grid->Canvas->Font->Size = 8;
StatusBar->Panels->Items[2]->
switch(Crossword[ARow][ACol].
{
case '0' :
Grid->Canvas->Brush->Color = clGray;break;
case '1':
Grid->Canvas->Brush->Color = clBlack;break;
case '2':
Grid->Canvas->Brush->Color = clWhite;break;
}
if (Crossword[ARow][ACol].
Grid->Canvas->FillRect(Rect);
if (Crossword[ARow][ACol].Start !=0)
{
Grid->Canvas->TextRect(Rect,
}
Grid->Canvas->TextRect(Rect,
StatusBar->Panels->Items[1]->
}
}
//----------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
Starting = 1;
CurrentMode = tShow;
StatusBar->Panels->Items[0]->
EditX->Text = "5";
EditY->Text = "5";
PanelSize->Hide();
Grid->FixedCols = 0;
Grid->FixedRows = 0;
Grid->RowCount = 5;
Grid->ColCount = 5;
GridCellsSize();
CrossX = 5;
CrossY = 5;
CreateCrossword();
Grid->Repaint();
Starting = 0;
DbGridWork->DataSource = Dm->DataSourceWork;
Dm->DataSourceWork->DataSet = Dm->ADOQuery;
DbGridWork->ReadOnly = 1;
DbGridWords->ReadOnly = 1;
DbGridWords->DataSource = Dm->DataSourceWrd;
Dm->DataSourceWrd->DataSet = Dm->ADOQueryWrd;
}
//----------------------------
void __fastcall TfrmMain::btn2Click(TObject *Sender)
{
if (PanelSize->Visible)
{
PanelSize->Hide();
GridCellsSize();
}
else PanelSize->Show();
}
//----------------------------
void __fastcall TfrmMain::EditXChange(TObject *Sender)
{
unsigned int x = 5;
try
{
x = StrToInt(EditX->Text.Trim());
Grid->ColCount = x;
KillCrossword();
CrossX = x;
CreateCrossword();
}
catch(Exception &e)
{
x= 5;
EditX->Text = "5";
Grid->ColCount = x;
KillCrossword();
CrossX = x;
CreateCrossword();
}
}
//----------------------------
void __fastcall TfrmMain::EditYChange(TObject *Sender)
{
unsigned int y = 5;
try
{
y = StrToInt(EditY->Text.Trim());
Grid->RowCount = y;
KillCrossword();
CrossY = y;
CreateCrossword();
}
catch(Exception &e)
{
y= 5;
EditY->Text = "5";
Grid->RowCount = y;
KillCrossword();
CrossY = y;
CreateCrossword();
}
}
//----------------------------
void __fastcall TfrmMain::btnModeClick(TObject *Sender)
{
if (CurrentMode == tDraw)
{
CurrentMode = tShow;
StatusBar->Panels->Items[0]->
}
else
{
CurrentMode = tDraw;
StatusBar->Panels->Items[0]->
}
}
//----------------------------
void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
KillCrossword();
}
//----------------------------
void __fastcall TfrmMain::GridSelectCell(
bool &CanSelect)
{ SetCell(ACol,ARow);
int hh,vv;
if (Grid->ColCount
& 1 == 0) hh=-1; else hh=RoundTo(Grid->ColCount/2,0)
if (Grid->RowCount
& 1 == 0) vv=-1; else vv=RoundTo(Grid->RowCount/2,0)
if(chkH->Checked
&& ACol !=hh) SetCell(Grid->ColCount-ACol-1,
if(chkV->Checked
&& ARow !=vv) SetCell(ACol,Grid->ColCount-
if(chkH->Checked&&
ACol !=hh && ARow !=vv) SetCell(Grid->ColCount-ACol-1,
Grid->Repaint();
StatusBar->Panels->Items[4]->
StatusBar->Panels->Items[3]->
}
//----------------------------
void __fastcall TfrmMain::SetCell(int C, int R)
{
if (CurrentMode == tDraw && C <= CrossX && R <= CrossY)
{
if (Crossword[R][C].Cell == '2')
Crossword[R][C].Cell = '1'; else
Crossword[R][C].Cell = '2';
Crossword[R][C].Selected = 0;
Crossword[R][C].Letter = ' ';
}
}
void __fastcall TfrmMain::mniN4Click(TObject *Sender)
{
Application->Terminate();
}
//----------------------------
void __fastcall TfrmMain::mniN3Click(TObject *Sender)
{
AnsiString FileName;
unsigned int k;
if (SaveDialog1->Execute())
{
Grid->ColCount = 0;
Grid->RowCount = 0;
FileName = SaveDialog1->FileName;
TFileStream* fs = new TFileStream(FileName, fmCreate);
fs->Write(&CrossX, sizeof(CrossX));
fs->Write(&CrossY, sizeof(CrossY));
if (Crossword != NULL)
{
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
fs->Write(&Crossword[i][j],
}
}
delete fs;
Grid->ColCount = CrossX;
Grid->RowCount = CrossY;
GridCellsSize();
Grid->Repaint();
}
}
//----------------------------
void __fastcall TfrmMain::mniN2Click(TObject *Sender)
{
AnsiString FileName;
if (OpenDialog1->Execute())
{
FileName = OpenDialog1->FileName;
TFileStream* fs = new TFileStream(FileName, fmOpenRead);
Grid->ColCount = 0;
Grid->RowCount = 0;
KillCrossword();
fs->Read(&CrossX, sizeof(CrossX));
fs->Read(&CrossY, sizeof(CrossY));
CreateCrossword();
Grid->ColCount = CrossX;
Grid->RowCount = CrossY;
if (Crossword != NULL)
{
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
fs->Read(&Crossword[i][j],
}
GridCellsSize();
Grid->Repaint();
delete fs;
}
}
}
//----------------------------
void __fastcall TfrmMain::btnClearClick(
{
if (Crossword != NULL)
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
{
Crossword[i][j].Cell= '2';
Crossword[i][j].Start = 0;
Crossword[i][j].Direction = ' ';
Crossword[i][j].Letter = ' ';
}
}
Grid->Repaint();
}
//----------------------------
bool __fastcall TfrmMain::CellBack(int PosX,int PosY)
{
if (PosX == 0 || Crossword[PosY][PosX-1].Cell !='2') return 1;
else return 0;
}
bool __fastcall TfrmMain::CellUp(int PosX,int PosY)
{
if (PosY == 0 || Crossword[PosY-1][PosX].Cell !='2') return 1;
else return 0;
}
byte __fastcall TfrmMain::GetStartPosition(int PosX,int PosY)
{
byte Flag = 0;
if (Crossword[PosY][PosX].Cell !='2') return Flag;
if(PosX < CrossX-1 && CellBack(PosX,PosY) && Crossword[PosY][PosX+1].Cell =='2') Flag = 1;
if(PosY < CrossY-1 && CellUp(PosX,PosY) && Crossword[PosY+1][PosX].Cell =='2') Flag |=2;
return Flag;
}
void __fastcall TfrmMain::btn1Click(TObject *Sender)
{
int WordsCounter = 0 ;
byte Direction;
if (Crossword != NULL)
{
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
{
Direction = GetStartPosition(j,i);
if(Direction!=0)
{
WordsCounter ++;
Crossword[i][j].Start = WordsCounter;
switch(Direction)
{
case 1:Crossword[i][j].Direction = 'H';break;
case 2:Crossword[i][j].Direction = 'V';break;
case 3:Crossword[i][j].Direction = 'B';break;
}
}
else Crossword[i][j].Start = 0;
Crossword[i][j].Letter = ' ';
}
}
Grid->Repaint();
GetMasks();
Dm->ADOQuery->SQL->Text = "SELECT * FROM mWork";
Dm->ADOQuery->Open();
}
}
//----------------------------
void __fastcall TfrmMain::GetMasks()
{
if (Crossword != NULL)
{
Dm->ADOQuery->SQL->Text = "DELETE FROM mWork;";
Dm->ADOQuery->ExecSQL();
for(int i=0; i<CrossY; i++)
{
for(int j=0; j<CrossX; j++)
{
if (Crossword[i][j].Start !=0)
switch (Crossword[i][j].Direction)
{
case 'H':GetHorizontalMask(i,j);
case 'V':GetVerticalMask(i,j);
case 'B':GetHorizontalMask(i,j);