Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
qwerty.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.79 Mб
Скачать

Федеральное агентство образования и науки Российской Федерации

Волгоградский Государственный Технический Университет

Кафедра ПОАС

Семестровая работа по дисциплине

Интеллектуальные системы

На тему

«Карточная игра «Червы»

Выполнили:

Студенты группы ивт-46x

XXXXXX

XXXXXX

Проверил:

Литовкин Д.В.

Волгоград 20 XX

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

Карточная игра «Червы» (кол-во исполнителей: 2)

Реализовать режим игры «человек + компьютер».

Требования к арбитру - должен реализовать стандартные условия игры.

Требования к компьютерному игроку — должен принимать правильные решения,

учитывая следующие критерии:

- состав карт на руках у себя;

- оставшееся кол-во карт на руках у игроков;

- текущее кол-во очков у каждого игрока;

- кол-во полученных взяток;

- кто заходит.

Способ хранения данных — списки.

Условия игры

Общие сведения

Цель игры состоит в том, чтобы набрать наименьшее количество очков в конце игры.

Чтобы начать игру

1. Выберите три карты для передачи другому игроку (за исключением каждой четвертой сдачи, когда этого не следует делать). Чтобы выбрать карту для передачи, щелкните ее. Чтобы отменить выбор карты, щелкните ее еще раз.

2. Первый круг начинает игрок, у которого находится двойка треф, причем именно с этой карты.

3. Каждый игрок по очереди (по часовой стрелке) кладет одну карту. Необходимо класть карту той же масти, что и карта, с которой был начат круг. Если у игрока нет такой карты, он может сбросить любую. Исключение: нельзя сбросить ни черву, ни даму пик, если разыгрывается первая взятка.

Примечание

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

Как ведется подсчет очков

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

- Счет игрока, собравшего взятки, содержащие все червы и даму пик, не увеличивается, а всем остальным начисляется по 26 очков. Этот трюк называется «прокрутить динамо».

Приемы игры

- Старайтесь не брать взятки с червами и дамой пик. Исключение составляют две ситуации: если вы пытаетесь «прокрутить динамо» или пытаетесь помешать другому игроку выполнить этот трюк.

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

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

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

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

Экранные формы

Рис 1. Начало игры

Рис 2. Сброс

Рис 3. Ход

Рис 4. Конец кона

Рис 5, 6. Конец игры

Управление игроком-человеком

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

Структура данных

% ранг, масть

rank, suit = string

%игрок, индекс, количество, флаг

player, index, count, flag = integer

% структура карты

struct_card = card( rank, suit )

% список карт

cards_list = struct_card*

%карта у игрока

cardplayer = card_player( player, struct_card)

%список карт для игроков

card_player_list = cardplayer*

%масть и количество ее карт

struct_count_card = count_card( suit, count )

%список мастей и количества их карт

count_card_list = struct_count_card*

%список мастей

suit_list = suit*

%список чисел

int_list = integer*

% имя файла

filename = string

%карта и ее файл

struct_card_with_file_name = card_file(struct_card,filename)

%бд карт ( карта )

dbcards( struct_card )

%бд карт у игроков ( карта игрока )

dbcard_of_player( cardplayer )

%бд стека, куда помещаются карты при сбросе (карта игрока)

dbstack( cardplayer )

%бд длинной масти (игрок, масть)

dblong_suit( player,suit )

%игрок запомнил кому скинул даму пик (кто скинул, ому скинул)

db_who_have_queen(player,player)

%бд стратегии игры (игрок, стратегия)

db_strategy_for_game(player,string)

%бд карт бывранных для сброса человеком (номер карты)

db_active_cards(integer)

%бд режима игры человека (режим)

db_condition(string)

%бд очередности хода (игрок, который ходит)

db_who_move(integer)

%бд номера хода (номер хода)

db_count_of_hod(integer)

%бд текущей взятки (карта игрока)

db_trick(cardplayer)

%бд всех взяток (карта игрока)

db_all_tricks(cardplayer)

%бд очков ( игрок, его очки)

db_points(player,integer Point)

%бд номера взятки (номер взятки)

db_number_trick(integer)

%бд номера сброса (номер сброса)

db_number_of_drop(integer)

Алгоритм арбитра

1.Начало игры

1.1.Вначале игры при нажатии на кнопку «Раздать» происходит раздача карт

1.2.Игра не может быть начата пока игрок не выберет 3 карты и не нажмет на кнопку сброс

1.3.После нажатия на кнопку сброс игроки обмениваются картами, и определяется, у какого игрока есть 2 крести

1.3.1.Если 2 крести находится у игрока компьютера, то он начинает ходить

1.3.2.Если 2 крести находится у игрока человека, то он обязан пойти с нее

1.3.3.На первом ходу нельзя сбрасывать черви и даму пик

2.Ход

2.1.Все игроки обязаны ходить в масть той карте, с которой начался заход

2.2.Если у игроков нет карт масти, с которой начался заход, то он может кинуть любую карту

2.3.Если у игроков нет карт масти, с которой начался заход, то он может кинуть любую карту, даже черви, если у него нет других карт

3.Остановка и подсчет очков

3.1.После того как закончился кон выводится сообщение с набранными игроками очками, причем за каждую черву начисляется 1 балл, а за даму пик 13

3.2.Если какой-то игрок собрал все червы и даму пик, то ему начисляется 0, а остальным игрокам по 26

3.3.Игра заканчивается, когда какой-либо игрок наберет 100 или больше очков, выиграл в этом случае игрок с наименьшим количеством очков

Предикаты арбитра

% рисует карты определенного игрока

% card_player_list - список карт игроков

% начальная координата x

% начальная координата y

% card_player_list - список карт игроков

% Win - handle окна

draw_card(card_player_list,integer,integer,card_player_list,player,WINDOW Win)

% рисует карты во взятке определенного игрока

% card_player_list - список карт игроков

% начальная координата x

% начальная координата y

% card_player_list - список карт игроков

% Win - handle окна

draw_card_in_tricks(card_player_list,integer,integer,card_player_list,player,WINDOW Win)

% определяет номер выбранной карты

% PNT - координаты того места куда кликнули мышкой

% Number_of_card - в него записывается номер карты

get_number_of_card(PNT,integer Number_of_card)

% определяет поднять или опустить карту при сбросе

% Number_of_card - номер карты

up_or_down_card(integer Number_of_card)

% определяет номера выбранных карт для сброса

% int_list - список номеров карт

get_number_of_card_from_drop_cardlist(int_list)

% сменить состояние кнопки сброса, в зависимости отколичества выбранных карт

% Count - количество выбранных карт

% Win - handle окна

change_drop_button_state(integer Count,WINDOW Win)

% определяет действие с выбранной игроком картой в зависимости от режима игры

% Condition - режим игры

% Win - handle окна

select_condition(string Condition,PNT,WINDOW Win)

% ход компьютерного игрока

% Win - handle окна

move(WINDOW Win)

% рисует карты во взятке на кону

% cardplayer - карта игрока

% Win - handle окна

draw_card_on_trick(cardplayer Card,WINDOW Win)

% рисует стрелку для отображения кому идет сброс или того кто взял взятку

% player - номер игрока

% Win - handle окна

draw_pointer(player,WINDOW Win)

% рисует карты во взятке на кону

% card_player_list - список карт игроков

% Win - handle окна

draw_trick(card_player_list,WINDOW Win)

% определяет карты определенного игрока

% card_player_list - список карт игроков

% card_player_list - список карт игроков

% player - номер игрока

get_cards_of_player(card_player_list,card_player_list,player)

% определяет кто берет взятку

% card_player_list - список карт игроков

% player - номер игрока

who_get_trick(card_player_list,player)

% уточняет номер выбранной карты

% card_player_list - список карт игроков

% index - номер выбранной карты

% index - уточненный номер

accurately_number(card_player_list,index,index)

% считает количество очков

calc_points

% выводит очки в MessageBox

output_points_to_message_box

% переносит взятку на кону в базу взяток определенного игрока

% player - номер игрока

put_trick_to_base_all_triks(player)

% считает очки

% card_player_list - список взяток

get_player_point(card_player_list)

% новая раздача карт

% Win - handle окна

new_play_out(WINDOW Win)

% определяет в какую сторону идет сброс

% сброс влево

% номер игрока

% номер игрока

next_player_for_drop1(integer,integer)

% сброс вправо

% номер игрока

% номер игрока

next_player_for_drop2(integer,integer)

% сброс напротив

% номер игрока

% номер игрока

next_player_for_drop3(integer,integer)

% проверяет есть ли разные игроки в базе взяток

get_all

% рисует стрелки кому идет сброс

% Win - handle окна

% Number_of_drop - номер сброса

draw_arrows(WINDOW Win,integer Number_of_drop)

%дает игроку сброшенные ему карты

%card_player_list - список карт игроков из стека

get_droped(card_player_list)

Стратегия компьютерного игрока

Выбор стратегии для сброса.

Если есть масть, число карт которой больше или равно 6 и хотя бы две из этик карт –старшие, то выбираем стратегию «взять все».

Ситуация

Действия

Крести: 8,9,10, В, Д, Т

Буби: 6, 10

Пики: Д, К,

Червы: 8, В, Т

Выбрать стратегию «взять все»

……………………………………………………………………………………..

Стратегия сброса карт ( взять все )

Если есть масть, число карт которой больше или равно 10, то сбросить остальные карты и, если можно, оставшиеся младшие карты этой масти

Ситуация

Действия

Крести: 4,5,6,7,8,9,10, В, Д,К, Т

Буби: 6, 10

Сбросить 6 , 10 буби и 4 крести

……………………………………………………………………………………..

Предикаты искусственного интеллекта игрока

%считает кол-во карт для мастей и кол-во старших карт

% и вызывате выбор стратегии сброса

% player - игрок

drop_card(player)

%выбирает стратегию сброса

%player - игрок

%count - кол-во крестей

%count - кол-во черв

%count - кол-во бубей

%count - кол-во пик

%count - кол-во старших карт

select_strategy_for_drop(player,count,count,count,count,count)

%сброс для стратегии "взять все".Сбрасывает 2 крести и

% вызывает выбор и сброс карт для стратегии "взять всё"

drop_card_get_all(player,count)

%сбрасывает переданную карту

%player - игрок

%card_player_list - список карт игроков

%suit - масть карты

%count - кол-во карт для сброса

%rank - ранг сбрасываемой карты

drop_get_all(player,card_player_list,suit,count,rank)

%сбрасывает все карты из другой масти.

%И вызывает сброс младших карт из переданной масти

%player - игрок

%suit - масть

%card_player_list - список карт

drop_other_suit(player,suit,card_player_list)

%сбрасывает младшие карты из переданной масти

%player - игрок

%suit - масть

%card_player_list - список карт игроков

%count - кол-во карт для сброса

drop_junior_of_this_suit(player,suit,card_player_list, count)

%выбирает какие карты скидывать (какие предикаты вызывать)

%player - игрок

%count - кол-во карт для сброса

%card_player_list - список карт игроков

set_card_get_all(player,count,card_player_list)

% сбрасывает Д, К, Т пик. Находит масти,число карт которых <= 3

% и вызывает выбор карт для сброса

%player - игрок

%count - кол-во карт для сброса

drop_card_get_small(player,count)

% определить карты для сброса для стратегии "взять меньше"

%suit_list - список мастей, чье кол-во карт <= 3

%count - кол-во мастей, чье кол-во карт <= 3

%card_player_list - список карт игроков

%player - игрок

%count - кол-во карт для сброса

set_card_get_small(suit_list,count,card_player_list,player,count)

%сбросить переданную карту длястратегии "взять меньше"

%player - игрок

%suit - масть карты

%count - кол-во карт для сброса

%card_player_list - список карт игороков

drop_get_small(player,suit,count,card_player_list)

%определяет число карт для сброса и вызывает сброс

%player - игрок

%suit - масть, которую сбросить

%count - кол-во карт этой масти

%count - кол-во карт для сброса

%card_player_list - список карт игороков

define_count_get_small(player,suit,count,count,card_player_list)

%сбрасывает конкретную карту, если онаесть у игрока.

%И возвращает новое кол-во карт для сброса (уменьшает на 1, если сбросил)

%player - игрок

%struct_card - карта

%count - кол-во карт для сброса

%count - новое кол-во карт для сброса

drop_this_card(player,struct_card,count, count)

% первый ход для стратегии "взять все"

%player - игрок

first_move_get_all(player)

% первый ход для стратегии "взять меньше"

%player - игрок

first_move_get_small(player)

% промежуточный ход для стратегии "взять все"

%player - игрок

intermediate_move_get_all(player)

% промежуточный ход для стратегии "взять меньше"

%player - игрок

intermediate_move_get_small(player)

% последний ход для стратегии "взять все"

%player - игрок

last_move_get_all(player)

% последний ход для стратегии "взять меньше"

%player - игрок

last_move_get_small(player)

%выбирает стратегию для игры

%player - игрок

select_strategy_for_game(player)

%изменяет стратегию для игры

%player - игрок

change_strategy_for_game(player)

%выбор хода дляикомпьютерного игрока

%player - игрок

select_move(player)

Листинг программы

/*****************************************************************************

Copyright (c) My Company

Project: HEARTS

FileName: HEARTS.PRO

Purpose: No description

Written by: Visual Prolog

Comments:

******************************************************************************/

include "hearts.inc"

include "hearts.con"

include "hlptopic.con"

%BEGIN_WIN Task Window

/***************************************************************************

Event handling for Task Window

***************************************************************************/

domains

rank, suit = string

player, index, count, flag = integer

struct_card = card( rank, suit )

cards_list = struct_card*

cardplayer = card_player( player, struct_card)

card_player_list = cardplayer*

struct_count_card = count_card( suit, count )

count_card_list = struct_count_card*

suit_list = suit*

int_list = integer*

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

filename = string

struct_card_with_file_name = card_file(struct_card,filename)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

database - maindb

%бд карт ( карта )

dbcards( struct_card )

%бд карт у игроков ( карта игрока )

dbcard_of_player( cardplayer )

%бд стека, куда помещаются карты при сбросе (карта игрока)

dbstack( cardplayer )

%бд длинной масти (игрок, масть)

dblong_suit( player,suit )

%игрок запомнил кому скинул даму пик (кто скинул, ому скинул)

db_who_have_queen(player,player)

……………………………………………………………………………………..

predicates

task_win_eh : EHANDLER

%связывает карту с именем файла

%struct_card_with_file_name - карта и имя файла

cards_file(struct_card_with_file_name)

%связывае игрока и имя файла изображения стрелки

%player - номер игрока

%filename - имя файла

pict_of_pointer( player,filename).

%содержит все карты

cards( struct_card )

%раздаёт карты игрокам

%player - игрок, с которогоначинать раздачу

%cards_list - список карт

%count - число карт

play_out(player, cards_list, count)

……………………………………………………………………………………..

constants

%BEGIN Task Window, CreateParms, 01:58:37-29.12.2008, Code automatically updated!

task_win_Flags = [wsf_SizeBorder,wsf_TitleBar,wsf_Close,wsf_Maximize,wsf_Minimize,wsf_ClipSiblings]

task_win_Menu = no_menu

task_win_Title = "hearts"

task_win_Help = idh_contents

%END Task Window, CreateParms

clauses

% факты, содержащие карты

cards( card("2","крести")).

cards( card("3","крести")).

cards( card("4","крести")).

cards( card("5","крести")).

cards( card("6","крести")).

cards( card("7","крести")).

cards( card("8","крести")).

cards( card("9","крести")).

cards( card("10","крести")).

cards( card("В","крести")).

cards( card("Д","крести")).

cards( card("К","крести")).

cards( card("Т","крести")).

……………………………………………………………………………………..

……………………………………………………………………………………..

% раздача карт

play_out(_,_,0) :- !. % кончались карты для раздачи

play_out(Player, Cards_list, CountCards):-

% выбераем случайным образом номер карты

random(CountCards,Index),

IndexCard = Index + 1,

% получаем из списка карт карту по номеру

get_card( 1, IndexCard, Cards_list, Card),

% удаляем эту карту из списка

del_card( 1,IndexCard, Cards_list, New_Cards_list),

% вставляем карту в ДБ карт играков

assertz( dbcard_of_player( card_player(Player, Card)) ),

New_CountCards = CountCards - 1,

% переходим к следующему игроку

next_player(Player, NewPlayer),

play_out( NewPlayer, New_Cards_List, New_CountCards).

……………………………………………………………………………………..

%=============================================================================

%========================== ВЗЯТЬ МЕНЬШЕ =====================================

drop_card_get_small(_,CountCardForDrop):-CountCardForDrop <=0,!.

drop_card_get_small(Player,CountCardForDrop):-

CountCardForDrop > 0,

% если есть, то сбрасываем Д, К, Т пик. Каждый предикат возвращает новое кол-во карт для сброса

drop_this_card(Player,card("Д","пики"),CountCardForDrop, New_Count1),

drop_this_card(Player,card("К","пики"),New_Count1, New_Count2),

drop_this_card(Player,card("Т","пики"),New_Count2, New_Count),

findall(CardOfPlayer,dbcard_of_player(CardOfPlayer),CardOfPlayer_list),

% получить число карт для каждой масти

get_count_card(Player,CardOfPlayer_list, ["крести","бубны","червы","пики"], Count_card_list),

%получить масти, число карт которых <=3 и > 0

get_suit_whose_cards_small_4(Count_card_list,Suit_list),

% получить кол-во таких мастей

count_element(Suit_list, CountSuit),

% выбрать и сбросить карты

set_card_get_small(Suit_List,CountSuit,CardOfPlayer_list,Player,New_Count).

……………………………………………………………………………………..

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

!.

%END Task Window, idc_push_button _CtlInfo

%BEGIN Task Window, id_help_contents

task_win_eh(_Win,e_Menu(id_help_contents,_ShiftCtlAlt),0):-!,

vpi_ShowHelp("hearts.hlp"),

!.

%END Task Window, id_help_contents

%BEGIN Task Window, id_help_about

task_win_eh(Win,e_Menu(id_help_about,_ShiftCtlAlt),0):-!,

dlg_about_dialog_Create(Win),

!.

%END Task Window, id_help_about

%BEGIN Task Window, id_file_exit

task_win_eh(Win,e_Menu(id_file_exit,_ShiftCtlAlt),0):-!,

win_Destroy(Win),

!.

%END Task Window, id_file_exit

%BEGIN Task Window, e_Size

task_win_eh(_Win,e_Size(_Width,_Height),0):-!,

ifdef use_tbar

toolbar_Resize(_Win),

enddef

ifdef use_message

msg_Resize(_Win),

enddef

!.

%END Task Window, e_Size

%END_WIN Task Window

/***************************************************************************

Invoking on-line Help

***************************************************************************/

project_ShowHelpContext(HelpTopic):-

vpi_ShowHelpContext("hearts.hlp",HelpTopic).

/***************************************************************************

Main Goal

***************************************************************************/

goal

ifdef use_mdi

vpi_SetAttrVal(attr_win_mdi,b_true),

enddef

ifdef ws_win

ifdef use_3dctrl

vpi_SetAttrVal(attr_win_3dcontrols,b_true),

enddef

enddef

vpi_Init(task_win_Flags,task_win_eh,task_win_Menu,"hearts",task_win_Title).

%BEGIN_DLG About dialog

/**************************************************************************

Creation and event handling for dialog: About dialog

**************************************************************************/

constants

%BEGIN About dialog, CreateParms, 10:49:04-23.11.2008, Code automatically updated!

dlg_about_dialog_ResID = idd_dlg_about

dlg_about_dialog_DlgType = wd_Modal

dlg_about_dialog_Help = idh_contents

%END About dialog, CreateParms

predicates

dlg_about_dialog_eh : EHANDLER

clauses

dlg_about_dialog_Create(Parent):-

win_CreateResDialog(Parent,dlg_about_dialog_DlgType,dlg_about_dialog_ResID,dlg_about_dialog_eh,0).

%BEGIN About dialog, idc_ok _CtlInfo

dlg_about_dialog_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtrlInfo),0):-!,

win_Destroy(_Win),

!.

%END About dialog, idc_ok _CtlInfo

%MARK About dialog, new events

dlg_about_dialog_eh(_,_,_):-!,fail.

%END_DLG About dialog

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]