通过键盘控制SHAPE的形态

本文介绍了一个使用VML技术实现的图形编辑器,通过键盘操作可以调整图形的位置、大小、坐标尺寸等属性,并能修改填充颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<html xmlns:v="urn:schemas-microsoft-com:vml">
<script language=javascript>var GWELCOLE=1900+64;</script>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<style>
v/:* {behavior:url(#default#VML);}
o/:* {behavior:url(#default#VML);}
x/:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}

* {color:#229; font-size:12;}
table {position:absolute;top:180;}
th {background:#AAF}
td {background:#AFA}
</style>
</head>

<body topmargin="0">
1:49
q:81
shape coordsize;按下对应的键会改变其形状或颜色, Gu Laicheng, 2008.1.22<br/>
角度:2^32*1=65536=1度 5898240=90度 11796480=180度<br/>
<span id=msg></span><br/>
<table>
<tr><th>+</th><th>-</th><th>Item</th></tr>
<tr><td>1</td><td>q</td><td>Left</td></tr>
<tr><td>2</td><td>w</td><td>Top</td></tr>
<tr><td>3</td><td>e</td><td>Width</td></tr>
<tr><td>4</td><td>r</td><td>Height</td></tr>
<tr><td>5</td><td>t</td><td>Coordsize-x</td></tr>
<tr><td>6</td><td>y</td><td>Coordsize-y</td></tr>
<tr><td>7</td><td>u</td><td>Moveto-x</td></tr>
<tr><td>8</td><td>i</td><td>Moveto-y</td></tr>
<tr><td>9</td><td>o</td><td>Center-x</td></tr>
<tr><td>0</td><td>p</td><td>Center-y</td></tr>
<tr><td>s</td><td>x</td><td>Radus-x</td></tr>
<tr><td>d</td><td>c</td><td>Radus-y</td></tr>
<tr><td>f</td><td>v</td><td>Start-Angle</td></tr>
<tr><td>g</td><td>b</td><td>End-Angle</td></tr>
<tr><td>h</td><td>n</td><td>Fill-color1</td></tr>
<tr><td>j</td><td>m</td><td>Fill-color2</td></tr>
</table>
<v:shape id=GLC style="POSITION:absolute;LEFT:150;TOP:170;WIDTH:100;HEIGHT:100;Z-INDEX:1;"
coordsize="10800,10800" title="11796480" fillcolor="#d1ffd1"
strokecolor="black" path="m21600,21600 ae21600,21600,10800,10800,0,11796480 x e" adj="0,,0">
<v:fill rotate = "t" type = "gradient" color2 = "#5667FE" focus = "100%"></v:fill>
<v:stroke joinstyle = "round"></v:stroke>
<v:formulas></v:formulas>
<v:path o:connecttype = "segments"></v:path>
</v:shape>
</body>
<script>

function updstr(src,i,flg,grd){
    var re = //d+/b/g;
    var arr,s;
    var j=0;
  while ((arr = re.exec(src)) != null){
  if(j==i) {
   if (flg=="+")
   {
   s=RegExp.leftContext+""+(parseInt(RegExp.lastMatch)+grd)+""+RegExp.rightContext;
   }
   if (flg=="-")
   {
   s=RegExp.leftContext+""+(parseInt(RegExp.lastMatch)-grd)+""+RegExp.rightContext;
   }
//   alert(src+":"+s+"::"+i);
   return s;
  }
  j++;
 }
}

document.onkeydown=function()
{
// alert("A:"+event.keyCode);
 switch (event.keyCode)
 {
 case 49: //1
  GLC.style.left=parseInt(GLC.style.left)+1;break;
 case 81:
  GLC.style.left=parseInt(GLC.style.left)-1;break;
 case 50: //2
  GLC.style.top=parseInt(GLC.style.top)+1;break;
 case 87:
  GLC.style.top=parseInt(GLC.style.top)-1;break;
 case 51: //3
  GLC.style.width=parseInt(GLC.style.width)+1;break;
 case 69:
  GLC.style.width=parseInt(GLC.style.width)-1;break;
 case 52: //4
  GLC.style.height=parseInt(GLC.style.height)+1;break;
 case 82:
  GLC.style.height=parseInt(GLC.style.height)-1;break;
 case 53: //5
  GLC.Coordsize=updstr(GLC.coordsize,0,"+",1000);break;
 case 84: //t
  GLC.Coordsize=updstr(GLC.coordsize,0,"-",1000);break;
 case 54: //6
  GLC.Coordsize=updstr(GLC.coordsize,1,"+",1000);break;
 case 89:
  GLC.Coordsize=updstr(GLC.coordsize,1,"-",1000);break;

 case 55: //7
  GLC.path=updstr(GLC.path,0,"+",1000);break;
 case 85:
  GLC.path=updstr(GLC.path,0,"-",1000);break;

 case 56: //8
  GLC.path=updstr(GLC.path,1,"+",1000);break;
 case 73:
  GLC.path=updstr(GLC.path,1,"-",1000);break;
 case 57: //9
  GLC.path=updstr(GLC.path,2,"+",1000);break;
 case 79:
  GLC.path=updstr(GLC.path,2,"-",1000);break;
 case 48: //0
  GLC.path=updstr(GLC.path,3,"+",1000);break;
 case 80:
  GLC.path=updstr(GLC.path,3,"-",1000);break;


 case 83:
  GLC.path=updstr(GLC.path,4,"+",1000);break;
 case 88:
  GLC.path=updstr(GLC.path,4,"-",1000);break;
 case 68:
  GLC.path=updstr(GLC.path,5,"+",1000);break;
 case 67:
  GLC.path=updstr(GLC.path,5,"-",1000);break;

 case 70:
  GLC.path=updstr(GLC.path,6,"+",65536);break;
 case 86:
  GLC.path=updstr(GLC.path,6,"-",65536);break;
 case 71:
  GLC.path=updstr(GLC.path,7,"+",65536);break;
 case 66:
  GLC.path=updstr(GLC.path,7,"-",65536);break;

  GLC.style.left=parseInt(GLC.style.left)+1;break;

 case 72:
  GLC.fill.color ="#"+(parseInt(GLC.fill.color.value.substring(1,7),16)+256*16).toString(16);break;
 case 78:
  GLC.fill.color ="#"+(parseInt(GLC.fill.color.value.substring(1,7),16)-256*16).toString(16);break;
 case 74:
  GLC.fill.color2="#"+(parseInt(GLC.fill.color2.value.substring(1,7),16)+256*16).toString(16);break;
 case 77:
  GLC.fill.color2="#"+(parseInt(GLC.fill.color2.value.substring(1,7),16)-256*16).toString(16);break;

 }
 msg.innerText = "style.cssText:"+GLC.style.cssText+"/ncoordsize:"+GLC.coordsize+
  "/n path:"+GLC.path+
  "/n fillcolor1:"+GLC.fill.color+
  "/n fillcolor2:"+GLC.fill.color2;

}
</script>
</html>
 

根据要求用c语言完成代码,并且能在deevc++上运行 1. 目的与要求 (1) 游戏规则:7种状态的方块(长条型、Z字型、反Z字型、田字型、7字型、反7字型、T字型)随机产生,自由下落,落下时可由玩家用上、下、左、右控制控制翻转和移动,以便以万家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。 (2) 游戏界面:游戏的背景色是黑色,方块用蓝色,在一定区域内运动和变形,落下后的障碍物用黄色显示。 (3) 游戏形状:由数组作为存储方块状态的数据结构,各个方块要能实现下落、移动、旋转,旋转可设为顺时针或逆时针变形,一般为逆时针,实现下落底部方块的处理。 (4) 键盘处理:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。 (5) 鼠标事件:通过点击菜单栏中相应的菜单项,可以实现游戏的开始、结束,方块形状的变换,分数、等级的显示,以及游戏帮助等功能。 (6) 显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。 (7)实现用户排名功能,要求能够将排名信息进行保存,存至文件永久保存。 (8)当新用户的成绩需要插入排名列表时,要能够修改原列表信息;如果是同一用户需要更新成绩,则覆盖原成绩。 (9)插入、修改、删除排名信息等要求使用链表实现。 2. 实现提示 (1) 方块如何实现旋转:通用的方法是旋转90度,还可以把每个方块各种变形的样子都用结构体定义好,形成一个封闭的链表,变形一次指针指向下一种形状。 (2) 方块是否还能下落:用一个带有返回值的函数,若碰撞则说明不能下落,返回1;反则说明没有碰撞,返回0。即将整个4×4方块数组下落看成一个单位长度,与游戏空间数组有重叠的1,则在当前位置4×4数组是1的地方赋值给游戏空间对应的数组元素,表示停止下落,并画有1 的地方。对于左移、右移一个单位长度有重叠的1 ,则不允许左移、右移,继续自然下落。 (3) 方块如何实现消行:先认为每一行都是满1的,从游戏空间的数组由上到下扫描,一旦测试到某一行中某个列元素为0,则认为这一行没满,跳出这行的扫描循环,进入下一行的扫描。若扫描完某一行的元素都没有发现0,则以这行以上的每一行完完整整地将上一行的元素赋值给下一行,这个过程以由下到上进行,然后将整个游戏空间画黒,再在有1的地方画小正方形。
最新发布
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值