#include <graphics.h>
#include <iostream>
#include <fstream>
#include <cstdio>
#include <process.h>
#include <windows.h>
#define WITH_SYCRONIZATION
using namespace std;
int i,j,n,m,a[50][50],pozx,pozy,PM[6][30][30],CH[30][30],FO[30][30],dir,dl[6]={0,-1,0,1,0},dc[6]={0,0,1,0,-1},viz[50][50],cate,d,x,y,k;
int victory,timer,S;
int fx[6]={0,10,10,11,11},fy[6]={0,13,14,13,14},b[50][50],c[50][50];
int GH[5][30][30],GHS[3][30][30];
int turn[5]={0,-6,-1,-16,-11},turn2[5]={0,-6,-1,-16,-11},fx2[6]={0,10,10,11,11},fy2[6]={0,13,14,13,14};
int SPM[6][30][30];
void citire(void* number){
int t;
while(!kbhit()){
if(S==1) ;
else break;
}
if(S==1){
t=getch();
if(t==72){
dir=1;
_endthread();
}
if(t==77){
dir=2;
_endthread();
}
if(t==80){
dir=3;
_endthread();
}
if(t==75){
dir=4;
_endthread();
}
}
_endthread();
}
void makewindow(){
int v=0,ok,input,ii,jj,timer=0;
char asd[100];
initwindow(m*30,n*30," PAC-MAN");
/* Liniile care delimiteaza patratelele
for(i=0;i<=m;i++)
for(j=0;j<=n;j++){
moveto(i*30,j*30);
lineto((i+1)*30,j*30);
moveto(i*30,j*30);
lineto(i*30,(j+1)*30);
moveto(i*30,j*30+30);
lineto(i*30+30,j*30+30);
moveto(i*30+30,j*30);
lineto(i*30+30,j*30+30);
}*/
//harta
for(i=0;i<n;i++)
for(j=0;j<m;j++){
if(a[i][j]==1){ //puts food
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(j*30+jj,i*30+ii,FO[ii][jj]);
}
else if (a[i][j]==0){ //puts Walls
setfillstyle((v+1)%2,4);
bar(j*30+1,i*30+1,(j+1)*30-1,(i+1)*30-1);
}
else if(a[i][j]==2 || a[i][j]>=4){ //puts Ghost Spawn
setfillstyle(9,1);
bar(j*30+1,i*30+1,(j+1)*30-1,(i+1)*30-1);
}
else if(a[i][j]==3){ //puts Cherry
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(j*30+jj,i*30+ii,CH[ii][jj]);
}
}
//pac-man
cate--;
pozx=22;
pozy=14;
viz[22][14]=1;
setfillstyle(v%2,4);
bar(pozy*30+1,pozx*30+1,(pozy+1)*30-1,(pozx+1)*30-1);
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,PM[2][i][j]);
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
if(GH[1][i][j]!=0)
putpixel(j+30*fy[1],i+30*fx[1],GH[1][i][j]);
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
if(GH[2][i][j]!=0)
putpixel(j+30*fy[2],i+30*fx[2],GH[2][i][j]);
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
if(GH[3][i][j]!=0)
putpixel(j+30*fy[3],i+30*fx[3],GH[3][i][j]);
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
if(GH[4][i][j]!=0)
putpixel(j+30*fy[4],i+30*fx[4],GH[4][i][j]);
dir=0;
getch();//press a key to start
while(!victory){
turn[1]++;
turn[2]++;
turn[3]++;
turn[4]++;
S=1;
_beginthread(citire,0,0);
Sleep(250);
S=0;
Sleep(5);
if(dir==1 || dir==2 || dir==3 || dir==4){
if(timer<=14 && timer>0){ //possible walk over ghost
for(i=1;i<=4;i++)
if(fx[i]==pozx+dl[dir] && fy[i]==pozy+dc[dir]){
fx[i]=fx2[i];
fy[i]=fy2[i];
turn[i]=turn2[i];
setfillstyle(v%2,4);
bar((pozy+dc[dir])*30+1,(pozx+dl[dir])*30+1,(pozy+dc[dir]+1)*30-1,(pozx+dl[dir]+1)*30-1);
}
}
if(a[pozx+dl[dir]][pozy+dc[dir]]==1){ //walk over food/wasfood
for(i=1;i<=4;i++)
if(pozx+dl[dir]==fx[i] && pozy+dc[dir]==fy[i] && timer==0)
victory=-1;
if(victory==0){
setfillstyle(v%2,4);
bar(pozy*30+1,pozx*30+1,(pozy+1)*30-1,(pozx+1)*30-1);
pozx+=dl[dir];
pozy+=dc[dir];
if(viz[pozx][pozy]==0){
setfillstyle(v%2,4);
bar(pozy*30+1,pozx*30+1,(pozy+1)*30-1,(pozx+1)*30-1);
viz[pozx][pozy]=1;
cate--;
}
if(timer<=14 && timer>0)
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,SPM[dir][i][j]);
else
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,PM[dir][i][j]);
}
}
else if(a[pozx+dl[dir]][pozy+dc[dir]]==3){ //walk over cherry/wascherry
for(i=1;i<=4;i++)
if(pozx+dl[dir]==fx[i] && pozy+dc[dir]==fy[i] && timer==0)
victory=-1;
if(victory==0){
if(viz[pozx+dl[dir]][pozy+dc[dir]]==0)
timer=15;
setfillstyle(v%2,4);
bar(pozy*30+1,pozx*30+1,(pozy+1)*30-1,(pozx+1)*30-1);
pozx+=dl[dir];
pozy+=dc[dir];
if(viz[pozx][pozy]==0){
setfillstyle(v%2,4);
bar(pozy*30+1,pozx*30+1,(pozy+1)*30-1,(pozx+1)*30-1);
viz[pozx][pozy]=1;
cate-=3;
}
if(timer<=14 && timer>0)
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,SPM[dir][i][j]);
else
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,PM[dir][i][j]);
}
}
else if(a[pozx+dl[dir]][pozy+dc[dir]]==0){
for(i=1;i<=4;i++)
if(pozx+dl[dir]==fx[i] && pozy+dc[dir]==fy[i] && timer==0)
victory=-1;
if(victory==0){
setfillstyle(v%2,1);
bar(pozy*30+1,pozx*30+1,pozy*30+29,pozx*30+29);
if(timer>0 && timer<=14)
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,SPM[dir][i][j]);
else
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
putpixel(j+30*pozy,i+30*pozx,PM[dir][i][j]);
}
}
else{
for(i=1;i<=4;i++)
if(pozx+dl[dir]==fx[i] && pozy+dc[dir]==fy[i])
victory=-1;
}
}
else if(dir>4)
;
else if(dir==0) ;
if(cate==0) //all food gone
victory=1;
//GhostMove
for(i=0;i<n;i++)
for(j=0;j<m;j++)
c[i][j]=n*m;
x=pozx;
y=pozy;
c[x][y]=0;
ok=0;
while(ok==0){
ok=1;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
for(d=1;d<=4;d++)
if(a[i+dl[d]][j+dc[d]]!=0 && c[i+dl[d]][j+dc[d]]>c[i][j]+1){
c[i+dl[d]][j+dc[d]]=c[i][j]+1;
ok=0;
}
}
if(timer==0){
for(i=1;i<=4;i++)
if(turn[i]%2==0 && turn[i]>0)
for(d=1;d<=4;d++){
if(c[fx[i]+dl[d]][fy[i]+dc[d]]==0){
victory=-1;
break;
}
else if(c[fx[i]+dl[d]][fy[i]+dc[d]]==c[fx[i]][fy[i]]-1 && b[fx[i]+dl[d]][fy[i]+dc[d]]==1){
b[fx[i]][fy[i]]=1;
b[fx[i]+dl[d]][fy[i]+dc[d]]=2;
setfillstyle(1,0);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fx[i]+1)*30-1);
if(a[fx[i]][fy[i]]==2 || a[fx[i]][fy[i]]>3){
setfillstyle(9,1);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fx[i]+1)*30-1);
}
else if(a[fx[i]][fy[i]]==3 && viz[fx[i]][fy[i]]==0){
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(fy[i]*30+jj,fx[i]*30+ii,CH[ii][jj]);
}
else if(a[fx[i]][fy[i]]==1 && viz[fx[i]][fy[i]]==0){
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(fy[i]*30+jj,fx[i]*30+ii,FO[ii][jj]);
}
else if(viz[fx[i]][fy[j]]==1){
setfillstyle(v%2,4);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fy[i]+1)*30-1);
}
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
if(GH[i][ii][jj]!=0)
putpixel((fy[i]+dc[d])*30+jj,(fx[i]+dl[d])*30+ii,GH[i][ii][jj]);
fx[i]+=dl[d];
fy[i]+=dc[d];
Sleep(10);
break;
}
}
}
else{
timer--;
for(i=1;i<=4;i++)
if(turn[i]%2==0 && turn[i]>0)
for(d=1;d<=4;d++){
if(c[fx[i]+dl[d]][fy[i]+dc[d]]==c[fx[i]][fy[i]]+1 && b[fx[i]+dl[d]][fy[i]+dc[d]]==1){
b[fx[i]][fy[i]]=1;
b[fx[i]+dl[d]][fy[i]+dc[d]]=2;
setfillstyle(1,0);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fx[i]+1)*30-1);
if(a[fx[i]][fy[i]]==2 || a[fx[i]][fy[i]]>3){
setfillstyle(9,1);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fx[i]+1)*30-1);
}
else if(a[fx[i]][fy[i]]==3 && viz[fx[i]][fy[i]]==0){
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(fy[i]*30+jj,fx[i]*30+ii,CH[ii][jj]);
}
else if(a[fx[i]][fy[i]]==1 && viz[fx[i]][fy[i]]==0){
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
putpixel(fy[i]*30+jj,fx[i]*30+ii,FO[ii][jj]);
}
else if(viz[fx[i]][fy[j]]==1){
setfillstyle(v%2,4);
bar(fy[i]*30+1,fx[i]*30+1,(fy[i]+1)*30-1,(fy[i]+1)*30-1);
}
for(ii=1;ii<=28;ii++)
for(jj=1;jj<=28;jj++)
if(GHS[i%2][ii][jj]!=0)
putpixel((fy[i]+dc[d])*30+jj,(fx[i]+dl[d])*30+ii,GHS[i%2][ii][jj]);
fx[i]+=dl[d];
fy[i]+=dc[d];
Sleep(10);
break;
}
}
}
if(!victory){
S=1;
_beginthread(citire,0,0);
Sleep(250);
S=0;
Sleep(5);
}
}
Sleep(5000);
closegraph();
if(victory==1){
initwindow(500,50);
ifstream flc("winner.txt");
for(dir=1;dir<=11;dir++)
for(i=1;i<=9;i++)
for(j=1;j<=9;j++){
flc>>k;
setfillstyle(1,k);
bar((j-1)*5+45*(dir-1),(i-1)*5,j*5+45*(dir-1),i*5);
}
flc.close();
getch();
closegraph();
}
else{
initwindow(500,50);
ifstream los("looser.txt");
for(dir=1;dir<=11;dir++)
for(i=1;i<=9;i++)
for(j=1;j<=9;j++){
los>>k;
setfillstyle(1,k);
bar((j-1)*5+45*(dir-1),(i-1)*5,j*5+45*(dir-1),i*5);
}
los.close();
getch();
closegraph();
}
// system("PAUSE");
}
int main(){
ifstream fin("matrix.txt");
fin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
fin>>a[i][j];
cate+=a[i][j];
if(a[i][j])
b[i][j]=1;
if(a[i][j]>3)
b[i][j]=2;
}
cate-=34;
int nr;
ifstream PMin("pacman.txt");
for(i=1;i<=14;i++)
for(j=1;j<=14;j++){
PMin>>nr;
PM[2][2*i-1][2*j-1]=PM[2][2*i-1][2*j]=PM[2][2*i][2*j-1]=PM[2][2*i][2*j]=nr;
}
PMin.close();
ifstream GH1in("ghost1.txt"); //pink ghost
for(i=1;i<=14;i++)
for(j=1;j<=14;j++){
GH1in>>nr;
GH[1][2*i-1][2*j-1]=GH[1][2*i-1][2*j]=GH[1][2*i][2*j-1]=GH[1][2*i][2*j]=nr;
}
GH1in.close();
ifstream GH2in("ghost2.txt"); //teal ghost
for(i=1;i<=14;i++)
for(j=1;j<=14;j++){
GH2in>>nr;
GH[2][2*i-1][2*j-1]=GH[2][2*i-1][2*j]=GH[2][2*i][2*j-1]=GH[2][2*i][2*j]=nr;
}
GH2in.close();
ifstream CHin("cherry.txt");
for(i=1;i<=14;i++)
for(j=1;j<=14;j++){
CHin>>nr;
CH[2*i-1][2*j-1]=CH[2*i-1][2*j]=CH[2*i][2*j-1]=CH[2*i][2*j]=nr;
}
CHin.close();
ifstream FOin("food.txt");
for(i=1;i<=14;i++)
for(j=1;j<=14;j++){
FOin>>nr;
FO[2*i-1][2*j-1]=FO[2*i-1][2*j]=FO[2*i][2*j-1]=FO[2*i][2*j]=nr;
}
FOin.close();
for(i=1;i<=28;i++)// purple ghost
for(j=1;j<=28;j++){
GH[3][i][j]=GH[1][i][j];
GHS[1][i][j]=GH[1][i][j];
if(GHS[1][i][j]==12)
GHS[1][i][j]=8;
if(GH[3][i][j]==12)
GH[3][i][j]=5;
}
for(i=1;i<=28;i++)
for(j=1;j<=28;j++){
GH[4][i][j]=GH[2][i][j];
GHS[0][i][j]=GH[2][i][j];
if(GHS[0][i][j]==3)
GHS[0][i][j]=8;
if(GH[4][i][j]==3)
GH[4][i][j]=10;
}
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
PM[4][i][j]=PM[2][i][28-j+1];
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
PM[3][i][j]=PM[2][n-j+4][i];
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
PM[1][i][j]=PM[3][28-i+1][j];
for(k<=1;k<=4;k++)
for(i=1;i<=28;i++)
for(j=1;j<=28;j++)
if(PM[k][i][j])
SPM[k][i][j]=1;
victory=0;
makewindow();
return 0;
}