Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

gra sokoban tzn magazynier i prosba o pomoc

Ostatnio zmodyfikowano 2009-06-03 18:11
Autor Wiadomość
kwas27
Temat założony przez niniejszego użytkownika
gra sokoban tzn magazynier i prosba o pomoc
» 2009-06-03 17:12:34
napisalem gre magazynier troszke kodu posiagalem z netu ale prosba jest moja taka musze zrobic jeszcze ekran powitalny do tej gry lecz mam problem bo nie chce mi dzialac chodz jest potencjalnie prawidlowo wstawiony na dole jest kod programu czekam na sugestie


C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <sstream>  // for itos function
#include <conio.h> // for getch() function

using namespace std; // required for MS Visual C++ compiler Version 6.0


// For 10x10 array
const int x = 10;
const int y = 10;

char oGrid[ x ][ y ]; // Array to prevent erasing the 'o's

// Function declarations
bool main_menu( bool, int & ); // Menu
char load_level( char[ x ][ y ], int &, int &, int &, int &, int &, string ); // Loads level
void draw_level( char[ x ][ y ], int & ); // Draws level
char move( char[ x ][ y ], bool &, int &, int &, int &, int & ); //The engine
std::string itos( int arg ); //Conversion function


// *****************************
// Main Program
int main()
{
    char grid[ x ][ y ]; // Create a 2d (10x10) array
    int eTotal; // Amount of e's player currently has
    int eAmount; // Total amount of e's
    int moves; // Number of moves gamer has made
    bool level_finished, play_game = true;
    int pusherX, pusherY; // stored position of 'a'(current position)
    string level;
    int n = 1; // level number; initialized to 1
   
    // Main game loop - ends when user exits
    while( play_game )
    {
        play_game = main_menu( play_game, n ); // load menu
       
        if( play_game )
        {
            level_finished = false;
            level = "levels\\level"; // Loads level
            level += itos( n );
            level += ".txt";
            load_level( grid, pusherX, pusherY, eTotal, eAmount, moves, level );
        }
        else
             level_finished = true;
       
        while( !level_finished ) // play game
        {
            draw_level( grid, moves );
            move( grid, level_finished, pusherX, pusherY, eTotal, moves );
           
            if( eTotal == eAmount ) // when player wins
            {
                n++;
                draw_level( grid, moves );
                cout << "Gratuluje przeszedles level! - nacisnij dowolny guzik by grac dalej.\n\n\n";
                getch();
               
                cout << endl << level << endl;
               
                // Increments to new level
                level = "levels\\level";
                level += itos( n );
                level += ".txt";
                load_level( grid, pusherX, pusherY, eTotal, eAmount, moves, level );
            }
        }
    }
   
    return 0;
}


// *****************************
// Displays Menu
bool main_menu( bool play_game, int & level )
{
    bool exit = false; // exit menu
    int ch = 0; // for getch()
    play_game = false; // returned when function ends
   
    while( !exit )
    {
        // main menu
        cout << "\n cultowa gra magazynier - Menu\n";
        cout << "********************\n";
        cout << "1) Zalacz ta odlotowa gre\n";
        cout << "2) wybierz poziom\n";
        cout << "3) Krotka instrukcja\n";
        cout << "4) Wyjscie\n";
       
        do { ch = _getch(); } // get only keys that i want,
        while( ch != '1' &&
        ch != '2' &&
        ch != '3' &&
        ch != '4' );
       
        switch( ch )
        {
        case '1': // Play New Game
            ch = - 1;
            play_game = true;
            exit = true;
            break;
        case '2': // Select Level
            ch = - 1;
            cout << "wybierz poziom od (1-5): ";
            cin >> level;
            break;
        case '3': // Display Instructions
            ch = - 1;
            cout << endl << endl <<
            "................. jest to program zaliczeniowy\n"
            "na zajecia Metody i Jezyki programowania II. \n"
            "\n"
            "magazynier.cpp\n"
            "versja pierwsza i chyba ostatnia\n"
            "kompilowany pod: Windows\n"
            "\n"
            "\n"
            "To jest teks ktory wyjasni co i jak- otwarles gre magazynier w ktora mozesz grac w konsoli\n"
            "\n"
            "Na planszy jestes jako litera 'a'. Musisz tak manewrowac literka zeby przepchac wszystkie diamenty w miejsc 'o' .\n"
            "\n"
            "Robisz to raz jesli przeszeldes poziom przechodzisz do nastepnego poziomu.\n"
            "\n"
            "gra jest bardzo prosta mam nadzieje ze bedzie Ci sie podobac i bedziesz sie milo i fajnie bawic. \n"
            "\n"
            "Powodzenia i milej gry!\n"
            "\n"
            "\n"
            "Poruszanie sie: strzalka w gore (ruch w gore), strzalka w dol (ruch w dol), lewa strzalka (ruch w lewo),\n"
            "prawa strzalka (ruch w prawo), esc (oznacza jednoznaczne wyjscie).\n\n";
            break;
        case '4': // Exit
            ch = - 1;
            exit = true;
            play_game = false;
            break;
        default:
            break;
        }
    }
    return play_game;
}



// *********************
// Loads the level
char load_level( char grid[ x ][ y ], int & pusherX, int & pusherY,
int & eTotal, int & eAmount, int & moves, string level )
{
    int i, j;
    eTotal = 0;
    eAmount = 0;
    moves = 0;
   
    // Initializes oGrid to 0
    for( i = 0; i < 10; i++ ) {
        for( j = 0; j < 10; j++ ) {
            oGrid[ i ][ j ] = ' ';
        }
    }
   
    /* Get file */
    char key; // stores character
    string moo;
    ifstream file; // declare a stream
   
    file.open( level.c_str() ); // opens file, c_str converts string to const char
    do // extracts all characters and prints them
    {
        file.get( key );
        if( int( key ) >= 32 && int( key ) <= 126 ) {
            moo += key;
        }
    } while( !file.eof() );
   
    file.close(); // close file
    /* End of Get file */
   
    // Main load loop
    for( i = 0; i < 10; i++ ) {
        for( j = 0; j < 10; j++ ) {
           
            grid[ i ][ j ] = moo.at(( i * 10 ) + j );
           
            if( grid[ i ][ j ] == 'a' ) // Stores 'a' position
            {
                pusherX = i;
                pusherY = j;
            }
           
            if( grid[ i ][ j ] == 'e' ) // Adds total amount of e's
                 eAmount++;
           
            if(( grid[ i ][ j ] == 'o' ) ||( grid[ i ][ j ] == '@' ) ) // Stores o's
                 oGrid[ i ][ j ] = 'o';
           
            if(( grid[ i ][ j ] == '@' ) ) // Stores 'o's
            {
                oGrid[ i ][ j ] = 'o';
                eTotal++;
                eAmount++;
            }
        }
    }
    return grid[ x ][ y ];
}



// ******************************************
// draws the level
void draw_level( char grid[ x ][ y ], int & moves )
{
    int i, j;
    system( "cls" ); // Clear screen
   
    // draw body
    for( i = 0; i < 10; i++ ) {
        for( j = 0; j < 10; j++ ) {
           
            switch( grid[ i ][ j ] ) {
            case ' ': // space
                cout << setw( 2 ) << " ";
                break;
            case '|':
                cout << setw( 2 ) << "|";
                break;
            case '-':
                cout << setw( 2 ) << "-";
                break;
            case '*':
                cout << setw( 2 ) << "*";
                break;
            case 'e':
                cout << setw( 2 ) << char( 4 ); // Diamond
                break;
            case 'o':
                cout << setw( 2 ) << "o";
                break;
            case '@':
                cout << setw( 2 ) << char( 15 ); // Hole
                break;
            case 'a':
                cout << setw( 2 ) << "a";
                break;
            case '/':
                cout << setw( 2 ) << "/";
                break;
            }
        } cout << endl;
    }
    cout << "\n\n\nMoves: " << moves << "\n";
    //cout << "Blocks gathered: " << eTotal << "\n"
    //<< "Total blocks needed: " << eAmount << "\n";
}


// **************************************************************************
// Function moves character around.  Also does a lot of logic checking.
// Currently, you must put a non-move character on the side of the level if you
// don't won't the 'a' to overlap into the next line
char move( char grid[ x ][ y ], bool & quit, int & pusherX, int & pusherY,
int & eTotal, int & moves )
{
    char ch, direction, go_or_not;
    int tempX, tempY; // temp holder for pusherX and pusherY
    int xPosition, yPosition; // temp value for 'e' and '@'
    int i, j, ch2; // temp value for 'o'
   
    i = pusherX;
    j = pusherY;
   
    do { ch = _getch(); // key-capture
        ch2 = int( ch ); }
   
    while( ch2 != 72 && //up
    ch2 != 75 && //left
    ch2 != 80 && //down
    ch2 != 77 && //right
    ch2 != 27 ); //esc
   
    switch( ch2 )
    {
    case 72: // Up
        ch = - 1;
        xPosition = - 1;
        yPosition = 0;
        tempX = pusherX + xPosition;
        tempY = pusherY + yPosition;
        direction = 'w';
        break;
    case 80: // Down
        ch = - 1;
        xPosition = 1;
        yPosition = 0;
        tempX = pusherX + xPosition;
        tempY = pusherY + yPosition;
        direction = 's';
       
        break;
    case 75: // Left
        ch = - 1;
        yPosition = - 1;
        xPosition = 0;
        tempY = pusherY + yPosition;
        tempX = pusherX + xPosition;
        direction = 'a';
        break;
    case 77: // Right
        ch = - 1;
        yPosition = 1;
        xPosition = 0;
        tempY = pusherY + yPosition;
        tempX = pusherX + xPosition;
        direction = 'd';
        break;
    case 27: // Quit
        ch = - 1;
        quit = true;
        cout << "Wychodzeni...\n";
        return 0;
        break;
    default:
        break;
    }
   
    // If 'e' is not blocked, then allow it to move
    if( grid[ tempX ][ tempY ] == 'e' )
    {
        if(( grid[ tempX + xPosition ][ tempY + yPosition ] == ' ' ) ||( grid[ tempX + xPosition ][ tempY + yPosition ] == 'o' ) )
        {
            if( grid[ tempX + xPosition ][ tempY + yPosition ] == 'o' )
            {
                grid[ tempX + xPosition ][ tempY + yPosition ] = '@';
                grid[ tempX ][ tempY ] = ' ';
                eTotal++; // add to total blocks solved
            }
            else
            {
                grid[ tempX + xPosition ][ tempY + yPosition ] = 'e';
                grid[ tempX ][ tempY ] = ' ';
            }
        }
    }
   
    // If '@' is not blocked, then allow it to move
    if( grid[ tempX ][ tempY ] == '@' )
    {
        if(( grid[ tempX + xPosition ][ tempY + yPosition ] == ' ' ) ||( grid[ tempX + xPosition ][ tempY + yPosition ] == 'o' ) )
        {
            if( grid[ tempX + xPosition ][ tempY + yPosition ] == 'o' )
            {
                grid[ tempX + xPosition ][ tempY + yPosition ] = '@';
                grid[ tempX ][ tempY ] = ' ';
            }
            else
            {
                grid[ tempX + xPosition ][ tempY + yPosition ] = 'e';
                grid[ tempX ][ tempY ] = ' ';
                eTotal--; // remove from total blocks solved
            }
        }
    }
   
    // Can we move to this block?
    if(( grid[ tempX ][ tempY ] == ' ' ) ||( grid[ tempX ][ tempY ] == 'o' ) )
    {
        go_or_not = direction;
        moves++;
    }
   
    // Moving the 'a' (player)
    switch( go_or_not )
    {
    case 'n':
        break;
    case 'w':
        grid[ pusherX ][ pusherY ] = ' ';
        grid[ pusherX - 1 ][ pusherY ] = 'a';
        pusherX--;
        xPosition++; // for 'o'
        break;
    case 's':
        grid[ pusherX ][ pusherY ] = ' ';
        grid[ pusherX + 1 ][ pusherY ] = 'a';
        pusherX++;
        xPosition--; // for 'o'
        break;
    case 'a':
        grid[ pusherX ][ pusherY ] = ' ';
        grid[ pusherX ][ pusherY - 1 ] = 'a';
        pusherY--;
        yPosition++; // for 'o'
        break;
    case 'd':
        grid[ pusherX ][ pusherY ] = ' ';
        grid[ pusherX ][ pusherY + 1 ] = 'a';
        pusherY++;
        xPosition--; // for 'o'
        break;
    default:
        break;
    }
   
    // show 'o' if hidden; making sure we don't erase them o's
    if(( oGrid[ i ][ j ] == 'o' ) &&( grid[ i ][ j ] == ' ' ) )
         grid[ i ][ j ] = 'o';
   
    return grid[ x ][ y ];
}


// Function converts int to string
std::string itos( int arg )
{
    std::ostringstream buffer;
    buffer << arg; // send the int to the ostringstream
    return buffer.str(); // capture the string
}
P-7406
DejaVu
» 2009-06-03 17:30:33
Hm... http://www.codeuu.com/Shellsok_-_Multi-Platformed_Text-Based_Sokoban_Game

/edit:
napisalem gre magazynier troszke kodu posiagalem z netu (...)
Mocne słowa.
P-7408
kwas27
Temat założony przez niniejszego użytkownika
no oka
» 2009-06-03 17:58:57
no dobra nie bylem do konca szczery sciaglem wszystko:( ale pomoze ktos?
P-7411
pixelmaster
» 2009-06-03 18:11:48
na początku maina wyświetlasz tekst czekasz na naciśnięcie klawisza, czyścisz po nim ekran i lecisz dalej
P-7413
« 1 »
  Strona 1 z 1