Rafahl_r Δημοσ. 25 Ιουνίου 2013 Δημοσ. 25 Ιουνίου 2013 Γνωρίζει κάποιος πως μπορώ να κάνω ένα κείμενο όταν φτάσει στα όρια της κονσόλας να μην πηγαίνει από κάτω? απλά να εξαφανίζεται. φανταστείτε 1 τρένο να ξεκινάει από αριστερά προς δεξιά στην οθόνη, θέλω να μετακινηθεί δεξιά μέχρι να μείνει το τελευταίο βαγόνι στην οθόνη. το πρόβλημα είναι ότι αν πχ έχω 3 βαγόνια, θα φτάσει το 1ο βαγόνι στα όρια και θα αναδηπλωθεί, αυτό θα χαλάσει όλο το σχήμα θέλω να προσομοιώσω την λειτουργία του τρένου, κάθε φορά το τρένο θα αφήνει το τελευταίο βαγόνι! - Θεωρώ ότι το τρένο ξεκινάει από τέρμα αριστερά και τέρμα δεξιά είναι η αφετηρία του τελευταίου βαγονιού. for(int i=0; i < WIDTH; i++) { SetWidth(i); // Let some space on left side on each print for( int k=0; k < 4; k++) { StackPop(OutputStack, city, &x); printf(" %s ", city); } printf("\n"); SetWidth(i); // Let some space on left side on each print for( int k=0; k < 4; k++) printf(" ----------------- "); printf("\n"); SetWidth(i); // Let some space on left side on each print for(int k=1; k < 4; k++) printf(" | | "); printf(" | | \n"); SetWidth(i); // Let some space on left side on each print for(int k=1; k < 4; k++) printf(" | o o | "); printf(" | o o | \n"); Sleep(500); system("cls"); } το πρόβλημα με τον πάνω κώδικα είναι ότι όταν φτάσει στα όρια της κονσόλας αναδηπλώνεται και χαλάει όλο το σχήμα! αν μπορούσαμε να το κάνουμε απλά να συνεχίζει δεξιά, να κρύβεται δηλαδή θα ήμουν ευτυχισμένος.
Rafahl_r Δημοσ. 25 Ιουνίου 2013 Μέλος Δημοσ. 25 Ιουνίου 2013 Σκέφτηκα να αναπαραστήσω την κονσόλα με έναν πίνακα Width * Height και πολύ απλά να δουλέψω πάνω στον πίνακα και στο τέλος να κάνω Draw (Print) τον πίνακα. - Αν θέλω να μετακινήσω κάποιο κείμενο, πολύ απλά θα το ρίξω έξω από τα όρια της "Γραμμης" έστω ότι θέλω να scrollarw αυτό το κείμενο, να αφήσω μόνο το H στην οθόνη [][Η][Ε][Λ][Λ][Ο][][][][] Αυτό που θα κάνω είναι να μετακινήσω τους δείκτες [][][][][][][][][][Η]ello όπου [] είναι ο πίνακας, ότι είναι εκτός [] σημαίνει ότι δεν υπάρχει πλεον στον πίνακα, άρα δεν θα γίνονται Print! Πολύ ωραία! αυτό θα μπορούσε να είναι extra άσκηση! κάνω 2 ασκήσεις σε 1, τι να κάνω όμως! είναι αναγκαίο για την προσομοίωση
parsifal Δημοσ. 25 Ιουνίου 2013 Δημοσ. 25 Ιουνίου 2013 Καλημέρα! Αν κατάλαβα καλά, δουλεύεις με plain C κώδικα χωρίς να χρησιμοποιείς κάποια GUI βιβλιοθήκη (π.χ. Win32 subsystem) που θα σου επέτρεπε να ρυθμίσεις κατάλληλα το παράθυρο του τερματικού (ή αν δεν ήταν τερματικό αλλά GUI application, κάποιο εσωτερικό text field control όπου θα τυπώνονταν τα μηνύματά σου) για να μην κάνει text wrap. Λογικά δεν πρέπει να έχεις ούτε και έλεγχο στο πλάτος γραμμής του τερματικού σου. Πάντως το default των τερματικών σε Windows και σε Linux είναι συνήθως 80x25. Δηλαδή 25 γραμμές με πλάτος 80 χαρακτήρων έκαστη. Θα μπορούσες λοιπόν να τυπώνεις μόνο τους πρώτους 80 χαρακτήρες από κάθε line string ώστε να εξομοιώσεις τη λειτουργία που θέλεις. Τώρα, τί θα γίνει σε περίπτωση που κάποιος κάνει resize το παράθυρο του τερματικού είναι άλλη ιστορία...
Rafahl_r Δημοσ. 25 Ιουνίου 2013 Μέλος Δημοσ. 25 Ιουνίου 2013 Ναι αυτό θα κάνω! για την ώρα έχω το παράθυρο (Console32) 110Χ45 και δεν έχει πρόβλημα, μπορώ να εμφανίσω εως και 110 χαρακτήρες στην σειρά. Για να κάνω την ζωή μου εύκολη, πολύ απλά θα δουλεύω γραμμή γραμμή, δηλαδή θα έχω έναν πίνακα 110 θέσεων και όταν θελήσω να κάνω Scroll το Text δεξιά, απλά γεμίζω αριστερά με κενά τον πίνακα. Εδώ είναι μια πολύ γρήγορη-μπακαλίστικη υλοποίηση που δουλεύει #include "stdafx.h" #include <string> #include <Windows.h> using namespace std; #define CONSOLE_WIDTH 80 void ShiftText(string str, int times) { string pStr = ""; // Initialize string with spaces for(int i=0; i < CONSOLE_WIDTH; i++) pStr += " "; // Put our text on the right position on array for(int i=0; i < str.size(); i++) pStr[i + times] = str[i]; // This will cut last position (each character go out of Χ-Axis 80) pStr.resize(CONSOLE_WIDTH); printf("%s", pStr.c_str()); } int _tmain(int argc, _TCHAR* argv[]) { for(int i=0; i < CONSOLE_WIDTH; i++) { ShiftText("Hello How Are You", i); Sleep(50); system("cls"); } return 0; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα