Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
1
Добавлен:
30.05.2020
Размер:
15.52 Кб
Скачать
// draught.cpp -Реализация модуля элементов игры зенитная установка
//#include "C\BORLANDC\BIN\Labs\kurs\figures.h"
//#include "C\BORLANDC\BIN\Labs\kurs\draught.h"
#include <figures.h>
#include <draught.h>
#include <graphics.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>

//реализация класса шашка		
TDraught::TDraught(int tCenterX, int tCenterY, TDrState tState,	
		   TDrColor tColor)
	:TFigure(tCenterX,tCenterY)	
{		
theState=tState;
theColor=tColor;
};

void TDraught::Show()
{
int real_col;
if (theColor==Black) {real_col=BLUE;}
else {real_col=GREEN;}
setfillstyle(SOLID_FILL,real_col);
fillellipse(theCenterX, theCenterY, cDraughtRadius, cDraughtRadius);
if (theKing==King) circle(theCenterX,theCenterY,cKingRadius);
};


//реализация класса клетка
TSquare::TSquare(int tCenterX, int tCenterY, TSqState tSqState)	
	:TFigure(tCenterX,tCenterY)
{	
theSqState=tSqState;	
};	

void TSquare::Show()	
{	
setfillstyle(SOLID_FILL,WHITE);	
bar(theCenterX-cSquareLength,theCenterY-cSquareLength,	
	theCenterX+cSquareLength,theCenterY+cSquareLength);
};	

//реализация класса курсор	
TCursor::TCursor(int tCenterX, int tCenterY)	
	:TFigure(tCenterX,tCenterY)
	{;};

void TCursor::Show()	
{	
int poly[6];	
poly[0]=theCenterX;	
poly[1]=theCenterY;	
poly[2]=theCenterX+10;	
poly[3]=theCenterY;	
poly[4]=theCenterX;	
poly[5]=theCenterY+10;	
setfillstyle(SOLID_FILL,MAGENTA);	
fillpoly(3,poly);	
};	

float TCursor::GetCenterX()	
{return(theCenterX);}	

float TCursor::GetCenterY()	
{return(theCenterY);}	

void TCursor::Move(int DeltaX, int DeltaY)	
{	
if((theCenterX+DeltaX<420)&&(theCenterX+DeltaX>20)&&	
	(theCenterY+DeltaY<420)&&(theCenterY+DeltaY>20))
{	
theCenterX+=DeltaX;	
theCenterY+=DeltaY;	
}	
Show();	
};	

//реализация класса поле
TField::TField()
{
int i,j,z;
div_t x,y;

//установка начальных значений и создание курсора, шашек и клеток
thePlayer=PBlack;
theEnter=one;
PCursor = new TCursor(cCenterX,cCenterY);

//клетки
for (i=0;i<8;i++)
 for (j=0;j<8;j++)
   {
   x=div(i,2),y=div(j,2);
   if (x.rem==0 && y.rem==0)
    {z=(j+8*i)/2;
    PSquare[z]=new TSquare((i+1)*cCenterX,(j+1)*cCenterY,Empty);
    }
   if (x.rem==1 && y.rem==1)
    {z=(8*i+j-1)/2;
    PSquare[z]=new TSquare((i+1)*cCenterX,(j+1)*cCenterY,Empty);
    }
   }
for(i=0;i<12;i++)
 {PSquare[i]->theSqState=First;}
for(i=32;i>19;i--)
 {PSquare[i]->theSqState=Second;}

//шашки
for(i=0;i<12;i++)
   {
   PDraught[i]=new TDraught(PSquare[i]->theCenterX,
			   PSquare[i]->theCenterY,stOnField,Black);
   PDraught[i]->theKing=NKing;			
   }			
for(i=12;i<24;i++)			
   {			
   PDraught[i]=new TDraught(PSquare[i+8]->theCenterX,			
			   PSquare[i+8]->theCenterY,stOnField,White);
   PDraught[i]->theKing=NKing;			
   }			

Initiate();			
};			

//показываем все на экране
void TField::Initiate()			
{			
int i,prev_col=getcolor();			
//отобразить клетки и шашки
window(61, 5, 80, 25);
clearviewport();
gotoxy(1,1);
setcolor(WHITE);
//settextstyle(GOTHIC_FONT,HORIZ_DIR,2);
//outtextxy(470,15,"DRAUGHTS");
printf("ПРАВИЛА ИГРЫ:\n\t\t\t\t\t\t\t");
printf(" Первыми ходят Синие,\n\t\t\t\t\t\t\t");
printf("затем Зеленые\n\t\t\t\t\t\t\t");
printf("и так поочереди.\n\n\t\t\t\t\t\t\t");
printf("  КЛАВИШИ УПРАВЛЕНИЯ:\n\t\t\t\t\t\t\t");
printf("7 - вверх и влево;\n\t\t\t\t\t\t\t");
printf("9 - вверх и вправо;\n\t\t\t\t\t\t\t");
printf("1 - вниз и влево;\n\t\t\t\t\t\t\t");
printf("3 - вниз и вправо;\n\t\t\t\t\t\t\t");
printf("5 - ввод;\n\t\t\t\t\t\t\t");
printf("N - новая игра;\n\t\t\t\t\t\t\t");
printf("Q - выход.\n\n\t\t\t\t\t\t\t");
rectangle(20,20,430,430);
rectangle(440,50,620,280);
rectangle(445,55,615,275);
setcolor(prev_col);
window(1,1,80,25);
printf("           12                             12");
for (i=0;i<cSquareNum;i++) PSquare[i]->Show();
for (i=0;i<cDraughtNum;i++) PDraught[i]->Show();
PCursor->Show();
};

//реакции на внешние воздействия
int temp,temp1;
void TField::HandleEvent(TEvent *anEvent)
{		
switch (anEvent->What)		
 {		
 int s,d;		
 case EvEnter: if (theEnter==one) temp=Enter1();		
	       else if(theEnter==two) temp1=Enter2(temp);	
	       else if(theEnter==three) Enter3(temp1);	
	       PCursor->Show();	
	       anEvent->What=EvNothing;break;	
 case EvMoveUR:s=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);		
	       d=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),2);	
	       PCursor->Move(50,-50);	
	       UpDate(d,s);	
		anEvent->What=EvNothing;break;
 case EvMoveDL:s=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);		
		d=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),2);
		PCursor->Move(-50,50);
		UpDate(d,s);
		anEvent->What=EvNothing;break;
 case EvMoveUL:s=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);		
		d=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),2);
		PCursor->Move(-50,-50);
		UpDate(d,s);
		anEvent->What=EvNothing;break;
 case EvMoveDR:s=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);		
		d=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),2);
		PCursor->Move(50,50);
		UpDate(d,s);
		anEvent->What=EvNothing;break;
 case EvNew:int g=0,b=0;		
	    for(int i=0;i<cDraughtNum;i++)	
	    {if((PDraught[i]->theColor==Black)	
	       &&(PDraught[i]->theState==stOnField))b++;
	    if((PDraught[i]->theColor==White)
	       &&(PDraught[i]->theState==stOnField))g++;}
	    if(g>b){window(55,20,80,25);printf("Зеленые победили!!!");
	    window(55,22,80,25);
	    printf(" Нажмите любую клавишу...");}
	    if(g<b){window(55,20,80,25);printf("Синие победили!!!");
	    window(55,22,80,25);
	    printf(" Нажмите любую клавишу...");}
	    if(g==b){window(55,20,80,25);printf("Ничья!!!");
	    window(55,22,80,25);
	    printf(" Нажмите любую клавишу...");}
	    getch();
	    Delete();
	    TField();
	    break;
 };
};

//перерисовка того, что надо перерисовать
void TField::UpDate(int d, int s)
{
PSquare[s]->Show();
if(PDraught[d]->theState==stOnField)PDraught[d]->Show();
PCursor->Show();
};

//определяем внешнее воздействие
void TField::Start()
{
TEvent theEvent;
theEvent.What=EvNothing;
do
 {
  if (kbhit())
  {char ch=getch(); strupr(&ch);
      switch (ch)
      {
       case 'N': theEvent.What=EvNew;break;
       case 'Q': theEvent.What=EvQuit;break;
       case '9': theEvent.What=EvMoveUR;break;
       case '7': theEvent.What=EvMoveUL;break;
       case '3': theEvent.What=EvMoveDR;break;
       case '1': theEvent.What=EvMoveDL;break;
       case '5': theEvent.What=EvEnter;break;
      };
   }
HandleEvent(&theEvent);
 } while (theEvent.What !=EvQuit);
};

//найти номер по координатам
int TField::Find(int X,int Y, int P)	
{	
int i,m;	
//если Р=1, то ищем номер клетки
if(P==1)	
for (i=0;i<cSquareNum;i++)	
  {if ((X==PSquare[i]->theCenterX)&&(Y==PSquare[i]->theCenterY))	
    {m=i;break;}	
  }	
//если Р=2, то ищем номер шашки
if(P==2)	
{for (i=0;i<cDraughtNum;i++)	
{if ((X==PDraught[i]->theCenterX)&&(Y==PDraught[i]->theCenterY)	
	&&(PDraught[i]->theState==stOnField))
  {m=i;break;}	
}	
}
return m;
};

//"съедение"
void TField::Eat(int i1,int i2, int i3)
{
int m;
//номер клетки, на которой стоит съедающая шашка
int t=Find(PDraught[i1]->theCenterX,PDraught[i1]->theCenterY,1);
PSquare[t]->theSqState=Empty;
PSquare[t]->Show();
//координаты съедающей шашки
PDraught[i1]->theCenterX=PSquare[i2]->theCenterX;
PDraught[i1]->theCenterY=PSquare[i2]->theCenterY;
PDraught[i1]->Show();
//клетка, на которую идет съедающая шашка
if(PDraught[i1]->theColor==Black)PSquare[i2]->theSqState=First;
if(PDraught[i1]->theColor==White)PSquare[i2]->theSqState=Second;
//номер съедаемой шашки
m=Find(PSquare[i3]->theCenterX,PSquare[i3]->theCenterY,2);
PDraught[m]->theState=stOutField;	
PSquare[i3]->Show();	
PSquare[i3]->theSqState=Empty;	
//проверка на конец игры
int b=0,g=0;	
for(int i=0;i<cDraughtNum;i++)	
{if((PDraught[i]->theColor==Black)	
    &&(PDraught[i]->theState==stOnField))b++;	
if((PDraught[i]->theColor==White)	
    &&(PDraught[i]->theState==stOnField))g++;}	
if(g==0){window(55,20,80,25);printf("Конец игры!!!");	
	 window(55,22,80,25);
	 printf("Выиграли синие!!!");window(1,1,80,25);}
if(b==0){window(55,20,80,25);printf("Конец игры!!!");	
	window(55,22,80,25);
	printf("Выиграли зеленые!!!");window(1,1,80,25);}
//выводим текущее количество шашек противников
gotoxy(1,1);	
cout<<"           "<<b<<"                             "<<g<<"   ";
};	

//реакция на первый выбор
int TField::Enter1()	
{	
int l=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);
//получили номер нажатой клетки	
if (((PSquare[l]->theSqState==First)&&(thePlayer==PBlack))	
	||((PSquare[l]->theSqState==Second)&&(thePlayer==PWhite)))
  {	
  theEnter=two;	
  }	
else if (((PSquare[l]->theSqState==First)&&(thePlayer!=PBlack))	
	||((PSquare[l]->theSqState==Second)&&(thePlayer!=PWhite)))
    {window(57,20,80,25);printf("Ход другого игрока!");	
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();	
     window(57,20,80,25);printf("                     ");	
     window(57,22,80,25);printf("                        ");window(1,1,80,25);}
else{window(57,20,80,25);printf("Выберите шашку!");
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();
     window(57,20,80,25);printf("                     ");
     window(57,22,80,25);printf("                        ");window(1,1,80,25);}
return l;
};

//реакция на второй выбор
int TField::Enter2(int t)
{
int m,i;
int l=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);
if (l==t)
{
m=Find(PSquare[l]->theCenterX,PSquare[l]->theCenterY,2);
theEnter=three;
}
else {theEnter=one;}
return m;
};

//реакция на третий выбор (выбор клетки перехода)
void TField::Enter3(int t1)
{
//номер клетки, на которую переходим
int l=Find(PCursor->GetCenterX(),PCursor->GetCenterY(),1);
//она должна быть пустой
if(PSquare[l]->theSqState==Empty)
 {
//если переходящая шашка дамка
 if(PDraught[t1]->theKing==King)
  {
//номер клетки, на которой стоит дамка
   int t=Find(PDraught[t1]->theCenterX,PDraught[t1]->theCenterY,1);
//просматриваем все клетки между шашкой и клеткой,	
//на которую она переходит	
   int N=abs(PSquare[t]->theCenterX-PSquare[l]->theCenterX)/2/cSquareLength;	
   int DeltaX=(PSquare[l]->theCenterX-PSquare[t]->theCenterX)/N;	
   int DeltaY=(PSquare[l]->theCenterY-PSquare[t]->theCenterY)/N;	
   int sum=0,num;	
   for(int i=1;i<N;i++)	
    {	
   int sq=Find(PSquare[t]->theCenterX+DeltaX*i,	
	PSquare[t]->theCenterY+DeltaY*i,1);
     if(PSquare[sq]->theSqState!=Empty){sum++;num=sq;}	
    }	
//проверяется количество шашек на пути дамки  
if(sum>1){window(57,20,80,25);printf("Недопустимый ход!");	
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();	
     window(57,20,80,25);printf("                     ");	
     window(57,22,80,25);printf("                                ");
window(1,1,80,25);}	
  if(sum==1)	
  {if((PDraught[t1]->theColor==Black)&&(PSquare[num]->theSqState==Second))	
	  Eat(t1,l,num);
  if((PDraught[t1]->theColor==White)&&(PSquare[num]->theSqState==First))	
	  Eat(t1,l,num);
  if(thePlayer==PBlack)thePlayer=PWhite;	
  else thePlayer=PBlack;}	
  if(sum==0)	
  {PSquare[t]->theSqState=Empty;	
  PDraught[t1]->theCenterX=PSquare[l]->theCenterX;	
  PDraught[t1]->theCenterY=PSquare[l]->theCenterY;	
  PSquare[t]->Show();	
  if(PDraught[t1]->theColor==Black)PSquare[l]->theSqState=First;	
  if(PDraught[t1]->theColor==White)PSquare[l]->theSqState=Second;	
  if(thePlayer==PBlack)thePlayer=PWhite;	
  else thePlayer=PBlack;}	
  }	
//шашка – не дамка
 else if(PDraught[t1]->theKing==NKing)	
  {	
//просто шаг  
if(((PDraught[t1]->theColor==Black)	
   &&(PSquare[l]->theCenterX-PDraught[t1]->theCenterX==	
	abs(PSquare[l]->theCenterY-PDraught[t1]->theCenterY))
   &&(PSquare[l]->theCenterX-PDraught[t1]->theCenterX==2*cSquareLength))	
  ||((PDraught[t1]->theColor==White)	
    &&(-PSquare[l]->theCenterX+PDraught[t1]->theCenterX==	
	abs(PSquare[l]->theCenterY-PDraught[t1]->theCenterY))
    &&(abs(-PSquare[l]->theCenterX+PDraught[t1]->theCenterX)==2*cSquareLength)))	
	{
//номер клетки, на которую идем	 
int t=Find(PDraught[t1]->theCenterX,PDraught[t1]->theCenterY,1);
	 PSquare[t]->theSqState=Empty;
	 PDraught[t1]->theCenterX=PSquare[l]->theCenterX;
	 PDraught[t1]->theCenterY=PSquare[l]->theCenterY;	
	 PSquare[t]->Show();	
	 if(PDraught[t1]->theColor==Black)PSquare[l]->theSqState=First;	
	 if(PDraught[t1]->theColor==White)PSquare[l]->theSqState=Second;	
//меняем игрока
	 if(thePlayer==PBlack)thePlayer=PWhite;	
	 else thePlayer=PBlack;	
	}	
//съедение  
else if((abs(PSquare[l]->theCenterX-PDraught[t1]->theCenterX)==			abs(PSquare[l]->theCenterY-PDraught[t1]->theCenterY))	
   &&(abs(PSquare[l]->theCenterX-PDraught[t1]->theCenterX)==4*cSquareLength))		
	{	
//номер клетки, на которую идем	
int w=Find((PSquare[l]->theCenterX+PDraught[t1]->theCenterX)/2,			    (PSquare[l]->theCenterY+PDraught[t1]->theCenterY)/2,1);
	if(PSquare[w]->theSqState!=Empty)	
	 {	
  if((PDraught[t1]->theColor==Black)&&(PSquare[w]->theSqState==Second))		
	  Eat(t1,l,w);
  if((PDraught[t1]->theColor==White)&&(PSquare[w]->theSqState==First))	
	  Eat(t1,l,w);
	if(thePlayer==PBlack)thePlayer=PWhite;
	else thePlayer=PBlack;
	 }
//едим шашку своего цвета	
else{window(57,20,80,25);printf("Недопустимый ход!");
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();	
     window(57,20,80,25);printf("                     ");	
     window(57,22,80,25);printf("                        ");
window(1,1,80,25);}	
	}
//ни съедение, ни шаг   
else{window(57,20,80,25);printf("Недопустимый ход!");	
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();	
     window(57,20,80,25);printf("                     ");	
     window(57,22,80,25);printf("                        ");window(1,1,80,25);}	
//не дошла ли шашка до противоположной стороны
   if((PDraught[t1]->theColor==Black)&&((l==31)||(l==30)||(l==29)	
						||(l==28)))
	 PDraught[t1]->theKing=King;					
   if((PDraught[t1]->theColor==White)&&((l==0)||(l==1)||(l==2)	
						||(l==3)))
	 PDraught[t1]->theKing=King;					
  }						
 theEnter=one;						
 PDraught[t1]->Show();						
 }						
//клетка оказалась непустой
else{window(57,20,80,25);printf("Эта клетка непустая!");		
     window(57,22,80,25);printf("Нажмите любую клавишу...");getch();
     window(57,20,80,25);printf("                     ");		
     window(57,22,80,25);printf("                        ");
window(1,1,80,25);						
     theEnter=one;}						
};						

//удаление указателей для New и выхода
void TField::Delete()
{
int i;
for (i=0;i<32;i++)
{ delete PSquare[i];}
for (i=0;i<24;i++)
{ delete PDraught[i];}
delete PCursor;
};

TField::~TField()
{
Delete();
};

//реализация класса моделируемая реальность
TReality::TReality()	
{	
//установить графический режим для дисплея	
int gdriver = DETECT, gmode, errorcode;	
initgraph(&gdriver, &gmode, "c:\\Borlandc\\bgi");	
errorcode = graphresult();	
if (errorcode != grOk)	
	{cerr<<"Graphics error"; exit(1);}
setcolor(BLACK);	
//создать экземпляр биллиардного стола	
PTheField=new TField;	
};	

void TReality::Run()	
{	
PTheField->Start();	
};

TReality::~TReality()
{
delete PTheField;
closegraph();
};
Соседние файлы в папке kurs