Программа "Генератор кроссвордов"

Автор работы: Пользователь скрыл имя, 07 Апреля 2013 в 14:41, курсовая работа

Краткое описание

Кроссворд появился в начале 20 века и быстро завоевал популярность во всем мире. Слово кроссворд образовалось из двух английских слов cross - пересечение и word - слово. Решение кроссвордов тренирует память и расширяет кругозор, некоторые типы кроссвордов способствуют развитию сообразительности и ассоциативного мышления. Медики стали использовать кроссворд как успокаивающее средство. Преподаватели тоже применяют кроссворд в своей работе, это позволяет учащимся усваивать знания в игровой форме. Сфера применения кроссвордов постоянно расширяется, кроссворды применяются для тестирования профессиональных качеств.

Содержимое работы - 1 файл

Записка.docx

— 606.66 Кб (Скачать файл)

Бруно Бабэ. Просто и ясно о 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с.

 

 

  1. Приложение

Исходный код приложения.

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->ExeName) + "WordBase.mdb";

  //Получили имя файла  ACCESS

 const String ConnStr = "Provider=%s;Data Provider=%s;Data Source=%s";

  //Строка параметров  соединения

 if (!Dm->ADOConnection1->Connected) {

  Dm->ADOConnection1->ConnectionString = Format (ConnStr,

   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]->Text = IntToStr(ACol) ;

    switch(Crossword[ARow][ACol].Cell)

    {

      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].Selected) Grid->Canvas->Brush->Color = clYellow;

    Grid->Canvas->FillRect(Rect);

    if (Crossword[ARow][ACol].Start !=0)

    {

      Grid->Canvas->TextRect(Rect,Rect.Left,Rect.Top,IntToStr(Crossword[ARow][ACol].Start));

    }

    Grid->Canvas->TextRect(Rect,Rect.Left+10,Rect.Top+10,Crossword[ARow][ACol].Letter);

    StatusBar->Panels->Items[1]->Text = IntToStr(ARow);

   }

}

//---------------------------------------------------------------------------

 

void __fastcall TfrmMain::FormShow(TObject *Sender)

{

  Starting = 1;

  CurrentMode = tShow;

  StatusBar->Panels->Items[0]->Text = sModeShow;

  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]->Text = sModeShow;

  }

  else

  {

    CurrentMode = tDraw;

    StatusBar->Panels->Items[0]->Text = sModeDraw;

  }

 

}

//---------------------------------------------------------------------------

 

void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)

{

  KillCrossword();

}

//---------------------------------------------------------------------------

 

 

void __fastcall TfrmMain::GridSelectCell(TObject *Sender, int ACol, int ARow,

      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,ARow);

       if(chkV->Checked && ARow !=vv) SetCell(ACol,Grid->ColCount-ARow-1);

       if(chkH->Checked&& ACol !=hh && ARow !=vv) SetCell(Grid->ColCount-ACol-1,Grid->ColCount-ARow-1);

       Grid->Repaint();

       StatusBar->Panels->Items[4]->Text = IntToStr(GetStartPosition(ACol,ARow));

       StatusBar->Panels->Items[3]->Text = Crossword[ARow][ACol].Direction;

}

//---------------------------------------------------------------------------

 

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],sizeof(WCell));

      }

  }

    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],sizeof(WCell));

      }

      GridCellsSize();

      Grid->Repaint();

      delete fs;

    }

 

}

}

 

//---------------------------------------------------------------------------

 

 

void __fastcall TfrmMain::btnClearClick(TObject *Sender)

{

  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);break;

          case 'V':GetVerticalMask(i,j);break;

          case 'B':GetHorizontalMask(i,j);GetVerticalMask(i,j);break;

Информация о работе Программа "Генератор кроссвордов"