Problem ze zrozumieniem jednego konstruktora – prośba o wytłumaczenie

0

W ramach nauki C++ piszę snake'a kod nie jest w całości mój. W 90% go rozumiem ale mam problem z jednym konstruktorem

//Klasa Food
Food::Food(Snake *s) // całkowicie nie rozumiem tego konstruktora
{
	snake = s;  // jak wyżej, nie wiem jak go rozumieć jak z niego skorzystać
	this -> osX = 41;
	this -> osY = 9;

	srand(time(NULL));

}


Food::~Food()
{
}

void Food::setFeed(char xo, char yo){

	if ((xo == snake -> getNewX()+1) && (yo == snake->getNewY()+1)) {
		this->osX = (rand() % 79) + 2;
		this->osY = (rand() % 24) + 2;
	}
}


void Food::check() {
	this -> setFeed(this->getFeedX(),this->getFeedY());
}

char Food::getFeedX() {
	return this-> osX;
}


char Food::getFeedY() {
	return this -> osY;
}

}

Klasa Sneak

#include "Snake.h"

Snake::Snake()
{
	this->velX = 0;
	this->velY = -1;
	this->segments.push_front(SnakeSegment(40, 12));
	this->segments.push_front(SnakeSegment(40, 11));
	this->segments.push_front(SnakeSegment(40, 10));
	this->oldTail.setPosition(40,13);
}

Snake::~Snake()
{
}

void Snake::setHeadPosition(char x, char y)
{
	this->segments.front().setPosition(x, y);
}

void Snake::setVel(char x, char y)
{
	this->velX = x;
	this->velY = y;
}


char Snake::getNewX()
{
	return newX;
}

char Snake::getNewY()
{
	return newY;
}

void Snake::delta()
{
	newX = this->segments.front().x + this->velX;
	newY = this->segments.front().y + this->velY;
	// nowa głowa
	this->segments.push_front(SnakeSegment(newX, newY));
	// zapamiętaj i usuń ostatni segment ogona
	this->oldTail = this->segments.back();
	this->segments.pop_back();
}

list<SnakeSegment> Snake::getSegments()
{
	return segments;
}

SnakeSegment Snake::getOldTail()
{
	return this->oldTail;
}

potem oczywiście wywołuje konstruktor Sneak z parametrem sneak w trzeciej klasie

wszystko co prawda mi działa ale chcę zrozumieć co tu się dzieje

0

Pokaż definicję klasy Food. Zapewne po prostu ustawiasz tam wskaźnik na snejka, choć nie wiem po co to w jedzeniu.

0

Dodam jeszcze, że jeśli zrobię to na konstruktorze bezparametrowym wąż śmiga owoc się pojawia ale po zjedzeniu nie zmienia swojego położenia tylko nadal tkwi w tym samym miejscu, jak się dowiedziałem dzieje się tak ponieważ tworzę jakby "nowego sneak'a" zapewne racja tylko nie rozumiem dlaczego

kq napisał(a):

Pokaż definicję klasy Food. Zapewne po prostu ustawiasz tam wskaźnik na snejka, choć nie wiem po co to w jedzeniu.

#pragma once

#include <iostream>
#include "Snake.h"

class Food
{
public:
	Food(Snake *s);
	~Food();

	void setFeed(char xo, char yo);
	void check();
	char getFeedX();
	char getFeedY();


private:
	char osX;
	char osY;
	Snake *snake;
};
0

Bardzo dziwny (w rozumieniu: wygląda niepoprawnie) design tego snejka. To jedzenie "je się" w snejku? W akcji jedzenia to snejk powinien być aktywny, a jedzenie pasywne.

Może poszukaj jakiejś lepszej implementacji na podstawie której chcesz sie uczyć.

0
kq napisał(a):

Bardzo dziwny (w rozumieniu: wygląda niepoprawnie) design tego snejka. To jedzenie "je się" w snejku? W akcji jedzenia to snejk powinien być aktywny, a jedzenie pasywne.

Może poszukaj jakiejś lepszej implementacji na podstawie której chcesz sie uczyć.
Co chcesz przez to powiedzieć?

#include "Screen.h"
#include "rlutil.h"
#include <conio.h>

using namespace rlutil;

Screen::Screen()
{
	snake = new Snake;
	food = new Food(snake);
	cls();

	// brzeg planszy
	for (int y = 0; y < 25; y++) {
		gotoxy(1, y+1);
		setChar(177);
		gotoxy(80, y+1);
		setChar(177);
	}

	for (int x = 0; x < 80; x++) {
		gotoxy(x+1, 1);
		setChar(177);
		gotoxy(x+1, 25);
		setChar(177);
	}
}


Screen::~Screen()
{
}

void Screen::draw()
{
	setCursorVisibility(false);
	
	// narysuj owoc
	gotoxy(this->food->getFeedX(), this->food->getFeedY());
	setChar(15);
	
	// narysuj węża
	for (auto segments : this->snake->getSegments()) {
		gotoxy(segments.x + 1, segments.y + 1);
		setChar(178);
	}
	// usuń stary ogon
	gotoxy(this->snake->getOldTail().x+1, this->snake->getOldTail().y+1);
	setChar(' ');



}

void Screen::checkKeyboard()
{
	if (kbhit()) {
		key = getkey();
		switch (key) {
		case KEY_UP: this->snake->setVel(0, -1); break;
		case KEY_RIGHT: this->snake->setVel(1, 0); break;
		case KEY_DOWN: this->snake->setVel(0, 1); break;
		case KEY_LEFT: this->snake->setVel(-1, 0); break;
		}
	}
}

void Screen::run()
{
	for (;;) {
		this->checkKeyboard();
		this->food->check();
		this->snake->delta();
		this->draw();

		// poczekaj 10 ms
		msleep(100);
	}
}

tak wygląda 3 klasa
w main jest wywoływana tylko metoda run

0

jak widać metoda check sprawdza współrzędne węża i owoca jak są takie same metoda random losuje nowe współrzędne dla owoca ale jeśli nie zastosuje tego enigmatycznego(dla mnie) konstruktora owoc się z miejsca nie rusza bo parametry z klasy sneak nie są przekazywane do food. Ni w ząb nie rozumiem działania tego parametru w konstruktorze food

Dla jasności jeszcze, rozumiem jak działają wskaźniki


int liczba = 5555;        //zmienna liczbowa
int *wskaźnik = &liczba;        //przypisanie wskaźnikowi adresu zmiennej telefon
 
cout << *wskaźnik << endl;       //wyświetlenie wyłuskanej wartości wskaźnika (5555)
cout << wskaźnik << endl;        //wyświetlenie adresu zmiennej liczba
cout << &wskaźnik << endl;       //wyświetlenie adresu wskaźnika
cout << &numer << endl;   //wyświetlenie adresu zmiennej liczba

i to jest jasne, ale ten konstruktor.....
ktoś byłby łaskaw napisać mi solucje co, skąd, dlaczego tak, i jak działa?

0
Uczeń napisał(a):

int *wskaźnik = &liczba; //przypisanie wskaźnikowi adresu zmiennej telefon

Nie.

cout << &numer << endl; //wyświetlenie adresu zmiennej liczba

Nie.

0

zamiast

cout << &numer << endl;

powinno być

cout << &liczba << endl;
0
Azarien napisał(a):
Uczeń napisał(a):

int *wskaźnik = &liczba; //przypisanie wskaźnikowi adresu zmiennej telefon

Nie.

cout << &numer << endl; //wyświetlenie adresu zmiennej liczba

Nie.

No zgadza się jest błąd, nazwy zmiennych pomyliłem bo z różnych przykładów akurat to nie ważne... ale czy to wszystko co potrafisz poradzić mi w tej kwestii? Czy może jednak potrafisz mi wytłumaczyć rzetelnie o co z tym konkretnym konstruktorem chodzi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1