Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2011, 18:21   #1
q123Gunner
Новичок
Джуниор
 
Регистрация: 12.05.2011
Сообщений: 1
По умолчанию улучшение текстовой змейки

вот написал текстовую змейку на паскале, а теперь хочу улучшить её добавив преграды , только не доходит как это сделать , вот код:
Код:
uses crt;
type
spoint=record
x:integer;
y:integer;
end;
const
maxwidth=15;
var
width:integer;
e:spoint;
snakebody:array[1..maxwidth]of spoint;
i,nx,ny:integer;
v:byte;
gameover:boolean;
key:char;

function checknext(x:integer; y:integer;): boolean;
var
isset:boolean;
i:integer;
begin
isset:=true;
for i:=1 to width do
begin
if (x=snakebody[i].x) and (y=snakbody.y) then
isset:=false;
end;
if isset then
begin
if (x<=0) or (y<=0) or (x>=80) or (y>=25) then isset:=false;
end;
checknext:=isset;
end;

procedure neweat;
begin
e.x:=random(78)+2;
e.y:=random(23)+2;
while (not checknext(e.x,e.y)) do
begin
e.x:=random(78)+2;
e.y:=random(23)+2;
end;
end;

procedure movesnake(x,y:integer);
var
i:integer;
begin
for i:=1 to width do
begin
snakebody[i]:=snakebody[i+1];
end;

snakebody[width].x:=x;
snakebody[width].y:=y;

if (x=e.x) and (y=e.y) then
begin
width:=width+1;
snakebody[width].x:=x;
snakebody[width].y:=y;
neweat;
end;
end;

begin
gameover:=false;
width:=4;

snakebody[1].x:=1;
snakebody[1].y:=1;

snakebody[2].x:=2;
snakebody[2].y:=1;

snakebody[3].x:=3;
snakebody[3].y:=1;

snakebody[4].x:=4;
snakebody[4].x:=1;

clrscr;
v:=1;

randomize;
neweat;
while(width<maxwidth) do
begin

if (keypressed) then 
begin
key:=readkey;
case key of
'w':begin if v=4 then continue; v:=3; end;
's':begin if v=3 then continue; v:=4; end;
'a':begin if v=2 then continue; v:=2; end;
'd':begin if v=1 then continue; v:=1; end;
#27:break;
end;
end;

clrscr;

case v of
1:begin nx:=snakebody[width].x+1; ny:=snakebody[width].y;end;
2:begin nx:=snakebody[width].x-1; ny:=snakebody[width].y;end;
3:begin nx:=snakebody[width].x; ny:=snakebody[width].y-1;end;
4:begin nx:=snakebody[width].x; ny:=snakebody[width].y+1;end;
end;

if (not checknext(nx,ny)) then
begin
gameover:=true;
break;
end;
textbackground(lightegreen);
movesnake(nx,ny);
textcolor(yellow);
gotoxy(e.x,e.y);
write('$');

for i:=1 to width-1 do
begin
textcolor(red);
gotoxy(snakebody[i].x,snakebody[i].y);
write('#');
end;
gotoxy(snakebody[width].x,snakebody[width].y);
write('+');

gotoxy(80,25);

delay(30000);
end;

clrscr;

if (gameover) then
writeln('GAME OVER!')
else
writeln('YOU WIN!');

writeln('Press Enter for exit!');
readln;
end.




________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)

Модератор.

Последний раз редактировалось Serge_Bliznykov; 30.06.2011 в 20:28.
q123Gunner вне форума Ответить с цитированием
Старый 07.07.2011, 04:11   #2
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

я раньше писал подобное, но пишу я на C, так что кодом не помогу...
кароче так: просто сделай перед заменой следующей клетки проверку, | это, или нет! сейчас дам тебе сайт где такое написано на C++
http://shatalov.su/cpp_primer/function_1.php
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Старый 07.07.2011, 04:22   #3
pufystyj
Форумчанин
 
Аватар для pufystyj
 
Регистрация: 10.11.2010
Сообщений: 569
По умолчанию

да и ещё вот тебе мой код:
Код:
#include <conio.h>
#include <iostream>
#include <clocale>
#include <ctime>

using namespace std;

char map[25][31];
int napr;
int yaii = 14;
int xaii = 10;
int aiifuel = 10;
int xy = 15 - yaii;
int yx = yaii - 15;
int xy1 = 10 - xaii;
int yx1 = xaii - 10;

int aii()
{

	if (aiifuel < 6)
	{

	    if (yaii < 15)
		{

			yaii++;

		}
		else if (yaii > 15)
		{
			yaii--;
		}

		if (xaii < 10)
		{
			xaii++;
		}
		else if (xaii > 10)
		{
			xaii--;
		}

	}
	else
    napr = rand() % 4;
    map [yaii][xaii] = ' ';
    switch(napr) {
    case 0:
        ++yaii;
        break;
    case 1:
        --yaii;
        break;
    case 2:
        ++xaii;
        break;
    case 3:
        --xaii;
        break;
    }
    map [yaii][xaii] = 'X';
return map [yaii][xaii];
}


int fuel (char map [25][31], int fuel)
{
fuel = fuel - 1;
if (map [15][10] == 'T')
{
fuel = 20;
}

if (fuel == 0)
{
system("cls");
cout << "Вы проиграли!";
exit(0);
}
return fuel;
}

int main()
{
	srand(time(0));
	setlocale(LC_CTYPE,"Russian");


	for (int p = 0; p < 23; p++)
	{
		for (int o = 0; o < 30; o++)
		{
map[p][o] = ' '; 
		}
	}

for (int l = 0; l < 30; l = l + 1)
{
map [l][22] = '|';
}
for (int k = 0; k < 22; k = k + 1)
{
map [21][k] = '-';
}
char act;
int bbb;
int x = 15;
int y = 10;
int afuel = 20;



map [10][15] = 'T';
map [15][10] = 'C';
  	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j]; 
		}
		cout << "\n";
	}
	cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";

for (;;)
{
act = _getch();
bbb = static_cast<int>(act);
if (bbb == -32)
{
}
else if (bbb == 114)
{
  system("cls");
	for (int p = 0; p < 23; p++)
	{
		for (int o = 0; o < 30; o++)
		{
map[p][o] = ' '; 
		}
	}

for (int l = 0; l < 30; l = l + 1)
{
map [l][22] = '|';
}
for (int k = 0; k < 22; k = k + 1)
{
map [21][k] = '-';
}

int v = 0;
while (v < 12)
{
v = v + 1;
int n;
int m;
n = rand()%10;
m = rand()%10;
map [n][m] = '0';
}


for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j];
		}
		cout << "\n";
	}
	cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";


}
else if (bbb == 27)
{
cout << "Выход";
exit (0);
}
else if (bbb == 75)
{
  system("cls");
  map[y][x] = ' ';
  x = x - 1;
  if (x == -1)
  {
  x = x + 1;
  }
  map [15][10] = 'C';
 afuel = fuel (map, afuel);
   map[y][x] = 'T'; 
if (map [yaii][xaii] == 'T')
{
  system("cls");
  cout << "Вы победили";
}
aii();
if (map [y][x] == 'X')
{
  system("cls");
  cout << "Вы проиграли";
}
  	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j];
		}
		cout << "\n"; 
	}
	cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";

}
else if (bbb == 77)
{
  system("cls");
	map[y][x] = ' ';
  x = x + 1;
    if (x == 22)
  {
  x = x - 1;
  }
  map [15][10] = 'C';
  map[y][x] = 'T';
 afuel = fuel (map, afuel);
   map[y][x] = 'T';
if (map [yaii][xaii] == 'T')
{
  system("cls");
  cout << "Вы победили";
}
aii();
if (map [y][x] == 'X')
{
  system("cls");
  cout << "Вы проиграли";
}
 for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j]; // в циклах поэлементно выводится массив
		}
		cout << "\n"; 
	}
    cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";
}
else if (bbb == 72)
{
  system("cls"); 
	map[y][x] = ' ';
  y = y - 1;
    if (y == -1)
  {
  y = y + 1;
  }
  map [15][10] = 'C';
   map[y][x] = 'T'; 
if (map [yaii][xaii] == 'T')
{
  system("cls");
  cout << "Вы победили";
}
aii();
if (map [y][x] == 'X')
{
  system("cls");
  cout << "Вы проиграли";
}
  	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j];
		}
		cout << "\n"; // переход на новую строку после каждого "ряда"
	}
    cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";

}
else if (bbb == 80)
{

  system("cls"); 
	map[y][x] = ' ';
  y = y++;
      if (y == 21)
  {
  y = y - 1;;
  }
  map [15][10] = 'C';
  map[y][x] = 'T';
 afuel = fuel (map, afuel);
   map[y][x] = 'T'; 
if (map [yaii][xaii] == 'T')
{
  system("cls");
  cout << "Вы победили";
}
aii();
if (map [y][x] == 'X')
{
  system("cls");
  cout << "Вы проиграли";
}
  	for (int i = 0; i < 22; i++)
	{
		for (int j = 0; j < 30; j++)
		{
			cout << map[i][j];
		}
		cout << "\n"; // переход на новую строку после каждого "ряда"
	}
    cout << "Управление - стрелочками, выход - Esc, другой лвл - R.\n";
}
else
{
  cout << "Вы нажали неверную клавишу!\n";
}
}

return 0;
}
П.с. да блин поставьте мне хоть кто-то плюсик!
Это ещё не конец и даже не начало конца, это возможно только конец начала.
pufystyj вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кинте исходник простой консольной змейки Banner Помощь студентам 2 23.02.2011 07:55
исходник змейки fis Gamedev - cоздание игр: Unity, OpenGL, DirectX 21 31.03.2010 22:19
Улучшение кода The riddle Помощь студентам 2 07.12.2009 10:00
[Pascal] Помогите с движением змейки Рамик Помощь студентам 5 08.09.2009 21:53