Diskuze: Vlastní třída
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 50 zpráv z 67.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Nechápu jak můžeš psát něco složitějšího a ptát se na základy oop
Kdyby jsi uměl ty základy oop a nehledal to v nich tak to pochopíš, musíš si vytvořit třídy, zinicializovat je a volat na nich ty metody co chceš, třída může popřpadě dědit z jiné, nebo z formu.
podprogramem myslíš funkci(/metodu)? - tu zavoláš takto:
xxx();
Btw.: jenom nepiš ze ti to Visual Studio podtrhlo - metoda musí být nekde definovaná
Prosím, přečti si zdejší tutoriály .... tímhle to nikam nevede.
Nemáš páru vůbec o čem se zde hovoří .. je pro zajímavost .. postni sem
ten kód at třeba pomůžeme
Hlavně je mi podivné, že se chce odvolávat na nějaké public void xxx z jiného souboru. Nevím, co s tím chce dělat. To má být nějaké novodobé imperativní programování nebo co?
Ne ne a ne .... přečti si zdejší tutoriály o OOP. Žádné "void" voalt nebudeš. Budeš si zakládat instance tvých tříd a v nich volat metody.
předpokládám že už si prošel první třídou a umíš číst.
// Usoudil jsem podle toho, že umí psát.
Obávám se že ta hromada kódu bude jenom spousta ale moc spousta metod (těžko říct zda public či private) nabušené ve Form1.cs které ještě ani nic nevrací. A Form1 bude obsahovat desítky různých datových položek.
Otázkou také je, co znamená "složitější kód". Například pro Luboš Běhounek Satika by to mohlo být něco nad 10000 řádek.
Void je docela hezké slovo. Možná by nebylo špatné se podívat do slovníku, co vlastně znamená. Takové spojení "void noName" také nezní špatně.
Tak zde je ten kód:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Maze
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
start();
}
// STOPWATCH:
public Stopwatch watch = new Stopwatch();
// START:
public void start()
{
player.Location = new Point(0, 575);
watch.Reset();
watch.Start();
}
//RECTANGLE:
public void rectangle()
{
int rPx = player.Location.X;
int rPy = player.Location.Y;
Rectangle rPlayer = new Rectangle(rPx, rPy, 24, 24);
Rectangle rFinish = new Rectangle(end.Location.X, end.Location.Y,
end.Size.Width, end.Size.Height);
Rectangle r1 = new Rectangle(label1.Location.X, label1.Location.Y,
label1.Size.Width, label1.Size.Height);
Rectangle r2 = new Rectangle(label2.Location.X, label2.Location.Y,
label2.Size.Width, label2.Size.Height);
Rectangle r3 = new Rectangle(label3.Location.X, label3.Location.Y,
label3.Size.Width, label3.Size.Height);
Rectangle r4 = new Rectangle(label4.Location.X, label4.Location.Y,
label4.Size.Width, label4.Size.Height);
Rectangle r5 = new Rectangle(label5.Location.X, label5.Location.Y,
label5.Size.Width, label5.Size.Height);
Rectangle r6 = new Rectangle(label6.Location.X, label6.Location.Y,
label6.Size.Width, label6.Size.Height);
Rectangle r7 = new Rectangle(label7.Location.X, label7.Location.Y,
label7.Size.Width, label7.Size.Height);
Rectangle r8 = new Rectangle(label8.Location.X, label8.Location.Y,
label8.Size.Width, label8.Size.Height);
Rectangle r9 = new Rectangle(label9.Location.X, label9.Location.Y,
label9.Size.Width, label9.Size.Height);
Rectangle r10 = new Rectangle(label10.Location.X, label10.Location.Y,
label10.Size.Width, label10.Size.Height);
Rectangle r11 = new Rectangle(label11.Location.X, label11.Location.Y,
label11.Size.Width, label11.Size.Height);
Rectangle r12 = new Rectangle(label12.Location.X, label12.Location.Y,
label12.Size.Width, label12.Size.Height);
Rectangle r13 = new Rectangle(label13.Location.X, label13.Location.Y,
label13.Size.Width, label13.Size.Height);
Rectangle r14 = new Rectangle(label14.Location.X, label14.Location.Y,
label14.Size.Width, label14.Size.Height);
Rectangle r15 = new Rectangle(label15.Location.X, label15.Location.Y,
label15.Size.Width, label15.Size.Height);
Rectangle r16 = new Rectangle(label16.Location.X, label16.Location.Y,
label16.Size.Width, label16.Size.Height);
Rectangle r17 = new Rectangle(label17.Location.X, label17.Location.Y,
label17.Size.Width, label17.Size.Height);
if (rPlayer.IntersectsWith(rFinish))
{
finish();
}
if (rPlayer.IntersectsWith(r1))
{
start();
}
if (rPlayer.IntersectsWith(r2))
{
start();
}
if (rPlayer.IntersectsWith(r3))
{
start();
}
if (rPlayer.IntersectsWith(r4))
{
start();
}
if (rPlayer.IntersectsWith(r5))
{
start();
}
if (rPlayer.IntersectsWith(r6))
{
start();
}
if (rPlayer.IntersectsWith(r7))
{
start();
}
if (rPlayer.IntersectsWith(r8))
{
start();
}
if (rPlayer.IntersectsWith(r9))
{
start();
}
if (rPlayer.IntersectsWith(r10))
{
start();
}
if (rPlayer.IntersectsWith(r11))
{
start();
}
if (rPlayer.IntersectsWith(r12))
{
start();
}
if (rPlayer.IntersectsWith(r13))
{
start();
}
if (rPlayer.IntersectsWith(r14))
{
start();
}
if (rPlayer.IntersectsWith(r15))
{
start();
}
if (rPlayer.IntersectsWith(r16))
{
start();
}
if (rPlayer.IntersectsWith(r17))
{
start();
}
}
// CONTROL:
public void Form1_KeyDown(object sender, KeyEventArgs e)
{
// UP:
if (e.KeyCode == Keys.W)
{
player.Top -= 10;
}
// DOWN:
if (e.KeyCode == Keys.S)
{
player.Top += 10;
}
// LEFT:
if (e.KeyCode == Keys.A)
{
player.Left -= 10;
}
// RIGHT:
if (e.KeyCode == Keys.D)
{
player.Left += 10;
}
// RECTANGLE:
rectangle();
}
// FINISH:
public void finish()
{
watch.Stop();
string time = watch.Elapsed.Seconds.ToString();
Form Start = new Form();
Start.Show();
MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
}
}
}
A já chci každý ten VOID uložit zvlášť do souboru, abych je mohl využít i u jiného programu. Např. public void Form1_KeyDown, který rozhoduje, která klávesa byla stisknuta.
Děláš si srandu? Přečteš si už ty tutoriály nebo ne? To je naprostá blbost, to co se snažíš
No vida, a jak se tedy říká tomu, co má vlastnost void a týká se nějakého kusu programu?
Skvělé. Když místo slova "void" budeš používat slovo "metoda", tak ti snad ostatní budou rozumět.
Škoda, že sis nevšiml tlačítka pro vložení zdrojového kódu. Je mezi tlačítkem pro kurzívu a tlačítkem pro vložení nicku. Pak by se tvůj kód ostatním sice také nelíbil, ale byl by podstatně čitelnější.
Soutěž o nejpekelnější kód ? Kdybys alespoň znal AND, OR operátory
... Zkus si prosím tě přečíst raději tutoriály a pak si budeš trhat
vlasy, co jsi to vůbec napsal
Ukládat tvé metody každý do jiného souboru je blbost ...
Píšeš že tam chceš dát metodu na ovládání vstupu klávesnice ...
Proč si na to neuděláš třídu ?
Dávat každou metodu do jednoho souboru, přičemž může být třeba 5 metod podobných, jen u jedné ověřuješ stisk, u druhé podržení atd. je dost špatné ...
Jak ti radí ostatní, nevyšiluj a přečti si ZNOVA celý tutoriál na C#.
To je opravdu katastrofa. Přečti si ty zdejší tutoriály. Ty tvé "voidy"
stejně v jiném programu fungovat nebudou například ten "void" co určuje
stisknutou klávesu. A to jednodušše proto že to je callback události
KeyDown na Formu
Pokud chceš kód jedné třídy rozstrkat do víc souborů, tak se koukni na klíčové slovo partial.
Ano používej partial pokud to má smysl. V tvém případě to smysl nemá.
Podívej se na tutoriály o OOP a sám poznáš že by js to mohl napsat mnohem
lépe
Myslím, že by ten kód mohl klidně zůstat v jednom souboru, zatím to
není složitý kód
Zaměř se raději na kód metody rectangle, dala by se napsat asi na 5
řádků .
Bylo by to takhle:
if (rPlayer.IntersectsWith(r1) || rPlayer.IntersectsWith(r2))
{
start();
}
Ale doporučuji to přepsat úplně
Stále nemohu najít cestu pro jednodušší řešení než:
if (rPlayer.IntersectsWith(r1) || rPlayer.IntersectsWith(r2))
{
start();
}
poradíš mi prosím?
Zkus se mrknout na cyklus foreach a skze něj prověř ty své rectangly zda nekolidují s hráčem. Poznámka nezapomeň si udělat list těch rectanglů, aby jsi je mohl projet.
nemůžeš napsat:
if (rPlayer.IntersectsWith(r1&&r2))
chceš napsat 2 parametry do 1dnoho ...
udělej si metodu na :
if (rPlayer.IntersectsWith(r1,r2))
Nemůžeš spojovat parametry, musíš spojit ty výsledky. Když se zamyslíš nad tím kódem, tak i když spustíš hned u první podmínky ten start, tak se potom testujou ty všechny. (je to zbytečné - ale to je jen takový detail)
Jestli si pamatuju, jsi ten člověk, co dělal ty microsoftácké tutoriály.
Takže jestli ano, tak několik rad:
Ty všechny labely můžeš získat skrz foreach cyklus z formuláře :
foreach (Control c in Controls)
{
if (c is Label)
{
// TODO
}
}
Pozn. Kdyby to bylo v panelu, tak by jsi akorát volal panel.Controls místo Controls.
Každý label má vlastnost ClientRectangle (velikost toho labelu), takže si je stačí uložit někde na začátku programu a jen snima pracovat.
Vytvořil by sis privátní list:
private List<Rectangle> rectangles = new List<Rectangle>();
přidal do listu v konstruktoru všechny ty velikosti a souřadnice těch labelů
foreach (Control c in Controls)
{
if (c is Label)
{
rectangles.Add(c.ClientRectangle);
}
}
A pak si jen napsal metodu, která ti proiteruje toho playera se zbytkem těch rectanglu.
private bool IsThrough(Rectangle playerRectangle, params Rectangle[] rectangles)
{
foreach (Rectangle r in rectangles)
{
if (playerRectangle.IntersectsWith(r))
return true;
}
return false;
}
Takže tvůj kód by byl
if (IsThrough(label1.ClientRectangle, rectangles.ToArray()))
{
start();
}
Tvůj kód je pak univerzální, že ať předěláš své bludiště jakkoliv (bylo by těm těch labelů třeba 1000) tak nebudeš vytvářet r1 - r1000 (kdybys použil alespoň pole), ale jednoduše si pomůžeš.
Snad ti to pomůže
Jak píše Jakub Lásko[Saarix] - místo procházení každého labelu a kolizí ručně v kódu použij cyklus a kolize testuj v něm.
Budeš potřebovat foreach (nebo případně for) cyklus a v něm projít všechny labely, které představují překážky (najdeš je třeba u formuláře v kolekci Controls a zareagovat na to.
Díky. Přesně takto sem si to představoval, jen jsem nevěděl jak na to
Problémem který tu všichni řešíme je ten, že zřejmě nechápeš
přesně co se tam děje Pokud
to potřebuješ splácat narychlo, opisuj. Pokud tomu chceš porozumět přečti
si zdejší tutoriály
ještě 500x mu to řekněte, evidentně o ně má veliký zájem
Stále mi to nejede Můžeš
prosím vložit ty kódy do mého kódu?
Labely jsou umístěny na panel1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Maze
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
start();
}
// STOPWATCH:
public Stopwatch watch = new Stopwatch();
// START:
public void start()
{
player.Location = new Point(0, 575);
watch.Reset();
watch.Start();
}
// CONTROL:
public void Form1_KeyDown(object sender, KeyEventArgs e)
{
// UP:
if (e.KeyCode == Keys.W)
{
player.Top -= 10;
}
// DOWN:
if (e.KeyCode == Keys.S)
{
player.Top += 10;
}
// LEFT:
if (e.KeyCode == Keys.A)
{
player.Left -= 10;
}
// RIGHT:
if (e.KeyCode == Keys.D)
{
player.Left += 10;
}
}
// FINISH:
public void finish()
{
watch.Stop();
string time = watch.Elapsed.Seconds.ToString();
MessageBox.Show("Congratulations! " + "Your time: " + time + " seconds.");
}
}
}
Předem děkuji.
Odpovídá na Zirko
A ano, toto potřebuji udělat narychlo, ale hned jak to dokončím, začnu studovat tutoriály!
Teď musíš někam pověsit ty kontroly pozic, jestli hráč nekoliduje s nějakým objektem - udělej si na to metodu a volej ji třeba na konci form1_keydown.
Do té kontrolní funkce musíš dát cyklus, kde projedeš všechny Controls toho panelu a zkontroluješ, jestli nekoliduje s hráčem.
Zobrazeno 50 zpráv z 67.