home *** CD-ROM | disk | FTP | other *** search
- /* -------------------------------------------- */
- /* WDREH.C */
- /* (C) 1989 TOOLBOX & Alf Dengler */
- /* Compiler: Microsoft Quick C */
- /* -------------------------------------------- */
- #include <stdio.h> /* standard input output */
- #include <graph.h> /* graphics include file */
- #include <ctype.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #define DREH 12 /* Anzahl Drehmöglichkeiten */
- #define WDIM 3 /* Seitenlänge Würfelquadrat */
- #define WZAHL 9 /* Maximale Anzahl Würfel */
- #define MAX_ZUF 50 /* Maximale Drehungen zu */
- /* Beginn des Spiels */
-
- /* Variablenbedeutungen : */
- /* dzahl : Erwünschte Zahl Würfeldrehungen */
- /* m[WZAHL][6]: Spielfeldmatrix m */
- /* erg[WZAHL] : Ergebnisvektor erg */
- /* vorbel[6] : Vektor zum Vorbelegen von m */
- /* punkt: benötigte Drehungen zum Wieder- */
- /* herstellen des Spielfelds */
- /* ranval[MAX_ZUF] : Die jeweilige Nummer der */
- /* Zufallsverdrehung */
- /* (1...12) wird im Vektor ranval abgespeichert */
-
- char dreh_bed, strein[3];
- char ende[] = "stop", name[81];
- char kontr[] = "123456789abc";
- char zuege[DREH][3]= { "L1","L2","L3","R1","R2",
- "R3","O1","O2","O3","U1",
- "U2","U3" };
- int dzahl, punkt, ranval[MAX_ZUF], richtig;
- int m[WZAHL][6], erg[WZAHL];
- int vorbel[6] = { 1,2,3,4,5,6 };
-
- /* Notwendige Strings zur Darstellung */
- /* des Spielfelds und der Fenster */
-
- char ol[] = "╔", or[] = "╗", ml[] = "╠";
- char mr[] = "╣", ul[] = "╚", ur[] = "╝";
- char vert[]="║", ou[121], zeil_79[80];
- char horiz[] =
- "═══════════════════════════════════════════════";
- char sfeld_1[]=
- "╠══════╬═══╦═══╦═══╣",sfeld_2[]="║ ║ ║";
- char sfeld_3[]=
- "╠═══╬═══╬═══╣",sfeld_4[]="╩═══╩═══╩";
-
- main()
- {
- int equal, zustart, horiz_len;
- long sekunden;
-
- horiz_len = strlen(horiz);
- strncpy(ou,horiz,horiz_len);
- strncat(ou,horiz,50);
-
- /* Starten des Zufallsgenerators mit einer */
- /* Zufallszahl mit Hilfe der Zeitfunktion time */
- time(&sekunden);
- zustart = sekunden%1000;
- srand(zustart);
-
- vorbeleg();
- /* Vorbelegen der Spielfeldmatrix m */
-
- _setvideomode (_DEFAULTMODE);
- /* Voreingestellten Bildschirmmodus wählen */
-
- titelbild();
- /* Programmname und Copyright am Bildschirm */
-
- equal = 1;
- while(equal != 0)
- {
- _clearscreen(_GCLEARSCREEN);
- /* Bildschirmaufbau */
- tfenster(1,1,25,79);
- m_fzeil(3,1,79);
- m_fzeil(19,1,79);
- _settextposition(2,18);
- printf(" W Ü R F E L D R E H ");
- beschr();
- _settextposition(10,10);
- printf("Wie heißen Sie ");
- printf("stop<ENTER> für Ende)?");
- _settextposition(14,10);
- gets(name);
- _settextwindow(4,2,18,78);
- _clearscreen(_GWINDOW);
- _settextwindow(1,1,25,80);
- equal = strcmpi(name,ende);
- /* Test auf Programmende (name=stop) */
- if(equal == 0)
- {
- _setvideomode(_DEFAULTMODE);
- /* Alten Bildschirmmodus herstellen */
- exit(0);
- }
- feldaufbau(); /* Aufbau des Spielfeldes */
- spielfeld();
- verdreh();
- spielfeld();
- dialog();
- ergeb();
- vorbeleg();
- }
- }
-
- int verdreh() {
- /* Gewünschtes Umordnen der Spielfeldmatrix m */
- int i;
- char zstring[80];
-
- dzahl = 0;
- while(dzahl < 1) {
- /* Ermitteln von dzahl (1 ... MAX_ZUF) */
- tfenster(9,33,15,75);
- _settextwindow(11,37,14,73);
- _clearscreen(_GWINDOW);
- _outtext("Wie viele Umordnungen \n");
- _outtext("sind erwünscht (1 ... 50) : ");
- _displaycursor(_GCURSORON);
- gets(zstring);
- dzahl = atoi(zstring);
- _displaycursor(_GCURSOROFF);
- if(dzahl > MAX_ZUF) dzahl = MAX_ZUF;
- if(dzahl < 0) dzahl = 0;
- /* dzahl kann nicht negativ sein */
- _settextwindow(9,33,15,75);
- _clearscreen(_GWINDOW);
- _settextwindow(1,1,25,80);
- }
-
- /* Erzeugen der Zufallszahlen und Ändern */
- /* der Belegung der Spielfeldmatrix m[WZAHL][6] */
- for (i = 0; i < dzahl; i++) {
- ranval[i] = rand()%DREH + 1; };
- for (i = 0; i < dzahl; i++) {
- dreh_bed = kontr[ranval[i] - 1];
- drehung(); };
- }
-
- int dialog() {
- /* Dialog zur Erstellung der Ausgangsbelegung */
- int i, num;
-
- punkt = 0; richtig = 0;
- while(richtig == 0) {
- tfenster(9,35,14,68);
- _settextwindow(11,40,13,66);
- _outtext("Eingabe der Drehung : ");
- gets(strein);
- _clearscreen(_GWINDOW);
- for (i = 0; i < DREH; i++) {
- num = strnicmp(strein, zuege[i], 2);
- if (num == 0) {
- dreh_bed = kontr[i];
- _settextwindow(1,1,25,80);
- drehung();
- spielfeld();
- punkt++;
- break; }
- }
- _settextwindow(9,35,16,76);
- _clearscreen(_GWINDOW);
- _settextwindow(1,1,25,80);
- }
- }
-
- int drehung() {
- /* Umordnung der Spielfeldmatrix m und Prüfung, */
- /* ob die Ausgangsbelegung wieder erreicht ist. */
- int hilf, i, sp, zl;
-
- switch(dreh_bed) {
- case'1':
- case'4': sp = 0; break;
- case'2':
- case'5': sp = 1; break;
- case'3':
- case'6': sp = 2; break;
- case'7':
- case'a': zl = 0; break;
- case'8':
- case'b': zl = 3; break;
- case'9':
- case'c': zl = 6; break;}
-
- switch(dreh_bed) {
- case'1':
- case'2':
- case'3': for (i = 0; i < WDIM; i++) {
- hilf = m[sp][5];
- m[sp][5] = m[sp][1];
- m[sp][1] = m[sp][0];
- m[sp][0] = m[sp][4];
- m[sp][4] = hilf;
- sp += WDIM; } break;
- case'4':
- case'5':
- case'6': for (i = 0; i < WDIM; i++) {
- hilf = m[sp][5];
- m[sp][5] = m[sp][4];
- m[sp][4] = m[sp][0];
- m[sp][0] = m[sp][1];
- m[sp][1] = hilf;
- sp += WDIM; } break;
- case'7':
- case'8':
- case'9': for (i = 0; i < WDIM; i++) {
- hilf = m[zl][5];
- m[zl][5] = m[zl][2];
- m[zl][2] = m[zl][0];
- m[zl][0] = m[zl][3];
- m[zl][3] = hilf;
- zl++; } break;
- case'a':
- case'b':
- case'c': for (i = 0; i < WDIM; i++) {
- hilf = m[zl][5];
- m[zl][5] = m[zl][3];
- m[zl][3] = m[zl][0];
- m[zl][0] = m[zl][2];
- m[zl][2] = hilf;
- zl++; }; break;
- }
- /* Vergleich der Ergebnisvektorwerte erg[i] */
- /* mit den Matrixwerten m[i][5] mit i=0 ... 5 */
- hilf = 0;
- for (i = 0; i < WZAHL; i++) {
- if (erg[i] == m[i][5]) hilf++;}
- if (hilf == WZAHL) richtig++;
- }
-
- int vorbeleg() {
- /* Vorbelegen der Spielfeldmatrix */
- int i, j;
-
- for (i = 0; i < WZAHL; i++) {
- for (j = 0; j < 6; j++) {
- m[i][j] = vorbel[j]; }}
- for (i = 0; i < WZAHL; i++) { erg[i] = 6; }
- /* Belegen des Ergebnisvektors */
- }
-
- int feldaufbau() { /* Aufbau des Spielfeldes */
- /* Zeilen- und Spaltenbeschriftung */
- tfenster(7,10,16,29);
- _settextposition(7,17); printf("╦");
- _settextposition(8,17); printf("║S P A L T E");
- _settextposition(9,17); printf("║ 1 2 3");
- _settextposition(11,12); printf("Z 1");
- _settextposition(12,12); printf("E");
- _settextposition(13,12); printf("I 2");
- _settextposition(14,12); printf("L");
- _settextposition(15,12); printf("E 3");
- /* Ziehen der Linien des Würfelfeldes */
- _settextposition(10,10); cputs(sfeld_1);
- _settextposition(11,17); cputs(sfeld_2);
- _settextposition(12,17); cputs(sfeld_3);
- _settextposition(13,17); cputs(sfeld_2);
- _settextposition(14,17); cputs(sfeld_3);
- _settextposition(15,17); cputs(sfeld_2);
- _settextposition(16,17); cputs(sfeld_4);
- }
-
- int beschr() {
- /* Spielregeln im unteren Bildschirmteil */
- _settextposition(20,10); printf("Mögliche ");
- printf("Drehungen (jeweils um 90 Grad) :");
- _settextposition(21,10);
- printf("Spaltendrehung: L = Links R = Rechts");
- _settextposition(22,10);
- printf("Zeilendrehung O = nach oben");
- _settextposition(23,22);
- printf("U = Drehung einer Zeile nach unten");
- _settextposition(24,10);
- printf("z.B.: O1=Zeile 1 um 90 Grad nach oben");
- }
-
- int ergeb() {
- /* Ausgabe des Ergebnisses am Bildschirm */
- int hilf, hilf2, h3;
- hilf = strlen(name); h3 = 0;
- tfenster(6,35,16,76); m_fzeil(14,35,42);
- if (hilf < 10) {
- _settextposition(8,38);
- printf("Ergebnisse des Spielers %s !",name);}
- else {
- hilf2 = 38 + (38 - hilf) / 2; h3 = 7;
- _settextposition(8,38+h3);
- printf("Ergebnisse des Spielers");
- _settextposition(9,hilf2);
- printf("%s",name); }
- _settextposition(11,38+h3);
- printf("Zahl der Umordnungen : %d ",dzahl);
- _settextposition(12,38+h3);
- printf(" Benötigte Züge : %d",punkt);
- _settextposition(15,38);
- printf("Bitte drücken Sie die <ENTER>-Taste");
- getchar();
- }
-
- int titelbild() {
- /* Titel am Bildschirm darstellen */
- /* Aufforderung zum drücken einer Taste */
- tfenster(21,18,23,63);
- _settextposition(22,21);
- printf(" Bitte drücken Sie die <ENTER>-Taste!");
- _settextposition(8,30); printf(" WÜRFELDREH");
- tfenster(6,25,12,55); tfenster(5,22,13,58);
- tfenster(3,18,15,62);
- _settextposition(22,60);
- while(!kbhit()); getch();
- _clearscreen(_GCLEARSCREEN);
- }
-
- int spielfeld() {
- /* Belegen des Spielfeldes mit den Würfelwerten */
- int spaltnr, zeilnr = 9, j, k, zaehler=0;
- for (j = 0; j < WDIM; j++) {
- zeilnr += 2; spaltnr = 15;
- for (k = 0; k < WDIM; k++) {
- spaltnr += 4;
- _settextposition(zeilnr,spaltnr);
- printf("%d", m[zaehler][5]); zaehler++;}
- }
- }
-
- int tfenster(lo_y, lo_x, ru_y, ru_x)
- /* Zeichnen eines Fensterrahmens */
- int lo_x, lo_y, ru_x, ru_y;
- {
- char str_breit[85];
- int i,f_breite,f_hoehe;
- f_breite = ru_x - lo_x + 1;
- f_hoehe = ru_y - lo_y + 1;
- strncpy(str_breit, ol, 2);
- strncat(str_breit, ou, f_breite - 2);
- strncat(str_breit, or, 1);
- _settextposition(lo_y, lo_x);
- cputs(str_breit);
- for (i = lo_y + 1; i < ru_y; i++) {
- _settextposition(i, lo_x);
- printf("%s", vert);
- _settextposition(i, ru_x);
- printf("%s", vert); }
- strncpy(str_breit, ul, 2);
- strncat(str_breit, ou, f_breite - 2);
- strncat(str_breit, ur, 1);
- _settextposition(ru_y, lo_x);
- cputs(str_breit);
- }
-
- int m_fzeil(l_y, l_x, m_len) int l_x, l_y, m_len;
- /* Zeichnen eines horiz. Fenstertrennteiles */
- {
- char str_breit[85];
- strncpy(str_breit, ml, 2);
- strncat(str_breit, ou, m_len - 2);
- strncat(str_breit, mr, 1);
- _settextposition(l_y, l_x);
- cputs(str_breit);
- }
- /* -------------------------------------------- */
- /* Ende von WDREH.C */
-
-