Advertisement
Guest User

Untitled

a guest
Mar 27th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.56 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <Windows.h>
  4. #include <time.h>
  5.  
  6. #define MAX_MESSAGES 10
  7. #define MAX_SYMBOLS_IN_MESSAGE 128
  8. #define MAX_SYMBOLS_IN_EXT_STRING 70
  9.  
  10. #define SIZE_OF_MAP_Y 6
  11. #define SIZE_OF_MAP_X 10
  12.  
  13. #define COUNT_OF_PLAYERS_SHIPS 10
  14. #define COUNT_OF_ENEMY_SHIPS 10
  15.  
  16. #define FREE_SYMBOL ' '
  17. #define USED_BOX_SYMBOL '#'
  18.  
  19. #define USER_SHIP_SYMBOL '*'
  20. #define ENEMY_SHIP_SYMBOL '@'
  21.  
  22. #define DESTROYED_ENEMY_SHIP_SYMBOL '!'
  23. #define DESTROYED_USER_SHIP_SYMBOL '&'
  24.  
  25. void print_table(char const table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]);
  26.  
  27. void add_message(char msg[MAX_SYMBOLS_IN_MESSAGE]);
  28. void print_message();
  29.  
  30. void user_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *es_counter, int *the_end);
  31. void enemy_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *us_counter, int *the_end);
  32.  
  33. char messages[MAX_MESSAGES][MAX_SYMBOLS_IN_MESSAGE];
  34.  
  35. int messages_counter = 0;
  36. int copy_of_counter_messages;
  37.  
  38. int include_end_of_string = 1;
  39.  
  40. int pos_of_uk = 0;
  41.  
  42. int es_counter = COUNT_OF_ENEMY_SHIPS;
  43. int us_counter = COUNT_OF_PLAYERS_SHIPS;
  44.  
  45. int main() {
  46. setlocale(LC_ALL, "Russian");
  47. SetConsoleCP(1251);
  48. SetConsoleOutputCP(1251);
  49. srand(time(NULL));
  50.  
  51. char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]; //игровое поле
  52. char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]; //позиции кораблей компьютера
  53.  
  54. int the_end = 0;
  55.  
  56. for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //очищаем игровое поле, заполняем определенным символом
  57. for (int k = 0; k < SIZE_OF_MAP_X; ++k)
  58. table[i][k] = FREE_SYMBOL;
  59. }
  60.  
  61. for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //очищаем позиции кораблей компьютера
  62. for (int k = 0; k < SIZE_OF_MAP_X; ++k)
  63. enemy_ships[i][k] = FREE_SYMBOL;
  64. }
  65.  
  66.  
  67. int t1, t2;
  68.  
  69. for (int i = 0; i < COUNT_OF_PLAYERS_SHIPS; ++i) { //задаем позиции кораблей юзера
  70. t1 = (rand() % SIZE_OF_MAP_Y);
  71. t2 = (rand() % SIZE_OF_MAP_X);
  72.  
  73. if (table[t1][t2] == FREE_SYMBOL)
  74. table[t1][t2] = USER_SHIP_SYMBOL;
  75. else
  76. --i;
  77. }
  78.  
  79. for (int i = 0; i < COUNT_OF_ENEMY_SHIPS; ++i) { //задаем позиции кораблей компьютера
  80. t1 = (rand() % SIZE_OF_MAP_Y);
  81. t2 = (rand() % SIZE_OF_MAP_X);
  82.  
  83. if (enemy_ships[t1][t2] == FREE_SYMBOL && table[t1][t2] == FREE_SYMBOL) {
  84. enemy_ships[t1][t2] = ENEMY_SHIP_SYMBOL;
  85. //table[t1][t2] = ENEMY_SHIP_SYMBOL;
  86. }
  87. else
  88. --i;
  89. }
  90.  
  91. for (int i = 0; i < MAX_MESSAGES; ++i) { //очищаем массив сообщений
  92. for (int k = 0; k < MAX_SYMBOLS_IN_MESSAGE; ++k) {
  93. messages[i][k] = ' ';
  94. }
  95. }
  96.  
  97. print_table(table); //первоначально отрисовываем поле
  98.  
  99. //HANDLE hStdHnd = GetStdHandle(STD_OUTPUT_HANDLE);
  100. //CONSOLE_SCREEN_BUFFER_INFO buff;
  101. //GetConsoleScreenBufferInfo(hStdHnd,&buff);
  102. //printf("x: %d y: %d\n",buff.srWindow.Right,buff.srWindow.Bottom);
  103.  
  104. //printf("%s\n", "lol"+"lol");
  105.  
  106.  
  107. while (!the_end) { //главный игровой цикл
  108. user_step(table, enemy_ships, &es_counter, &the_end);
  109.  
  110. if(!the_end)
  111. enemy_step(table, enemy_ships, &us_counter, &the_end);
  112. }
  113.  
  114. printf("Игра закончена!\n");
  115.  
  116. //запилить авто расчет ширины доп строки!
  117.  
  118. system("pause");
  119. return 0;
  120. }
  121.  
  122. void print_message() {
  123. //for (int i = (messages_counter - 1); i >= 0; --i)
  124. //printf("%s\n", messages[i]);
  125. int kostyl;
  126.  
  127. putchar(' ');
  128. putchar(' ');
  129. putchar(' ');
  130.  
  131.  
  132. if ((copy_of_counter_messages - 1) >= 0) {
  133. if (strlen(messages[copy_of_counter_messages - 1]) < (MAX_SYMBOLS_IN_EXT_STRING)) {
  134. printf("%s", messages[copy_of_counter_messages - 1], (copy_of_counter_messages - 1));
  135. --copy_of_counter_messages;
  136. }
  137. else {
  138. kostyl = pos_of_uk + (MAX_SYMBOLS_IN_EXT_STRING - 1);
  139.  
  140. for (int i = pos_of_uk; i <= kostyl && i <= strlen(messages[copy_of_counter_messages - 1]); ++i) {
  141. pos_of_uk = i;
  142. putchar(messages[copy_of_counter_messages - 1][pos_of_uk]);
  143.  
  144. if (messages[copy_of_counter_messages - 1][pos_of_uk] == '\0' || messages[copy_of_counter_messages - 1][pos_of_uk + 1] == '\0') {
  145. pos_of_uk = 0;
  146. --copy_of_counter_messages;
  147. //printf("> (POK)");
  148. break;
  149. }
  150. }
  151. if (pos_of_uk != 0)
  152. ++pos_of_uk;
  153.  
  154. if (messages[copy_of_counter_messages - 1][pos_of_uk] == ' ')
  155. ++pos_of_uk;
  156. }
  157. }
  158. }
  159.  
  160. void static add_message(char msg[MAX_SYMBOLS_IN_MESSAGE]) {
  161. if (messages_counter < MAX_MESSAGES) {
  162. for (int i = 0; i <= strlen(msg); ++i) {//записываем новое сообщение
  163. messages[messages_counter][i] = msg[i];
  164. }
  165.  
  166. ++messages_counter;
  167. }
  168. else {
  169. for (int i = 0; i < (MAX_MESSAGES - 1); ++i) { //переносим значения на единицу раньше
  170. for (int k = 0; k <= strlen(messages[i + 1]); ++k)
  171. messages[i][k] = messages[i + 1][k];
  172. }
  173.  
  174. for (int k = 0; k < MAX_SYMBOLS_IN_MESSAGE; ++k) //очищаем последний (самый новый элемент)
  175. messages[MAX_MESSAGES - 1][k] = ' ';
  176.  
  177. for (int i = 0; i <= strlen(msg); ++i) { //записываем новое сообщение
  178. messages[messages_counter - 1][i] = msg[i];
  179. }
  180. }
  181. }
  182.  
  183. void user_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *enemy_ships_counter, int *the_end) {
  184. char y, x; //временные координаты
  185. int end = 0; //координаты введены, действия выполнены, все отлично
  186.  
  187. while (!end) { //пока не будет корректный выбор квадрата для атаки
  188. printf("\n\nВведите координаты буквами в формате (xy) -> ");
  189. scanf_s("%c%c", &x, 1, &y, 1);
  190. fseek(stdin, 0, SEEK_SET);
  191.  
  192.  
  193. if ((x >= 'a' && x <= 'z') && (y >= 'a' && y <= 'z')) { //проверяем вводимые символы на то, что они - символы
  194. y -= 'a'; //переводим буквенные координаты в цифры
  195. x -= 'a';
  196.  
  197. if ((x >= 0 && x < SIZE_OF_MAP_X) && (y >= 0 && y < SIZE_OF_MAP_Y)) { //проверяем допустимость вводимых координат, что они не вне поля
  198. if (table[y][x] != USED_BOX_SYMBOL && table[y][x] != USER_SHIP_SYMBOL && table[y][x] != DESTROYED_ENEMY_SHIP_SYMBOL && table[y][x] != DESTROYED_USER_SHIP_SYMBOL) { //проверяем корректность выбранного для атаки квадрата
  199. end = 1;
  200.  
  201. if (enemy_ships[y][x] == ENEMY_SHIP_SYMBOL) { //если попадаем во вражеский корабль
  202. *enemy_ships_counter -= 1;
  203. enemy_ships[y][x] = FREE_SYMBOL;
  204. table[y][x] = DESTROYED_ENEMY_SHIP_SYMBOL;
  205.  
  206. add_message("Вы подбили корабль компьютера!");
  207.  
  208. if (*enemy_ships_counter == 0) {
  209. //printf("Вы победили!\n");
  210. add_message("Вы победили!");
  211. *the_end = 1;
  212. }
  213.  
  214. print_table(table);
  215. }
  216. else { //если мимо вражеского корабля
  217. table[y][x] = USED_BOX_SYMBOL;
  218. //printf("Мимо!\n");
  219. add_message("Мимо!");
  220. print_table(table);
  221. }
  222. }
  223. else {
  224. switch(table[y][x]) { //обрабатываем битье по некорректным квадратам
  225. case USED_BOX_SYMBOL :
  226. add_message("Ошибка! В этот квадрат уже били, там нет ничего интересного!");
  227. break;
  228. case USER_SHIP_SYMBOL :
  229. add_message("Ошибка! Бить по своим кораблям неэтично!");
  230. break;
  231. case DESTROYED_ENEMY_SHIP_SYMBOL :
  232. add_message("Ошибка! Оно уже сдохло!");
  233. break;
  234. case DESTROYED_USER_SHIP_SYMBOL :
  235. add_message("Ошибка! Этим лучше своему подбитому кораблю Вы не сделаете!");
  236. break;
  237. default :
  238. break;
  239. }
  240. print_table(table);
  241. }
  242. }
  243. else {
  244. add_message("Ошибка! Введенные Вами координаты выходят за пределы поля!");
  245. print_table(table);
  246. }
  247. }
  248. else {
  249. add_message("Ошибка! Введенные Вами координаты не являются символами разметки!");
  250. print_table(table);
  251. }
  252. }
  253. }
  254.  
  255. void enemy_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *user_ships_counter, int *the_end) {
  256. int y, x; //временные координаты
  257. int end = 0; //координаты введены, действия выполнены, все отлично
  258.  
  259. while (!end) { //пока не будет корректный выбор квадрата для атаки
  260. y = (rand() % SIZE_OF_MAP_Y); //генерируем наугад квадрат для атаки
  261. x = (rand() % SIZE_OF_MAP_X);
  262.  
  263. if (enemy_ships[y][x] == FREE_SYMBOL && table[y][x] != USED_BOX_SYMBOL && table[y][x] != DESTROYED_USER_SHIP_SYMBOL && table[y][x] != DESTROYED_ENEMY_SHIP_SYMBOL) { //проверяем допустимость атаки по квадрату
  264. end = 1;
  265.  
  266. //print_table(table);
  267.  
  268. if (table[y][x] == USER_SHIP_SYMBOL) { //если попадаем в корабль игрока
  269. *user_ships_counter -= 1;
  270. table[y][x] = DESTROYED_USER_SHIP_SYMBOL;
  271.  
  272. add_message("Компьютер подбил ваш корабль!");
  273.  
  274. if (*user_ships_counter == 0) {
  275. //printf("Компьютер победил!\n");
  276. add_message("Компьютер победил!");
  277. *the_end = 1;
  278. }
  279.  
  280. print_table(table);
  281. }
  282. else {
  283. table[y][x] = USED_BOX_SYMBOL;
  284. //printf("Компьютер бьет мимо Ваших кораблей!\n");
  285. add_message("Компьютер бьет мимо Ваших кораблей!");
  286. print_table(table);
  287. }
  288. }
  289. }
  290. }
  291.  
  292. void print_table(char const table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]) { //печатает игровое поле
  293. copy_of_counter_messages = messages_counter;
  294. pos_of_uk = 0; //костыль
  295.  
  296. system("cls");
  297.  
  298. printf("У Вас - %d кораблей, у Вашего противника - %d\n\n", us_counter, es_counter);
  299.  
  300. putchar(' ');
  301. putchar(' ');
  302.  
  303. for (int i = 0; i < SIZE_OF_MAP_X; ++i) //выводим горизонтальный ряд разметки с обозначениями
  304. printf("%2c", i + 'a');
  305. putchar('\n');
  306.  
  307.  
  308. for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //выводим все-все-все по строкам
  309. putchar(' ');
  310. putchar(' ');
  311.  
  312.  
  313. for (int k = 0; k < SIZE_OF_MAP_X * 2 + 1; ++k) //выводим горизонтальный ряд разметки
  314. putchar('-');
  315.  
  316. print_message();
  317.  
  318. putchar('\n');
  319.  
  320. printf("%-2c", i + 'a'); //выводим вертикальный (ряд) разметки с обозначениями по символу ввиду особенности печати
  321.  
  322.  
  323. for (int h = 0; h < SIZE_OF_MAP_X; ++h) { //выводим клетки поля по горизонтали указанного ряда вместе с разделителями
  324. putchar('|');
  325. putchar(table[i][h]);
  326. }
  327. putchar('|');
  328. putchar('\n');
  329. }
  330.  
  331.  
  332. putchar(' ');
  333. putchar(' ');
  334. for (int k = 0; k < SIZE_OF_MAP_X * 2 + 1; ++k) //выводим последний горизонтальный ряд разметки
  335. putchar('-');
  336.  
  337. putchar('\n');
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement