Технология программирования: игра "Бой словами"

Исследование логики программы и ее воспроизведение в командной строке. Создание игрового поля. Действия над буквами, действия игрока и компьютера. Глобальные переменные и массивы, необходимые для работы. Заполнение массивов координат и индексов слова.

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

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

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

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

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

Пояснительная записка к курсовой работе

по дисциплине «Технология программирования»

Технология программирования: игра «Бой словами»

Реферат

Графика, искусственный интеллект, программирование, словарь, Microsoft Visual Studio, Магия Слов.

Объектом исследования является игра «Магия Слов».

Цель курсовой работы - разбор логики и ее воспроизведение в собственной программе.

Исследование логики программы проводилось на игре от Alawar Entertainment «Магия слов», путем исследования этого приложения. Исполнение собственной игры проводилось с использованием пакета для кроссплатформенной разработки - Cocos2dx.

Результатом программы является готовая программа, являющаяся аналогией игры «Магия Слов».

В процессе разработки программы были изучены основные средства программирования на языке си, базовые возможности пакета Cocos2dx в общем и языка C++ в частности для создания пользовательского графического интерфейса.

Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2007.

Задание на курсовую работу

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

Для получения оценки «удовлетворительно» достаточно реализовать только интерфейс, который бы позволял 2 игрокам играть между собой. При этом программа должна проверять правильность ходов.

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

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

Содержание

  • Введение
  • 1. Постановка задачи
  • 2. Подготовка
  • 3. Создание игрового поля
    • 4. Действия над буквами
  • 5. Действия игрока
  • 6. Действия компьютера
  • Заключение

Библиографический список

Введение

Курсовая работа подразумевает собой создание игры. Суть игры заключается в том, чтобы снизить показатель здоровья противника до нуля, путем сложения слов из букв. В игре имеется 4 поля: сверху располагается поле, в которое нужно ввести слово, количество букв которого будет равнозначно количеству нанесенного урона; снизу располагаются поля с буквами - центральное и боковые. Центральное поле, имеющее 16 букв, доступно для всех игроков. Боковые поля, имеющие 4 буквы, доступны одноименным игрокам, то есть, первый игрок может использовать центральное и левое поле, а второй - центральное и правое. Таким образом, в арсенале каждого игрока имеется 20 букв. В начале игры каждый игрок имеет 100 здоровья. Если игрок не может ввести слово, то он имеет возможность сбросить буквы в центральном поле, но он потеряет 5 здоровья.

1. Постановка задачи

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

Правила игры «Магия Слов»:

Цель игры - снизить показатель здоровья противника до нуля, путем сложения слов из букв. Правила игры «Магия Слов» очень просты:

Игрок выбирает локацию.

Игроку дается поле, состоящее из 16 букв.

Игрок должен в свой ход составить слово, количество букв которого равнозначно нанесенному урону. То есть, чем больше слово, тем больше урона будет нанесено противнику.

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

Победив противника, игрок переходит к следующему противнику пока не дойдет до босса локации.

Если игрок погибает во время прохождения локации, то он должен начинать сначала.

В своей программе мне пришлось убрать большую часть элементов игры ввиду ограниченности времени и кое-что изменить. Таким образом, правила игры «Бой словами» таковы:

Начинается игра

Игрокам дается поле, состоящее из 16 букв и доступное обоим игрокам, и 2 мини-поля, состоящее из 4 букв и доступное одноименному игроку.

Каждый ход игрок должен составить из букв поля и мини-поля слово, количество букв которого будет равнозначно нанесенному урону.

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

Таким образом, игра «Бой словами» предназначена для одного или двух игроков, когда игра «Магия Слов» предназначена только на одного.

2. Подготовка

Для начала подключим библиотеки, нужные для работы.

//Подключение библиотек

#include "HelloWorldScene.h"

#include <iostream>

#include <fstream>

#include <string>

#include <list>

#include <cstdlib>

#include <ctime>

using namespace std;

using namespace cocos2d;

Теперь объявим глобальные переменные и массивы, нужные для работы. Массивы типа CCPoint хранят в себе координаты, в которых будут находиться буквы. Массивы типа int хранят в себе индексы букв. Массивы points и wordl относятся к верхнему полю, в которое нужно будет ввести слово. Массивы field и lettersl относятся к нижнему центральному полю, в котором будут находиться буквы, из которых нужно будет составлять слова. Массивы field1 и letters1l относятся к нижнему боковому полю первого игрока, в котором также будут находиться буквы для составления слов, а field 2 и letters2l относятся для второго игрока.

// Массивы координат

CCPoint points [8];

CCPoint field [16];

CCPoint field1 [4];

CCPoint field2 [4];

// Массивы индексов

int wordl[8];

int lettersl[16];

int letters1l[4];

int letters2l[4];

// Количество жизней у игроков

int health1;

int health2;

// Текущий игрок

int current_player;

bool AI_enabled;

3. Создание игрового поля

Для начала сделаем меню для игры.

// Создать главное меню

sSprite = CCSprite::create("menu.png");

sSprite->setPosition(ccp(size.width/2, size.height/2));

this->addChild(sSprite, 10);

// Кнопка игры с живым соперником

CCMenuItemImage *Player = CCMenuItemImage::create(

"pl_btn.png",

"pl_btn.png",

this,

menu_selector(HelloWorld::playPlayer));

Player->setPosition(ccp(200, size.height/2));

// Кнопка игры с AI

CCMenuItemImage *AI = CCMenuItemImage::create(

"ai_btn.png",

"ai_btn.png",

this,

menu_selector(HelloWorld::playAI));

AI->setPosition(ccp(size.width-200, size.height/2));

// Главное меню

sMenu = CCMenu::create(Player, AI, NULL);

sMenu->setPosition(CCPointZero);

this->addChild(sMenu, 10);

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

Для начала получим размеры окна, для нашей программы.

// Получить размеры окна

CCSize size = CCDirector::sharedDirector()->getWinSize();

Теперь активируем обработку нажатий.

// Активировать обработку нажатий

this->setTouchEnabled(true);

Теперь, непосредственно, создаем меню с кнопками. Кнопки будут описаны ниже.

// Меню

CCMenu* pMenu = CCMenu::create(Attack, Shuffle, NULL);

pMenu->setPosition(CCPointZero);

CC_BREAK_IF(! pMenu);

this->addChild(pMenu, 1);

Cocos2dx работает со спрайтами, поэтому игровым полем является картинка, нарисованная с помощью графического редактора GIMP.

Рисунок 1 - Игровое поле

Теперь мы создаем фоновое изображение.

// Фоновое изображение

CCSprite* pSprite = CCSprite::create("background_img.png");

pSprite->setPosition(ccp(size.width/2, size.height/2));

this->addChild(pSprite, 0);

программа игровой слово

Следующим шагом будет заполнение массива координат слова и массива индексов слова.

// Заполнение массива координат слова и массива индексов слова

for(i=0; i<8; i++)

{

points[i] = CCPoint(137+i*75, 462);

wordl[i]=-1;

}

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

for(i=0; i<16; i++)

{

field[i] = CCPoint(287+(i%4)*75, 287-(i/4)*75);

addLetter((char)('A'+rand()%26), field[i]);

lettersl[i]=i;

}

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

// Заполнение массива координат поля перового игрока и массива индексов поля первого игрока, создание букв поля первого игрока

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

{

field1[i] = CCPoint(63, 287-(i)*75);

addLetter((char)('A'+rand()%26), field1[i]);

letters1l[i]=i+16;

}

// Заполнение массива координат поля второго игрока и массива индексов поля второго игрока, создание букв поля второго игрока

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

{

field2[i] = CCPoint(737, 287-(i)*75);

addLetter((char)('A'+rand()%26), field2[i]);

letters2l[i]=i+20;

}

Теперь мы сделаем кнопки атаки и перемешивания, которые так же были нарисованы с помощью графического редактора GIMP.

// Кнопка атаки

CCMenuItemImage *Attack = CCMenuItemImage::create(

"attack_btn.png",

"attack_btn.png",

this,

menu_selector(HelloWorld::attackCallback));

Attack->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width/2, 375));

// Кнопка перемешивания

CCMenuItemImage *Shuffle = CCMenuItemImage::create(

"shuffle_btn.png",

"shuffle_btn.png",

this,

menu_selector(HelloWorld::shuffleCallback));

Shuffle->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width/2, 545));

Рисунок 2 - Кнопка атаки

Рисунок 3 - Кнопка перемешивания

4. Действия над буквами

Данный этап описывает все действия над буквами. Начнем с добавления буквы в игру. Для того, чтобы буква не терялась на белом фоне, был создан спрайт для ячейки в графическом редакторе GIMP, в которую будет помещена буква. Это всё делает функция addLetter.

void HelloWorld::addLetter(char letter,CCPoint position)

{

// Создание изображения для буквы

CCSprite* image = CCSprite::create("letter.png");

image->setPosition(position);

this->addChild(image, 0);

// Создание надписи для буквы

const char* str = &letter;

CCLabelTTF* label = CCLabelTTF::create(str, "Calibri", 64,

CCSizeMake(image->getContentSize().width,image->getContentSize().height), kCCTextAlignmentCenter);

label->setPosition(ccp(image->getContentSize().width/2,image->getContentSize().height/2));

image->addChild(label, 0);

// Добавление буквы в массив

_letters->addObject(image);

}

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

void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event)

{

// Получить координаты нажатия

CCTouch* touch = (CCTouch*)(touches->anyObject());

CCPoint location = touch->locationInView();

location = CCDirector::sharedDirector()->convertToGL(location);

// Для каждой буквы, присутствующей в игре

for (int i=0; i<_letters->count(); i++)

{

// Получить координаты крайних точек

CCSprite *letter = dynamic_cast<CCSprite*>(_letters->objectAtIndex(i));

int xmax, xmin, ymax, ymin;

xmax = letter->getPositionX() + letter->getContentSize().width/2;

xmin = letter->getPositionX() - letter->getContentSize().width/2;

ymax = letter->getPositionY() + letter->getContentSize().height/2;

ymin = letter->getPositionY() - letter->getContentSize().height/2;

// Если нажатие совершено внутри буквы

if (location.x>xmin && location.x<xmax && location.y>ymin && location.y<ymax)

{

// Если нажатие совершено в области выстраиваемого слова

if (location.y>400)

{

// Найти, на какую по счету букву в слове нажали, вернуть ее и все следующие за ней на место.

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

{

if (wordl[j] == i)

{

returnLetters(j);

}

}

}

// Если нажатие в области полей букв

else

{

// Проверить, можно ли использовать букву (не принадлежит ли она игроку, который сейчас не ходит)

bool valid = true;

if(current_player == 1)

{

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

{

if(letters2l[k] == i)

{

valid = false;

}

}

}

else

{

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

{

if(letters1l[k] == i)

{

valid = false;

}

}

}

// Если букву можно использовать, и в текущем слове меньше 8 букв

if (word_index<8 && valid)

{

// Проверка, не движется ли эта буква на свое место в слове

bool exists = false;

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

{

if(wordl[j]==i)

exists = true;

}

// Если все в порядке, переместить букву на ее место в слове, записать ее индекс в массив индексов слова, увеличить индекс конца текущего слова

if(!exists)

{

moveLetter(i, points[word_index]);

wordl[word_index]=i;

word_index++;

}

Следующая функция, returnLetter, предназначена для возврата буквы из верхнего поля на её место.

void HelloWorld::returnLetter(int index)

{

int i;

// Вернуть букву на ее исходное положение

// Поиск по бувам из основного поля

for (i=0; i<16; i++)

{

if(lettersl[i]==index)

{

moveLetter(index, field[i]);

}

}

// Поиск по бувам из поля первого игрока

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

{

if(letters1l[i]==index)

{

moveLetter(index, field1[i]);

}

}

// Поиск по бувам из поля второго игрока

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

{

if(letters2l[i]==index)

{

moveLetter(index, field2[i]);

}

}

}

Функция returnLetter вызывается в функции returnLetters, которая, в свою очередь, возвращает буквы на исходную позицию, начиная с переданного индекса.

void HelloWorld::returnLetters(int index)

{

int i;

for(i=index; i<8; i++)

{

returnLetter(wordl[i]);

wordl[i]=-1;

}

word_index=index;

}

Теперь рассмотрим функцию removeLetter. Данная функция функция прячет букву в верхнем поле, ставит её на исходную позицию. Чтобы не появлялась одна и та же буква, функция removeLetter вызывает функцию resetLetter.

void HelloWorld::removeLetter(int word_index)

{

// Задать последовательность действий для изображения буквы: сделать прозрачной, вызвать функцию замены буквы, задержка, сделать непрозрачной

((CCSprite*)_letters->objectAtIndex(word_index))->runAction(CCSequence::create(

CCFadeTo::create(0.5, 0),

CCCallFuncND::create(this, callfuncND_selector(HelloWorld::resetLetter), (void*)word_index),

CCDelayTime::create(0.25),

CCFadeTo::create(0.5, 255),

NULL));

// Аналогичная последовательность действий для надписи буквы

((CCSprite*)((CCSprite*)_letters->objectAtIndex(word_index))->getChildren()->objectAtIndex(0))->runAction(CCSequence::create(

CCFadeTo::create(0.5, 0),

CCDelayTime::create(0.25),

CCFadeTo::create(0.5, 255),

NULL));

// Указать, что исходная позиция буквы теперь свободна

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

{

if (lettersl[i]==word_index)

{

lettersl[i]=-1;

}

}

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

{

if (letters1l[i]==word_index)

{

letters1l[i]=-1;

}

}

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

{

if (letters2l[i]==word_index)

{

letters2l[i]=-1;

}

}

}

void HelloWorld::resetLetter(CCNode* sender, void* word_index)

{

int w=((int) word_index);

// Поиск пустого места в поле, генерация новой надписи для буквы и перемещение буквы на свободную позицию

// В основном поле

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

{

if (lettersl[i]==-1)

{

char letter = (char)('A'+rand()%26);

char s1[] = " ";

s1[0] = letter;

char* str = s1;

((CCSprite*)_letters->objectAtIndex(w))->setPosition(field[i]);

((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(w))->getChildren()->objectAtIndex(0))->setString(str);

lettersl[i] = w;

return;

}

}

// В поле первого игрока

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

{

if (letters1l[i]==-1)

{

char letter = (char)('A'+rand()%26);

char s1[] = " ";

s1[0] = letter;

char* str = s1;

((CCSprite*)_letters->objectAtIndex(w))->setPosition(field1[i]);

((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(w))->getChildren()->objectAtIndex(0))->setString(str);

letters1l[i] = w;

return;

}

}

// В поле второго игрока

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

{

if (letters2l[i]==-1)

{

char letter = (char)('A'+rand()%26);

char s1[] = " ";

s1[0] = letter;

char* str = s1;

((CCSprite*)_letters->objectAtIndex(w))->setPosition(field2[i]);

((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(w))->getChildren()->objectAtIndex(0))->setString(str);

letters2l[i] = w;

return;

}

}

}

5. Действия игрока

Игроку доступны две кнопки - «Attack» и «Shuffle». Нажатие кнопки «Attack» вызывает функцию attackCallback. Эта функция формирует строку из выбранных букв и проверяет наличие этой строки в словаре при помощи функции findword.

void HelloWorld::attackCallback(CCObject* pSender)

{

int i;

char a[9];

// Из букв, выстроенных в ряд, получить слово

for(i=0; i<word_index; i++)

{

const char* t = ((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(wordl[i]))->getChildren()->objectAtIndex(0))->getString();

a[i] = *t;

}

// Добавить символ окончания строки в конец полученного слова

i = 0;

while(a[i] >= 'A' && a[i] <= 'Z')

{

i++;

}

a[i] = '\0';

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

if (findword(a))

{

changePlayer();

damagePlayer(current_player, i);

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

{

if (wordl[i]>=0)

{

removeLetter(wordl[i]);

wordl[i]=-1;

word_index--;

}

Если игрок не может создать слово из предоставленных ему букв, то на этот случай есть кнопка «Shuffle». Эта функция заменяет все буквы в центральном поле на новые буквы, но наносит урон игроку, использовавшему эту кнопку. Происходит это посредством функции returnLetters и removeLetter. Функция returnLetters нужна для того чтобы все буквы вернулись на исходные места, а функция removeLetter для того чтобы заменит все буквы в центральном поле.

void HelloWorld::shuffleCallback(CCObject* pSender)

{

int i;

// Вернуть все выстроенные буквы на места

returnLetters(0);

// Заменить все буквы в основном поле

for (i=0; i<16; i++)

{

removeLetter(lettersl[i]);

}

// Нанести урон игроку, который перемешивал буквы

damagePlayer(current_player, 3);

}

Функция damagePlayer наносит урон. Функция получает номер игрока и количество урона, которое будет нанесено игроку. После этих манипуляций обновляется показатель здоровья игрока.

void HelloWorld::damagePlayer(int player, int damage)

{

char hlt[4];

if(player == 1)

{

health1-=damage;

sprintf(hlt,"%i",health1);

player1->setString(hlt);

}

if(player == 2)

{

health2-=damage;

sprintf(hlt,"%i",health2);

player2->setString(hlt);

}

}

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

Рисунок 4 - Игрок составляет слово

После этого игрок нажимает кнопку «Attack», буквы исчезают из верхнего поля, а в центральном и боковом поле появляются новые буквы. Боковое поле игрока скрывается. Ход игрока заканчивается.

Рисунок 5 - Игрок нажимает кнопку атаки

6. Действия компьютера

На данном этапе будут рассматриваться действия искусственного интеллекта. Функция findword построчно считывает содержание файла словаря, пробегается по всем доступным буквам, составляет слова и выбирает самое длинное из них.

bool HelloWorld::findword(string word)

{

int i;

bool found=false;

// Открытие файла

string STRING;

ifstream infile;

infile.open ("dict.txt");

while(!infile.eof()) // To get you all the lines.

{

// Чтение строки из файла

getline(infile,STRING); // Saves the line in STRING.

i = 0;

// Если считанная строка и слово, которое мы ищем, одинаковой длины

if(STRING.size() == word.size())

{

// Сравниваем строки посимвольно

while(i < word.size())

{

if(STRING[i] == word[i])

{

i++;

}

else

{

i = word.size()+1;

}

}

if(i == word.size())

{

found = true;

}

}

}

// Закрытие файла

infile.close();

// Возвращаем true, если слово найдено и false, если не найдено.

return found;

}

Функция getAvailableLetters получает список доступных букв для искусственного интеллекта.

void HelloWorld::getAvailableLetters()

{

int i;

for(i = 0; i < 16; i++)

{

const char* t = ((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(lettersl[i]))->getChildren()->objectAtIndex(0))->getString();

available[i] = *t;

}

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

{

const char* t = ((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(letters2l[i]))->getChildren()->objectAtIndex(0))->getString();

available[i+16] = *t;

}

available[20] = '\0';

}

Функция letterAvailable проверяет, есть ли такая буква среди предложенных букв.

bool HelloWorld::letterAvailable(char letter, int count)

{

int i;

int found = 0;

for(i = 0; i < 20; i++)

{

if(letter == available[i])

{

found++;

}

}

if(found>=count)

{

return true;

}

else

{

return false;

}

}

Функция letterCount проверяет количество повторов буквы в слове.

int HelloWorld::letterCount(string word, int index)

{

int count = 1;

int i;

for(i = index+1; i < word.size(); i++)

{

if(word[i] == word[index])

{

count++;

}

}

return count;

}

Функция checkAvailableWord берет слово и проверяет можно ли его составить из предложенных букв.

{

int i = 0;

int j = 0;

int count = 0;

bool possible = true;

if(word.size() > 8 || word.size() <= optimal_length)

{

possible = false;

}

while(i < word.size() && possible)

{

possible = letterAvailable(word[i], letterCount(word, i));

i++;

}

if(possible)

{

optimal = word;

optimal_length = word.size();

}

return possible;

}

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

void HelloWorld::AI_turn(CCNode* sender)

{

string STRING;

ifstream infile;

infile.open ("dict.txt");

getAvailableLetters();

optimal_length = 0;

while(!infile.eof()) // To get you all the lines.

{

// Чтение строки из файла

getline(infile,STRING); // Saves the line in STRING.

checkAvailableWord(STRING);

}

if(optimal_length == 0)

{

CCLog("Shuffling");

this->runAction(CCSequence::create(

CCCallFuncN::create(this, callfuncN_selector(HelloWorld::shuffleAI)),

CCDelayTime::create(1.5),

CCCallFuncN::create(this, callfuncN_selector(HelloWorld::AI_turn)), NULL));

}

else

{

createWord(optimal);

this->runAction(CCSequence::create(

CCDelayTime::create(1.5),

CCCallFuncN::create(this, callfuncN_selector(HelloWorld::attackAI)), NULL));

}

}

Функция createWord создает слово.

void HelloWorld::createWord(string word)

{

int i, j, k;

bool found;

bool used;

char letters[16];

for(i = 0; i < word.size(); i++)

{

found = false;

//Для основного поля

for(j = 0; j < 16; j++)

{

const char* t = ((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(lettersl[j]))->getChildren()->objectAtIndex(0))->getString();

letters[j] = *t;

if(letters[j] == word[i] &&!found)

{

//Смотрим, задействована ли буква в слове

used = false;

for(k = 0; k < 8; k++)

{

if(wordl[k] == lettersl[j])

{

used = true;

}

}

//Если не задействована

if(!used)

{

moveLetter(lettersl[j], points[word_index]);

wordl[word_index]=lettersl[j];

word_index++;

found = true;

}

}

}

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

{

const char* t = ((CCLabelTTF*)((CCSprite*)_letters->objectAtIndex(letters2l[j]))->getChildren()->objectAtIndex(0))->getString();

letters[j] = *t;

if(letters[j] == word[i] &&!found)

{

used = false;

for(k = 0; k < 8; k++)

{

if(wordl[k] == letters2l[j])

{

used = true;

}

}

if(!used)

{

moveLetter(letters2l[j], points[word_index]);

wordl[word_index]=letters2l[j];

word_index++;

found = true;

}

Функции shuffleAI и attackAI аналогичны функциям shuffleCallback и attackCallback, только предназначены для искусственного интеллекта.

void HelloWorld::shuffleAI(CCNode* sender)

{

int i;

// Вернуть все выстроенные буквы на места

returnLetters(0);

// Заменить все буквы в основном поле

for (i=0; i<16; i++)

{

removeLetter(lettersl[i]);

}

// Нанести урон игроку, который перемешивал буквы

damagePlayer(current_player, 3);

}

void HelloWorld::attackAI(CCNode* sender)

{

changePlayer();

damagePlayer(current_player, optimal_length);

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

{

if (wordl[i]>=0)

{

removeLetter(wordl[i]);

wordl[i]=-1;

word_index--;

}

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

Рисунок 6 - Компьютер составляет слово

После этого компьютер нажимает кнопку «Attack», буквы исчезают из верхнего поля, а в центральном и боковом появляются новые буквы. Боковое поле компьютера скрывается. Ход компьютера заканчивается.

Рисунок 7 - Компьютер нажал кнопку атаки

Заключение

В ходе курсовой работы были разобраны принципы, по которым работает компьютерная игра «Магия Слов» от компании Alawar Entertainment. Они были использованы для написания собственной игры. При программировании использовался фреймворк cocos2dx, языком создания программы был С++.

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

Библиографический список

1. Керниган, Б. Язык программирования C /Б. Керниган, Д. Ритчи. Вильямс, 2012. 304 с.

2. Пошаговая инструкция по разработке простых игр на cocos2dx [Электронный ресурс] / http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Step_by_Step_Cocos2dxSimpleGame_Series.

3..Мануал пользователя [Электронный ресурс] / http://www.cocos2d-x.org/projects/cocos2d-x/wiki

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


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

  • Постановка задачи и ее математическая модель. Блок-схема алгоритма обработки массивов координат точек. Тестирование алгоритма сортировки. Используемые глобальные и локальные переменные. Листинг программы на языке Си. Анализ результатов. Пример работы.

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

  • Обоснование выбора средства программирования. Входная и выходная информация. Основные требования к программному и аппаратному обеспечению. Анализ метода поиска в строке по алгоритму Боуера-Мура. Глобальные переменные и константы в среде Visual Studio.

    курсовая работа [489,0 K], добавлен 01.07.2015

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

    отчет по практике [309,0 K], добавлен 07.01.2014

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

    дипломная работа [72,7 K], добавлен 29.11.2011

  • Написание игры "Lines" на языке Object Pascal в среде Delphi. Алгоритм работы программы. Описание метода генерации поля. Используемые константы и переменные. Форма приложения после старта игрового процесса. Основные элементы формы и обработки событий.

    курсовая работа [225,0 K], добавлен 12.04.2012

  • Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.

    отчет по практике [961,6 K], добавлен 21.04.2012

  • Широкое использование компьютерных и информационных технологий. Концепции типов данных. Алгоритмы сортировки одномерных массивов. Описание двумерного массива Паскаля. Методы доступа к элементам массивов. Индексные, динамические и гетерогенные массивы.

    курсовая работа [66,3 K], добавлен 07.12.2010

  • Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы.

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

  • Принципы получения электронных копий. История создания сканера, принцип действия. Виды сканеров, их характеристики. Выбор среды программирования: визуальное программирование, среда программирования Delphi, язык С++. Описание разработанной программы.

    курсовая работа [42,9 K], добавлен 25.12.2008

  • История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.

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

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