|
#include <dos.h>
#include <bios.h>
#include <ctype.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void swap();
//смена цвета при
перескакивании нашего квадратика с одной стороны экрана на другую
void show();
//перерисовка экрана
void move();
//наш ход
void cpu();
//ход компьютера
void info();
//вывести на экран (обновить)
счет
int count,win_limit,key,jump,cpu_c,human_c,a,row_speed,h,col_speed,b,x1,x2,y1,y2,col;
main()
{
randomize();
row_speed=2;col_speed=2,a=3;b=1;
//
задаем скорость передвижения и размееры квадрата
textmode(C80);
//устонавливаем формат вывода текста 80Х25
символов
dima:
jump=5;
//устонавливаем максимальное число
перескоков с одной стороны экрана на другую
textattr(138);
clrscr();
window(30,12,80,12);
cprintf("press any key to start");
getch();
clrscr();
col=42;
x2=random(75);
//произвольное
расположение квадрата компьютера по оси Х
x2++;
y2=random(23);
//произвольное
расположение квадрата компьютера по оси
Y
y2++;
textbackground(col);
x1=40;
//наш
квадрат располагаем в центре
y1=12;
count=0;h=1;win_limit=400;cpu_c=0;human_c=0;
//обнуляем счетчики
ходов, устанавливаем таймер на 400 милисекунд
while (key!=283)
//повторяем до нажатия
ESC
{
if (x1==x2&&y1==y2)
//если
координаты обоих квадратов совпадаю, то мы проиграли
{
window(30,12,80,12);
textattr(140);
cprintf("You lose!!!");
sound(2500);
delay(100);
sound(2000);
delay(100);
sound(1500);
delay(100);
nosound();
goto
dima; //игра
заново
}
if (count>=win_limit)
//если таймер
истек, то мы вайграли
{
window(30,12,80,12);
textattr(137);
cprintf("You win!!!");
sound(1500);
delay(100);
sound(2000);
delay(100);
sound(2300);
delay(100);
sound(2500);
delay(300);
sound(2000);
delay(100);
sound(2500);
delay(300);
nosound();
goto
dima;
//игра заново
}
delay(150);
if (bioskey(1) !=
0)
//если клавиша нажата, то запускаем
move() и передвигаем наш квадрат
{
move();
}
cpu();
//ходит
комьпьютер
show();
//отображаем
все на мониторе
info();
//снизу ведем
статистику
count++;
//начислем
счетчик ходов
}
nosound();
return 1;
}
void show()
//перерисовка экрана
{
window(1,1,80,25);
textattr(0);
clrscr();
//заливаем черным окно
//sound(sound1); //если убрать это коментирование то при каждой
перерисовки будет звучать динамик
textattr(col);
window(x1,y1,x1+a,y1+b);
clrscr();
cprintf("” ” ДД"); //рисуем
рожицу которой ходим мы
if (x1==x2&&y1==y2)
{
window(x2,y2,x2+a,y2+b);
textattr(76);
clrscr();
cprintf("м__н ДД"); //рисуем
рожицу компьютера которая нас съела
}
else
{
window(x2,y2,x2+a,y2+b);
textattr(76);
clrscr();
cprintf("м н НН");
//рисуем
рожицу компьютера
}
}
void swap() //смена
цвета при перескоке
{
int check;
sound(1500);
delay(50);
nosound();
switch (col) //просто
меняем последовательо цвета пропуская цвет фона и цвет противника
{
case 25: col=42;
break;
case 42: col=59;
break;
case 59: col=93;
break;
case 93: col=110;
break;
case 110: col=127;
break;
case 127: col=25;
break;
}
if (jump>0) jump--;
//вычитаем
число допустимых скачков
}
void move()
//наш ход
{
int check;
human_c++;
//начисляем счетчик
наших ходов
key=bioskey(0);
//считываем
нажатую клавишу
sound(3500);
delay(20);
nosound();
switch (key) //перебираем
все возможные варианты нажатия клавишы
{
case 14122: textattr(2);
//актививизация
чита №1
window(60,22,80,25);
clrscr();
cprintf("cheat enabled!!!\r\njump left:");
sound(2500);
delay(500);
nosound();
cscanf("%d",&jump);
break;
case 10622: textattr(2);
//актививизация чита
№2
window(60,22,80,25);
clrscr();
cprintf("cheat enabled!!!");
sound(2500);
delay(500);
nosound();
while (key!=10592)
//прекращение действия
чита
{
move();
show();
info();
}
break;
case 18432: y1=y1-col_speed;
//двигаемся вверх
break;
case 20480: y1=y1+col_speed;
//двигаемся вниз
break;
case 19712: x1=x1+row_speed;
//двигаемся
направо
break;
case 19200: x1=x1-row_speed;
//двигаемся налево
}
check=0;
//check создан
для того, чтобы избежать бесконечного прыгания с одной стороны экрана
на другую и обратно
if (x1<=a-1&&check==0)
//нужно ли
перескакивать по горизонтали или нет
{
if (jump==0)
{
swap();
x1=x1+row_speed;
}
else
{
x1=80-a;
check++;
swap();
}
}
if (x1>=79-a&&check==0)
{
if (jump==0)
{
swap();
x1=x1-row_speed;
}
else
{
x1=1;
check++;
swap();
}
}
if (y1<=1&&check==0)
//нужно ли перескакивать по вертикли или нет
{
if (jump==0)
{
swap();
y1=y1+col_speed;
}
else
{
y1=25-b;
check++;
swap();
}
}
if (y1>=25-b&&check==0)
{
if (jump==0)
{
swap();
y1=y1-col_speed;
y2=y2-col_speed;
}
else
{
y1=1;
swap();
}
}
}
void cpu()
//ход компьютера
{
int move,row,col,check_x,check_y;
cpu_c++;
//начисляем счетчик
хода компьютера
row=x1-x2;
//алгаритм
решения куда ходить, чтобы догнать нас
col=y1-y2;
if (row!=0) check_x=80/row;
if (col!=0) check_y=25/col;
move=0;
if (check_x>=check_y&&move==0||!row)
//непосредственно движение
{
if (y1>=y2)
{
y2++;
}
if (y1<y2)
{
y2--;
}
move++;
}
if (check_x<check_y&&move==0||!col)
{
if (x1>=x2)
{
x2++;
}
if (x1<x2)
{
x2--;
}
move++;
}
}
void info() //функция
вывода на экран статистики
{
textattr(10);
window(1,22,20,25);
cprintf("human turn:%d\r\ncpu turn:%d\r\ntime:%d\r\njumps
left:%d",human_c,cpu_c,win_limit-count,jump);
} |