"Быки и коровы"

Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.04.2021
Размер файла 799,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

"Московский технологический университет"

МИРЭА

Кафедра общей информатики

Курсовая работа на тему

Основы программирования

«Быки и коровы»

Выполнила студентка Грубова А.А.

Шифр 19К0395

Группа КУБО-01-19

Преподаватель Карпов Д.А.

Москва 2020 г.

Оглавление

программа игра бык корова

Введение и постановка задачи

Основная часть

1.1 Применяемое программное обеспечивание

1.2 Описание работы программы

1.3 Алгоритм программы

1.4 Описание интерфейса пользователя программы

1.4.1 Текстовые поля.

1.4.2 Поля ввода

1.4.3 Таблицы

1.4.4 Кнопки

1.5 Результаты тестирования программы

1.6 Руководство пользователя

1.6.1 Назначение и область применения

1.6.2 Краткое описание возможностей

1.6.3 Уровень подготовки пользователя

1.7 Список сообщений об ошибках

1.7.1 Ошибка ввода некорректных данных

1.7.2 Ошибка при сохранении данных

1.7.3 Ошибка открытия файла

Заключение

Список информационных источников

Приложение

Введение и постановка задачи

В соответствии с темой курсовой проекта «Быки и коровы» необходимо разработать программу, которая соответствует следующим правилам и выполняет данные требования:

· В игре принимает участие пользователь и компьютер, каждый из которых в начале игры загадывает четырёхзначное число. Цифры в загаданном числе не должны повторяться;

· Противники по очереди пытаются отгадать число оппонента, задавая вопрос в таком же формате четырёхзначного числа;

· Противник в ответе должен указать количество быков и коров. Бык -- это угаданная цифра на правильной позиции, а корова -- это правильная цифра, но не на своей позиции;

· Обмен вопросов - ответов идёт до тех пор, пока кто-то первым не разгадает число противника.

Также программа должна иметь возможность записать в файл и выводить из файла в программу прогресс пользователя.

Основная часть

1.1 Применяемое программное обеспечивание

Qt -- это кроссплатформенный фреймворк для разработки ПО на языке программирования C++ (и не только). Также имеется и для Ruby -- QtRuby, для Python -- PyQt, PHP -- PHP-Qt и других языков программирования. Разрабатывается компанией Trolltech с 1996 года.

Рис. 1 Интерфейс Qt

С использованием этого фреймворка написано множество популярных программ: 2ГИС для Android, Kaspersky Internet Security, Virtual Box, Skype, VLC Media Player, Opera и другие. KDE -- это одно из окружений рабочего стола со множеством программ для Linux написано с использованием фреймворка Qt.

Qt полностью объектно-ориентированная, кроссплатформенная. Дает возможность разрабатывать платформонезависимое ПО, написанный код можно компилировать для Linux, Windows, Mac OS X и других операционных систем. Включает в себя множество классов для работы с сетью, базами данных, классы-контейнеры, а также для создания графического интерфейса и множество других.

В Qt имеется огромный набор виджетов (Widget), таких как: кнопки, прогресс бары, переключатели, checkbox, и другие -- они обеспечивают стандартную функциональность GUI (графический интерфейс пользователя).

Рис. 2 Виджеты Qt.

Библиотека Qt состоит из различных модулей, которые подключаются при помощи директивы #include. В состав входят:

QtCore -- классы ядра библиотеки Qt, они используются другими модулями.

QtGui -- модуль содержит компоненты графического интерфейса.

QtNetwork -- модуль содержит классы для работы с сетью. В него входят классы для работы с протоколами FTP, HTPP, IP и другими.

QtOpenGL -- модуль содержит классы для работы с OpenGL

QtSql -- содержит классы для работы с различными базами данных с использованием языка SQL.

QtSvg -- содержит классы, позволяющие работать с данными Scalable Vector Graphics (SVG)

QtXml -- классы для работы с XML

QtScript -- классы для работы с Qt Scripts

Имеются и другие модули.

В данный момент Qt распространяется по 3-м лицензиям: Qt Commercial (собственническая), GNU GPL, GNU LGPL.

1.2 Описание работы программы

При запуске программа генерирует четырёхзначное число, которое должен угадать пользователь, заносит его в поле и скрывает. Пользователь вводит в программу четырёхзначное число, которое противник (компьютер) должен угадать для победы. Далее, пользователь вводит ещё одно четырёхзначное число, которое будет являться попыткой угадать число, загаданное противником. Происходит проверка каждого символа, введенного пользователем в доступные поля. При вводе некорректного значения поле очищается, и пользователю демонстрируется сообщение о некорректности введенных значений. Программа производит расчёт быков и коров пользователя и заносит данные значения и число в таблицы. Программа генерирует ещё одно четырёхзначное число, которое будет являться попыткой компьютера отгадать число пользователя. Происходит расчёт быков и коров компьютера, полученные значения и сгенерированное число заносятся в таблицы. «Угадывание» набора цифр соперника продолжается до тех пор, пока один из оппонентов не соберет 4 быка, т.е. введёт набор цифр соперника. При отгадывании кем-либо числа соперника проявляется поле с числом, которое компьютер сгенерировал при компиляции, и изменяется рейтинг.

Программа предоставляет возможность начать игру заново, сохраняя рейтинг (кнопка «Новая игра») и обнуляя его (кнопка «Обнулить рейтинг»).

Также предоставлена возможность загрузить игру в файл. При нажатии на кнопку «Сохранить игру» создаётся и открывается файл или просто открывается, если файл был создан заранее. Программа проверяет, был ли файл открыт. Если нет, то уведомляет об этом пользователя и прекращает работу с файлом. При удачном открытии файла программа записывает в него количество сделанных ходов, числа пользователя и компьютера, рейтинг и все ходы соперников. Программа закрывает файл и перестаёт работать с ним.

Теперь опишем считывание данных из файла в программу. Программа открывает файл, выбранный пользователем. Если файл не удалось открыть, программа оповещает пользователя об этом. Если файл удачно открылся, то программа начинает построчно считывать данные из файла, разбивая их на элементы массива, и заносит их в таблицы и поля. После этого программа закрывает файл и прекращает работу с ним.

1.3 Алгоритм программы

1.4 Описание интерфейса пользователя программы

Интерфейс программы представлен на основном окне в виде Qt Widget. На данном виджете размещена конфигурация, состоящая из таблиц, полей ввода, полей вывода и текстовых полей. Далее подробно разберём каждый элемент конфигурации.

Рис. 3 Интерфейс пользователя программы

1.4.1 Текстовые поля

На виджете размещены текстовые поля различного назначения. Во-первых, поля, которые несут в себе название поля ввода или другого текстового поля, расположенного ниже. Во-вторых, поля-инструкции, которые будут проявляются рядом с полями ввода и подсказывать пользователю, какие дальнейшие действия он должен сделать. После выполнения пользователем необходимых действий текстовое поле будет скрыто. В-третьих, поля-счетчики, которые показывают количество побед пользователя и компьютера.

Рис. 4 Текстовые поля 1

Рис. 5 Текстовые поля 2

1.4.2 Поля ввода

Пользователю доступны два поля ввода. Первое поле - это поле, в которое пользователь вводит загаданное им число. Именно это число в дальнейшем будет угадывать компьютер. Во второе поле пользователь заносит число, которое, по мнению пользователя, загадал компьютер. Число из поля автоматически переносится в таблицу, а поле очищается.

Рис. 6 Поле ввода для загаданного числа

Рис. 7 Поле ввода для попытки угадать число соперника

1.4.3 Таблицы

На виджете находится несколько таблиц. Первая таблица отображает количество ходов, совершённых оппонентами. В последующих трёх таблицах перечислены ходы пользователя, быки и коровы за этот ход. Аналогично представлены ходы компьютера в последних трёх таблицах.

Рис. 8 Таблица, содержащая количество ходов

Рис. 9 Таблицы ходов пользователя. Рис.10. Таблицы ходов компьютера

1.4.4 Кнопки

Также на виджете расположены 4 кнопки. Кнопка «Сохранить игру» записывает прогресс пользователя в выбранный или созданный файл. Кнопка «Загрузить игру» считывает данные из выбранного файла и заносит полученные данные в очищенные таблицы. Кнопка «Новая игра» очищает все таблицы и поля ввода. Кнопка «Обнулить рейтинг» работает аналогично кнопке «Новая игра» и, вдобавок, количество побед у пользователя и компьютера делает равным нулю.

Рис. 11 Кнопки на виджете

1.5 Результаты тестирования программы

Тестирование проводилось с тестовым набором данных, которые охватывают различные возможные ошибки потенциальных пользователей. В результате тестирования было выявлено, что программа является устойчивой ко всем видам потенциально возможным ошибок пользователей. Все предотвращенные ошибки перечислены в разделе «Список сообщений об ошибках». Ниже приведены промежуточные результаты тестирования.

Рис. 12 Результаты тестирования 1

Рис. 13 Результаты тестирования 2

Также в ходе тестирования были осуществлены попытки сохранения данных в формате .thf. Результаты приведены ниже.

Рис. 14 Результаты тестирования 3

Рис. 15 Результаты тестирования 4

1.6 Руководство пользователя

1.6.1 Назначение и область применения

Данная программа представляет собой реализацию популярной логической игры «Быки и коровы». Изначально данная игра была предназначена для двух человек, цель которых угадать задуманное соперником.

Игра предназначена для людей всех возрастов. Она развивает логическое мышление, умение сравнивать и анализировать.

Программа может быть использована пользователем для отвлечения от основной работы с целью отдыха.

1.6.2 Краткое описание возможностей

Данная программа даёт возможность пользователю сыграть в игру «Быки и коровы» против компьютера. Также пользователь может сохранять прогресс игры в файл в формате .thf, что даёт возможность читать незакодированные данные, и загружать ранее сохранённые данные.

1.6.3 Уровень подготовки пользователя

Пользователь должен иметь опыт работы с OC MS Windows (7, 8, 10), навык работы с Qt Creator и Google Chrome последней версии (для установки Qt Creator).

Квалификация пользователя должна позволять:

· пользоваться ПО Qt Creator;

· уметь сохранять и загружать файлы.

1.7 Список сообщений об ошибках

Программа выводит сообщение об ошибке в ответ на необычную или исключительную ситуацию, которую не может разрешить самостоятельно. В данном разделе будут подробно описаны сообщения об ошибках, выявленные во время тестирования.

1.7.1 Ошибка ввода некорректных данных

При попытке пользователя ввести в поля ввода какие-либо символы, кроме цифр, программа вызывает исключение, выводит сообщение об ошибке и прекращает функцию.

Рис. 16 Сообщение о вводе некорректных данных

1.7.2 Ошибка при сохранении данных

Если при попытке сохранить прогресс игры в файл, будет обнаружено, что пользователь изменял данные в таблице, программа вызовет исключение, сообщит об ошибке и завершит функцию.

Рис. 17 Сообщение об ошибке при сохранении

1.7.3 Ошибка открытия файла

Если при сохранении данных из обозреваемой программы в файл или загрузке данных, не удалось открыть файл, программа должна вызвать исключение, сообщить об ошибке и завершить функцию.

Рис. 18 Сообщение о невозможности открыть файл

Заключение

Разработка программы «Быки и коровы» требовала изучение теории, которая необходима для успешного выполнения задания, наличие определенного объема знаний по программированию на языке C++ и изучение среды разработки: фреймворка Qt Creator.

Кроме того, важными моментами при разработке программы являются описание спецификаций программы, алгоритма её реализации, хотя язык C++ и класс Widget предоставляет необходимые средства для упрощения процесса программирования.

Проведённое тестирование программы позволило сделать вывод о работоспособности программы и её соответствии заданию. Выявленные недостатки предполагают дальнейшую работу над совершенствованием программы, что предоставляет начинающему программисту обширное поле деятельности для увеличения качества и количества знаний и совершенствования навыков программирования на C++.

С целью подробного описания программы, её работоспособности и особенностей использования был написан отчёт по проделанной работе.

В Приложении 1 прикреплен код программы, состоящий из трех файлов: widget.h, main.cpp, widget.ui с комментариями.

Список информационных источников

1. URL:https://nicknixer.ru/programmirovanie/kratkij-obzor-krossplatformennogo-frejmvorka-qt/

2. URL:https://ru.wikipedia.org/wiki/%D0%91%D1%8B%D0%BA%D0%B8_%D0%B8_%D0%BA%D0%BE%D1%80%D0%BE%D0%B2%D1%8B

3. URL:https://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE%D0%BA-%D1%81%D1%85%D0%B5%D0%BC%D0%B0

4. URL: http://docs.cntd.ru/document/1200157208

5. URL: http://docs.cntd.ru/document/1200063713

6. URL: https://www.prj-exp.ru/patterns/pattern_user_guide.php

7. URL: http://docs.cntd.ru/document/9041994

8. URL: https://lektsii.org/6-84251.html

Приложение

Листинг 1.1 - Заголовочный файл widget.h

#ifndef WIDGET_H

#define WIDGET_H

#include <QWidget>

#include <QTableWidgetItem>

namespace Ui {

class Widget;

}

class Widget: public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void on_Numbertxt_textChanged(const QString &arg1);

void MyNumber();

void on_linetxt_textChanged(const QString &arg1);

void on_btnZeroize_clicked();

void on_btnNewGame_clicked();

void on_btnSave_clicked();

void on_btnDownload_clicked();

bool CheckOnRepeat(int limit, int array[], int element);

private:

Ui::Widget *ui;

int CompNumber[4];

//Набор чисел компьютера.

bool CellNorm;

int MN[4];

//Набор чисел пользователя.

QString CurrentDirPath;

QString FileName;

const QString TEXT_FILE_FORMAT;

const QString OPEN_FILE_FORMAT;

const QString TEXT_EXTENTION;

bool SaveGameFun(const QString &filePath);

bool ChechThePointer(QTableWidgetItem &pointer);

void LoadGameFun(const QString &filePath);

};

#endif // WIDGET_H

Листинг 1.2 - Исходник main.cpp

#include <QtGui/QApplication>

#include "widget.h"

#include <QTextCodec>

int main(int argc, char *argv[])

{

QTextCodec* codec = QTextCodec::codecForName("Windows-1251");

QTextCodec::setCodecForCStrings(codec);

QTextCodec::setCodecForLocale(codec);

QTextCodec::setCodecForTr(codec);

QApplication a(argc, argv);

Widget w;

w.show();

return a.exec();

}

Листинг 1.3 - Исходник widget.cpp

#include "widget.h"

#include "ui_widget.h"

#include <QMessageBox>

#include <ctime>

#include <cmath>

#include <QTextStream>

#include <QFileDialog>

#include <QFileInfo>

#include <QStringList>

#include <QDebug>

Widget::Widget(QWidget *parent):

QWidget(parent),

ui(new Ui::Widget),

TEXT_FILE_FORMAT("Text Game (*.thf)"),

OPEN_FILE_FORMAT("Game file (*.thf)"),

TEXT_EXTENTION("thf")

{

ui->setupUi(this);

CurrentDirPath = QDir::currentPath();

// Сохраняем дирректорию из которой была запущена программа.

FileName = "/BullsAndCows";

ui->tableNum->setColumnCount(1);

ui->tableMy->setColumnCount(1);

ui->tableComp->setColumnCount(1);

ui->MyBullTable->setColumnCount(1);

ui->MyCowTable->setColumnCount(1);

ui->CompBullTable->setColumnCount(1);

ui->CompCowTable->setColumnCount(1);

//Во всех таблицах создаём 1 столбец.

QPalette p(palette());

p.setColor(QPalette::Window, QColor(128,128,128));

setPalette(p);

ui->lblInfo2->hide();

QString file1, file2;

file1 = ":/photo/cow";

file2 = ":/photo/bull";

QImage image1(file1), image2(file2);

//Получаем изображения по адресу из Ресурсов.

ui->MyCow->setPixmap(QPixmap::fromImage(image1));

ui->MyBull->setPixmap(QPixmap::fromImage(image2));

ui->CompCow->setPixmap(QPixmap::fromImage(image1));

ui->CompBull->setPixmap(QPixmap::fromImage(image2));

//Ставим картинки.

ui->Numbertxt->setMaxLength(4);

ui->linetxt->setMaxLength(4);

//Задаём максимальную длину для ввода строк.

connect(ui->linetxt, SIGNAL(textChanged(QString)), this, SLOT(MyNumber()));

connect(ui->Numbertxt, SIGNAL(textChanged(QString)), this, SLOT(MyNumber()));

//Перехватываем сигнал с LineEdit и направляем его в нужную нам функцию.

srand(time(NULL));

//Набор чисел соперника.

for(int i = 0; i < 4; ++i)

{

CompNumber[i] = rand()%10;

//Заполняем массив случайными.

for(int j = 0; j < i; ++j)

{

while(CompNumber[j] == CompNumber[i])

//Следим, чтобы они не повторялись.

{

CompNumber[i] = rand()%10;

}

}

}

CellNorm = true;

QString COMP;

int COMPint;

COMPint = CompNumber[0]*1000 + CompNumber[1]*100 + CompNumber[2]*10 + CompNumber[3];

//Переводим массив в 1 переменную.

COMP = QString::number(COMPint);

//Преобразуем её в строку.

ui->CompNumberTXT->setText(COMP);

//Заполняем строкой LineEdit.

ui->CompNumberTXT->hide();

//Прячем его, до того момента, пока пользователь не отгадает число.

ui->linetxt->hide();

//Прячем поле ввода для попыток угадать набор чисел противника, чтобы пользователь не запутался.

}

Widget::~Widget()

{

delete ui;

}

void Widget::on_Numbertxt_textChanged(const QString &arg1)

{

QString STR = ui->Numbertxt->text();

//Считываем строку из поля ввода

int size = STR.size();

QByteArray byteArray = STR.toAscii();

//Переводим строку в массив. Получаем массив, в котором отображен элемент char и его код в таблице ASCII

if(STR.isEmpty())

{

return;

}

QVector <int> Cont;

for(int i = 0; i < size; ++i)

{

Cont.push_back((int) byteArray[i]); //Работаем с таблицей ASCII

if(Cont[i] < 48 || Cont[i] > 57)

//Смотрим, чтобы у нас были только цифры

{

QMessageBox::information(this, "Ошибка", "Вы можете вводить только цифры");

QString a = "";

ui->Numbertxt->setText(a);

return;

}

}

if(size == 1)

{

return;

}

for(int i = 0; i < size - 1; ++i)

{

if(Cont[size - 1] == Cont[i])

//Если находим посторяющиеся цифры

{

STR.resize(STR.size() - 1);

//Удаляем последний занесённый элемент

break;

}

}

Cont.clear();

//Очищаем дин.память

ui->Numbertxt->setText(STR);

return;

}

void Widget::MyNumber()

{

int MyCows = 0, MyBulls = 0;

//Счетчики быков и коров пользователя.

QString MyCowsSTR, MyBullsSTR;

int CompCows = 0, CompBulls = 0;

//Счетчики быков и коров компьютера.

QString CompCowsStr, CompBullsStr;

bool check;

//Переменная, для проверки содержимого LineEditов.

QString MYNUMBER = ui->Numbertxt->text();

//Забираем из LineEdit число пользователя в строку.

int MyNumber = MYNUMBER.toInt(&check);

//Переводим строку в инт.

if(!check) return;

//Если в строке не целочисленное, то завершаем программу.

int MYSIZE = MYNUMBER.size();

if(MYSIZE == 4)

//Если пользователь ввёл своё число для игры...

{

ui->Numbertxt->setReadOnly(true);

//Закрываем доступ к LineEdit, чтобы он не мог изменить его в середине игры.

ui->lblInfo1->hide();

ui->linetxt->show();

ui->lblInfo2->show();

for(int i = 0; i < 4; ++i)

//Получаем набор чисел пользователя.

{

MN[i] = MyNumber % 10;

//Забираем последнее число.

MyNumber = (MyNumber - MyNumber % 10) / 10;

//Убираем последнее число.

}

}

QString STRTry = ui->linetxt->text();

//Забираем строку с попыткой пользователя.

int Try = STRTry.toInt(&check);

//Переводим строку в число.

if(!check) return;

//Если в LineEdit пользователь записал не число, завершаем программу.

int size = STRTry.size();

if(size == 4)

//Если пользователь ввёл "попытку".

{

int motion = ui->tableNum->rowCount();

//Узнаём, сколько ходов уже было сделано.

int Mycell = motion + 1;

QString MyCell = QString::number(Mycell);

//Узнаём номер ходе пользователя и переводим его в строку.

ui->tableNum->setRowCount(motion + 1);

ui->tableMy->setRowCount(motion + 1);

ui->MyBullTable->setRowCount(motion + 1);

ui->MyCowTable->setRowCount(motion + 1);

//Добавляем ещё одну строку.

QTableWidgetItem* MyCountMotionItem = new QTableWidgetItem(MyCell);

QTableWidgetItem* MyTryItem = new QTableWidgetItem(STRTry);

//Создаём указатели, с задаными значениями.

ui->tableNum->setItem(motion, 0, MyCountMotionItem);

ui->tableMy->setItem(motion,0,MyTryItem);

//Заполняем ячейки.

ui->linetxt->clear();

//Очищаем LineEdit.

int MTry[4];

//Создаём массив, в котором будем попытку пользователя..

for(int i = 0; i < 4; ++i)

{

MTry[i] = Try % 10;

//Получаем последнее число и заносим его в массив.

Try = (Try - Try % 10) / 10;

//Убираем последнюю цифру.

}

//На выходе из цикла мы получим 2 массива, которые заполнены наборами цифр, загаданных игроками.

for(int i = 0; i < 4; ++i)

{

for(int j = 0; j < 4; ++j)

{

if( CompNumber[3 - i] == MTry[j])

//Если пользователь угадал число...

{

if(i == j)

//и угадал её позицию...

{

++MyBulls;

//Кол-во его быков увеличивается на 1.

continue;

}

else

//но не угадал позицию...

{

++MyCows;

//Кол-во его коров увеличивается.

}

}

}

}

MyBullsSTR = QString::number(MyBulls);

MyCowsSTR = QString::number(MyCows);

//Переводим числа в строки.

QTableWidgetItem* MyBullsItem = new QTableWidgetItem(MyBullsSTR);

QTableWidgetItem* MyCowsItem = new QTableWidgetItem(MyCowsSTR);

//Создаём указатели, которые несут значения.

ui->MyBullTable->setItem(motion,0,MyBullsItem);

ui->MyCowTable->setItem(motion, 0, MyCowsItem);

//Передаём значения в таблицу.

if(MyBulls == 4)

//Если пользователь угадал число

{

QMessageBox::information(this, "Поздравляем!","Вы победили! Чтобы начать новую игру, нажмите кнопку 'Новая Игра'");

QString MyScoreTxt = ui->MyRatingtxt->text();

int MyScoreInt = MyScoreTxt.toInt();

//Узнаём, сколько было побед у пользователя.

MyScoreTxt = QString::number(++MyScoreInt);

//Передаём нынешнее кол-во побед в строку.

ui->MyRatingtxt->setText(MyScoreTxt);

//Выводим строку на виджет.

ui->CompNumberTXT->show();

//Показываем число противника.

ui->Numbertxt->clear();

ui->Numbertxt->setReadOnly(false);

//Очищаём окно ввода числа и разрешаем его использовать.

}

else

//Компьютер начинает угадывать число пользователя.

{

ui->tableComp->setRowCount(motion +1);

ui->CompBullTable->setRowCount(motion + 1);

ui->CompCowTable->setRowCount(motion + 1);

//Добавляем строки в таблицы.

int CompTryGuessArray[4];

//Попытка компьютера угадать числа пользователя.

int NumberCompInTable = 0;

QString NumberCompInTableSTR;

//Переменные, которые нужны для заполнения таблицы.

for(int i = 0; i < 4; ++i)

{

do

{

CompTryGuessArray[i] = rand()%10;

//Заполняем массив случайными.

}

while(CheckOnRepeat(i,CompTryGuessArray, CompTryGuessArray[i]));

}

//Заполняем массив случайными не повторяющимися числами.

QString Cont;

for(int i = 3; i >= 0; --i)

{

Cont.push_back(QString::number(CompTryGuessArray[i]));

}

// NumberCompInTable = CompTryGuessArray[3] * 1000 + CompTryGuessArray[2] * 100 + CompTryGuessArray[1] * 10 + CompTryGuessArray[0];

// NumberCompInTableSTR = QString::number(NumberCompInTable);

QTableWidgetItem* CompNumberItem = new QTableWidgetItem(Cont);

ui->tableComp->setItem(motion,0, CompNumberItem);

//Заполняем ячейку таблицы.

for(int i = 0; i < 4; ++i)

{

for(int j = 0; j < 4; ++j)

{

if(CompTryGuessArray[j] == MN[i])

//Если компьютер угадал число.

{

if(j == i)

//и позицию.

{

++CompBulls;

//Кол-во быков увеличивается.

}

else

{

++CompCows;

//Иначе увеличивается кол-во коров.

}

}

}

}

CompBullsStr = QString::number(CompBulls);

CompCowsStr = QString::number(CompCows);

//Переводим числа в строки.

QTableWidgetItem* CompBullsItem = new QTableWidgetItem(CompBullsStr);

QTableWidgetItem* CompCowsItem = new QTableWidgetItem(CompCowsStr);

//Создаём указатели с заданными значениями.

ui->CompBullTable->setItem(motion,0,CompBullsItem);

ui->CompCowTable->setItem(motion,0,CompCowsItem);

//Передаём значения в таблицу.

if(CompBulls == 4)

//Если компьютер угадал число соперника...

{

QString CompScoreTxt = ui->CompRatingTxt->text();

int CompScoreInt = CompScoreTxt.toInt();

//Узнаём, сколько побед было у компьютера.

CompScoreTxt = QString::number(++CompScoreInt);

//Передаём нынешнее кол-во побед в строку.

ui->CompRatingTxt->setText(CompScoreTxt);

ui->CompNumberTXT->show();

ui->Numbertxt->setReadOnly(false);

QMessageBox::information(this,"Неудача!","Вы проиграли! Чтобы начать новую игру, нажмите кнопку 'Новая Игра'");

}

}

}

}

void Widget::on_linetxt_textChanged(const QString &arg1)

{

QString STR = ui->linetxt->text();

//Считываем строку из поля ввода

int size = STR.size();

QByteArray byteArray = STR.toAscii();

//Переводим строку в массив. Получаем массив, в котором отображен элемент char и его код в таблице ASCII

if(STR.isEmpty())

{

return;

}

QVector <int> Cont;

for(int i = 0; i < size; ++i)

{

Cont.push_back((int) byteArray[i]); //Работаем с таблицей ASCII

if(Cont[i] < 48 || Cont[i] > 57)

//Смотрим, чтобы у нас были только цифры

{

QMessageBox::information(this, "Ошибка", "Вы можете вводить только цифры");

QString a = "";

ui->linetxt->setText(a);

return;

}

}

if(size == 1)

{

return;

}

for(int i = 0; i < size - 1; ++i)

{

if(Cont[size - 1] == Cont[i])

//Если находим посторяющиеся цифры

{

STR.resize(STR.size() - 1);

//Удаляем последний занесённый элемент

break;

}

}

Cont.clear();

//Очищаем дин.память

ui->linetxt->setText(STR);

return;

}

void Widget::on_btnZeroize_clicked()

{

on_btnNewGame_clicked();

//Вызываем ф-ию, которая вызывает новую игру.

ui->MyRatingtxt->setText("0");

ui->CompRatingTxt->setText("0");

ui->Numbertxt->setReadOnly(false);

}

void Widget::on_btnNewGame_clicked()

{

ui->CompNumberTXT->clear();

ui->Numbertxt->clear();

ui->linetxt->clear();

//Очищаем LineEdit от прошлых значений.

ui->tableNum->setRowCount(0);

ui->tableMy->setRowCount(0);

ui->tableComp->setRowCount(0);

ui->CompBullTable->setRowCount(0);

ui->CompCowTable->setRowCount(0);

ui->MyBullTable->setRowCount(0);

ui->MyCowTable->setRowCount(0);

//Очищаем таблицы.

srand(time(NULL));

//Набор чисел соперника.

for(int i = 0; i < 4; ++i)

{

do

{

CompNumber[i] = rand()%10;

//Заполняем массив случайными.

}

while(CheckOnRepeat(i, CompNumber, CompNumber[i]));

}

QString COMP;

int COMPint;

COMPint = CompNumber[0]*1000 + CompNumber[1]*100 + CompNumber[2]*10 + CompNumber[3];

//Переводим массив в 1 переменную.

COMP = QString::number(COMPint);

//Преобразуем её в строку.

ui->CompNumberTXT->setText(COMP);

//Заполняем строкой LineEdit.

ui->CompNumberTXT->hide();

//Прячем его, до того момента, пока пользователь не отгадает число.

ui->linetxt->hide();

ui->Numbertxt->setReadOnly(false);

ui->lblInfo1->show();

ui->lblInfo2->hide();

}

void Widget::on_btnSave_clicked()

{

QString filePath = QFileDialog::getSaveFileName(this,"Сохранить как...", CurrentDirPath + FileName, TEXT_FILE_FORMAT);

//Вызываем диалоговое окно сохранения файла. Путь передастся в строку filePath.

if(filePath.isEmpty())

//Если нет пути к файлу...

{

QMessageBox::information(this, "Внимание!", "Сохранение отменено пользователем.");

return;

//Сообщаем об этом пользователю и завершаем ф-ию.

}

QFileInfo info(filePath);

CurrentDirPath = info.absoluteDir().absolutePath();

//Получаем путь к папке.

bool AlreadyWrited = false;

CellNorm = true;

AlreadyWrited = SaveGameFun(filePath);

if(!AlreadyWrited)

{

if(!CellNorm)

{

QMessageBox::information(this,"Внимание!","Не удалось сохранить данные, потому что в значение ячейке таблицы было изменено.");

return;

}

QMessageBox::information(this,"Внимание!","Не удалось открыть файл.");

}

return;

}

bool Widget::SaveGameFun(const QString &filePath)

{

QFile file(filePath);

//Инициализируем переменную файла.

bool ok = true;

if(!file.open(QIODevice::WriteOnly))

//Открываем файл.

{

qDebug() << "Не удалось открыть файл." << file.errorString();

//Если не удалось открыть, сообщаем пользователю.

return false;

//Завершаем функцию.

}

QTextStream ts(&file);

//Инициализируем переменную текстового потока, цепляя её на открытый файл.

QString MyNumStr = ui->Numbertxt->text(), CompNumStr = ui->CompNumberTXT->text();

QString MyRatingStr = ui->MyRatingtxt->text(), CompRatingStr = ui->CompRatingTxt->text();

int CountMotions = ui->tableNum->rowCount();

ts << CountMotions << ";";

ts << MyNumStr << ";" << CompNumStr << endl;

//Записываем в файл числа пользователя и компьютера.

ts << MyRatingStr << ";" << CompRatingStr << endl;

for(int i = 0; i < CountMotions; ++i)

{

QTableWidgetItem* MyTryItem = ui->tableMy->item(i, 0);

MyTryItem->text().toInt(&ok);

if(!ok || MyTryItem->text().size() != 4)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

CellNorm = false;

return false;

}

QString MyTryStr = MyTryItem->text();

//Получаем ход пользователя.

QTableWidgetItem* MyBullsItem = ui->MyBullTable->item(i, 0);

MyBullsItem->text().toInt(&ok);

if(!ok || MyBullsItem->text().size() != 1)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

CellNorm = false;

return false;

}

QString MyBullsStr = MyBullsItem->text();

//Получаем кол-во быков за этот ход

QTableWidgetItem* MyCowsItem = ui->MyCowTable->item(i, 0);

MyCowsItem->text().toInt(&ok);

if(!ok || MyCowsItem->text().size() != 1)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

CellNorm = false;

return false;

}

QString MyCowsStr = MyCowsItem->text();

//Получаем кол-во коров за этот ход

ts << MyTryStr << ";" << MyBullsStr << ";" << MyCowsStr << ";";

//Заносим получанные данные в файл.

QTableWidgetItem* CompTryItem = ui->tableComp->item(i, 0);

CompTryItem->text().toInt(&ok);

if(!ok || CompTryItem->text().size() != 4)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

CellNorm = false;

return false;

}

QString CompTryStr = CompTryItem->text();

//Получаем ход компьютера.

QTableWidgetItem* CompBullItem = ui->CompBullTable->item(i, 0);

CompBullItem->text().toInt(&ok);

if(!ok || CompBullItem->text().size() != 1)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

return false;

CellNorm = false;

}

QString CompBullStr = CompBullItem->text();

//Получаем кол-во быков компьютера за этот ход.

QTableWidgetItem* CompCowsItem = ui->CompCowTable->item(i, 0);

CompCowsItem->text().toInt(&ok);

if(!ok || CompCowsItem->text().size() != 1)

{

qDebug() << "Значение в ячейке было изменено. Сохранение невозможно.";

return false;

CellNorm = false;

}

QString CompCowsStr = CompCowsItem->text();

//Получаем кол-во коров компьютера за этот ход.

ts << CompTryStr << ";" << CompBullStr << ";" << CompCowsStr << endl;

}

file.close();

//Закрываем поток.

return true;

}

void Widget::on_btnDownload_clicked()

{

QString filePath = QFileDialog::getOpenFileName(this,"Загрузить файл с игрой", CurrentDirPath,OPEN_FILE_FORMAT);

//Открывается диалоговое окно, чтобы загрузить файлы для игры.

//Путь к файлу сохранится в строку.

if(filePath.isEmpty())

//Если строка пустая...

{

QMessageBox::information(this,"Внимание!","Открытие файла отменено пользователем.");

return;

}

QFileInfo info(filePath);

CurrentDirPath = info.absoluteDir().absolutePath();

on_btnZeroize_clicked();

//Очищаем всё на виджете.

LoadGameFun(filePath);

return;

}

void Widget::LoadGameFun(const QString &filePath)

{

QFile file(filePath);

if(!file.open(QIODevice::ReadOnly))

{

qDebug() << "Не удалось открыть файл." << file.errorString();

return;

}

QTextStream ts(&file);

QString MyNumberStr, CompNumberStr, CountMotionStr;

QString MyRatingStr, CompRatingStr;

int CountMotionInt = 0;

QStringList rawData1 = ts.readLine().split(";");

//Считываем 1 строку из файла, разбивая её на 3 элемента.

CountMotionStr = rawData1.at(0);

MyNumberStr = rawData1.at(1);

CompNumberStr = rawData1.at(2);

//Сохраняем данные из файла в строки.

CountMotionInt = CountMotionStr.toInt();

ui->tableNum->setRowCount(CountMotionInt);

ui->tableMy->setRowCount(CountMotionInt);

ui->tableComp->setRowCount(CountMotionInt);

ui->MyBullTable->setRowCount(CountMotionInt);

ui->MyCowTable->setRowCount(CountMotionInt);

ui->CompBullTable->setRowCount(CountMotionInt);

ui->CompCowTable->setRowCount(CountMotionInt);

ui->Numbertxt->setText(MyNumberStr);

ui->CompNumberTXT->setText(CompNumberStr);

//Заполняем эдиты строками.

QStringList rawData2 = ts.readLine().split(";");

//Считываем 2 строку из файла.

MyRatingStr = rawData2.at(0);

CompRatingStr = rawData2.at(1);

ui->MyRatingtxt->setText(MyRatingStr);

ui->CompRatingTxt->setText(CompRatingStr);

for(int i = 0; i < CountMotionInt; ++i)

{

QString Mn, Mb, Mc, Cn, Cb, Cc, motion = QString::number(i + 1);

QStringList rawData = ts.readLine().split(";");

Mn = rawData.at(0);

Mb = rawData.at(1);

Mc = rawData.at(2);

Cn = rawData.at(3);

Cb = rawData.at(4);

Cc = rawData.at(5);

QTableWidgetItem* MnItem = new QTableWidgetItem(Mn);

ui->tableMy->setItem(i,0,MnItem);

QTableWidgetItem* MbItem = new QTableWidgetItem(Mb);

ui->MyBullTable->setItem(i, 0, MbItem);

QTableWidgetItem* McItem = new QTableWidgetItem(Mc);

ui->MyCowTable->setItem(i, 0, McItem);

QTableWidgetItem* CnItem = new QTableWidgetItem(Cn);

ui->tableComp->setItem(i, 0,CnItem);

QTableWidgetItem* CbItem = new QTableWidgetItem(Cb);

ui->CompBullTable->setItem(i, 0, CbItem);

QTableWidgetItem* CcItem = new QTableWidgetItem(Cc);

ui->CompCowTable->setItem(i, 0, CcItem);

QTableWidgetItem* motionItem = new QTableWidgetItem(motion);

ui->tableNum->setItem(i, 0, motionItem);

}

file.close();

return;

}

bool Widget::CheckOnRepeat(int limit, int array[], int element)

{

for(int i = 0; i < limit; ++i)

{

if(array[i] == element)

{

return true;

}

}

return false;

}

Размещено на Allbest.ru


Подобные документы

  • Реализация основных алгоритмических структур. Усеченный условный оператор и оператор exit. Цикл с параметром (счетный цикл). Распечатка таблиц функций. Средства разработки программ на языке Free Pascal. Разработка игрового приложения "Быки и коровы".

    курсовая работа [1,9 M], добавлен 23.12.2015

  • Разработка программы "Быки и коровы", предназначенной для развития логики и смекалки. Требования к программным, техническим параметрам персональных компьютеров. Требования техники безопасности и охраны труда при эксплуатации программы, методика испытаний.

    курсовая работа [1,8 M], добавлен 06.01.2017

  • Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.

    курсовая работа [1,5 M], добавлен 17.01.2011

  • Существующие альтернативы программы. Описание формул для выкроек, используемых в разработке. Описание разрабатываемой программы, а также структура ее интерфейса. Детальное описание возможностей и спецификация, функциональные особенности программы.

    курсовая работа [427,4 K], добавлен 10.10.2015

  • Разработка эскизного и технического проекта программы игры "Собери картинку". Назначение и область применения, основные технические характеристики. Разработка рабочего проекта, разработка и спецификация программы игры. Описание и тестирование программы.

    курсовая работа [22,6 K], добавлен 10.06.2010

  • Написание программы для работы со списком документов, разработка функционала. Требования к аппаратному и программному обеспечению. Описание интерфейса пользователя. Структура программы и описание данных. Процедура тестирования и его результаты.

    курсовая работа [1,5 M], добавлен 26.08.2012

  • Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.

    курсовая работа [159,8 K], добавлен 26.01.2010

  • Определение назначения и описание функций дискового кэша как промежуточного буфера с быстрым доступом к информации. Процесс кэширования внешних накопителей. Построение алгоритма, описание интерфейса и разработка программы для работы с двусвязным списком.

    курсовая работа [2,1 M], добавлен 21.01.2014

  • Постановка задачи и математическое описание ее решения. Назначение программного обеспечения. Описание принятых идентификаторов. Выбор языка программирования и написание программы на входном языке. Методика отладки программы и проведение ее тестирования.

    курсовая работа [96,1 K], добавлен 25.06.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.