Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > BlitzMax > 2D-программирование

Ответ
 
Опции темы
Старый 08.08.2012, 02:31   #1
Matt Merkulov
Модератор
 
Аватар для Matt Merkulov
 
Регистрация: 23.10.2005
Сообщений: 219
Написано 62 полезных сообщений
(для 247 пользователей)
Гнусный Тетрис

он будет каждый раз выдавать вам самую неудобную фигуру
попробуйте хотя бы немного продержаться и с позором проиграйте

управление:
стрелки - двигать фигуру
q, w - вращать фигуру

Скачать скомпиленную версию ( 150KB )

Исходники:
SuperStrict

Framework brl.glmax2d
Import brl.random

SeedRnd Millisecs()

Const SquareSize:Int = 24

Global World:Int[ 21, 23 ]
Global TempWorld:Int[ 21, 23 ]
Global Figure:Int[ 7, 4, 4, 4 ]
Global Phases:Int[ 7 ]
Global XShift:Int[][] = [ [ 0 ], [ 0, 0 ], [ 0, 0 ], [ 1, 0 ], [ 0, 1, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 1, 0, 0 ] ]
Global YShift:Int[][] = [ [ 2 ], [ 2, 2 ], [ 3, 1 ], [ 4, 2 ], [ 2, 3, 2, 3 ], [ 2, 3, 3, 1 ], [ 2, 3, 2, 2 ] ]

Local M:Int = 0
For Local S:String = Eachin "ABEF,AEFJEFBC,IEFBABFG,BFJNEFGH,AEFGCBFJEFGKIJFB,EFGCBFJKIEFGABFJ,EFBGBFGJEFGJBEFJ".Split(",")
	Phases[ M ] = S.Length / 4 - 1
	For Local I:Int = 0 To Phases[ M ]
		For Local J:Int = 0 To 3
			Local A:Int = S[ I * 4 + J ] - 65
			Figure[ M, I, A & 3, A Shr 2 ] = True
		Next
	Next
	M :+ 1
Next

Graphics SquareSize * 14, SquareSize * 21 + 16

For Local I:Int = 0 To 20
	World[ 1, I ] = True
	World[ 12, I ] = True
	World[ I, 20 ] = True
Next

Local X:Int = 0, Y:Int = 19, R:Int = 0, T:Int = 0, N:Int = 0, Score:Int = 0

Repeat
	Cls
	For Local I:Int = 0 To 20
		For Local J:Int = 1 To 12
			If World[ J, I ] Then DrawRect J * SquareSize, I * SquareSize, SquareSize, SquareSize
		Next
	Next
	
	For Local I:Int = 0 To 3 
		For Local J:Int = 0 To 3
			If Figure[ N, R, I, J ] Then DrawRect ( X + I ) * SquareSize, ( Y + J ) * SquareSize, SquareSize, SquareSize
		Next
	Next
	
	DrawText "Score: " + Score, SquareSize * 7 - 4 * ( 7 + String( Score ).Length ), SquareSize * 21
	
	Flip
	
	Local A:Int = X + KeyHit( KEY_RIGHT ) - KeyHit( KEY_LEFT )
	Local B:Int = Y + KeyDown( KEY_DOWN )
	Local Q:Int = ( R + KeyHit( KEY_W ) - KeyHit( KEY_Q ) ) & Phases[ N ]
	
	IF Not CheckPosition( A, B, N, Q ) Then
		X = A
		Y = B
		R = Q
	End If
	
	Local M:Int = Millisecs()
	
	If M > T Then
		T = M + 999
		
		If CheckPosition( X, Y + 1, N, R ) Then
			If Y = 0 Then End
			
			For Local I:Int = 0 To 3
				For Local J:Int = 0 To 3
					If Figure[ N, R, I, J ] Then World[ X + I, Y + J ] = True
				Next
			Next
			
			Local Counter:Int = 0
			Local D:Int = 0
			For Local J:Int = 19 To 0 Step -1
				Local Quantity:Int = 0
				For Local I:Int = 2 To 11
					If World[ I, J ] Then Quantity :+ 1
					World[ I, J + D ] = World[ I, J ]
				Next
				If Quantity > 9 Then
					D :+ 1
					Counter :+ 1
					Score :+ Counter
				End If
			Next
			
			X = 5
			Y =  - 1
			N = Decide()
		EndIf
		
		Y :+ 1
	End If
Until KeyHit( KEY_ESCAPE )

Function CheckPosition:Int( X:Int, Y:Int, N:Int, R:Int )
	For Local I:Int = 0 To 3
		For Local J:Int = 0 To 3
			If Figure[ N, R, I, J ] * World[ I + X, J + Y ] Then Return True
		Next
	Next
EndFunction

Function Decide:Int()
	Local CurrentScore:Int = 0
	Local CurrentN:Int = 0
	For Local N:Int = 0 To 6
		Local Score:Int = 999
		For Local R:Int = 0 To Phases[ N ]
			For Local X:Int = 2 To 11
				For Local Y:Int = 4 To 19
					If Not World[ X, Y ] And World[ X, Y + 1 ] Then
						Local XX:Int = X - XShift[ N ][ R ]
						Local YY:Int = Y + 1 - YShift[ N ][ R ]
						If CheckPosition( XX, YY, N, R ) Then Continue
						Score = Min( Score, Calculate( XX, YY, N, R ) )
					End If
				Next
			Next
		Next
		
		If Score >= CurrentScore Then
			If Score = CurrentScore Then If Rand( 0, 1 ) Then Continue
			CurrentScore = Score
			CurrentN = N
		End If
	Next
	
	Return CurrentN
End Function



Function Calculate:Int( X:Int, Y:Int, N:Int, R:Int )
	For Local X:Int = 2 To 11
		For Local Y:Int = 0 To 20
			TempWorld[ X, Y ] = World[ X, Y ]
		Next
	Next
	
	For Local I:Int = 0 To 3
		For Local J:Int = 0 To 3
			If Figure[ N, R, I, J ] Then TempWorld[ X + I, Y + J ] = True
		Next
	Next

	Local Score:Int = 0
	
	Local CurrentHeight:Int
	For Local I:Int = 2 To 11
		For Local J:Int = 0 To 20
			If TempWorld[ I, J ] Then
				If I > 2 Then Score :+ Abs( J - 1 - CurrentHeight )
				CurrentHeight = J - 1
				Exit
			End If
		Next
		
		For Local J:Int = 1 To 19
			If Not TempWorld[ I, J ] And TempWorld[ I, J - 1 ] Then Score :+ 16
		Next
	Next
	
	Return Score
End Function

Последний раз редактировалось Matt Merkulov, 08.08.2012 в 09:10.
(Offline)
 
Ответить с цитированием
Эти 17 пользователя(ей) сказали Спасибо Matt Merkulov за это полезное сообщение:
ARA (08.08.2012), cahekp (08.08.2012), dimanche13 (08.08.2012), FireOwl (08.08.2012), FREE MAN (08.08.2012), Gector (08.08.2012), HolyDel (08.08.2012), L.D.M.T. (08.08.2012), Mhyhr (08.08.2012), Nex (08.08.2012), pepel (08.08.2012), Randomize (08.08.2012), Reks888 (08.08.2012), St_AnGer (08.08.2012), Tadeus (08.08.2012), Жека (08.08.2012), Черный крыс (12.08.2012)
Старый 08.08.2012, 02:59   #2
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,363
Написано 483 полезных сообщений
(для 872 пользователей)
Ответ: Гнусный Тетрис

Ты злодей.
(Offline)
 
Ответить с цитированием
Эти 10 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
ARA (08.08.2012), cahekp (08.08.2012), Gector (08.08.2012), L.D.M.T. (08.08.2012), Matt Merkulov (08.08.2012), Mhyhr (08.08.2012), Nex (08.08.2012), pepel (08.08.2012), Randomize (08.08.2012), St_AnGer (08.08.2012)
Старый 08.08.2012, 03:31   #3
ARA
ТЫ ЧООО?
 
Аватар для ARA
 
Регистрация: 26.02.2007
Сообщений: 3,294
Написано 1,970 полезных сообщений
(для 7,063 пользователей)
Ответ: Гнусный Тетрис

Рекорд - 6.
Тетрис и правда злобный.
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 06:23   #4
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,001
Написано 1,142 полезных сообщений
(для 2,753 пользователей)
Ответ: Гнусный Тетрис

рекорд - 9 с 8-й попытки
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 07:27   #5
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,363
Написано 483 полезных сообщений
(для 872 пользователей)
Ответ: Гнусный Тетрис

И ещё - мне до такой лаконичности кода далековато (хоть и не стремлюсь к ней), склоняюсь перед профессионализмом автора.
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 07:33   #6
Matt Merkulov
Модератор
 
Аватар для Matt Merkulov
 
Регистрация: 23.10.2005
Сообщений: 219
Написано 62 полезных сообщений
(для 247 пользователей)
Ответ: Гнусный Тетрис

это частично потому что я переписал свой старый код тетриса-тысячесимвольника
там были использованы всякие извраты чтобы сократить объем кода
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 08:20   #7
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: Гнусный Тетрис

6
вот я лох-то ))))))) в тетрис играть не умею
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 08:21   #8
HolyDel
 
Регистрация: 25.09.2006
Сообщений: 6,030
Написано 1,469 полезных сообщений
(для 2,690 пользователей)
Ответ: Гнусный Тетрис

1...
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 08:56   #9
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,910
Написано 3,395 полезных сообщений
(для 9,285 пользователей)
Ответ: Гнусный Тетрис

а почему вращение на такие экзотические клавиши, а не на православное "вверх"?
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (08.08.2012)
Старый 08.08.2012, 09:08   #10
Matt Merkulov
Модератор
 
Аватар для Matt Merkulov
 
Регистрация: 23.10.2005
Сообщений: 219
Написано 62 полезных сообщений
(для 247 пользователей)
Ответ: Гнусный Тетрис

вращать надо уметь в обе стороны, чтобы клавиши были рядом
хотя сейчас пальцы автоматом ставятся на WASD, так что мб A/D было бы лучше, согласен

(укрупнил поле, перезалил экзешник)
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 09:13   #11
HolyDel
 
Регистрация: 25.09.2006
Сообщений: 6,030
Написано 1,469 полезных сообщений
(для 2,690 пользователей)
Ответ: Гнусный Тетрис

кстати, работает в убунте под вайном.

в новой версии набрал 5.
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 10:39   #12
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: Гнусный Тетрис

Сообщение от HolyDel Посмотреть сообщение
кстати, работает в убунте под вайном.
этож БМ. можно скомпилить для линукса нативный бинарник и никакой вайн будет не нужен.
7
(Offline)
 
Ответить с цитированием
Старый 08.08.2012, 10:42   #13
HolyDel
 
Регистрация: 25.09.2006
Сообщений: 6,030
Написано 1,469 полезных сообщений
(для 2,690 пользователей)
Ответ: Гнусный Тетрис

а можно запустить под вайном и никакой нативный бинарник будет не нужен
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
ARA (08.08.2012), St_AnGer (10.08.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 19:45.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com