Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * "Klątwa Boulder Dasha"
- * Zadanie zaliczeniowe nr 1 z przedmiotu:
- * Wstęp do programowania potok imperatywny
- * Semestr zimowy roku akademickiego 2015/2016
- * autor: Paweł Szczygieł <ps371816@students.mimuw.edu.pl>
- */
- #include<stdio.h>
- int Diamenty(char plansza[100][200],int kolumny,int wiersze); /*funkcja licząca początkową ilość diamentów na planszy*/
- void WczytaniePlanszy (char plansza [100][200],int *kolumny,int *wiersze){
- int i=1,k=0,w=0,j,tmp; /* k-liczba kolumn-1, w-liczba wierszy-1 i-zmienna pomocnicza używana przy odczytywaniu pól planszy */
- while(i){ /*pobiera pierwszy wiersz i zlicza liczbę kolumn */
- tmp=getchar();
- if(tmp=='#'){
- plansza[k][0]=tmp;
- k++;
- }
- else /*i=0 gdy skończył się pierwszy wiersz(powoduje to zakończenie działania pętli)*/
- i=0;
- }
- i=1;
- while(i){ /*pobiera kolejne wiersze dopóki pierwszy znak w wierszu to #*/
- tmp=getchar();
- if(tmp=='#'){
- w++;
- plansza[0][w]=tmp;
- }
- else
- i=0; /*i=0 gdy pierwszy znak w wierszu nie jest # (powoduje to zakończenie działania pętli)*/
- if(i){
- for(j=1;j<=k;j++){
- plansza[j][w]=getchar();
- }
- }
- }
- *kolumny=k;
- *wiersze=w;
- }
- int Wyszukiwanie (char plansza [100][200], char znak1 , char znak2 ,int kolumny,int wsp[2]){ /* funkcja wyszukuje znak i do tablicy wsp[] wpisuje jego współrzędne(wyszukiwane są równolegle dwa znaki, gdyż przy stabilizacji */
- int i=wsp[1],j=wsp[0]-1,znalezienie=0; /* potrzebny jest diament lub kamień, gdy potrzebujemy wyszukać jeden znak możemy wstawić go jako oba argumenty)*/
- while((i>0)&&(znalezienie==0)){ /*kiedy znajdziemy szukaną wartość to nie wchodzimy do pętli ponownie i funkcja kończy swoje działanie*/
- while((j>0)&&(znalezienie==0)){ /*w ostatnim i pierwszym wierszu i ostatniej i pierwszej kolumnie nic nie będzie wyszukiwane bo wiadomo ,że tam są tylko # */
- if((plansza[j][i]==znak1)||(plansza[j][i]==znak2)){
- znalezienie=1;
- wsp[0]= j;
- wsp[1]= i;
- }
- j--;
- }
- j=kolumny-1;
- i--;
- }
- return znalezienie;
- }
- void Spadanie(char plansza [100][200],int kolumna,int wiersz,int wiersze){
- int i=1;
- while((plansza[kolumna][wiersz+i]==' ')&&(wiersz+i<wiersze)){
- plansza[kolumna][wiersz+i]=plansza[kolumna][wiersz+i-1];
- plansza[kolumna][wiersz+i-1]=' ';
- i++;
- }
- }
- void Stabilizacja (char plansza [100][200], int kolumny , int wiersze){
- int wsp[2];
- wsp[0]=kolumny-1;
- wsp[1]=wiersze-1;
- while(Wyszukiwanie(plansza,'O','$',kolumny,wsp)){ /*wyszukiwanie kamieni i diamentów które mogłyby spaść*/
- Spadanie(plansza,wsp[0],wsp[1],wiersze); /*jeżeli pod znalezionym kamieniem lub diamentem jest wolna przestrzeń to on spada*/
- }
- }
- void Wgore(char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
- if((plansza[pozycja[0]][pozycja[1]-1]==' ')||(plansza[pozycja[0]][pozycja[1]-1]=='.')){ /*nad Rockfordem jest puste pole lub ziemia*/
- plansza[pozycja[0]][pozycja[1]-1]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[1]--;
- }
- else{
- if(plansza[pozycja[0]][pozycja[1]-1]=='$'){ /*nad Rocfordem jest diament*/
- plansza[pozycja[0]][pozycja[1]-1]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[1]--;
- }
- else{
- if(plansza[pozycja[0]][pozycja[1]-1]=='X'){ /*nad Rockfordem jest wyjście*/
- if(!Diamenty(plansza,kolumny,wiersze)){
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]=0;
- pozycja[1]=0;
- }
- }
- }
- } /*jeśli nad Rockfordem jest skała lub kamień to nie poruszy się on*/
- }
- void Wdol(char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
- if((plansza[pozycja[0]][pozycja[1]+1]==' ')||(plansza[pozycja[0]][pozycja[1]+1]=='.')){ /*pod Rockfordem jest puste pole lub ziemia*/
- plansza[pozycja[0]][pozycja[1]+1]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[1]++;
- }
- else{
- if(plansza[pozycja[0]][pozycja[1]+1]=='$'){ /*pod Rocfordem jest diament*/
- plansza[pozycja[0]][pozycja[1]+1]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[1]++;
- }
- else{
- if(plansza[pozycja[0]][pozycja[1]+1]=='X'){ /*pod Rockfordem jest wyjście*/
- if(!Diamenty(plansza,kolumny,wiersze)){
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]=0;
- pozycja[1]=0;
- }
- }
- }
- } /*jeśli pod Rockfordem jest skała lub kamień to nie poruszy się on*/
- }
- void Wprawo (char plansza[100][200],int pozycja[2], int kolumny,int wiersze){
- if((plansza[pozycja[0]+1][pozycja[1]]==' ')||(plansza[pozycja[0]+1][pozycja[1]]=='.')){ /* po prawej od Rockforda jest puste pole lub ziemia*/
- plansza[pozycja[0]+1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]++;
- }
- else{
- if(plansza[pozycja[0]+1][pozycja[1]]=='$'){ /*po prawej od Rocforda jest diament*/
- plansza[pozycja[0]+1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]++;
- }
- else{
- if(plansza[pozycja[0]+1][pozycja[1]]=='X'){ /*po prawej od Rockforda jest wyjście*/
- if(!Diamenty(plansza,kolumny,wiersze)){
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]=0;
- pozycja[1]=0;
- }
- }
- else{ /* po prawej od Rockforda jest kamień*/
- if(plansza[pozycja[0]+1][pozycja[1]]=='O'){
- if(plansza[pozycja[0]+2][pozycja[1]]==' '){ /*po prawej od kamienia jest puste pole więc kamień zostaje przesunięty*/
- plansza[pozycja[0]+2][pozycja[1]]='O';
- plansza[pozycja[0]+1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]++;
- } /*jeśli pole po prawej od kamienia nie jest puste nic się nie dzieje,podobnie jeśli po prawej od Rockforda jest skała*/
- }
- }
- }
- }
- }
- void Wlewo(char plansza[100][200],int pozycja[2], int kolumny,int wiersze){
- if((plansza[pozycja[0]-1][pozycja[1]]==' ')||(plansza[pozycja[0]-1][pozycja[1]]=='.')){ /* po lewej od Rockforda jest puste pole lub ziemia*/
- plansza[pozycja[0]-1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]--;
- }
- else{
- if(plansza[pozycja[0]-1][pozycja[1]]=='$'){ /*po lewej od Rocforda jest diament*/
- plansza[pozycja[0]-1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]--;
- }
- else{
- if(plansza[pozycja[0]-1][pozycja[1]]=='X'){ /*po lewej od Rockforda jest wyjście*/
- if(!Diamenty(plansza,kolumny,wiersze)){
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]=0;
- pozycja[1]=0;
- }
- }
- else{ /* po lewej od Rockforda jest kamień*/
- if(plansza[pozycja[0]-1][pozycja[1]]=='O'){
- if(plansza[pozycja[0]-2][pozycja[1]]==' '){ /*po lewej od kamienia jest puste pole więc kamień zostaje przesunięty*/
- plansza[pozycja[0]-2][pozycja[1]]='O';
- plansza[pozycja[0]-1][pozycja[1]]='&';
- plansza[pozycja[0]][pozycja[1]]=' ';
- pozycja[0]--;
- } /*jeśli pole po lewej od kamienia nie jest puste nic się nie dzieje,podobnie jeśli po lewej od Rockforda jest skała*/
- }
- }
- }
- }
- }
- void Ruch (char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
- int tmp=getchar();
- while((tmp!=EOF)&&(pozycja[0]!=0)){
- if(tmp=='w')
- Wgore(plansza,pozycja,kolumny,wiersze);
- if(tmp=='s')
- Wdol(plansza,pozycja,kolumny,wiersze);
- if(tmp=='a')
- Wlewo(plansza,pozycja,kolumny,wiersze);
- if(tmp=='d')
- Wprawo(plansza,pozycja,kolumny,wiersze);
- tmp=getchar();
- Stabilizacja(plansza,kolumny,wiersze);
- }
- }
- int Diamenty(char plansza[100][200],int kolumny,int wiersze){ /*funkcja licząca początkową ilość diamentów na planszy*/
- int i,j,diamenty=0;
- for(j=kolumny-1;j>0;j--){
- for(i=wiersze-1;i>0;i--){
- if(plansza[j][i]=='$')
- diamenty++;
- }
- }
- return diamenty;
- }
- void Wypisanie(char plansza[100][200],int kolumny,int wiersze){ /*funkcja wypisująca aktualny stan planszy*/
- int i,j;
- for(i=0;i<=wiersze;i++){
- for(j=0;j<kolumny;j++)
- putchar(plansza[j][i]);
- printf("\n");
- }
- }
- int main(){
- char plansza [100][200];
- int pozycja[2]; /*w tabeli pozycja przechowywane są współrzędne Rockforda*/
- int kolumny,wiersze;
- WczytaniePlanszy (plansza,&kolumny,&wiersze);
- pozycja[0]=wiersze-1;
- pozycja[1]=kolumny-1;
- Wyszukiwanie(plansza,'&','&',kolumny,pozycja); /*znalezienie Rockforda na planszy*/
- Stabilizacja(plansza,kolumny,wiersze);
- Ruch(plansza,pozycja,kolumny,wiersze);
- Wypisanie(plansza,kolumny,wiersze); /*wypisanie stanu końcowego planszy*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement