Autor Beitrag
CodeKiddy
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Mo 02.07.18 16:59 
Hallo, ihr Lieben! :)
Das CodeKiddy hat mal wieder ein kleines Problem und ich hoffe, ihr könnt mir helfen. :D

Bei meiner neuen Hausaufgabe muss ich zwei Formen miteinander "kommunizieren lassen". Unzwar geht es darum, dass die Größe meiner Hauptform in einer Nebenform für Einstellungen beim Initialisieren abgerufen und automatisch der richtige RadioButton für die Größe aktiviert wird.
Ich habe vier verschiedene RadioButtons, die für jeweils eine Größe stehen, 320 x 280, 640 x 480 etc. Und je nachdem wie groß der Anwender das Fenster in einem vorigen Prozess eingestellt hat, soll beim Aufrufen des Einstellungsfensters der richtige RadioButton aktiviert sein. Doch ich bekomme es nicht hin, die Größe so abzurufen, dass sie sich bei einer Veränderung der Größe anpasst.

Ich kann ja mal zeigen, was ich in etwa habe dazu. Am besten ihr bekommt mal das ganze Projekt. Und falls ihr euch über manche Programmierweisen wundert: mein Fernlehrer ist schuld und nicht ich. Ich arbeite so, wie ich es gezeigt bekomme. :D

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
678:
679:
680:
681:
682:
683:
684:
685:
686:
687:
688:
689:
690:
691:
692:
693:
694:
695:
696:
697:
698:
699:
700:
701:
702:
703:
704:
705:
706:
707:
708:
709:
710:
711:
712:
713:
714:
715:
716:
717:
718:
719:
720:
721:
722:
723:
724:
725:
726:
727:
728:
729:
730:
731:
732:
733:
734:
735:
736:
737:
738:
739:
740:
741:
742:
743:
744:
745:
746:
747:
748:
749:
750:
751:
752:
753:
754:
755:
756:
757:
758:
759:
760:
761:
762:
763:
764:
765:
766:
767:
768:
769:
770:
771:
772:
773:
774:
775:
776:
777:
778:
779:
780:
781:
782:
783:
784:
785:
786:
787:
788:
789:
790:
791:
792:
793:
794:
795:
796:
797:
798:
799:
800:
801:
802:
803:
804:
805:
806:
807:
808:
809:
810:
811:
812:
813:
814:
815:
816:
817:
818:
819:
820:
821:
822:
823:
824:
825:
826:
827:
828:
829:
830:
831:
832:
833:
834:
835:
836:
837:
838:
839:
840:
841:
842:
843:
844:
845:
846:
847:
848:
849:
850:
851:
852:
853:
854:
855:
856:
857:
858:
859:
860:
861:
862:
863:
864:
865:
866:
867:
868:
869:
870:
871:
872:
873:
874:
875:
876:
877:
878:
879:
880:
881:
882:
883:
884:
885:
886:
887:
888:
889:
890:
891:
892:
893:
894:
895:
896:
897:
898:
899:
900:
901:
902:
903:
904:
905:
906:
907:
908:
909:
910:
911:
912:
913:
914:
915:
916:
917:
918:
919:
920:
921:
922:
923:
924:
925:
926:
927:
928:
929:
930:
931:
932:
933:
934:
935:
936:
937:
938:
939:
940:
941:
942:
943:
944:
945:
946:
947:
948:
949:
950:
951:
952:
953:
954:
955:
956:
957:
namespace pong1
{
    public partial class FormSpielfeld : Form
    {
        //die Felder
        //eine Struktur für die Richtung des Balls
        struct Spielball
        {
            //wenn die Richtung true ist, geht es nach oben bzw. nach rechts, sonst nach unten bzw. nach links
            public bool richtungX;
            public bool richtungY;

            //für die Veränderung des Bewegungswinkels
            public int winkel;
        }


        //für die Zeichenfläche
        Graphics zeichenflaeche;
        //für das Spielfeld
        Rectangle spielfeldGroesse;
        int spielfeldMaxX, spielfeldMaxY, spielfeldMinX, spielfeldMinY;
        int spielfeldLinienbreite;
        //für den Schläger;
        int schlaegerGroesse;
        //für den Ball
        Spielball ballPosition;
        //zum Zeichnen
        SolidBrush pinsel;
        //Spiel pausieren
        bool spielPause;
        //verbleibende Spielzeit
        int aktuelleSpielzeit;
        //Schriftart für die Zeit
        Font schrift;
        //Spielpunkte
        Score spielpunkte;
        //für die Punkte
        int punkteMehr, punkteWeniger;
        //für die Veränderung des Winkels
        int winkelZufall;


        public FormSpielfeld()
        {
            InitializeComponent();


            //die Breite der Linien
            spielfeldLinienbreite = 10;
            //die Größe des Schlägers
            schlaegerGroesse = 50;
            //erst einmal geht der Ball nach rechts und oben mit dem Winkel 0
            ballPosition.richtungX = true;
            ballPosition.richtungY = true;
            ballPosition.winkel = 0;


            //Einstellungen Schwierigkeit
            punkteMehr = 1;
            punkteWeniger = -5;
            winkelZufall = 5;


            //den Pinsel erzeugen
            pinsel = new SolidBrush(Color.Black);
            //die Zeichenfläche beschaffen
            zeichenflaeche = panelSpielfeld.CreateGraphics();


            //das Spielfeld bekommt einen schwarzen Hintergrund
            panelSpielfeld.BackColor = Color.Black;


            //die Grenzen für das Spielfeld setzen
            SetzeSpielfeld();
            //einen "neuen" Ball erstellen
            NeuerBall();


            //erst einmal ist das Spiel angehalten
            spielPause = true;


            //Ausgabe Spielzeit
            schrift = new Font("Arial"12, FontStyle.Bold);

            //Ausgabe Spielpunkte
            spielpunkte = new Score();


            //alle drei Timer sind zunächst angehalten
            timerBewegungBall.Enabled = false;
            timerSpiel.Enabled = false;
            timerSekunde.Enabled = false;

            //Deaktivieren des Menüeintrags "Pausieren"
            pausierenToolStripMenuItem.Enabled = false;
        }


        void SetzeSpielfeld()
        {
            spielfeldGroesse = panelSpielfeld.ClientRectangle;

            //die minimalen und die maximalen Ränder festlegen
            //dabei werden die Linien berücksichtigt
            spielfeldMaxX = spielfeldGroesse.Right - spielfeldLinienbreite;

            //den linken Rand verschieben wir ein Pixel nach rechts
            spielfeldMinX = spielfeldGroesse.Left + spielfeldLinienbreite + 1;
            spielfeldMaxY = spielfeldGroesse.Bottom - spielfeldLinienbreite;
            spielfeldMinY = spielfeldGroesse.Top + spielfeldLinienbreite;
        }


        void ZeichneSpielfeld()
        {
            //die weißen Begrenzungen
            pinsel.Color = Color.White;

            //ein Rechteck oben
            zeichenflaeche.FillRectangle(pinsel, 00, spielfeldMaxX, spielfeldLinienbreite);
            //ein Rechteck rechts
            zeichenflaeche.FillRectangle(pinsel, spielfeldMaxX, 0, spielfeldLinienbreite, spielfeldMaxY + spielfeldLinienbreite);
            //und noch eins unten
            zeichenflaeche.FillRectangle(pinsel, 0, spielfeldMaxY, spielfeldMaxX, spielfeldLinienbreite);

            //damit es nicht langweilig wird, noch eine graue Linie in die Mitte
            pinsel.Color = Color.Gray;
            zeichenflaeche.FillRectangle(pinsel, spielfeldMaxX / 2, spielfeldMinY, spielfeldLinienbreite, spielfeldMaxY - spielfeldLinienbreite);
        }


        void ZeichneZeit(string restzeit)
        {
            //zuerst die alte Anzeige "überschreiben"
            pinsel.Color = panelSpielfeld.BackColor;
            zeichenflaeche.FillRectangle(pinsel, spielfeldMaxX - 50, spielfeldMinY + 203020);


            //in weißer Schrift
            pinsel.Color = Color.White;

            //die Auszeichnungen für die Schrift werden beim Erstellen des Spielfelds gesetzt

            zeichenflaeche.DrawString(restzeit, schrift, pinsel, new Point(spielfeldMaxX - 50, spielfeldMinY + 20));
        }


        //setzt die Position des Balls
        void ZeichneBall(Point position)
        {
            panelBall.Location = position;
            //für die Zufallszahl
            Random zufall = new Random();


            //wenn der Ball rechts anstößt, ändern wir die Richtung
            if ((position.X + 10) >= spielfeldMaxX)
                ballPosition.richtungX = false;

            //stößt er unten bzw. oben an, ebenfalls
            if ((position.Y + 10) >= spielfeldMaxY)
                ballPosition.richtungY = true;
            else
            {
                if (position.Y <= spielfeldMinY)
                    ballPosition.richtungY = false;
            }


            //ist er wieder links, prüfem wir, ob der Schläger in der Nähe ist
            if ((position.X == spielfeldMinX) && ((panelSchlaeger.Top <= position.Y) && (panelSchlaeger.Bottom >= position.Y)))
            {
                if (ballPosition.richtungX == false)
                {
                    //einen Punkt dazu und die Punkte ausgeben
                    ZeichnePunkte(Convert.ToString(spielpunkte.VeraenderePunkte(punkteMehr)));
                }


                //die Richtung ändern
                ballPosition.richtungX = true;

                //und den Winkel
                ballPosition.winkel = zufall.Next(winkelZufall);
            }


            //ist der Ball hinter dem Schläger?
            if (position.X < spielfeldMinX)
            {
                //fünf Punkte abziehen und die Punkte ausgeben
                ZeichnePunkte(Convert.ToString(spielpunkte.VeraenderePunkte(punkteWeniger)));


                //eine kurze Pause einlegen
                System.Threading.Thread.Sleep(1000);

                //und alles von vorne
                ZeichneBall(new Point(spielfeldMinX, position.Y));
                ballPosition.richtungX = true;
            }
        }


        //setzt die Y-Position des Schlägers
        void ZeichneSchlaeger(int y)
        {
            //befindet sich der Schläger im Spielfeld?
            if (((y + schlaegerGroesse) < spielfeldMaxY) && (y > spielfeldMinY))
                panelSchlaeger.Top = y;
        }

        private void panelSchlaeger_MouseMove(object sender, MouseEventArgs e)
        {
            if (spielPause == true)
                return;


            if (e.Button == MouseButtons.Left)
                ZeichneSchlaeger(e.Y + panelSchlaeger.Top);
        }

        private void timerBewegungBall_Tick(object sender, EventArgs e)
        {
            int neuX = 0;
            int neuY = 0;


            //abhängig von der Bewegungsrichtung die Koordinaten neu setzen
            if (ballPosition.richtungX == true)
                neuX = panelBall.Left + 10;
            else
                neuX = panelBall.Left - 10;

            if (ballPosition.richtungY == true)
                neuY = panelBall.Top - ballPosition.winkel;
            else
                neuY = panelBall.Top + ballPosition.winkel;


            //den Ball neu zeichnen
            ZeichneBall(new Point(neuX, neuY));
        }

        private void timerSpiel_Tick(object sender, EventArgs e)
        {
            //das Spiel anhalten
            pausierenToolStripMenuItem_Click(sender, e);

            //eine Meldung anzeigen
            MessageBox.Show("Die Zeit ist um.""Spielende", MessageBoxButtons.OK, MessageBoxIcon.Information);

            //nachsehen, ob ein neuer Eintrag in der Bestenliste erfolgen kann
            if (spielpunkte.NeuerEintrag() == true)
            {
                //Ball und Schläger "verstecken"
                panelBall.Hide();
                panelSchlaeger.Hide();

                //die Liste ausgeben
                spielpunkte.ListeAusgeben(zeichenflaeche, spielfeldGroesse);

                //fünf Sekunden warten
                System.Threading.Thread.Sleep(5000);

                //die Zeichenfläche löschen
                zeichenflaeche.Clear(panelSpielfeld.BackColor);

                //Ball und Schläger wieder anzeigen
                panelBall.Show();
                panelSchlaeger.Show();
            }

            //Abfrage, ob ein neues Spiel gestartet werden soll
            if (NeuesSpiel() == true)
            {
                //das Spiel fortsetzen
                pausierenToolStripMenuItem_Click(sender, e);
            }
            else
            {
                //sonst beenden
                beendenToolStripMenuItem_Click(sender, e);
            }
        }

        private void pausierenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //erst einmal prüfen wir den Status
            //läuft das Spiel?
            if (spielPause == false)
            {
                //alle Timer anhalten
                timerBewegungBall.Enabled = false;
                timerSpiel.Enabled = false;
                timerSekunde.Enabled = false;

                //die Markierung im Menü einschalten
                pausierenToolStripMenuItem.Checked = true;

                einstellungenToolStripMenuItem.Enabled = true;

                //den Text in der Titelleiste ändern
                this.Text = "Pong - Das Spiel ist angehalten!";

                spielPause = true;
            }
            else
            {
                //das Intervall für die verbleibende Spielzeit setzen
                timerSpiel.Interval = aktuelleSpielzeit * 1000;

                //alle Timer wieder an
                timerBewegungBall.Enabled = true;
                timerSpiel.Enabled = true;
                timerSekunde.Enabled = true;

                //die Markierung im Menü abschalten
                pausierenToolStripMenuItem.Checked = false;

                einstellungenToolStripMenuItem.Enabled = false;

                //dem Text in der Titelleiste ändern
                this.Text = "Pong";

                spielPause = false;
            }
        }


        //erzeugt einen Dialog zum Neustart und liefert das Ergebnis zurück
        bool NeuesSpiel()
        {
            bool ergebnis = false;

            if (MessageBox.Show("Neues Spiel starten?""Neues Spiel", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                //die Spielzeit neu setzen
                aktuelleSpielzeit = 120;

                spielpunkte.LoeschePunkte();

                //alles neu zeichnen
                ZeichneSpielfeld();
                NeuerBall();
                ZeichneZeit(Convert.ToString(aktuelleSpielzeit));
                ZeichnePunkte("0");
                ergebnis = true;

                pausierenToolStripMenuItem.Enabled = true;
            }

            return ergebnis;
        }


        private void neuesSpielToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //"läuft" ein Spiel?
            //dann erst einmal pausieren
            if (spielPause == false)
            {
                pausierenToolStripMenuItem_Click(sender, e);

                //den Dialog anzeigen
                NeuesSpiel();

                //und weiter spielen
                pausierenToolStripMenuItem_Click(sender, e);
            }
            //wenn kein Spiel läuft, starten wir ein neues, wenn im Dialog auf Ja geklickt wurde
            else
            {
                if (NeuesSpiel() == true)
                    pausierenToolStripMenuItem_Click(sender, e);
            }
        }

        private void timerSekunde_Tick(object sender, EventArgs e)
        {
            //eine Sekunde abziehen
            aktuelleSpielzeit--;

            //die Restzeit ausgeben
            ZeichneZeit(Convert.ToString(aktuelleSpielzeit));
        }


        //setzt die Einstellungen für den Schwierigkeitsgrad
        void SetzeEinstellungen(int schlaeger, int mehr, int weniger, int winkel)
        {
            schlaegerGroesse = schlaeger;
            punkteMehr = mehr;
            punkteWeniger = weniger;
            winkelZufall = winkel;
        }


        //setzt die Einstellungen für einen neuen Ball und einen neuen Schläger
        void NeuerBall()
        {
            //die Größe des Balles setzen
            panelBall.Width = 10;
            panelBall.Height = 10;

            //die Größe des Schlägers setzen
            panelSchlaeger.Width = spielfeldLinienbreite;
            panelSchlaeger.Height = schlaegerGroesse;

            //beide Panels werden weiß
            panelBall.BackColor = Color.White;
            panelSchlaeger.BackColor = Color.White;

            //den Schläger positionieren
            //links an den Rand
            panelSchlaeger.Left = 2;
            //ungefähr in die Mitte
            ZeichneSchlaeger((spielfeldMaxY / 2) - (schlaegerGroesse / 2));

            //der Ball kommt vor den Schläger ungefähr in die Mitte
            ZeichneBall(new Point(spielfeldMinX, spielfeldMaxY / 2));
        }


        private void schwerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //das Intervall für den Ball setzen
            timerBewegungBall.Interval = 25;

            //die Einstellungen setzen
            SetzeEinstellungen(5010, -525);

            //und die Markierungen
            sehrEinfachToolStripMenuItem.Checked = false;
            einfachToolStripMenuItem.Checked = false;
            mittelToolStripMenuItem.Checked = false;
            schwerToolStripMenuItem.Checked = true;
            sehrSchwerToolStripMenuItem.Checked = false;
        }

        private void sehrEinfachToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //das Intervall für den Ball setzen
            timerBewegungBall.Interval = 200;

            //die Einstellungen setzen
            SetzeEinstellungen(1001, -202);

            //und die Markierungen
            sehrEinfachToolStripMenuItem.Checked = true;
            einfachToolStripMenuItem.Checked = false;
            mittelToolStripMenuItem.Checked = false;
            schwerToolStripMenuItem.Checked = false;
            sehrSchwerToolStripMenuItem.Checked = false;
        }

        private void mittelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //das Intervall für den Ball setzen
            timerBewegungBall.Interval = 50;

            //die Einstellungen setzen
            SetzeEinstellungen(503, -515);

            //und die Markierungen
            sehrEinfachToolStripMenuItem.Checked = false;
            einfachToolStripMenuItem.Checked = false;
            mittelToolStripMenuItem.Checked = true;
            schwerToolStripMenuItem.Checked = false;
            sehrSchwerToolStripMenuItem.Checked = false;
        }

        private void einfachToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //das Intervall für den Ball setzen
            timerBewegungBall.Interval = 100;

            //die Einstellungen setzen
            SetzeEinstellungen(501, -55);

            //und die Markierungen
            sehrEinfachToolStripMenuItem.Checked = false;
            einfachToolStripMenuItem.Checked = true;
            mittelToolStripMenuItem.Checked = false;
            schwerToolStripMenuItem.Checked = false;
            sehrSchwerToolStripMenuItem.Checked = false;
        }

        private void sehrSchwerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //das Intervall für den Ball setzen
            timerBewegungBall.Interval = 10;

            //die Einstellungen setzen
            SetzeEinstellungen(200, -540);

            //und die Markierungen
            sehrEinfachToolStripMenuItem.Checked = false;
            einfachToolStripMenuItem.Checked = false;
            mittelToolStripMenuItem.Checked = false;
            schwerToolStripMenuItem.Checked = false;
            sehrSchwerToolStripMenuItem.Checked = true;
        }


        private void spielfeldToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Point neueGroesse = new Point(00);
            EinstellungenDialog neueWerte = new EinstellungenDialog();


            //wenn der Dialog über die "OK"-Schaltfläche beendet wird
            if (neueWerte.ShowDialog() == DialogResult.OK)
            {
                //die neue Größe holen
                neueGroesse = neueWerte.LiefereWert();

                //den Dialog wieder schließen
                neueWerte.Close();


                //das Formular ändern
                this.Width = neueGroesse.X;
                this.Height = neueGroesse.Y;

                //neu ausrichten
                this.Left = (Screen.PrimaryScreen.Bounds.Width - this.Width) / 2;
                this.Top = (Screen.PrimaryScreen.Bounds.Height - this.Height) / 2;


                //die Zeichenfläche neu beschaffen
                zeichenflaeche = panelSpielfeld.CreateGraphics();

                //das Spielfeld neu setzen
                SetzeSpielfeld();

                //Spielfeld löschen
                zeichenflaeche.Clear(panelSpielfeld.BackColor);


                //und einen neuen Ball und einen neuen Schläger zeichnen
                NeuerBall();


                //das Spielfeld neu zeichnen
                ZeichneSpielfeld();
            }
        }

        private void bestenlisteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //zur Unterscheidung zweischen einem laufenden und einem nicht gestarteten Spiel
            bool weiter = false;

            //"läuft" ein Spiel? Dann erst einmal pausieren
            if (spielPause == false)
            {
                pausierenToolStripMenuItem_Click(sender, e);
                weiter = true;
            }

            //Ball und Schläger "verstecken"
            panelBall.Hide();
            panelSchlaeger.Hide();

            //die Liste ausgeben
            spielpunkte.ListeAusgeben(zeichenflaeche, spielfeldGroesse);

            //fünf Sekunden warten
            System.Threading.Thread.Sleep(5000);

            //die Zeichenfläche löschen
            zeichenflaeche.Clear(panelSpielfeld.BackColor);

            //Ball und Schläger wieder anzeigen
            panelBall.Show();
            panelSchlaeger.Show();

            //das Spiel wieder fortsetzen, wenn wir es angehalten haben
            if (weiter == true)
                pausierenToolStripMenuItem_Click(sender, e);
        }


        void ZeichnePunkte(string punkte)
        {
            //zuerst die alte Anzeige "überschreiben"
            pinsel.Color = panelSpielfeld.BackColor;
            zeichenflaeche.FillRectangle(pinsel, spielfeldMaxX - 50, spielfeldMinY + 403020);

            //in weißer Schrift
            pinsel.Color = Color.White;
            //die Einstellungen für die Schrift werden beim Erstellen des Spielfeldes gesetzt

            zeichenflaeche.DrawString(punkte, schrift, pinsel, new Point(spielfeldMaxX - 50, spielfeldMinY + 40));
        }


        private void panelSpielfeld_Paint(object sender, PaintEventArgs e)
        {
            ZeichneSpielfeld();

            ZeichneZeit(Convert.ToString(aktuelleSpielzeit));
        }


        public Point GetGroesse()
        {
            Point groesse = new Point(panelSpielfeld.Width, panelSpielfeld.Height);

            return groesse;
        }


        private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }
    }

public partial class NameDialog : Form
    {
        public NameDialog()
        {
            InitializeComponent();
        }


        public string LiefereName()
        {
            return textBoxEingabe.Text;
        }
    }


public partial class EinstellungenDialog : Form
    {
        //für die Farbe des Rahmen
        Color rahmenFarbe;
        //für die Farbe des Spielfeldes
        Color spielfeldFarbe;
        //für die Zeichenfläche des Panels
        Graphics zeichenflaeche;
        //für die Spielfeldgröße (Auswahl)
        Point groesse;


        
        public EinstellungenDialog()
        {
            InitializeComponent();

            //Zeichenfläche setzen
            zeichenflaeche = panelVorschau.CreateGraphics();


            //Standardfarben setzen
            rahmenFarbe = Color.White;
            spielfeldFarbe = Color.Black;
            panelVorschau.BackColor = Color.White;


            //Aktivierung des aktuellen RadioButtons (Auswahl)
            groesse = new Point(00);
        }


        public Point LiefereWert()
        {
            Point rueckgabe = new Point(00);


            if (radioButton320.Checked == true)
                rueckgabe = new Point(320200);

            if (radioButton640.Checked == true)
                rueckgabe = new Point(640480);

            if (radioButton1024.Checked == true)
                rueckgabe = new Point(1024768);

            if (radioButtonMaximal.Checked == true)
                rueckgabe = new Point(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);


            return rueckgabe;
        }


        private void buttonAbbrechen_Click(object sender, EventArgs e)
        {
            Close();
        }


        private void buttonFarbenRahmen_Click(object sender, EventArgs e)
        {
            //Auswertung der Farbauswahl
            if(colorDialogFarbenRahmen.ShowDialog() == DialogResult.OK)
            {
                //den Rahmen der Vorschau setzen
                

                //die Farbe zur Weitergabe an FormSpielfeld in einer Variablen speichern
                rahmenFarbe = colorDialogFarbenRahmen.Color;
            }

            //Panel neuzeichnen
            panelVorschau.Refresh();
        }


        private void buttonFarbenSpielfeld_Click(object sender, EventArgs e)
        {
            //Auswertung der Farbauswahl
            if(colorDialogFarbenSpielfeld.ShowDialog() == DialogResult.OK)
            {
                //den Hintergrund der Vorschau setzen
                panelVorschau.BackColor = colorDialogFarbenSpielfeld.Color;

                //die Farbe zur Weitergabe an FormSpielfeld in einer Variablen speichern
                spielfeldFarbe = colorDialogFarbenSpielfeld.Color;
            }

            //Panel neuzeichnen
            panelVorschau.Refresh();
        }


        //Farben an das Spielfeld übergeben
        public Color SetFarbeRahmen(Color farbe)
        {
            return rahmenFarbe;
        }

        public Color SetFarbeSpielfeld(Color farbe)
        {
            return spielfeldFarbe;
        }


        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            RahmenSchlaegerBall();
        }

        void RahmenSchlaegerBall()
        {
            //zwei temporäre Pinsel erstellen
            SolidBrush tempPinsel = new SolidBrush(rahmenFarbe);
            SolidBrush tempPinsel2 = new SolidBrush(spielfeldFarbe);
            SolidBrush tempPinsel3 = new SolidBrush(Color.Gray);

            //Spielfeld und Rahmen zeichnen
            //Rahmen setzen
            panelVorschau.BackColor = rahmenFarbe;

            //Hintergrund des Spielfeldes setzen
            zeichenflaeche.FillRectangle(tempPinsel2, 33, panelVorschau.Width - 8, panelVorschau.Height - 8);
            zeichenflaeche.FillRectangle(tempPinsel3, panelVorschau.Width / 235, panelVorschau.Height - 8);

            //Schläger und Ball zeichnen
            zeichenflaeche.FillRectangle(tempPinsel, 1020520);
            zeichenflaeche.FillRectangle(tempPinsel, 402555);

        }

        void SetGroesse()
        {
            FormSpielfeld groesseSpielfeld = new FormSpielfeld();

            groesse = groesseSpielfeld.GetGroesse();


            switch (groesse.X)
            {
                case 320:
                    radioButton320.Checked = true;
                    break;
                case 640:
                    radioButton640.Checked = true;
                    break;
                case 1024:
                    radioButton1024.Checked = true;
                    break;
                default:
                    radioButtonMaximal.Checked = true;
                    break;
            }
        }
    }


//die Klasse für die Liste
    //Sie muss die Schnittstelle IComparable implementieren
    class Liste : IComparable
    {
        //die Felder
        int listePunkte;
        string listeName;


        //die Methoden
        //der Konstruktor
        public Liste()
        {
            //er setzt die Punkte und den Namen auf Standardwerte
            listePunkte = 0;
            listeName = "Nobody";
        }

        //die Vergleichsmethode
        public int CompareTo(object objekt)
        {
            Liste tempListe = (Liste)(objekt);


            if (this.listePunkte < tempListe.listePunkte)
                return 1;

            if (this.listePunkte > tempListe.listePunkte)
                return -1;
            else
                return 0;
        }

        //die Methode zum Setzen von Einträgen
        public void SetzeEintrag(int punkte, string name)
        {
            listePunkte = punkte;
            listeName = name;
        }

        //die Methode zum Liefern der Punkte
        public int GetPunkte()
        {
            return listePunkte;
        }

        //die Methode zum Liefern des Namens
        public string GetName()
        {
            return listeName;
        }
    }


class Score
    {
        //die Felder
        int punkte;
        //die Anzahl der Einträge in der Liste
        int anzahl = 10;
        //für die Liste
        Liste[] bestenliste;


        //die Methoden
        //der Konstruktor
        public Score()
        {
            punkte = 0;

            //eine neue Instanz der Liste erstellen
            bestenliste = new Liste[anzahl];

            //die Elemente initalisieren
            for (int i = 0; i < anzahl; i++)
                bestenliste[i] = new Liste();
        }

        //zum Verändern der Punkte
        public int VeraenderePunkte(int anzahl)
        {
            punkte += anzahl;

            return punkte;
        }

        //zum Zurücksetzen der Punkte
        public void LoeschePunkte()
        {
            punkte = 0;
        }

        //Einfügen neuer Einträge in die Liste
        public bool NeuerEintrag()
        {
            string tempName = string.Empty;


            //wenn die aktuelle Punktzahl größer ist als der letzte Eintrag der Liste, wird der letzte Eintrag der Liste überschrieben und die Liste neu sortiert
            if (punkte > bestenliste[anzahl - 1].GetPunkte())
            {
                //den Namen beschaffen
                NameDialog neuerName = new NameDialog();

                if (neuerName.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    tempName = neuerName.LiefereName();

                neuerName.Close();


                bestenliste[anzahl - 1].SetzeEintrag(punkte, tempName);
                Array.Sort(bestenliste);


                return true;
            }
            else
                return false;
        }

        //Ausgabe der Liste
        public void ListeAusgeben(System.Drawing.Graphics zeichenflaeche, System.Drawing.RectangleF flaeche)
        {
            //ein temporärer Pinsel
            System.Drawing.SolidBrush tempPinsel = new System.Drawing.SolidBrush(System.Drawing.Color.White);

            //die Schriftart setzen
            System.Drawing.Font tempSchrift = new System.Drawing.Font("Arial"12, System.Drawing.FontStyle.Bold);


            //für die zentrierte Ausgabe
            System.Drawing.StringFormat ausrichtung = new System.Drawing.StringFormat();

            //Koordinaten für die Ausgabe
            float punkteX, nameX, y;
            punkteX = flaeche.Left + 50;
            nameX = flaeche.Left + 250;
            y = flaeche.Top + 50;

            //die Ausrichtung ist zentriert
            ausrichtung.Alignment = System.Drawing.StringAlignment.Center;


            //die Zeichenfläche löschen
            zeichenflaeche.Clear(System.Drawing.Color.Black);


            //den Titel ausgeben
            zeichenflaeche.DrawString("Bestenliste", tempSchrift, tempPinsel, flaeche.Width / 2, y, ausrichtung);

            //und nun die Liste selbst
            for (int i = 0; i < anzahl; i++)
            {
                y += 20;

                zeichenflaeche.DrawString(Convert.ToString(bestenliste[i].GetPunkte()), tempSchrift, tempPinsel, punkteX, y);
                zeichenflaeche.DrawString(bestenliste[i].GetName(), tempSchrift, tempPinsel, nameX, y);
            }
        }
    }
}



Ich hoffe, ihr steigt da irgendwie durch. :D


Vielen Dank schonmal. :)

_________________
Diese Software verdient die 3 großen GGG: Gesehen — Gelacht — Gelöscht.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 02.07.18 17:08 
Sorry, aber wir sind kein Hausaufgabenforum. Bitte poste nur den relevanten Code (bzw. editiere deinen bisherigen Beitrag).

Generell kann ich dir nur den Tipp geben, daß du dann die Größe an den Einstellungsdialog übergeben mußt (z.B. im Konstruktor oder mithilfe einer Eigenschaft oder Methode).
Du solltest also nicht vom Einstellungsdialog auf die Hauptform zugreifen!
CodeKiddy Threadstarter
Hält's aus hier
Beiträge: 9

WIN 10
C#
BeitragVerfasst: Mi 04.07.18 09:25 
Erst einmal danke für deine Antwort Th69.
Dass das hier kein Hausaufgabenforum ist, weiß ich. Und ich frage auch nicht direkt nach einer Lösung, sondern suche mehr nach einer Anregung für eine passende Methode, diese Hausaufgabe zu lösen. Dieser Teil ist auch nur ein kleines bisschen von dem, was in der Hausaufgabe gefordert wird. Also, keine Angst, ich weiß, worum es hier geht. Ich wollte euch nur nicht im Unklaren darüber lassen, woher ich diese Aufgabe habe. Zudem hätten sonst Hintergrundfragen aufkommen können, die ich gar nicht hätte beantworten können, weil ich mir die Aufgabe ja nicht selbst gestellt habe. Vorsicht ist besser als Nachsicht, habe ich im Netz gelernt. :D

Hinsichtlich des Codes, den ich eingefügt habe... Ich bin noch neu im Programmieren und wusste einfach nicht, was ihr braucht, um mich genau zu verstehen. Kannst du mir einen Tipp geben, was genau ihr eigentlich nur benötigt und ich lösche dann den Rest?

Aber deine Idee ist schon einmal gar nicht schlecht. Ich werde mal sehen, ob mein Gehirn dazu irgendwas ausspuckt. :)

_________________
Diese Software verdient die 3 großen GGG: Gesehen — Gelacht — Gelöscht.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.07.18 11:08 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 04.07.18 11:30 
Hallo,

ich habe mir jetzt mal deinen Code angeschaut (bzw. überflogen). Dir geht es um den Code in der Methode spielfeldToolStripMenuItem_Click?

Dann in etwa so
ausblenden C#-Quelltext
1:
2:
3:
4:
Size aktuelleGroesse = new Size(Width, Height);
EinstellungenDialog neueWerte = new EinstellungenDialog(aktuelleGroesse);

// ...

Und dann entsprechend den Konstruktor um den Parameter Size groesse erweitern.

PS: Für Größenangaben Size anstatt Point benutzen.

PPS: Sag deinem Fernlehrer ruhig mal, daß der Code nicht gut ist. Wenn er (bzw. das Institut) noch etwas lernen will, dann kann er sich mal hier (bei mir) melden! ;-)
Ich hatte dir ja schon in Zeichenbereich eines Panels, "Animation" von Kreisen einige Kritikpunkte genannt.