Tetris kodu 2019

Bu kodlar bat dosyasıyla çalışabilecek kodlardır.

 

Not : Kodları txt dosyadına kopyalayınız sonra uzantısını .bat yapınız .Hepsi bu kadar ...


Kod :

--------

 

Nedense Tetris oyununu hatırladım, bu yüzden Batch dosya versiyonlarını aradım. Ancak, yalnızca iki tür Toplu Dosya Tetris oyunu bulabilirim: üçüncü taraf programları kullanan çalışma oyunları veya temelde prototip olan toplu Toplu İş dosyaları; bu nedenle, saf bir Toplu Dosya Tetris oyunu yazmaya karar verdim. Bu ilk versiyon ve oldukça iyi çalışıyor:

 

@echo off

setlocal EnableDelayedExpansion

 

if "%~1" neq "" goto %1

 

title Tetris.BAT by Aacini

rem Written by Antonio Perez Ayala

rem http://www.dostips.com/forum/viewtopic.php?f=3&t=6812

rem Reference: http://colinfahey.com/tetris/tetris.html

rem 2015/11/27 - version 1.0

 

rem Delete the next line when Bitmap font 16x8 is used

set "F16x8=REM"

 

cls

echo/

echo ===  Pure .BATch-file Tetris game by Aacini  ===

echo/

echo/

echo Tetris pieces are controlled with these keys:

echo/

echo                                 rot.right

echo rot.             rot.     move      I      move

echo left ^<- A S D -^> right    left ^<- J K L -^> right

echo           ^|                         ^|

echo           v                         v

echo       soft drop                 hard drop

echo/

echo/

echo Press P to pause the game; press N to end game

echo/

echo/

pause

cls

 

rem Field dimensions

set /A cols=10, lines=20

 

set /A col=cols+6, lin=lines+8

%F16x8% set /A lin+=lines+2

mode CON: cols=%col% lines=%lin%

if %errorlevel% neq 0 (

   echo Configuration error^^^!

   echo You must select a font size that allows to set

   echo a text window of %col% columns X %lin% lines

   pause

   goto :EOF

)

 

chcp 850 > NUL

cd . > pipeFile.txt

"%~F0" Input >> pipeFile.txt  |  "%~F0" Main < pipeFile.txt

ping localhost -n 2 > NUL

del pipeFile.txt

goto :EOF

 

 

 

:Input

set "com[J]=Dx=-1"

set "com[L]=Dx=1"

set "com[K]=del=3"

set "com[I]=R=-1"

set "com[A]=R=1"

set "com[D]=R=-1"

set "com[S]=Dy=-1"

set "com[Y]=Y"

set "com[N]=N=1"

set "com[P]=pause=1"

 

for /L %%# in () do (

   set "key="

   for /F "delims=" %%k in ('xcopy /W "%~F0" "%~F0" 2^>NUL') do if not defined key set "key=%%k"

   for /F %%k in ("!key:~-1!") do (

      echo(!com[%%k]!

      if /I "%%k" equ "N" exit

   )

)

rem exit

 

 

 

:Main

 

(

   for /F "delims==" %%v in ('set') do set "%%v="

   set /A cols=%cols%, lines=%lines%

   set "F16x8=%F16x8%"

)

 

rem Initialize the Field

for /L %%i in (1,1,%cols%) do set "spc=!spc! "

for /L %%i in (1,1,%lines%) do set "F%%i=  ³%spc%³"

set /A top=lines+1

set "F%top%=  Ú" & set "F0=  À"

for /L %%i in (1,1,%cols%) do set "F%top%=!F%top%!Ä" & set "F0=!F0!Ä"

set "F%top%=!F%top%!¿" & set "F0=%F0%Ù"

set "F-1=  Level: 1" & set "Level=1"

set "F-2=   Rows: 0" & set "Rows=0"

set "F-3=  Score: 0" & set "Score=0"

for /L %%i in (1,1,%cols%) do set "blk=!blk!Û"

set /A top=lines+3, delay=50

%F16x8% set /A linesP2=lines+2

 

rem Define all ":orientations:" of the O I S Z L J T pieces via "triplets":

rem (offset Y . offset X . length X); one "triplet" for each horizontal line

for %%t in ( "O:0.-1.2 -1.-1.2"

             "I:0.-2.4:1.0.1 0.0.1 -1.0.1 -2.0.1"

             "S:0.0.2 -1.-1.2:1.0.1 0.0.2 -1.1.1"

             "Z:0.-1.2 -1.0.2:1.1.1 0.0.2 -1.0.1"

             "L:0.-1.3 -1.-1.1:1.0.1 0.0.1 -1.0.2:1.1.1 0.-1.3:1.-1.2 0.0.1 -1.0.1"

             "J:0.-1.3 -1.1.1:1.0.2 0.0.1 -1.0.1:1.-1.1 0.-1.3:1.0.1 0.0.1 -1.-1.2"

             "T:0.-1.3 -1.0.1:1.0.1 0.0.2 -1.0.1:1.0.1 0.-1.3:1.0.1 0.-1.2 -1.0.1" ) do (

   set "pc=%%~t"

   set "i=-1"

   for /F "delims=" %%p in (^"!pc::^=^

% New line %

!^") do (

      if !i! lss 0 (set "pc=%%p") else set "!pc!!i!=%%p"

      set /A i+=1

   )

   set "!pc!N=!i!"

)

set "pcs=OISZLJT"

 

set "init=1"

for /L %%# in () do (

 

   if defined init (

      setlocal EnableDelayedExpansion

      set "init="

 

      rem Create the first "previous" piece

      for /L %%i in (0,1,!time:~-1!) do set /A p=!random!%%7

      for %%p in (!p!) do set "p2=!pcs:~%%p,1!"

      for %%p in (!p2!) do set "p3=!%%p0!" & set "p4=!%%pN!"

 

      set "new=1"

   )

 

   if defined new (

      set "new="

 

      rem Take the "previous" piece as current one

      set "pc=!p2!" & set "p0=!p3!" & set "pN=!p4!"

 

      rem Create a new "previous" piece

      for /L %%i in (1,1,2) do (

         set /A p=!random!*7/32768

         for %%p in (!p!) do (

            set "p=!pcs:~%%p,1!"

            if !p! neq !pc! set "p2=!p!"

         )

      )

      for %%p in (!p2!) do set "p3=!%%p0!" & set "p4=!%%pN!"

 

      rem Insert the new "previous" piece in its place, above Field

      set /A x=3+cols/2, y=top, yp=top-1

      set "F!yp!=   %spc%"

      for %%p in (!p3!) do (

         for /F "tokens=1-3 delims=." %%i in ("%%p") do (

            set /A yp=y+%%i, xp=x+%%j, xL=xp+%%k

            for /F "tokens=1-3" %%a in ("!yp! !xp! !xL!") do (

               set "F%%a=!spc:~0,%%b!!blk:~0,%%k!!spc:~%%c!"

            )

         )

      )

 

      rem Try to insert the new current piece in the Field...

      set /A x=3+cols/2, y=lines,   b=1

      for %%p in (!p0!) do (

         for /F "tokens=1-3 delims=." %%i in ("%%p") do (

            set /A yp=y+%%i, xp=x+%%j, xL=xp+%%k

            for /F "tokens=1-3" %%a in ("!yp! !xp! !xL!") do (

               if "!F%%a:~%%b,%%k!" neq "!spc:~0,%%k!" set     "b="

               set "F%%a=!F%%a:~0,%%b!!blk:~0,%%k!!F%%a:~%%c!"

            )

         )

      )

      cls

      for /L %%i in (%top%,-1,-3) do (

         echo(!F%%i!

%F16x8%  if %%i geq %linesP2% echo(!F%%i!

%F16x8%  if %%i geq 1 if %%i leq %lines% echo(!F%%i!

      )

 

      rem ... if that was not possible:

      if not defined b call :endGame & endlocal

 

      set "p1=!p0!"

      set /A "pI=0, del=delay, b=1!time:~-2!"

 

   )

 

   rem Control module: move the piece as requested via a key, or down one row each %del% centiseconds

   set "move="

   set /A "Dy=Dx=0"

   set /P "com="

   if defined com (

      set /A "!com!, move=1"

      set "com="

      if defined N exit

      if defined pause call ause & set "move="

      set "b=1!time:~-2!"

   ) else (

      set /A "e=1!time:~-2!, elap=e-b, elap-=(elap>>31)*100"

      if !elap! geq !del! set /A b=e, Dy=move=-1

   )

 

   if defined move (

 

      rem Delete the piece from its current position, and store current coordinates

      set i=0

      for %%p in (!p0!) do for /F "tokens=1-3 delims=." %%i in ("%%p") do (

         set /A yp=y+%%i, xp=x+%%j, xL=xp+%%k

         for /F "tokens=1-3" %%a in ("!yp! !xp! !xL!") do (

            set "F%%a=!F%%a:~0,%%b!!spc:~0,%%k!!F%%a:~%%c!"

            set /A i+=1

            set "c!i!=%%a %%b %%c %%k"

         )

      )

 

      rem If move is Rotate: get rotated piece

      if defined R (

         set /A "p=(pI+R+pN)%%pN"

         for /F "tokens=1,2" %%i in ("!pc! !p!") do set "p1=!%%i%%j!"

      )

 

      rem Test if the piece can be placed at the new position, and store new coordinates

      set j=0

      for %%p in (!p1!) do if defined move (

         for /F "tokens=1-3 delims=." %%i in ("%%p") do (

            set /A yp=y+%%i+Dy, xp=x+%%j+Dx, xL=xp+%%k

            for /F "tokens=1-3" %%a in ("!yp! !xp! !xL!") do (

               if "!F%%a:~%%b,%%k!" equ "!spc:~0,%%k!" (

                  set /A j+=1

                  set "n!j!=%%a %%b %%c %%k"

               ) else (

                  set "move="

               )

            )

         )

      )

 

      if defined move (

 

         rem Place the piece at the new position

         for /L %%j in (1,1,!j!) do (

            for /F "tokens=1-4" %%a in ("!n%%j!") do (

               set "F%%a=!F%%a:~0,%%b!!blk:~0,%%d!!F%%a:~%%c!"

            )

         )

 

         rem Update the Field in screen

         cls

         for /L %%i in (%top%,-1,-3) do (

            echo(!F%%i!

%F16x8%     if %%i geq %linesP2% echo(!F%%i!

%F16x8%     if %%i geq 1 if %%i leq %lines% echo(!F%%i!

         )

 

         rem Update any changes in the piece

         set /A y+=Dy, x+=Dx

         if defined R set "p0=!p1!" & set "pI=!p!" & set "R="

 

      ) else (   rem The piece can not be moved

 

         rem Recover the piece at its current position

         for /L %%i in (1,1,!i!) do (

            for /F "tokens=1-4" %%a in ("!c%%i!") do (

               set "F%%a=!F%%a:~0,%%b!!blk:~0,%%d!!F%%a:~%%c!"

            )

         )

         if defined R set "p1=!p0!" & set "R="

 

         if !Dy! neq 0 (   rem The piece "lands"

 

            rem Count completed lines

            set "j=0"

            for /L %%i in (1,1,!i!) do for /F %%a in ("!c%%i!") do (

               if "!F%%a:~3,%cols%!" equ "%blk%" (

                  set "F%%a=  ³%spc: ==%³"

                  set /A j+=1

               )

            )

 

            if !j! neq 0 (

               rem Update scores (See N-Blox at http://www.tetrisfriends.com/help/tips_appendix.php#rankingsystem)

               set /A "xp=Level*(40+((j-2>>31)+1)*60+((j-3>>31)+1)*200+((j-4>>31)+1)*900), Score+=xp, Rows+=j, xL=Level, Level=(Rows-1)/10+1"

               set "F-2=!F-2:~0,8!+!j!     "

               set "xp=!xp!     "

               set "F-3=!F-3:~0,8!+!xp:~0,6!"

               echo BEL Ctrl-G Ascii-7

               cls

               for /L %%i in (%top%,-1,-3) do (

                  echo(!F%%i!

%F16x8%           if %%i geq %linesP2% echo(!F%%i!

%F16x8%           if %%i geq 1 if %%i leq %lines% echo(!F%%i

               )

               set "F-1=!F-1:~0,8! !Level!"

               set "F-2=!F-2:~0,8! !Rows!"

               set "F-3=!F-3:~0,8! !Score!"

               if !Level! neq !xL! if !delay! gtr 5 set /A delay-=5

 

               rem Remove completed lines

               set "i=1"

               for /L %%i in (1,1,%lines%) do (

                  set "F!i!=!F%%i!"

                  if "!F%%i:~3,1!" neq "=" set /A i+=1

               )

               for /L %%i in (!i!,1,%lines%) do set "F%%i=  ³%spc%³"

               call elay 95

               cls

               for /L %%i in (%top%,-1,-3) do (

                  echo(!F%%i!

%F16x8%           if %%i geq %linesP2% echo(!F%%i!

%F16x8%           if %%i geq 1 if %%i leq %lines% echo(!F%%i!

               )

            )

 

            rem Request to show a new piece

            set "new=1"

 

         )

 

      )

 

   )

 

)

 

:endGame

set /P "=Play again? " < NUL

:choice

   set /P "com="

if not defined com goto choice

if /I "%com%" equ "Y" exit /B

if /I "%com:~0,1%" neq "N" set "com=" & goto choice

echo N

exit

 

 

:Pause

set "pause=!F%lines%!"

set "F%lines%=  ³%spc:          =  PAUSED  %³"

cls & for /L %%i in (%top%,-1,-3) do (

         echo(!F%%i!

%F16x8%  if %%i geq %linesP2% echo(!F%%i!

%F16x8%  if %%i geq 1 if %%i leq %lines% echo(!F%%i!

      )

:wait

   set /P "com="

if not defined com goto wait

set "com="

set "F%lines%=%pause%"

cls & for /L %%i in (%top%,-1,-3) do (

         echo(!F%%i!

%F16x8%  if %%i geq %linesP2% echo(!F%%i!

%F16x8%  if %%i geq 1 if %%i leq %lines% echo(!F%%i!

      )

set "pause="

exit /B

 

 

:Delay centisecs

set "b=1%time:~-2%"

:wait2

   set /A "e=1%time:~-2%, elap=e-b, elap-=(elap>>31)*100"

if %elap% lss %1 goto wait2

set "b=1%time:~-2%"

exit /B

 

Bu programdaki parçaların animasyonu oldukça düzgün; Yavaş bilgisayarımda hafif bir titreme ancak parçaların hareketi hızlı olduğunda ortaya çıkar, bu yüzden animasyonun daha hızlı makinelerde daha yumuşak olacağını düşünüyorum. Parçalar, kod sayfası 850'nin blok karakteri kullanılarak birleştirilir, bu yüzden görünümü genellikle kullanılan genişliğinden daha uzun olan yazı tipine bağlıdır. Bitmap fontu @ 16x8 piksel kullanılırsa, basit bir numara her çizgiyi iki kez gösteren mükemmel kare parçaları göstermeye izin verir; Programda bu numarayı etkinleştirmek için, aşağıda gösterilen satırı kaldırın:



rem Delete the next line when Bitmap font 16x8 is used
set "F16x8=REM"


Ancak, bu durumda titreme artar, çünkü Font 16x8 yönetim kodu iki IF içerir. Bu gibi titrek artış, IF'leri iki FOR'un daha fazlasıyla değiştirmek için kodu değiştirmekle önlenebilir, ancak bu durumda program yalnızca bu yazı tipiyle çalışır. 

Bu, bu programın ilk sürümüdür, bu yüzden birkaç nokta değiştirilebilir veya geliştirilebilir. Bunları programımda kullanmak için Tetris oyun standartlarını aradım, ancak sadece tek bir "standart" olmadığını keşfettim, bu yüzden kendi fikirlerimi belirli noktalarda, özellikle oyunu oynamak için kullanılan anahtarlarda kullanmak zorunda kaldım. Değişiklikler için herhangi bir öneriniz, özellikle de sık sık bir Tetris oyuncusuysanız memnuniyetle karşılıyoruz. 

 
İLKER BABA
 
Kankam
İLKER BABA
 
İLKER BABA
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol