Программирование игр

Страницы работы

Содержание работы

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

Новосибирский Государственный Технический Университет

Кафедра  прикладной математики

Лабораторная работа №3

“Программирование игр”

Факультет:         ПМиИ

Группа:               ПМ-61

Студенты:           Иванов Илья Александрович

Куприянов Виктор Юрьевич

Михуля Михаил Николаевич

Преподаватели:  Хабаров Валерий Иванович

Целебровская Марина Юрьевна

НОВОСИБИРСК

2000

Содержание

Содержание........................................................................................................................................................... 2

Цель работы.......................................................................................................................................................... 2

Задание..................................................................................................................................................................... 2

Расширение структуры данных для представления математических выражений     3

Тестирование программы символьного интегрирования.......................................... 4

Текст программы............................................................................................................................................. 5

Цель работы

Изучение базовых стратегий решения задач для программирования игр двух лиц с полной информацией.

Задание

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

Текст программы

/* Copyright (c) 2000 by MIK Corporation */

% Comment: MIK = Mikhulya, Ivanov, Koopriyanov

CONSTANTS

% Window descriptors

play_w   = 1

move_w   = 2

status_w = 3

field_w  = 4

% Codes of the keyboard

left     = 'K'

right    = 'M'

up       = 'H'

down     = 'P'

home     = 'G'

end      = 'O'

pgup     = 'I'

pgdn     = 'Q'

escape   = ''

enter    = '\13'

% Boolean values

true  = 1

false = 0

% Size of a game field ( subtract 1 )

height = 13

width  = 13

DOMAINS

LOGICAL = INTEGER

DIRECTION = INTEGER

MOVE = a(INTEGER,INTEGER)

TYPE =

x;

o.

PLAYER =

comp;

user.

MOVE_LIST  = MOVE*

DATABASE

x_o(TYPE,MOVE)

DATABASE - cells

cell(MOVE)

PREDICATES

init_player(PLAYER)

play(PLAYER)

alpha_beta(MOVE,INTEGER)

best_move(MOVE,INTEGER,MOVE,INTEGER,MOVE,INTEGER)

search_in_direction(TYPE,MOVE,INTEGER,DIRECTION,DIRECTION)

comp_make_moves

opponent(PLAYER,PLAYER)

five_in_line(TYPE)

make_move(PLAYER,MOVE)

weight(MOVE,INTEGER)

show_move(PLAYER,MOVE)

get_char(LOGICAL,CHAR)

check_char(CHAR,LOGICAL,CHAR)

move_cursor(LOGICAL,CHAR,INTEGER,INTEGER)

want_exit(LOGICAL,CHAR)

belong(MOVE,MOVE_LIST)

max(INTEGER,INTEGER,INTEGER)

min(INTEGER,INTEGER,INTEGER)

yes(CHAR)

add_all_near_cell(TYPE,MOVE_LIST)

add_cell(MOVE)

player_type(PLAYER,TYPE)

wf(INTEGER,TYPE,DIRECTION,DIRECTION,DIRECTION,DIRECTION,INTEGER)

wd(DIRECTION,DIRECTION,DIRECTION,DIRECTION)

CLAUSES

init_player(Player) :retractall(_),

retractall(_,cells),

makewindow(play_w,$31,$3F,"Игровое поле",0,0,18,60),

makewindow(move_w,$1F,$1F,"Ходы",0,60,18,20),

Y=round(height/2),

X=round(width/2),

Top=8-Y,

Left=29-X,

Height=3+height,

Width=3+width,

makewindow(field_w,$1F,$1F,"",Top,Left,Height,Width),

cursor(Y,X),

makewindow(status_w,$1F,$1F,"Окно статуса",18,0,7,80),

write("Рад видеть Вас, сыграем в крестики-нолики."),nl,

write("Будете ходить первым? (y/n) "),

get_char(L,C),

write(C),nl,

yes(C),

shiftwindow(status_w),

write("Ваш ход, о многоуважаемый..."),nl,

shiftwindow(move_w),

write("   User    Comp   "),nl,

Player=user;

shiftwindow(status_w),

write("Спасибо, Вы столь снисходительны ко мне..."),nl,

shiftwindow(move_w),

write("   Comp    User   "),nl,

Player=comp.

make_move(user,a(X,Y)) :shiftwindow(field_w),

get_char(L,C),

move_cursor(L,C,X,Y),

not(x_o(_,a(X,Y))).

make_move(user,a(X,Y)) :shiftwindow(status_w),

write("Wrong!!!"),

make_move(user,a(X,Y)).

make_move(comp,a(X,Y)) :Y=round(height/2),

X=round(width/2),

not(x_o(_,a(X,Y))).

make_move(comp,Best_move) :comp_make_moves,

alpha_beta(Best_move,_).

show_move(user,a(X,Y)) :shiftwindow(field_w),

cursor(Y,X),

write("X"),

shiftwindow(move_w),

writef(" (%2,%2) ",Y,X).

show_move(comp,a(X,Y)) :shiftwindow(field_w),

cursor(Y,X),

Информация о работе