Игра Виселица (с исходным кодом на Си)

Виселица (Hangman) - всем известная логическая игра, в которой нужно отгадать по буквам слово. Угадывать буквы нужно верно, в противном случае к нарисованной виселице будут добавляться детали. Если виселица соберётся полностью - вы проиграете.

На нашем сайте вы можете бесплатно скачать игру Виселица для Windows, со словарём более 2000 слов, и её исходный код (созданный на Visual Basic 6 и Си)!




Исходный код на Си (файл со словами в скачиваемом архиве):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void hangman(int n){ //функция выводящая на экран изображение виселицы
    switch (n) {
    case 9: printf("  ____ |\n |   | |\n |   O |\n |  /|\\|\n_|_ / \\|  "); break;
    case 8: printf("  ____ |\n |   | |\n |   O |\n |  /|\\|\n_|_ /  |  "); break;
    case 7: printf("  ____ |\n |   | |\n |   O |\n |  /|\\|\n_|_    |  "); break;
    case 6: printf("  ____ |\n |   | |\n |   O |\n |  /| |\n_|_    |  "); break;
    case 5: printf("  ____ |\n |   | |\n |   O |\n |   | |\n_|_    |  "); break;
    case 4: printf("  ____ |\n |   | |\n |   O |\n |     |\n_|_    |  "); break;
    case 3: printf("  ____ |\n |     |\n |     |\n |     |\n_|_    |  "); break;
    case 2: printf("       |\n |     |\n |     |\n |     |\n_|_    |  "); break;
    case 1: printf("       |\n       |\n       |\n       |\n___    |  "); break;
    case 0: printf("       |\n       |\n       |\n       |\n       |  "); break;
    }
}
int main()
{
    system("chcp 1251");
    system("cls");
    FILE* txt;
    char word[80], enterLetter[33] = {0}, scanChar;
    double buffer;
    int i, flag = 0, sizeFile = 0, rndStr, sizeWord, guessChar, guessErr = 0, countLetter = 0;
    srand(time(NULL));
    if (!(txt = fopen("slova.txt", "r"))){ // проверяем открыт ли файл со словами
        printf("Ошибка открытия файла!");
        return 1;
    }
    while (fscanf(txt, "%s", &buffer) != EOF) // получаем количество строк к файле со словами
        sizeFile++;
    rndStr = rand() % sizeFile; // получаем случайный номер строки из файла
    fseek(txt, 0, SEEK_SET); // переводим курсор на начало файла
    for (i = 0; i < rndStr; i++) // получаем случайную строку с номером rndStr (это будет загаданное слово)
        fscanf(txt, "%s", word);
    fclose(txt);
    sizeWord = strlen(word); // получаем количество букв в строке
    char *secretWord = (char*)calloc(sizeWord, sizeof(char)); // динамически задаём второй массив, в котором будут показываться отгаданные буквы
    memset(secretWord, '_', sizeWord); // заполняем его нижними подчёркиваниями
    guessChar = sizeWord;
    while (guessChar >= 0 && guessErr <= 9) {
        if (flag == 1){guessErr++;} // флаг равен 1 при не отгаданной букве
        system("cls");
        hangman(guessErr);
        if (guessChar == 0){ // если количество не отгаданных букв = 0, то победа
            printf("%s", word);
            printf("\nВы победили!");
            free(secretWord);
            getchar();
            return 0;
        }
        if (guessErr == 9){ // если количество ошибочно отгаданных букв = 9, то поражение
            printf("%s", word);
            printf("\nВы проиграли(");
            free(secretWord);
            getchar();
            return 0;
        }
        printf("%s", secretWord);
        printf("\nВведённые буквы:\n");
        printf("%s", enterLetter);
        printf("\nВведите букву: ");
        scanChar = getchar();
        getchar();
        if (!((((int)scanChar >= -64 && (int)scanChar <= -33) || (int)scanChar == -88) || (((int)scanChar >= -32 && (int)scanChar <= -1) || (int)scanChar == -72))){ // символы не русского алфавита не учитываются
            continue;
        } else if ((int)scanChar >= -32 && (int)scanChar <= -1) { // строчные буквы преобразуются в прописные
            scanChar = (char)((int)scanChar - 32);
        } else if ((int)scanChar == -72) { // для буквы ё
            scanChar = (char)(-88);
        }
        flag = 1;
        for (i = 0; i < sizeWord; i++){ // цикл проверяет каждую букву на соответствие введённой
            if (word[i] == scanChar) {
                if (!(strchr(secretWord + i, scanChar))) { // если такая буква ещё не была отгадана, то выполняется
                    flag = 0;
                    guessChar--;
                    secretWord[i] = word[i];
                }
            } else if (strchr(enterLetter, scanChar)) { // если буква уже была введена
                flag = 0;
            }
        }
        if (!(strchr(enterLetter, scanChar))) // запись в массив введённых букв
            enterLetter[countLetter++] = scanChar;
    }
    free(secretWord);
    return 0;
}



Реклама