Cod sursa(job #587675)

Utilizator bazubBazu Bogdan bazub Data 5 mai 2011 16:11:25
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 15.38 kb
#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");
    for(i=0;i<n;i++) //harta
        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]);
            }

        }
    cate--;    //pac-man
    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;
        for(i=0;i<n;i++)        //GhostMove
            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();
    }
}
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;
}