Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.72 KB | None | 0 0
  1. /*
  2. * "Klątwa Boulder Dasha"
  3. * Zadanie zaliczeniowe nr 1 z przedmiotu:
  4. * Wstęp do programowania potok imperatywny
  5. * Semestr zimowy roku akademickiego 2015/2016
  6. * autor: Paweł Szczygieł <ps371816@students.mimuw.edu.pl>
  7. */
  8.  
  9. #include<stdio.h>
  10. int Diamenty(char plansza[100][200],int kolumny,int wiersze); /*funkcja licząca początkową ilość diamentów na planszy*/
  11.  
  12. void WczytaniePlanszy (char plansza [100][200],int *kolumny,int *wiersze){
  13. 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 */
  14. while(i){ /*pobiera pierwszy wiersz i zlicza liczbę kolumn */
  15. tmp=getchar();
  16. if(tmp=='#'){
  17. plansza[k][0]=tmp;
  18. k++;
  19. }
  20. else /*i=0 gdy skończył się pierwszy wiersz(powoduje to zakończenie działania pętli)*/
  21. i=0;
  22. }
  23.  
  24. i=1;
  25. while(i){ /*pobiera kolejne wiersze dopóki pierwszy znak w wierszu to #*/
  26. tmp=getchar();
  27. if(tmp=='#'){
  28. w++;
  29. plansza[0][w]=tmp;
  30. }
  31. else
  32. i=0; /*i=0 gdy pierwszy znak w wierszu nie jest # (powoduje to zakończenie działania pętli)*/
  33. if(i){
  34. for(j=1;j<=k;j++){
  35. plansza[j][w]=getchar();
  36. }
  37. }
  38. }
  39. *kolumny=k;
  40. *wiersze=w;
  41. }
  42. 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 */
  43. 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)*/
  44. while((i>0)&&(znalezienie==0)){ /*kiedy znajdziemy szukaną wartość to nie wchodzimy do pętli ponownie i funkcja kończy swoje działanie*/
  45. 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 # */
  46. if((plansza[j][i]==znak1)||(plansza[j][i]==znak2)){
  47. znalezienie=1;
  48. wsp[0]= j;
  49. wsp[1]= i;
  50. }
  51. j--;
  52. }
  53. j=kolumny-1;
  54. i--;
  55. }
  56.  
  57. return znalezienie;
  58. }
  59. void Spadanie(char plansza [100][200],int kolumna,int wiersz,int wiersze){
  60. int i=1;
  61. while((plansza[kolumna][wiersz+i]==' ')&&(wiersz+i<wiersze)){
  62. plansza[kolumna][wiersz+i]=plansza[kolumna][wiersz+i-1];
  63. plansza[kolumna][wiersz+i-1]=' ';
  64. i++;
  65. }
  66. }
  67. void Stabilizacja (char plansza [100][200], int kolumny , int wiersze){
  68. int wsp[2];
  69. wsp[0]=kolumny-1;
  70. wsp[1]=wiersze-1;
  71. while(Wyszukiwanie(plansza,'O','$',kolumny,wsp)){ /*wyszukiwanie kamieni i diamentów które mogłyby spaść*/
  72. Spadanie(plansza,wsp[0],wsp[1],wiersze); /*jeżeli pod znalezionym kamieniem lub diamentem jest wolna przestrzeń to on spada*/
  73. }
  74.  
  75. }
  76. void Wgore(char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
  77. if((plansza[pozycja[0]][pozycja[1]-1]==' ')||(plansza[pozycja[0]][pozycja[1]-1]=='.')){ /*nad Rockfordem jest puste pole lub ziemia*/
  78. plansza[pozycja[0]][pozycja[1]-1]='&';
  79. plansza[pozycja[0]][pozycja[1]]=' ';
  80. pozycja[1]--;
  81. }
  82. else{
  83. if(plansza[pozycja[0]][pozycja[1]-1]=='$'){ /*nad Rocfordem jest diament*/
  84. plansza[pozycja[0]][pozycja[1]-1]='&';
  85. plansza[pozycja[0]][pozycja[1]]=' ';
  86. pozycja[1]--;
  87. }
  88. else{
  89. if(plansza[pozycja[0]][pozycja[1]-1]=='X'){ /*nad Rockfordem jest wyjście*/
  90. if(!Diamenty(plansza,kolumny,wiersze)){
  91. plansza[pozycja[0]][pozycja[1]]=' ';
  92. pozycja[0]=0;
  93. pozycja[1]=0;
  94.  
  95. }
  96. }
  97. }
  98. } /*jeśli nad Rockfordem jest skała lub kamień to nie poruszy się on*/
  99. }
  100.  
  101. void Wdol(char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
  102. if((plansza[pozycja[0]][pozycja[1]+1]==' ')||(plansza[pozycja[0]][pozycja[1]+1]=='.')){ /*pod Rockfordem jest puste pole lub ziemia*/
  103. plansza[pozycja[0]][pozycja[1]+1]='&';
  104. plansza[pozycja[0]][pozycja[1]]=' ';
  105. pozycja[1]++;
  106. }
  107. else{
  108. if(plansza[pozycja[0]][pozycja[1]+1]=='$'){ /*pod Rocfordem jest diament*/
  109. plansza[pozycja[0]][pozycja[1]+1]='&';
  110. plansza[pozycja[0]][pozycja[1]]=' ';
  111. pozycja[1]++;
  112. }
  113. else{
  114. if(plansza[pozycja[0]][pozycja[1]+1]=='X'){ /*pod Rockfordem jest wyjście*/
  115. if(!Diamenty(plansza,kolumny,wiersze)){
  116. plansza[pozycja[0]][pozycja[1]]=' ';
  117. pozycja[0]=0;
  118. pozycja[1]=0;
  119.  
  120. }
  121. }
  122. }
  123. } /*jeśli pod Rockfordem jest skała lub kamień to nie poruszy się on*/
  124. }
  125. void Wprawo (char plansza[100][200],int pozycja[2], int kolumny,int wiersze){
  126. if((plansza[pozycja[0]+1][pozycja[1]]==' ')||(plansza[pozycja[0]+1][pozycja[1]]=='.')){ /* po prawej od Rockforda jest puste pole lub ziemia*/
  127. plansza[pozycja[0]+1][pozycja[1]]='&';
  128. plansza[pozycja[0]][pozycja[1]]=' ';
  129. pozycja[0]++;
  130. }
  131. else{
  132. if(plansza[pozycja[0]+1][pozycja[1]]=='$'){ /*po prawej od Rocforda jest diament*/
  133. plansza[pozycja[0]+1][pozycja[1]]='&';
  134. plansza[pozycja[0]][pozycja[1]]=' ';
  135. pozycja[0]++;
  136. }
  137. else{
  138. if(plansza[pozycja[0]+1][pozycja[1]]=='X'){ /*po prawej od Rockforda jest wyjście*/
  139. if(!Diamenty(plansza,kolumny,wiersze)){
  140. plansza[pozycja[0]][pozycja[1]]=' ';
  141. pozycja[0]=0;
  142. pozycja[1]=0;
  143. }
  144.  
  145. }
  146. else{ /* po prawej od Rockforda jest kamień*/
  147. if(plansza[pozycja[0]+1][pozycja[1]]=='O'){
  148. if(plansza[pozycja[0]+2][pozycja[1]]==' '){ /*po prawej od kamienia jest puste pole więc kamień zostaje przesunięty*/
  149. plansza[pozycja[0]+2][pozycja[1]]='O';
  150. plansza[pozycja[0]+1][pozycja[1]]='&';
  151. plansza[pozycja[0]][pozycja[1]]=' ';
  152. pozycja[0]++;
  153. } /*jeśli pole po prawej od kamienia nie jest puste nic się nie dzieje,podobnie jeśli po prawej od Rockforda jest skała*/
  154. }
  155. }
  156. }
  157. }
  158. }
  159. void Wlewo(char plansza[100][200],int pozycja[2], int kolumny,int wiersze){
  160. if((plansza[pozycja[0]-1][pozycja[1]]==' ')||(plansza[pozycja[0]-1][pozycja[1]]=='.')){ /* po lewej od Rockforda jest puste pole lub ziemia*/
  161. plansza[pozycja[0]-1][pozycja[1]]='&';
  162. plansza[pozycja[0]][pozycja[1]]=' ';
  163. pozycja[0]--;
  164. }
  165. else{
  166. if(plansza[pozycja[0]-1][pozycja[1]]=='$'){ /*po lewej od Rocforda jest diament*/
  167. plansza[pozycja[0]-1][pozycja[1]]='&';
  168. plansza[pozycja[0]][pozycja[1]]=' ';
  169. pozycja[0]--;
  170. }
  171. else{
  172. if(plansza[pozycja[0]-1][pozycja[1]]=='X'){ /*po lewej od Rockforda jest wyjście*/
  173. if(!Diamenty(plansza,kolumny,wiersze)){
  174. plansza[pozycja[0]][pozycja[1]]=' ';
  175. pozycja[0]=0;
  176. pozycja[1]=0;
  177. }
  178.  
  179. }
  180. else{ /* po lewej od Rockforda jest kamień*/
  181. if(plansza[pozycja[0]-1][pozycja[1]]=='O'){
  182. if(plansza[pozycja[0]-2][pozycja[1]]==' '){ /*po lewej od kamienia jest puste pole więc kamień zostaje przesunięty*/
  183. plansza[pozycja[0]-2][pozycja[1]]='O';
  184. plansza[pozycja[0]-1][pozycja[1]]='&';
  185. plansza[pozycja[0]][pozycja[1]]=' ';
  186. pozycja[0]--;
  187. } /*jeśli pole po lewej od kamienia nie jest puste nic się nie dzieje,podobnie jeśli po lewej od Rockforda jest skała*/
  188. }
  189. }
  190. }
  191. }
  192. }
  193. void Ruch (char plansza[100][200],int pozycja[2],int kolumny,int wiersze){
  194. int tmp=getchar();
  195. while((tmp!=EOF)&&(pozycja[0]!=0)){
  196. if(tmp=='w')
  197. Wgore(plansza,pozycja,kolumny,wiersze);
  198. if(tmp=='s')
  199. Wdol(plansza,pozycja,kolumny,wiersze);
  200. if(tmp=='a')
  201. Wlewo(plansza,pozycja,kolumny,wiersze);
  202. if(tmp=='d')
  203. Wprawo(plansza,pozycja,kolumny,wiersze);
  204. tmp=getchar();
  205. Stabilizacja(plansza,kolumny,wiersze);
  206.  
  207. }
  208.  
  209. }
  210. int Diamenty(char plansza[100][200],int kolumny,int wiersze){ /*funkcja licząca początkową ilość diamentów na planszy*/
  211. int i,j,diamenty=0;
  212. for(j=kolumny-1;j>0;j--){
  213. for(i=wiersze-1;i>0;i--){
  214. if(plansza[j][i]=='$')
  215. diamenty++;
  216. }
  217. }
  218. return diamenty;
  219. }
  220. void Wypisanie(char plansza[100][200],int kolumny,int wiersze){ /*funkcja wypisująca aktualny stan planszy*/
  221. int i,j;
  222. for(i=0;i<=wiersze;i++){
  223. for(j=0;j<kolumny;j++)
  224. putchar(plansza[j][i]);
  225. printf("\n");
  226.  
  227. }
  228. }
  229. int main(){
  230. char plansza [100][200];
  231. int pozycja[2]; /*w tabeli pozycja przechowywane są współrzędne Rockforda*/
  232. int kolumny,wiersze;
  233. WczytaniePlanszy (plansza,&kolumny,&wiersze);
  234. pozycja[0]=wiersze-1;
  235. pozycja[1]=kolumny-1;
  236. Wyszukiwanie(plansza,'&','&',kolumny,pozycja); /*znalezienie Rockforda na planszy*/
  237. Stabilizacja(plansza,kolumny,wiersze);
  238. Ruch(plansza,pozycja,kolumny,wiersze);
  239. Wypisanie(plansza,kolumny,wiersze); /*wypisanie stanu końcowego planszy*/
  240. return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement