小游戏——俄罗斯方块(附带超详细源码,复制就可实现效果)

用web前端基础的知识做个俄罗斯方块玩玩。

先来看看实现的效果:

俄罗斯方块

 

复制就可以实现所有效果哦!!!

详细代码源码:


<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>俄罗斯方块小游戏JS版-孙也</title>

   <script>

       window.onload=function()
{
                  
var iLevel=1;
var oWrap=document.getElementById("wrap");
                  
var oScore=document.getElementById("score");
                  
var oPause=document.getElementById("pause");
                  
var oRestart=document.getElementById("restart");
                  
var oLevel=document.getElementById("level");

                  var oNext=document.getElementById("next");
                  
var oTime=document.getElementById("time");
                  
var oOl=oNext.getElementsByTagName("ol")[0];
                  
var oAlert=document.getElementById("alert");
                  
var oSur=document.getElementById("surrender");
                  
var aLi=[]
var clock=null;
       
oSur.onclick=function()
{
                  
oAlert.style.display="none";
};
       
function toDou(iNum)
{

                  if(iNum<10)
{
                  
return"0"+iNum;
}
                  
else return iNum;
}

                  var oDate=new Date();

                  var startTime=oDate.getTime();
                 
clock=setInterval(function(){

                       var NowTime=new Date().getTime();
                       
var hour=toDou(parseInt((NowTime-startTime)/1000/3600));
                       
var minute=toDou(parseInt((NowTime-startTime)/1000%3600/60));
                       
var second=toDou(parseInt((NowTime-startTime)/1000%3600%60));
                       
oTime.innerHTML=hour+":"+minute+":"+second;
},1000);
                       
oTime.innerHTML="00:00:00";
              
for(var i=0;i<40;i++)
{
                       
aLi[i]=document.createElement("li");

                       oOl.appendChild(aLi[i]);
                
}

                    function clearNext()
{

            for(var i=0;i<aLi.length;i++)
{

                      aLi[i].className="";
}
            
}
                    
RussianDiamonds();
          
function RussianDiamonds()
{

                        var iRow=18;

                       var iCol=10;
                       
var arr=[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]];
                       
var diamond=[];
                       
var aFinishedRow=[];
                       
var aShape=[];
                       
var nowShape=0;
                       
var nextShape=0;
                       
var iScore=0;

                       var iType=0;

                       var bRowFinished=true;
                       
var bPause=false;

                       var bEnd=false;
                       
var bOver=false;
                       
var timer=null;

                        aShape.push(parseInt(Math.random()*6));

                                            createBoard();
                             
oScore.innerHTML=iScore;
autoDrop();
                             
oPause.onclick=function()
{

                                      if(!bOver)
{
 
                                    if(bPause)
{
                             
oPause.value="暂停";
                             
bPause=false;
switch(iLevel)
{

                                                    case 1:
timer=setInterval(function(){
goDown();
},800);
                                                    
break;
                                                    
case 2:
timer=setInterval(function(){
goDown();
},600);
                                                    
break;
                                                    
case 3:
timer=setInterval(function(){
goDown();
},400);
                                                    
break;
                                                         
}
                                            
}
                                                
else
{

                                       oPause.value="继续";
                                             
bPause=true;
clearInterval(timer);
                                     
}
                              
}
                                          
};
oRestart.onclick=function()
{
                              
window.location.reload();
                          
};
function goDown()
{

                     bEnd=false;
                          
for(var i=0;i<4;i++)
{
if(diamond[0][i]==iRow-1)
{
bEnd=true;
                        
}
                           
}

            if(!bEnd)
{

                          for(var i=0;i<4;i++)
{

                              var belowDiamondCol=diamond[0][i]+1;
if(arr[belowDiamondCol][diamond[1][i]].className=="finished")
                                                  
{
                                                            
bEnd=true;
                          
}           
                               
}
 
                     }
                         
if(bEnd)
{
                                 
clearInterval(timer);

                                    for(var i=0;i<iRow;i++)
{
 
                                 for(var j=0;j<iCol;j++)
{
                                       
if(arr[i][j].className=="red")
{
                                               
arr[i][j].className="finished";
                  
}
                         
}

                             }
                         
for(var i=0;i<iRow;i++)
{
                                      
bRowFinished=true;

                                      for(var j=0;j<iCol;j++)
{
                                                    
if(arr[i][j].className!="finished")

                                                     {
bRowFinished=false;
}
                                  
}

                         if(bRowFinished)
{

                             aFinishedRow.push(i);
                      
}
                                
}
                            
while(aFinishedRow.length)
{

                               for(var i=0;i<aFinishedRow.length;i++)
{

                                              for(var j=0;j<10;j++)
{
arr[aFinishedRow[i]][j].className="";

                 }  
                         }
                           
for(var i=0;i<aFinishedRow.length;i++)
{

                                 for(var j=aFinishedRow[i]-1;j>=0;j--)
{

                                            for(var h=0;h<iCol;h++)
{

                                                  if(arr[j][h].className=="finished")
{
arr[j][h].className="";

                                                      arr[j+1][h].className="finished"
                   
}
               }

                                      }
                       
}
                              
for(var i=1;i<=aFinishedRow.length;i++)
{
                                                     
iScore+=i*10;
}
                                           
oScore.innerHTML=iScore;
if(iScore>100)
{

                                                  iLevel=2;
oLevel.innerHTML=iLevel;
}

                                    if(iScore>200)
{

                                            iLevel=3;
                                             
oLevel.innerHTML=iLevel;
}

                                             aFinishedRow.length=0;
}
                                                  
autoDrop();
}
                                
else
{
for(var i=0;i<4;i++)
{
                                         
diamond[0][i]++;
}
clearScreen();

                                                 showDiamond();
}
                                 
}
                        
function autoDrop()
{

                                 for(var i=0;i<iCol;i++)
{
                                                
if(arr[0][i].className=="finished")
{
bOver=true;
}
                        
}
            if(bOver)
{
                                     
clearInterval(clock);
                                     
oAlert.style.display="block";
}

                                            else
{

                                                     createDiamond();
switch(iLevel)
{

                                                            case 1:
timer=setInterval(function(){
goDown();
},800);

                                                               break;
                                                            
case 2:
timer=setInterval(function(){
goDown();
},600);

                                                               break;
                                                            
case 3:
timer=setInterval(function(){
goDown();
},400);
                                                                
break;
                        

                     }
                               
}


}
                                           function createBoard()
{
                                              
for(var i=0;i<iRow;i++)

{    
for(var j=0;j<iCol;j++)
{
                                                      
var newDiv=document.createElement("div");

                                                    arr[i][j]=newDiv;
oWrap.appendChild(newDiv);
}

                }
                            
}                
function createDiamond()
{

                                            aShape.push(parseInt(Math.random()*6));
function enoughSpace(aNew)
{

                                              for(var i=0;i<4;i++)
{
if(arr[aNew[0][i]][aNew[1][i]].className=="finished")
{
bOver=true;
}
}
                                  
if(!bOver)
{
diamond=aNew;
iType=0;
}
}
                                    
nowShape=aShape.shift();
nextShape=aShape[0];
switch(nextShape)
{

                                                case 0:
clearNext();
aLi[14].className="pink";
aLi[15].className="pink";

                                                aLi[24].className="pink";
aLi[25].className="pink";
                                               
break;
                                                
case 1:
clearNext();
                                                
aLi[13].className="pink";

                                                aLi[23].className="pink";

                                                aLi[24].className="pink";

                                                aLi[25].className="pink";
                                                
break;
                                                 
case 2:
clearNext();

                                                aLi[13].className="pink";
                                                
aLi[14].className="pink";
                                                aLi[15].className="pink";
                                                
aLi[16].className="pink";
                                                
break;
                                               
case 3:
clearNext();
aLi[14].className="pink";
                                              
aLi[23].className="pink";

                                              aLi[24].className="pink";

                                              aLi[25].className="pink";
                                                
break;
                                               
case 4:
clearNext();

                                              aLi[13].className="pink";
                                              
aLi[14].className="pink";
                                              
aLi[24].className="pink";

                                              aLi[25].className="pink";
                                              
break;
                                              
case 5:
clearNext();

                                               aLi[15].className="pink";
                                                
aLi[16].className="pink";
                                                  
aLi[24].className="pink";
                                                  
aLi[25].className="pink";
                                                  
break;
}

                                            switch(nowShape)
{

                                               case 0:
enoughSpace([[0,0,1,1],[4,5,4,5]]);
                                               
break;
                                               
case 1:
enoughSpace([[0,1,1,1],[4,4,5,6]]);
                                               
break;
                                               
case 2:
enoughSpace([[0,0,0,0],[3,4,5,6]]);

                                              break;
                                               
case 3:
enoughSpace([[0,1,1,1],[5,4,5,6]]);
                                               
break;
                                               
case 4:
enoughSpace([[0,0,1,1],[4,5,5,6]]);
                                              
break;

                                               case 5:
enoughSpace([[1,1,0,0],[4,5,5,6]]);
                                                
break;
                                   
}               
showDiamond();
}
                                                 
function clearScreen()
{
                                        
for(var i=0;i<iRow;i++)
{
         for(var j=0;j<iCol;j++)
{
                                                   
if(arr[i][j].className!="finished")
{

                                                        arr[i][j].className="";

                                 }         
}
             
}
}

                             function showDiamond()
{
            for(var i=0;i<4;i++){ 
                                                
arr[diamond[0][i]][diamond[1][i]].className="red";
                       
}
}
                             
document.onkeydown=function(ev)
{    
var oEvent=ev||event;

                                       var bLeftOut=true;
var bRightOut=true;

                                               switch(oEvent.keyCode)
{

                                 case 37:
bLeftOut=false;
                                               
for(var i=0;i<4;i++)
{
    if(diamond[1][i]==0)
{

                                          bLeftOut=true;
}
else
{    
var iLeftDiamond=diamond[1][i]-1;
                               
if(arr[diamond[0][i]][iLeftDiamond].className=="finished")
{   
bLeftOut=true;
                 
}

                      }
                                 
}     
if(!bLeftOut)
{          
for(var i=0;i<4;i++)
{          
diamond[1][i]--;
                        
}
          }
                                        
clearScreen();
                                        
showDiamond();
                                         
break;
                                 
case 38:
switch(nowShape)
{

                                          case 1:
switch(iType)
{

                                             case 0:
var r1=[
diamond[0][0],
diamond[0][1]-1,
diamond[0][2],
diamond[0][3]+1
];
                                         
var c1=[
diamond[1][0]+2,
diamond[1][1]+1,
diamond[1][2],
diamond[1][3]-1
];
   
if(arr[r1[0]][c1[0]].className!="finished"&&
arr[r1[1]][c1[1]].className!="finished"&&
arr[r1[3]][c1[3]].className!="finished"
)

{
for(var i=0;i<4;i++)
{
diamond[0][i]=r1[i];
diamond[1][i]=c1[i];
}
iType=1;
clearScreen();

showDiamond();
}
break;

case 1:
var r2=[
diamond[0][0]+2,
diamond[0][1]+1,
diamond[0][2],
diamond[0][3]-1
];

var c2=[
diamond[1][0],
diamond[1][1]+1,
diamond[1][2],
diamond[1][3]-1
];

if(arr[r2[0]][c2[0]].className!="finished"&&
arr[r2[1]][c2[1]].className!="finished"&&
arr[r2[3]][c2[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r2[i];
diamond[1][i]=c2[i];
}
iType=2;
clearScreen();
showDiamond();
}
break;
case 2:
var r3=[
diamond[0][0],
diamond[0][1]+1,
diamond[0][2],
diamond[0][3]-1
];
var c3=[
diamond[1][0]-2,
diamond[1][1]-1,
diamond[1][2],
diamond[1][3]+1
];
if(arr[r3[0]][c3[0]].className!="finished"&&
arr[r3[1]][c3[1]].className!="finished"&&
arr[r3[3]][c3[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r3[i];
diamond[1][i]=c3[i];
}
iType=3;
clearScreen();
showDiamond();
}
break;
case 3:
var r0=[
diamond[0][0]-2,
diamond[0][1]-1,
diamond[0][2],
diamond[0][3]+1
];
var c0=[
diamond[1][0],
diamond[1][1]-1,
diamond[1][2],
diamond[1][3]+1
];
if(arr[r0[0]][c0[0]].className!="finished"&&
arr[r0[1]][c0[1]].className!="finished"&&
arr[r0[3]][c0[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r0[i];
diamond[1][i]=c0[i];
}
iType=0;
clearScreen();
showDiamond();
}
break;
}
break;

case 2:
switch(iType)
{
case 0:
var r1=[
diamond[0][0]-1,
diamond[0][1],
diamond[0][2]+1,
diamond[0][3]+2
];

var c1=[
diamond[1][0]+1,
diamond[1][1],
diamond[1][2]-1,
diamond[1][3]-2
];

if(arr[r1[0]][c1[0]].className!="finished"&&
arr[r1[2]][c1[2]].className!="finished"&&
arr[r1[3]][c1[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r1[i];
diamond[1][i]=c1[i];
}
iType=1;
clearScreen();
showDiamond();
}
break;
case 1:
var r0=[
diamond[0][0]+1,
diamond[0][1],
diamond[0][2]-1,
diamond[0][3]-2
];
var c0=[
diamond[1][0]-1,
diamond[1][1],
diamond[1][2]+1,
diamond[1][3]+2
];
if(arr[r0[0]][c0[0]].className!="finished"&&
arr[r0[2]][c0[2]].className!="finished"&&
arr[r0[3]][c0[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r0[i];
diamond[1][i]=c0[i];
}
iType=0;
clearScreen();
showDiamond();
}
break;
}
break;
case 3:
switch(iType)
{
case 0:
var r1=[
diamond[0][0]+1,
diamond[0][1]-1,
diamond[0][2],
diamond[0][3]+1
];
var c1=[
diamond[1][0]+1,
diamond[1][1]+1,
diamond[1][2],
diamond[1][3]-1
];
if(arr[r1[0]][c1[0]].className!="finished"&&
arr[r1[1]][c1[1]].className!="finished"&&
arr[r1[3]][c1[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r1[i];
diamond[1][i]=c1[i];
}

iType=1;
clearScreen();

showDiamond();
}

break;

case 1:
var r2=[
diamond[0][0]+1,
diamond[0][1]+1,
diamond[0][2],
diamond[0][3]-1
];

var c2=[
diamond[1][0]-1,
diamond[1][1]+1,
diamond[1][2],
diamond[1][3]-1
];

if(arr[r2[0]][c2[0]].className!="finished"&&
arr[r2[1]][c2[1]].className!="finished"&&
arr[r2[3]][c2[3]].className!="finished"
)

{
for(var i=0;i<4;i++)
{
diamond[0][i]=r2[i];
diamond[1][i]=c2[i];
}

iType=2;
clearScreen();
showDiamond();
}
break;
case 2:
var r3=[
diamond[0][0]-1,
diamond[0][1]+1,
diamond[0][2],
diamond[0][3]-1
];

var c3=[
diamond[1][0]-1,
diamond[1][1]-1,
diamond[1][2],
diamond[1][3]+1
];
if(arr[r3[0]][c3[0]].className!="finished"&&
arr[r3[1]][c3[1]].className!="finished"&&
arr[r3[3]][c3[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r3[i];
diamond[1][i]=c3[i];
}
iType=3;
clearScreen();
showDiamond();
}
break;
case 3:
var r0=[
diamond[0][0]-1,
diamond[0][1]-1,
diamond[0][2],
diamond[0][3]+1
];
var c0=[
diamond[1][0]+1,
diamond[1][1]-1,
diamond[1][2],
diamond[1][3]+1
];
if(arr[r0[0]][c0[0]].className!="finished"&&
arr[r0[1]][c0[1]].className!="finished"&&
arr[r0[3]][c0[3]].className!="finished"
)
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r0[i];
diamond[1][i]=c0[i];
}
iType=0;
clearScreen();
showDiamond();
}
break;
}
break;
case 4:
switch(iType)
{
case 0:
var r1=[
diamond[0][0]-1,
diamond[0][1],
diamond[0][2],
diamond[0][3]-1
];
var c1=[
diamond[1][0]+2,
diamond[1][1],
diamond[1][2],
diamond[1][3]
];

if(arr[r1[0]][c1[0]].className!="finished"&&
arr[r1[3]][c1[3]].className!="finished"
)
{

               for(var i=0;i<4;i++)
{           
diamond[0][i]=r1[i];

                                             diamond[1][i]=c1[i];
}
                        
iType=1;
                          
clearScreen();

                            showDiamond();
}

                          break;

                              case 1:
var r0=[
diamond[0][0]+1,
diamond[0][1],
diamond[0][2],
diamond[0][3]+1
];
                      
var c0=[
diamond[1][0]-2,
diamond[1][1],
diamond[1][2],
diamond[1][3]
];
                           
if(arr[r0[0]][c0[0]].className!="finished"&&
arr[r0[3]][c0[3]].className!="finished"
)
                        
{
for(var i=0;i<4;i++)
{
diamond[0][i]=r0[i];
diamond[1][i]=c0[i];
}
iType=0;
                                 
clearScreen();
showDiamond();
}
break;
}
                                     
break;
                          
case 5:
switch(iType)
{
case 0:
var r1=[
diamond[0][0]-2,
diamond[0][1],
diamond[0][2],
diamond[0][3]
];
                                
var c1=[
diamond[1][0]+1,
diamond[1][1]+1,
diamond[1][2],
diamond[1][3]
];
                             
if(arr[r1[0]][c1[0]].className!="finished"&&
arr[r1[1]][c1[1]].className!="finished"
)
{
                             
for(var i=0;i<4;i++)
{
                                             
diamond[0][i]=r1[i];
                                             
diamond[1][i]=c1[i];
}
iType=1;
                                             
clearScreen();

                                             showDiamond();
                                      
}
                                              
break;

                            case 1:
var r0=[
diamond[0][0]+2,
diamond[0][1],
diamond[0][2],
diamond[0][3]

];

                            var c0=[
diamond[1][0]-1,
diamond[1][1]-1,
diamond[1][2],
diamond[1][3]
];
                               
if(arr[r0[0]][c0[0]].className!="finished"&&
arr[r0[1]][c0[1]].className!="finished"
)
                                    
{
for(var i=0;i<4;i++)
{    
diamond[0][i]=r0[i];

                                       diamond[1][i]=c0[i];
}
iType=0;
clearScreen();
                                    
showDiamond();
}
                                
break;
}
                                       
break;
}
                                         
break;
                            
case 39:
bLeftOut=false;
for(var i=0;i<4;i++)
                       
{
                   if(diamond[1][i]==9)
{
bLeftOut=true;
}

                       else
{
var iRightDiamond=diamond[1][i]+1;
                            
if(arr[diamond[0][i]][iRightDiamond].className=="finished")
{
bLeftOut=true;
                    

          } 
                   
} 
                      
}
                    
if(!bLeftOut)
{
       for(var i=0;i<4;i++)
{
diamond[1][i]++;
}
                  
}
                            
clearScreen();
                            
showDiamond();
break;
case 40:
goDown();
                                          
break;
                        
}          
};
};
};

 </script>

<style>
*{margin:0;padding:0;list-style:none;}

body{font-size:24px;font-weight:bold;background:#CCC;}

#wrap{width:300px;overflow:hidden;position:absolute;left:50%;top:10px;margin-left:-240px;background:white;}

#wrap div{float:left;width:28px;height:28px;border:1px solid black;}

#wrap div.red{background:red;}
#wrap div.finished{background:#666;}

#next{width:300px;height:180px;position:absolute;left:50%;top:10px;margin-left:80px;border:1px solid black;background:white;}

#next h1{font-size:24px;height:30px;line-height:30px;}

#next ol li{width:30px;height:30px;float:left;}

#next ol li.pink{background:pink;width:28px;height:28px;border:1px solid black;}

#infor{width:300px;height:150px;position:absolute;left:50%;top:200px;margin-left:80px;border:1px solid black;background:white;}

#infor li{height:50px;padding-left:10px;line-height:50px;}
#operate{width:300px;height:150px;position:absolute;left:50%;
top:370px;margin-left:80px;}

#operate li{height:50px;line-height:50px;margin-bottom:20px;}

#pause{          float:left;height:48px;width:100px;
           border:1px solid black;cursor:pointer;
           text-align:center;font-size:24px;font-weight:bold;
       }

#restart{          position:absolute;left:30px;top:90px;height:48px;width:100px;
            border:1px solid black;cursor:pointer;text-align:center;font-size:24px;
            font-weight:bold;}
#alert{width:298px;height:148px;background:white;
            position:absolute;left:50%;top:50%;margin-left:-150px;margin-top:-75px;
            border:1px solid black;display:none;}

#alert p{height:30px;position:absolute;left:20px;top:20px;}

#surrender{position:absolute;left:180px;top:90px;height:48px;
           width:100px;border:1px solid black;cursor:pointer;text-align:center;
           font-size:24px;font-weight:bold;}
   
</style>
        
</head>
              
<body>

 
        <div style="width:960px;margin:20px auto; clear:both; height:620px;">
            
<div id="wrap">
            </div>
            
<div id="next">
<h1>下一个(NEXT):</h1>
<ol>
</ol>
            
</div>

                <ul id="infor">
                        
<li>当前关卡:<span id="level">1</span></li>
                        
<li>已用时间:<span id="time"></span></li>

                        <li>当前得分:<span id="score"></span></li>

               </ul>

               <ul id="operate">

                      <li><input type="button"id="pause"value="暂停"/></li>

               </ul>

           <div id="alert">

               <p>游戏结束,重新开始?</p>

               <input type="button"id="restart"value="好的"/>

               <input type="button"id="surrender"value="不了"/>

             </div>
        
</div>

<div style="text-align:center;">

</div>



</body>

</html>

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您解答这个问题。以下是Python小游戏之300行代码实现俄罗斯方块的源代码: ```python import pygame import random # 初始化游戏 pygame.init() # 颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) # 屏幕大小 SCREEN_WIDTH = 600 SCREEN_HEIGHT = 800 # 方块大小 BLOCK_SIZE = 30 # 方块类型及其形状 BLOCKS = { "I": [(0, 0), (1, 0), (2, 0), (3, 0)], "J": [(0, 0), (0, 1), (1, 1), (2, 1)], "L": [(2, 0), (0, 1), (1, 1), (2, 1)], "O": [(0, 0), (1, 0), (0, 1), (1, 1)], "S": [(1, 0), (2, 0), (0, 1), (1, 1)], "T": [(1, 0), (0, 1), (1, 1), (2, 1)], "Z": [(0, 0), (1, 0), (1, 1), (2, 1)] } # 方向 DIRECTIONS = { "LEFT": (-1, 0), "RIGHT": (1, 0), "DOWN": (0, 1), "UP": (0, -1) } # 游戏状态 STATE_RUNNING = 0 STATE_PAUSED = 1 STATE_GAME_OVER = 2 # 字体 FONT = pygame.font.SysFont(None, 50) class Block: def __init__(self, x, y, block_type): self.x = x self.y = y self.block_type = block_type self.shape = BLOCKS[block_type] self.color = self.get_color() def get_color(self): if self.block_type == "I": return BLUE elif self.block_type == "J": return RED elif self.block_type == "L": return GREEN elif self.block_type == "O": return BLUE elif self.block_type == "S": return RED elif self.block_type == "T": return GREEN elif self.block_type == "Z": return BLUE def move(self, direction): dx, dy = DIRECTIONS[direction] self.x += dx self.y += dy def rotate(self): new_shape = [] for x, y in self.shape: new_x = y new_y = -x new_shape.append((new_x, new_y)) self.shape = new_shape class Board: def __init__(self): self.width = SCREEN_WIDTH // BLOCK_SIZE self.height = SCREEN_HEIGHT // BLOCK_SIZE self.grid = [[BLACK for _ in range(self.width)] for _ in range(self.height)] self.current_block = self.generate_new_block() self.next_block = self.generate_new_block() self.score = 0 self.state = STATE_RUNNING def generate_new_block(self): block_type = random.choice(list(BLOCKS.keys())) x = self.width // 2 - 2 y = 0 return Block(x, y, block_type) def update(self): if self.state == STATE_RUNNING: if self.is_valid(self.current_block, 0, 1): self.current_block.move("DOWN") else: self.lock_block() self.clear_lines() self.current_block = self.next_block self.next_block = self.generate_new_block() if not self.is_valid(self.current_block, 0, 0): self.state = STATE_GAME_OVER def lock_block(self): for x, y in self.current_block.shape: self.grid[self.current_block.y + y][self.current_block.x + x] = self.current_block.color def clear_lines(self): lines_cleared = 0 for y in range(self.height): if all([self.grid[y][x] != BLACK for x in range(self.width)]): for y1 in range(y, 0, -1): for x in range(self.width): self.grid[y1][x] = self.grid[y1 - 1][x] for x in range(self.width): self.grid[0][x] = BLACK lines_cleared += 1 self.score += lines_cleared ** 2 def move_current_block(self, direction): if self.is_valid(self.current_block, *DIRECTIONS[direction]): self.current_block.move(direction) def rotate_current_block(self): if self.is_valid(self.current_block, 0, 0, True): self.current_block.rotate() def is_valid(self, block, dx, dy, rotated=False): if rotated: new_shape = [] for x, y in block.shape: new_x = y new_y = -x new_shape.append((new_x, new_y)) else: new_shape = block.shape for x, y in new_shape: new_x = block.x + x + dx new_y = block.y + y + dy if not (0 <= new_x < self.width and 0 <= new_y < self.height): return False if self.grid[new_y][new_x] != BLACK: return False return True def draw(self, screen): for y in range(self.height): for x in range(self.width): pygame.draw.rect(screen, self.grid[y][x], (x * BLOCK_SIZE, y * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 0) for x, y in self.current_block.shape: pygame.draw.rect(screen, self.current_block.color, ((self.current_block.x + x) * BLOCK_SIZE, (self.current_block.y + y) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 0) text = FONT.render(f"Score: {self.score}", True, WHITE) screen.blit(text, (10, 10)) text = FONT.render("Next Block:", True, WHITE) screen.blit(text, (400, 10)) for x, y in self.next_block.shape: pygame.draw.rect(screen, self.next_block.color, ((x + 16) * BLOCK_SIZE, (y + 3) * BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE), 0) def main(): # 创建屏幕 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Tetris") # 创建时钟 clock = pygame.time.Clock() # 创建棋盘 board = Board() # 游戏循环 while True: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: board.move_current_block("LEFT") elif event.key == pygame.K_RIGHT: board.move_current_block("RIGHT") elif event.key == pygame.K_DOWN: board.move_current_block("DOWN") elif event.key == pygame.K_UP: board.rotate_current_block() elif event.key == pygame.K_SPACE: board.state = STATE_PAUSED if board.state == STATE_RUNNING else STATE_RUNNING # 更新游戏状态 board.update() # 绘制屏幕 screen.fill(BLACK) board.draw(screen) # 显示屏幕 pygame.display.update() # 控制帧率 clock.tick(10) if __name__ == "__main__": main() ``` 希望能够帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值