@SuperDuperPuper

Как увеличить частоту кадров при выводе в консоль строк?

КОД
#include <time.h>
#include <conio.h>
#include <string>
#include <iostream>
#include <windows.h>
using namespace std;

class snake {
private:
	char got_key;
	int directX = 1;
	int directY = 0;
public:
	int x;
	int y;
	int coords_body[500][2];
	int snake_len = 2;
	char head;
	int speed;
	snake(int x, int y, char head, int speed) { set_values(x, y, head, speed); }

	void set_values(int X, int Y, char HEAD, int SPEED) {
		head = HEAD;
		speed = SPEED;
		x = X;
		y = Y;
		coords_body[0][0] = x;
		coords_body[0][1] = y;
		coords_body[1][0] = x;
		coords_body[1][1] = y + 1;

	}

	void move(int X, int Y) {
		int preX = coords_body[0][0];
		int preY = coords_body[0][1];
		coords_body[0][0] = x;
		coords_body[0][1] = y;
		for (int i = 1; i <= snake_len; i++) {
			X = coords_body[i][0];
			Y = coords_body[i][1];
			coords_body[i][0] = preX;
			coords_body[i][1] = preY;
			preX = X;
			preY = Y;

		}
		coords_body[snake_len + 1][0] = preX;
		coords_body[snake_len + 1][1] = preY;
	}

	void append() {
		snake_len += 1;
	}
	void die() {
		head = '~';
		directX = 0;
		directY = 0;
	}
	int check_collission(char array[29][120]) {
		char a = array[coords_body[0][1]][coords_body[0][0]];
		if (a == '#') {
			die();
			return 0;
		}
		else if (a == '$') {
			append();
			return 1;
		}
	}
	void get_key() {
		if (head != '~'){
			char key;
			if (_kbhit() != 0) {
				key = _getch();
				switch (key) {
				case 'w':
					directX = 0;
					directY = -1;
					break;
				case 's':
					directX = 0;
					directY = 1;
					break;
				case 'd':
					directX = 1;
					directY = 0;
					break;
				case 'a':
					directX = -1;
					directY = 0;
					break;
				}
			}
			x = x + directX * speed;
			y = y + directY * speed;
			move(x, y);
		}
		
	}


};
void spawn_raspberries(int raspberries[5][2]){
	int x;
	int y;
	for (int i = 0; i < 5;i++) {
		x = rand() % 120;
		y = rand()%29 ;
		raspberries[i][0] = x;
		raspberries[i][1] = y;

		
	}
}
void draw_raspberries(int raspberries[5][2],char array[29][120]) {
	int x;
	int y;
	for (int i = 0; i < 5; i++) {
		x = raspberries[i][0];
		y = raspberries[i][1];
		array[y][x] = '$';
	}
}

void delete_raspberry(int x,int y,int raspberries[5][2]){
	for (int i = 0; i < 5; i++) {
		if (raspberries[i][0]==x && raspberries[i][1] == y){
			raspberries[i][0] = -1;
			raspberries[i][1] = -1;
		}
	}
}

void delay(int ms) {
	int EndTime = clock() + ms;
	while (clock() < EndTime) {}

}
void draw_ground(char array[29][120]) {
	string output = "";
	for (int y = 0; y < 29; y++) {
		for (int x = 0; x < 120; x++) {

			output += array[y][x];
		}
		cout<<output << endl;
		output = "";

	}
}
	void create_ground(char array[29][120]) {
		for (int y = 0; y < 29; y++) {
			array[y][0] = '#';
			array[y][119] = '#';
			}
		for (int x = 0; x < 120; x++) {
			array[0][x] = '#';
			array[28][x] = '#';
		}
		for (int y = 1; y < 28; y++) {
			for (int x = 1; x < 119; x++) {
				array[y][x] = '.';
			}
		}
	}
	void append_snake_to_array(char array[29][120], int coords_body[500][2], int snake_len, char snake_head) {
		char body = ' ';
		int x = coords_body[0][0];
		int y = coords_body[0][1];
		array[y][x] = snake_head;
		if (snake_head != '~') {
			body = '#';
		}
		else {
			body = '~';
		}
		for (int i = 1; i < snake_len; i++) {
			x = coords_body[i][0];
			y = coords_body[i][1];
			array[y][x] = body;
		}
	}

	
	void game() {
		int fps = 0;
		int count = 0;
		int begin = clock() + 1000;

		bool game = true;
		char array[29][120];

		int raspberries[5][2];
		spawn_raspberries(raspberries);
		int raspberries_ammount = 5;

		snake snake_1(10, 10, '@', 1);
		while (game == true) {
			create_ground(array);
			draw_raspberries(raspberries,array);
			append_snake_to_array(array, snake_1.coords_body, snake_1.snake_len, snake_1.head);
			snake_1.get_key();
			draw_ground(array);

			if (snake_1.check_collission(array) == 1) {
				delete_raspberry(snake_1.coords_body[0][0], snake_1.coords_body[0][1],raspberries);
				raspberries_ammount -= 1; 
			}
			if (raspberries_ammount == 0) {
				raspberries_ammount = 5;
				spawn_raspberries(raspberries);
			}

			cout << "fps:" << fps;
			count += 1;
			if (clock() >begin ) {
				begin+= 1000;
				fps = count;
				count = 0;
			}


			system("cls");
			}
	
		}

int main()
{	
	game();
}
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Как увеличить частоту кадров при выводе в консоль строк?

Ответ на этот вопрос: не перерисовывать всё целиком каждый кадр.
Ответ на вопрос "как понять, на что тратится время выполнения программы": с помощью профилирования.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы