function fCreateOption(){
var dv = document.createElement("<div>");
dv.style.styleFloat  = "left";
//dv.style.display = "none";
dv.id = "dvOption";
document.body.appendChild(dv);
dv.appendChild(fGetTable(CONTAINW, CONTAINW, cWidth, "myTb1"));
myTb1.style.marginLeft = "5px";
dv.appendChild(document.createElement("<span id='Score' style='margin-top:10px;display:block;margin-left:5px;'></span>"));
dv.appendChild(document.createElement("<input type='button' value='重新开始' onclick='fRestart();this.blur();' style='margin-top:10px;display:block;margin-left:5px;'>"));
dv.appendChild(document.createElement("<input type='button' value='高级选项' onclick='fShowHideAdvance();this.blur();' style='margin-top:10px;display:block;margin-left:5px;'>")); var dv = document.createElement("<div>");
dv.style.styleFloat  = "left";
dv.style.border = "1px solid #cccccc";
dv.style.display = "none";
dv.id = "dvAdvance";
document.body.appendChild(dv);
dv.appendChild(document.createElement("<input type='button' value='录制片头' onclick='fRecordMovie(\"start\")' style='margin:3px'>"));
dv.appendChild(document.createElement("<input type='button' value='录制片尾' onclick='fRecordMovie(\"end\")' style='margin:3px'>"));
dv.appendChild(document.createElement("<input type='button' value='显示现有的元素' onclick='fDisplayElement()' style='margin:3px'>"));
dv.appendChild(document.createElement("<input type='button' value='自定义元素' onclick='fDefineElement()' style='margin:3px'>"));
dv.appendChild(document.createElement("<input type='button' value='清空' onclick='fCleanTable()' style='margin:3px'>"));
}
function fCleanTB(){
sRecordElement = '';
var tdList = win.document.getElementsByTagName('TD'); 
for(var i=0;i<tdList.length;i++) 
tdList[i].bgColor='#ffffff'

function fDefineElement(){
try{win.close();} catch(e){}
win = window.open("",null,"height=150,width=150,status=yes,toolbar=no,menubar=no,location=no,scrollbars=yes");
win.document.body.innerHTML = "";
var tb = fWinGetTable(win,CONTAINW, CONTAINW, cWidth*2, "");
win.document.body.innerHTML = "";
win.document.body.appendChild(tb);
win.document.body.appendChild(win.document.createElement("<input type='button' value='清空' onclick='opener.fCleanTB()' style='margin:3px'>"));
win.document.body.appendChild(win.document.createElement("<input type='button' value='加入' onclick='opener.fRecordElement()' style='margin:3px'>"));
win.document.onclick = function(){
if(win.event.srcElement.tagName == 'TD'){
win.event.srcElement.bgColor = bgColor; 
rAndc =win.event.srcElement.parentNode.rowIndex + '^' + win.event.srcElement.cellIndex; 
if(sRecordElement.indexOf(rAndc)<0) sRecordElement += ((sRecordElement=='')?rAndc:('\,'+rAndc));
}

}
function fDisplayElement(){
win = window.open("",null,"height=200,width=150,status=yes,toolbar=no,menubar=no,location=no,scrollbars=yes");
win.document.write("<script>function HeyBeClose(obj){if(obj.nextSibling) {if(obj.nextSibling.tagName=='DIV') {obj.nextSibling.value = parseInt(obj.nextSibling.value,10)-1;} HeyBeClose(obj.nextSibling)}}<\/script><body><\/body>");
for(var i=0;i<arrEls.length;i++){
var el = arrEls[i].el;
var tb = fWinGetTable(win,CONTAINW, CONTAINW, cWidth*2, i);
win.document.body.appendChild(tb);
var dv = win.document.createElement("<div value="+ i +" style='margin:5px;cursor:hand;' onclick='opener.arrEls.splice(this.value,1); HeyBeClose(this); document.body.removeChild(this.previousSibling); document.body.removeChild(this);'>");
dv.innerHTML = "删除";
win.document.body.appendChild(dv);
for(var j=0;j<el.length;j++){
if(el[j].status) tb.rows[el[j].r].cells[el[j].c].bgColor = bgColor;
}
}
}
// ============= HTML标签构造结束 ===========
// ============= 元素结构函数开始   ===========
function fGetElements(str){
var arr = str.split(",");
var arrElement = new Array();
for(var i=0;i<CONTAINW;i++){
for(var j=0;j<CONTAINW;j++){
for(var k=0;k<arr.length;k++){
if(arr[k].split("^")[0] == j && arr[k].split("^")[1] == i){
arrElement[arrElement.length] = new fGetElement(j, i, true);
break;
}
if(k == arr.length-1) arrElement[arrElement.length] = new fGetElement(j, i, false);
}
}
}
return arrElement;
}
function ElContain(el, pct){
this.el = el;
this.radPct = pct;
}
function fGetElement(c, r, status){
this.c = c;
this.r = r;
this.status = status;
}
// ============= 元素结构函数结束   ===========
// ============= 片头片尾控制函数开始  =========
function fPlayStartMovie(){
fCleanTable();
fSetMovie("start");
tbForMovie = tb.cloneNode(true);
fSetColor();
fPlayClip1();
function fSetColor(){
var tdList = tbForMovie.getElementsByTagName("TD");
for(var j=0;j<tdList.length;j++){
if(tdList[j].status) tdList[j].bgColor=bgColor;
}
}
}
function fPlayClip1(){
var rowEl = tb.insertRow(0); 
fFillRow(rowEl);
tb.deleteRow(r);
var row0 = tb.rows[0];
var row1 = tbForMovie.rows[iForMovie];
row0.replaceNode(row1);
if(iForMovie == 0) {iForMovie = r;sForMovie = window.setTimeout("fPlayClip2()",2000);return;}
iForMovie -- ;
sForMovie = window.setTimeout("fPlayClip1()",20);
}
function fPlayClip2(){
var midRow = Math.round(r/2);
var rowEl = tb.insertRow(midRow);
fFillRow(rowEl);
var rowEl = tb.insertRow(midRow);
fFillRow(rowEl);
tb.deleteRow(0);
tb.deleteRow(tb.rows.length-1);
if(iForMovie == 0) {fStart();return;}
iForMovie -- ;
sForMovie = window.setTimeout("fPlayClip2()",20)
}
function fFillRow(rowEl){
for(var j=0;j<c;j++){
var cellEl = rowEl.insertCell(j);
cellEl.style.width = cWidth + "px";
cellEl.style.height = cWidth + "px";
}
}
function fSetMovie(type){
var arr = (type == "start"?startMovie:endMovie).split(",");
for(var i=0;i<arr.length;i++){
var arrSub = arr[i].split("^");
tb.rows[arrSub[0]].cells[arrSub[1]].status = true;
}
}
function fPlayFailMovie(){
var tdList = tb.getElementsByTagName("TD");
if(moviePoint>-1 && !tdList[moviePoint].status) tdList[moviePoint].bgColor = bgColor;
else if(moviePoint>-1 && tdList[moviePoint].status) tdList[moviePoint].bgColor = "#ffffff";
moviePoint -- ;
if(moviePoint>-1) sForMovie = window.setTimeout("fPlayFailMovie()", movieSpeed);
}
// ============= 片头片尾控制函数结束  =========
// ============= 选项控制函数开始        =========
function fRestart(){
if(arrEls.length == 0) {alert("没有定义任何元素!");return;}
fCleanTable();
if(s) window.clearInterval(s);
fGetCurrentEl();
fGetNextEl();
drawNextEl();
fInit();
}function fRecordElement(){
arrEls[arrEls.length] = new ElContain(fGetElements(sRecordElement), win.prompt("此元素出现的机率百分比","20"));
}function fShowHideAdvance(){
if(dvAdvance.style.display == "") dvAdvance.style.display = "none";
else{
dvAdvance.style.display = "";
fCleanTable();
if(s) window.clearInterval(s);
}
}
function fCleanTable(){
for(var i=r-1;i>-1;i--){
for(var j=0;j<c;j++){
tb.rows[i].cells[j].bgColor = "#ffffff";
tb.rows[i].cells[j].status = false;
}
}
}
function fRecordMovie(type){
var str = "";
var tdList = tb.getElementsByTagName("TD");
for(var i=0;i<tdList.length;i++){
if(tdList[i].bgColor == bgColor){
var elRowAndCell = tdList[i].parentElement.rowIndex + "^" + tdList[i].cellIndex;
str += str == ""?elRowAndCell:"," + elRowAndCell;
}
}
if(str == "") {alert("请用鼠标点击table里面的单元格!");return;}
if(type == "start")
startMovie = window.prompt("",str);
else
endMovie = window.prompt("",str);
}
// ============= 选项控制函数结束        =========

解决方案 »

  1.   

    // ============= 游戏控制函数开始        =========
    function fInit(){
    cRow = 0;
    cColumn = Math.round(c/2) - 2;
    moviePoint = r*c-1;
    score = 0;
    bonusLevel = 0;
    speed = 500;
    iForMovie = r - 1;
    s = null;
    try{window.clearTimeout(sForMovie);window.clearInterval(s)} catch(e){}
    tb = document.getElementById("myTb0");
    fPlayStartMovie();
    }function fRotate(){
    for(var i=0;i<CurrentEl.el.length;i++){
    var row = CurrentEl.el[i].c;
    var column = CONTAINW - CurrentEl.el[i].r - 1
    CurrentEl.el[i].r = row;
    CurrentEl.el[i].c = column;
    }
    }function fGetCurrentEl(){
    CurrentEl = fRandom();
    }
    function fGetNextEl(){
    NextEl = fRandom();
    }
    function fRandom(){
    var el = arrEls[Math.round(Math.random()*(arrEls.length-1))];
    if(Math.random()*100<el.radPct) return el;
    else return fRandom();
    }
    function drawNextEl(){
    var tbs = document.getElementById("myTb1");
    for(var i=0;i<NextEl.el.length;i++){
    if(NextEl.el[i].status){
    tbs.rows[NextEl.el[i].r].cells[NextEl.el[i].c].bgColor = bgColor;
    }else{
    tbs.rows[NextEl.el[i].r].cells[NextEl.el[i].c].bgColor = "#ffffff";
    }
    }
    }
    function fStart(){
    s = window.setInterval("fMove('down')",speed)
    document.getElementById("Score").innerText = "得分:" + score;
    }
    function fMove(forward){
    if(!fCheckCanMoveOrRotate(forward, "move")) return;
    fCleanCurrent();
    if(forward == "down") cRow ++;
    if(forward == "left") cColumn --;
    if(forward == "right") cColumn ++;
    fDrawCurrent();
    }
    function fCleanCurrent(){
    for(var i=0;i<CurrentEl.el.length;i++){
    if(CurrentEl.el[i].status){
    tb.rows[CurrentEl.el[i].r+cRow].cells[CurrentEl.el[i].c+cColumn].bgColor = "#ffffff";
    }
    }
    }
    function fCheckCanMoveOrRotate(forward, type){
    var blnTemp = false;
    for(var i=0;i<CurrentEl.el.length;i++){
    if(CurrentEl.el[i].status){
    if(type == "move"){
    var row = CurrentEl.el[i].r;
    var column = CurrentEl.el[i].c;
    }else{
    var row = CurrentEl.el[i].c;
    var column = CONTAINW - CurrentEl.el[i].r - 1
    }
    if(forward == "down") row ++;
    if(forward == "left") column --;
    if(forward == "right") column ++;
    if(row + cRow>r-1){return fCheckIfFail(row+cRow)}
    if(row + cRow<0) return false;
    if(column + cColumn<0) return false;
    if(column + cColumn>c-1) return false;
    if(tb.rows[row+cRow].cells[column+cColumn].bgColor == bgColor) {
    for(var j=0;j<CurrentEl.el.length;j++){
    if(row == CurrentEl.el[j].r && column == CurrentEl.el[j].c){
    if(CurrentEl.el[j].status) {blnTemp = true;break;}
    else {//return fCheckIfFail(row+cRow)
    }
    }
    }
    if(forward == "down" && !blnTemp){return fCheckIfFail(row+cRow)}
    else if(forward != "down" && !blnTemp) return false;
    blnTemp = false;
    }
    }
    }
    return true;
    }
    function fCheckIfFail(row){
    if(row<=CONTAINW) {
    window.clearInterval(s);
    fSetMovie("end");
    fPlayFailMovie();
    return false;
    }
    fCheckCanCleanRow();
    fStartNext();
    document.getElementById("Score").innerText = "得分:" + score;
    return false;
    }function fCheckCanCleanRow(){
    var blnTemp = true;
    BonusLevel = 0; 
    for(var i=0;i<tb.rows.length;i++){
    var row = tb.rows[i];
    for(var j=0;j<row.cells.length;j++){
    if(row.cells[j].bgColor != bgColor){
    blnTemp = false;
    break;
    }
    }
    if(blnTemp){
    tb.deleteRow(i);
    score += 10;
    bonusLevel ++;
    var rowEl = tb.insertRow(0);
    for(var k=0;k<c;k++){
    var cellEl = rowEl.insertCell(k);
    cellEl.style.width = cWidth + "px";
    cellEl.style.height = cWidth + "px";
    }
    }
    blnTemp = true;
    }
    if(bonusLevel!=0) score += eval("bonus" + bonusLevel);
    bonusLevel = 0;
    }function fStartNext(){
    cRow = 0;
    cColumn = Math.round(c/2) - 2;
    CurrentEl = NextEl;
    fGetNextEl();
    drawNextEl();
    }
    function fDrawCurrent(){
    for(var i=0;i<CurrentEl.el.length;i++){
    if(CurrentEl.el[i].status){
    tb.rows[CurrentEl.el[i].r+cRow].cells[CurrentEl.el[i].c+cColumn].bgColor = bgColor;
    }
    }
    }
    // ============= 游戏控制函数结束        =========
    //-->
    </SCRIPT>
      

  2.   

    非常不错!解释详细!命名清楚!结构清晰!一,
    我玩了一下,看了一下代码。
    我参考了你的代码,往里面添加了一个“快速下降”功能。
    也就是当按某个键(我用的是"up"),方块立刻立即掉下来,而不用老是按down。
    (请允许我的冒昧。呵!呵!)以<SCRIPT LANGUAGE="JavaScript">为第一行代码作参照。
    80行改为:  var left = 37, right = 39, rotate = 32, down = 40;
    121行里添加如下代码,也就是"document.onkeydown = function()"加入如下代码。
    //------------------------------------------
    case up:
      while(fCheckCanMoveOrRotate("down", "move")){
        fMove("down");
      }
    break;
    //------------------------------------------二,
    你既然能够"录制片头",想必也能够(做到)"录制全程"。
    这是我的建议。
    添加“录制开始”(按钮),“录制结束”(按钮),“播放录像”(按钮)
    “录像脚本”(文本框).“录制开始” onclick : 
      当然就是录制开始。 RecordReplayStart(){doRecordReplayStart()};“录制结束” onclick :
      录制完成。 
      RecordReplayEnd(){
        doRecordReplayEnd();
        //弹出prompt,prompt里的文本框显示script.(让用户赋值这个script)
      };“播放录像” onclick :
       //在“录像脚本”(文本框) 填入script。
       ShowReplay();
       
    ^_^非常期待你能把这个功能作出来,并发出来!(至少发给我啦,呵!呵!)
      

  3.   

    我刚才写错了
    80行改为: var left = 37, right = 39, rotate = 32, down = 40, up = 38;