用c语言编写俄罗斯方块的程序

用c语言编写俄罗斯方块的程序,第1张

这里把游戏的关键设计放在三个盒子和一个坐标上:

大盒子:一个两维数组,记录着方块点阵的开与关(把游戏的舞台想像

成一个点阵),在下面也把这个东西称为地图

两个55小盒子:两维数组,一个盛放着正在下落的方块,一个盛放在

下一个下落的方块(即next),当然这两个也必须想像成一个点阵:如长条

的点阵为:

00000

00100

00100

00100

00100

现在你只要有这么一个概念:一个不断定时下落的小盒子从大盒子顶

部下降到底部,之后再将next盒子放在下落盒子,再进行下一轮的下落

中间的控制等尚不要太着急

现在面临着一个问题:

下落的盒子和地图之间要怎么联系起来

一个好的方法是再定义一个坐标:x,y,保存着小盒子左上角在地图上对应

的下标(位置),即当x

=

0,

y

=

0时,小盒子处于地图的左上部如此,当

小盒子需要移动时,即只须要改变x,y的值

现在说说旋转

小盒子保存着当前下落形状的点阵,那么旋转就只须要将这个点阵旋

转90度:例如:

00000

00000

00100

00000

00100

->

01111

00100

00000

00100

00000

这一点实现起来还是不太难的

判断碰撞

通常这种情况只须要在有移动小盒或旋转盒子时发生:也即点阵非空

是互斥的,当小盒要向下移(x++)时,如果小盒里的点阵与地图上的点阵(非

空的地方)重叠,则不能下移,(卡住了),旋转则转换后的形状与地图有冲

突则要放弃旋转

到了这里,你应该有一个大概的了解了,至于怎样在屏幕上画出来,这

个是比较简单的,下面的代码会慢慢与你解释

/

/接下一贴/

可以联机。

《双人成行》是一款双人闯关游戏,双人成行目前是没有办法只看自己视角的。这个游戏是必须由两个人组队闯关的,玩家可以选择线上联机或者是选择本地双人组队都可以。进入双人成行游戏界面后,可以在线邀请好友进行闯关。

俄区买不了双人成行的原因是steam开始对俄罗斯施加制裁。制裁的具体方式据称是禁止来自俄罗斯的用户购买游戏,但是俄罗斯用户目前依旧可以通过PayPal钱包购买游戏,这也得到了广大玩家的证实。

俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

谁知道这么优秀的娱乐工具,出自哪位神人之手呢?顾名思义,俄罗斯方块自然是俄罗斯人发明的。这位伟人叫做阿列克谢·帕基特诺夫(Алексей Пажитнов 英文:Alexey Pazhitnov)。 俄罗斯方块

俄罗斯方块原名是俄语Тетрис(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来。

1988年1月Tetris在电脑平台的热销,一时造成“洛阳纸贵”的局面。而当CBS晚报采访了俄罗斯方块之父帕基特诺夫之后,斯坦恩盗窃版权的计划彻底泡汤了。一个新的公司ELORG(Electronorgtechinca,苏联一家软件公司)开始和斯坦恩就游戏程序问题进行协商。ELORG的负责人亚历山大·阿列欣科( Alexander Alexinko)知道斯坦恩虽然没有版权,但是会以手中的游戏开发程序为筹码威胁中断谈判。 双人俄罗斯方块游戏

1988年5月经过几个月的争吵之后,筋疲力尽的斯坦恩终于和ELORG签定了PC俄罗斯方块版权的合约。当时的合约禁止开发街机版和掌机版的方块游戏,而电脑版的Tetris则成为当时最畅销的游戏。 1988年7月斯坦恩与阿列欣科商谈开发街机版俄罗斯方块的问题。阿列欣科当时尚未从斯坦恩那里拿到一分钱的版权费,但是同时的Spectrum 和 Mirrorsoft已经开始向电子游戏商出售了俄罗斯方块的版权。Spectrum 将Tetris的游戏机和PC在日本的版权卖给了Bullet-Proof Software (FC和GB版俄罗斯方块的制作商),而Mirrorsoft则把它在日本和北美的版权卖给了美国的Atari。这样一来两家公司的矛盾就开始了。1988年11月,BPS在FC上发行的俄罗斯方块(大家不很熟悉的俄罗斯方块1)在日本发售,销量达200万份。 1988年11月随着GB的开发,NOA(任天堂美国分公司)的经理荒川实(任天堂山内溥老爷子的女婿)希望将Tetris做成GB上的游戏。于是他联系了BPS的总裁亨克·罗杰斯(Henk Rogers),罗杰斯再与斯坦恩联系的时候却吃了闭门羹。于是他直接去莫斯科购买版权。而斯坦恩觉察出风头,也乘飞机前往莫斯科;与此同时,Spectrum的负责人罗伯特·麦克斯韦(Robert Maxwell)的儿子凯文·麦克斯韦(Kevin Maxwell) 也在向莫斯科进发。就这样,三路人马几乎在同时赶到了冰天雪地的红色都市。 1989年2月21日罗杰斯首先会见了ELORG的代表叶甫盖尼·别里科夫(Evgeni Belikov,和那个“装在套子里的人”同名)。他给帕基特诺夫等苏联人留下了深刻印象,并且签了手掌机方块游戏的版权。之后他向俄国人展示了FC版Tetris,这使别里科夫极为震惊。因为他并没有授予罗杰斯家用机的版权!罗杰斯则向他们说这是向TENGEN购买的版权,但是别里科夫也从来听说过TENGEN这个公司的名字。罗杰斯为了缓和尴尬的局面,将斯坦恩隐瞒的事实如数告诉了别里科夫,并且答应付给苏联方面更多支票作为已经卖出的FC版俄罗斯方块的版权费用。这时罗杰斯发现自己有机会买到Tetris全部机种的版权(但是当时还没买),虽然Atari会对他虎视眈眈,但是别忘了,他和BPS的背后还有任天堂这个大靠山给自己撑腰。 注意:罗伯特·斯坦恩原先所签的协议只是电脑版Tetris的版权,其他的版权并不是他的。 后来,斯坦恩和ELORG重新签署了协议。别里科夫强迫他重签的合约中修改的内容是:“电脑的定义:包含有中央处理器,监视器,磁盘驱动器,键盘和 *** 作系统的机器”。而斯坦恩当时却没有仔细看这些定义。后来他才意识到这是罗杰斯从自己手中抢走版权而耍的花招。但是为时已晚。第二天他被告知虽然签署的文件已经不能改过来,但是他还可以得到街机版Tetris的开发权。三天之后,他签下了街机版的协议。 1989年2月22日凯文·麦克斯韦访问了ELORG。别里科夫拿出罗杰斯给他的FC游戏卡向他询问这件事情。麦克斯韦在卡带上看到了Mirrorsoft的名字后才想起他的公司已经把部分版权倒卖给了Atari。当他想继续谈街机和手掌机版权的问题的时候,却发现他自己能够签的,就只有除电脑,街机,家用机和掌机以外的协议了。在糊涂之余这家伙灵机一动,告诉别里科夫说此卡带为盗版,然后也要签家用机的协议。 最后的结果是:凯文·麦克斯韦只带走一张白纸,罗伯特·斯坦恩带走了街机协议书。由于麦克斯韦声称所有的FC卡都是盗版,ELORG保留了家用机的版权,没卖给任何人。假如麦克斯韦想获得家用机版权的话,就必须出价比任天堂高才行。亨克·罗杰斯买到了掌机的版权,并且通知了荒川实。BPS就制作GB版Tetris向任天堂达成交易:这笔交易额高大500万-1000万美元。 1989年3月15日亨克·罗杰斯回到莫斯科,并且代表任天堂出巨资收购家用机版Tetris的版权。版权费的价格虽然没有向外界透露,但是这个数字将是Mirrorsoft永远拿不出来的。连荒川实和NOA的首席执行官霍华德·林肯(Howard Lincoln)都亲自前往苏联助阵。 1989年3月22日ELORG和任天堂的家用机协议终于达成。任天堂方面坚持加入一款声明,在协议签定之后,如果和其他出现法律纠纷,苏联方面必须派人去美国的法庭上做证。实际上,这种法律上的争端将是不可避免的。据说ELORG仅仅得到的定金有300-500万美元之多。别里科夫向Mirrorsoft通知,说Mirrorsoft, Andromeda和Tengen都没有家用机的版权,现在版权都归任天堂所有。当天晚上任天堂和BPS的头目们在莫斯科酒店里举行了庆祝party。 (也就是说,现在家用机和掌机的版权已经被任天堂和BPS分别掌握在手中。无论是Atari还是Tengen都没有权利制作FC版的俄罗斯方块。) 1989年3月31日霍华德·林肯向Atari发去最后通牒(传真),告诉他们立刻停止FC(NES)版的俄罗斯方块游戏。这使得Atari和麦克斯韦都十分震怒。他们以Tengen的名义回信说在4月7日那天他们就已经享有家用机俄罗斯方块的版权了。 1989年4月13日Tengen撰写了一份申请书,要求拥有Tetris的“影音作品,源程序和游戏音乐”版权。但是申请书中并没有提及阿列克谢·帕基特诺夫和任天堂的游戏版权问题。 与此同时,麦克斯韦利用自己掌握的媒体势力,企图夺回Tetris的阵地。甚至搬出了苏联与英国政府,对俄罗斯方块版权问题进行干预。结果挑起了苏共与ELORG之间的矛盾。甚至连戈尔巴乔夫都向麦克斯韦保证“以后不用担心日本公司的问题”。

俄罗斯方块不同版本展示(6张)在4月晚些时候,霍华德·林肯回到莫斯科的时候,发现ELORG已经在苏联政府的打压下抬不起头来,而就在那天半夜,NOA方面给他打电话,说Tengen已经起诉了任天堂。 第二天,他面会了别里科夫,帕基特诺夫和其他几位ELORG的成员,以确保他们能够为任天堂的官司佐证。(这回合同里的条款可生效了)随后NOA立刻反诉Tengen,并且开始收集证据。 1989年5月17日Tengen在USA Today上登载了大幅Tetris广告,虽然法庭大战已经迫在眉睫。 1989年6月Tengen与任天堂的案子终于开庭审理。论战主要围绕一个议题展开:NES(FC)究竟是电脑,还是电子游戏机……Atari认为NES是电脑系统,因为它拥有扩展机能,而且日本的Famicom也有网络功能存在。而任天堂的证据则更加切题:ELORG中的苏联人从来没有意向出售Tetris的家用机版权,而所谓的“电脑”的概念则早在和斯坦恩的协议中提到了。 1989年6月15日法庭召开听证会,讨论关于任天堂和Tengen互相命令对方终止生产和销售各自的Tetris软件的行为。法官福恩·史密斯(Fern Smith)宣布Mirrorsoft 与 Spectrum Holobyte均没有家用机版权,因此他们提供给Tengen的权利也不能生效。任天堂的请求最后得到了许可。 1989年6月21日Tengen版的俄罗斯方块全部撤下了货架,该游戏卡带的生产也被迫中止。数十万份软件留在包装盒里,封存在仓库中。 1989年7月任天堂NES版Tetris在美国发售。全美销量大约300万。与此同时,和GB版Tetris捆绑销售的Game Boy席卷美国,美利坚大地上刮起一阵方块旋风。 关于Tetris的混战此时已经告一段落。而任天堂和Tengen之间的法庭纠纷则一直持续到1993年。

编辑本段发展过程

发展历史

对于俄罗斯方块而言,相较于游戏本身内容的发展,其产权之争所包含的意义,对于整个IT行业都有着极为深远的影响。 游戏俄罗斯方块

俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。 然而,很少有人知道,这个著名的游戏在80年代曾经在法律界掀起轩然大波,那就是著名的俄罗斯方块产权之争。这次产权争夺,几家欢喜,几家哀愁,几家公司倒闭,几家公司赚钱,其中的是是非非,一言难尽。 工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播。帕基特诺夫因此开始小有名气。

产权纠纷

俄罗斯方块

俄罗斯方块的智慧财产权由前苏联的外国贸易协会(ELORG)持有,现由The Tetris Company继承。虽然大型机器上贩售的俄罗斯方块游戏多取得授权,但因为其规则简单、容易开发,事实上很多未授权品也散布着。1990年代初期,全世界流行大量的小型游戏机,多半为类似俄罗斯方块的游戏,都不是授权产品。 甚至,很多故意不用Tetris名称之类似俄罗斯方块的游戏机器在著作权官司中事实上都获得了胜诉。这意味着俄罗斯方块这类单纯数学性质的游戏,权利人在著作权诉讼中也很有可能居于弱势,这对游戏开发厂商来说是很大的冲击。是故,很多游戏开发厂商都有不太愿意开发这类数学性质游戏的倾向。

收购

PC版俄罗斯方块在匈牙利的布达佩斯被当地的一群电脑专家移植到了Apple II 和 Commodore 64 上,这些版本的软件引起了当时英国一个叫Andromeda的游戏公司经理罗伯特·斯坦恩(Robert Stein)的注意,他向帕基特诺夫以及匈牙利的电脑专家们收购了俄罗斯方块的版权,并且在买到版权之前把它们倒手卖给了英国的Mirrorsoft (注意不是Microsoft!) 以及美国的Spectrum Holobyte。

谈判

斯坦恩和帕基特诺夫经过谈判,就版权收购问题未取得成果。斯坦恩甚至直接飞到莫斯科和帕基特诺夫面谈,但是空手而归。由于俄罗斯人对于已经在西方兴起的电子游戏产业知道不多,斯坦恩决定窃取Tetris的版权,于是他放出谣言说这是匈牙利人开发的游戏。 与此同时,PC版的俄罗斯方块已经由英国的Mirrorsoft出品并且在欧洲销售,受到当时人们的极大关注。不仅仅因为这个游戏好玩,而且这是“第一个来自铁幕国家的游戏。”当时的游戏宣传海报上有浓郁的冷战色彩,比如战争画面,加加林太空飞行等。而斯坦恩仍然没有正式合法的版权。 1987年6月斯坦恩最终取得了在IBM-PC及其兼容机上的Tetris的版权,版权机种包括“其他任何电脑系统”。但是,他没有和苏联方面签署协议,也就是说,这个版权是不完全的。(译者注: 这个“其他任何电脑系统”在原文中的描述是“any other computer system”,这种说法在当时看来也很不严密,从而为后来的产权之争埋下了伏笔)

结果

Atari Games仍然开发了街机版的Tetris,共卖出约2万台机器。近来Atari Games 被 Williams/WMS收购,而那些封存在仓库里的NES版Tetris的命运则没人知道。Tengen不能从其他途径把它们处理掉,所以估计这些软件都被销毁了。但是据说仍然有约10万份Tengen版的Tetris流入了市场。 罗伯特·斯坦恩,这个版权问题的始作俑者,在Tetris上总共只赚了25万美元。本来他可以挣多点钱的,但是Atari和Mirrorsoft在付他版税的时候没有给足。 Spectrum Holobyte 则需要和ELORG重新协商,以确保电脑版Tetris的版权。罗伯特·麦克斯韦的媒体堡垒在混战中逐渐分崩离析,老麦克斯韦在做生意时做幕后黑手的事实也在调查中,而他却突然暴病身亡。Mirrorsoft 英国公司也惨淡地退出了历史舞台。真正的大赢家是BPS的总裁亨克·罗杰斯,还有幕后的任天堂。俄罗斯方块究竟为任天堂赚了多少银子呢?答案恐怕永远说不清了。想一想吧,在美国GB都是和Tetris捆绑销售,以增加GB的出货量……然后因为Tetris买了GB的人还会买其他的GB卡……要是这么算起来的话,那利润简直就像滚雪球一样了。现在GB版的Tetris总共生产了3000万张,成为不朽之作。 至于苏联方面,除了苏联政府,谁也没有从Tetris那里得到多少好处。苏联解体之后,原ELORG的人员都四散到了全国乃至世界各地,许多人继续开发游戏(比方说帕基特诺夫)。 阿列克谢·帕基特诺夫几乎没有从Tetris上赚到一分钱。ELORG本来打算给他Tetris的销售权,但是旋即取消了这笔交易。不过帕基特诺夫仍然为自己能够制作出这么一个世界闻名的优秀游戏而欣慰。他从科学院里得到一台286(当时在苏联可是了不起的电脑)作为奖励。而且分到了比同事们家宽敞明亮的房子。在1996年,亨克·罗杰斯支付给他一笔报酬,帕基特诺夫组建了Tetris Company LLC 公司,终于能够自己创作游戏,并且收取版权费了。 简单俄罗斯方块游戏

现在,所有经The Tetris Company官方授权许可的正统俄罗斯方块游戏,都会注明"Authentic Tetris® Game"的商标。

相关资讯

T,E,T,R,I,S,Tetris,它就是指俄罗斯方块了。掐指一算,这款游戏已经25周岁了。话说1985年的6月,数学家帕基特诺夫利用空闲时间编出一个游戏程序,用来测试当时一种计算机的性能。由于他爱玩拼图,并从游戏里得到灵感,Tetris,俄罗斯方块便诞生了。近日(2009年6月5日),帕基特诺夫及其合作伙伴宣布,Tetris,俄罗斯方块诞生25周年庆祝活动在美国洛杉矶举办的电子娱乐展上启动。不知,这次25周岁庆生能否让这款游戏再大火一把呢?

编辑本段衍生游戏

俄罗斯方块由于受到欢迎,有些游戏厂商以其为蓝本,开发出不同的衍生游戏: 俄罗斯方块

决战俄罗斯

决战俄罗斯(Face to Face):台湾交通大学大一学生蔡祈岩与王功华制作并于1990年由台湾的智冠科技(当时叫软体世界)出版,加入两人对战及许多道具,并首创与电脑对战功能,以 *** 作流畅与合理设计将这款游戏推向全新高度,迅速风靡中港台及亚洲各国,是华人自制电脑游戏的滥觞。 立体方块:将原本2D的方块改为3D,以增加游戏的挑战性。 脸谱方块:将人的脸谱分割成五等份(额头、眼睛、鼻子、嘴巴、下巴),须将随机落下的脸谱各部份拼成正确的脸谱方可消除并得分。

经典俄罗斯方块

小游戏说明:俄罗斯方块对于是80年代的人来说差不多是从小玩到大的游戏吧,最初是用游戏机玩,同在改用电脑了,快来回温下吧! 经典俄罗斯方块

*** 作方法:方向键←→控制方块的左右移动,方向键↑变形,方向键↓加速方块落下的速度。[1]

唯美俄罗斯方块

小游戏说明:俄罗斯方块小游戏大家都不陌生了,这款小游戏的画面非常唯美,希望大家喜欢此款小游戏。 *** 作方法:键盘方向键控制,↑键方块变形。[2]

猪猪侠魔幻方块

小游戏说明:猪猪侠魔幻方块PC豪华版,通过绚丽的动漫元素使游戏背景更出众,聪明可爱的猪猪侠带您挑战最最经典的方块游戏。 猪猪侠魔幻方块

*** 作方法:键盘 *** 作,←左移;→右移;↑旋转方块;↓方块一格格快速下移,空格健方块瞬间下落。[3]

俄罗斯方块双人版

小游戏说明:可以双人玩的俄罗斯方块小游戏,来和你的朋友比比谁更加厉害! *** 作方法: 玩家一:方向键←→控制左右方向,方向键↑变形,方向键↓快速降落。 玩家二:S F 控制左右方向,E 变形,D快速降落。[4]

编辑本段游戏开发者简介

阿列克谢·帕基特诺夫

俄罗斯方块的开发者是阿列克谢·帕基特诺夫,他被成为俄罗斯方块之父。 阿列克谢·帕基特诺夫(Алексей Пажитнов,1956年-),俄罗斯人。他是一位前苏联电脑工程师。1985年6月工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播,帕基特诺夫因此开始小有名气。 阿列克谢·帕基特诺夫几乎没有从研发游戏上赚到一分钱。不过帕基特诺夫仍然为自己能够制作出这么一个世界闻名的优秀游戏而欣慰。他当时从科学院里得到一台286电脑作为奖励,而且分到了比同事们家宽敞明亮的房子。

俄罗斯破解版不可以联机

1、俄罗斯盗版游戏网站不可以联机,因为程序大佬已经将这个游戏破解了,是不能进行联网并且联机的,否则连接正版服务器一下就会检测到了。

2、当然虽然不联网游戏,但是有些游戏是可以通过局域网来游戏,只是范围比较局限。

3、综上所述,俄罗斯盗版游戏网站游戏是不能联机的,大家可以当个单机游戏玩玩就好了。

需要在tc下

/------------- Compile ------------------------------ /

/ [in os mode:] /

/ bgiobj egavga /

/ tlib lib\graphicslib+egavga /

/ [in TC: ] /

/ make exe /

/-------------------------------------------------------/

#include <stdlibh>

#include <graphicsh>

#include <biosh>

#define mDRAW 5

#define mLINE 6

#define mADOWN 7

#define mGEN 8

#define mLEFT 75

#define mRIGHT 77

#define mSPACE 57

#define mDOWN 80

#define mESC 1

#define TIMEINT 2

#define MAXX 9

#define MAXY 30

#define BACKCOLOR BLACK

#define WINX 50

#define WINY 470

#define GAP 6

#define AREAX (WINX+GAP)

#define AREAY (WINY-GAP)

#define BOXW 15

int oldarea[MAXY+1][MAXX];

int area[MAXY+1][MAXX];

int actW,actH,actX,actY;

int curX,curY,curColor,curW,curH;

int newX,newY,newColor,newW,newH;

int active;

int box[4][4];

int FORCOLOR;

int MESSAGE;

int BOX[7][4][4]={

{

{1,1,1,1},

{0,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0},

{1,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0},

{0,0,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0},

{0,1,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,0,0},

{0,1,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{0,1,1,0},

{1,1,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,0,0},

{1,1,0,0},

{0,0,0,0},

{0,0,0,0}

}

};

void init();

void draw();

int genBox();

int getKey();

void lineFull();

int moveLeft();

int moveRight();

int moveDown();

int rotate();

int getW();

int getH();

void clearOldBox();

void putNewBox();

int collisionRotate(int box[][4]);

void getMessage();

void dispatchMessage();

int timeCome();

void fallDown();

int gameOver();

main()

{

int i;

init();

do

{

getMessage();

dispatchMessage();

}

while(!gameOver());

getch();

closegraph();

}

void getMessage()

{

if(MESSAGE) return;

if(timeCome())

{

MESSAGE=mADOWN;

return;

}

if(bioskey(1))

{

MESSAGE=bioskey(0)>>8;

return;

}

}

void dispatchMessage()

{

switch(MESSAGE)

{

case mLEFT: moveLeft();break;

case mRIGHT: moveRight();break;

case mADOWN: moveDown();break;

case mSPACE: rotate();break;

case mDOWN: fallDown(); break;

case mDRAW: draw();break;

case mLINE: lineFull();break;

case mGEN: genBox();break;

case mESC: closegraph(); exit(0);

default: MESSAGE=0;

}

}

void fallDown()

{

while(active)

{

moveDown(); draw();

}

MESSAGE=mLINE;

}

int timeCome()

{

static long tm, old;

tm=biostime(0,tm);

if(tm-old<TIMEINT) return 0;

else

{

old=tm; return 1;

}

}

void init()

{

int i,j,x1,y1,x2,y2;

int driver=DETECT, mode=0;

randomize();

registerbgidriver(EGAVGA_driver);

initgraph(&driver,&mode,"");

cleardevice();

setfillstyle(SOLID_FILL,BLUE);

bar(0,0,639,479);

x1=AREAX;

y1=AREAY-BOXWMAXY;

x2=AREAX+MAXXBOXW;

y2=AREAY;

rectangle(--x1,--y1,++x2,++y2);

setfillstyle(SOLID_FILL,BLACK);

bar(++x1,++y1,--x2,--y2);

y1=AREAY-MAXYBOXW; y2=AREAY;

setcolor(DARKGRAY);

for(i=0;i<MAXX;i++)

{

x1=AREAX+iBOXW;

line(x1,y1,x1,y2);

}

x1=AREAX; x2=x1+MAXXBOXW;

for(j=0;j<MAXY;j++)

{

y1=AREAY-jBOXW;

line(x1,y1,x2,y1);

}

for(j=0;j<MAXY;j++)

for(i=0;i<MAXX;i++)

area[j][i]=oldarea[j][i]=0;

actX=0; actY=0; actW=MAXX-1; actH=MAXY-1;

draw();

MESSAGE=mGEN;

}

int genBox()

{

int i,j,boxidx;

boxidx=random(7); FORCOLOR=random(7)+1;

for(j=0;j<4;j++)

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

box[j][i]=BOX[boxidx][j][i];

curW=getW(); curH=getH();

curX=(MAXX+curW)/2;

if(curX+curW>=MAXX)curX=MAXX-1-curW;

curY=MAXY-1-curH;

newX=curX; newY=curY; actX=curX;actY=curY;

actW=newW=curW; actH=newH=curH;

active=1;

if(collision(box)) return 0;

putNewBox();

draw(); MESSAGE=0;

return 1;

}

void lineFull()

{

int row,col, rowEnd,full,i,j;

rowEnd=newY+newH;

if(rowEnd>=MAXY-1) rowEnd=MAXY-2;

for(row=newY; row<=rowEnd;)

{

full=1;

for(col=0;col<MAXX;col++)

if(!area[row][col]){full=0; break;}

if(!full){++row; continue;}

for(j=row; j<MAXY-1;j++)

for(i=0;i<MAXX;i++)

area[j][i]=area[j+1][i];

actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;

draw(); rowEnd--;

}

MESSAGE=mGEN;

}

void draw()

{

int row,col,x1,y1,x2,y2;

for(row=actY;row<=actY+actH;row++)

for(col=actX;col<=actX+actW;col++)

if(area[row][col]!=oldarea[row][col])

{

if(area[row][col]==0)

setfillstyle(SOLID_FILL,BACKCOLOR);

else

setfillstyle(SOLID_FILL,FORCOLOR);

x1=AREAX+colBOXW; x2=x1+BOXW;

y1=AREAY-(row+1)BOXW; y2=y1+BOXW;

bar(++x1,++y1,--x2,--y2);

oldarea[row][col]=area[row][col];

}

MESSAGE=0;

}

int moveLeft()

{

newX=curX-1; clearOldBox();

if(collision(box))

{

newX=curX;

putNewBox();

MESSAGE=0;

return 0;

}

putNewBox();

actW=curW+1; actX=curX=newX;

MESSAGE=mDRAW;

return 1;

}

int moveRight()

{

newX=curX+1; clearOldBox();

if(collision(box))

{

newX=curX;

putNewBox();

MESSAGE=0;

return 0;

}

putNewBox();

actW=curW+1; actX=curX; curX=newX;

MESSAGE=mDRAW;

return 1;

}

int moveDown()

{

int i,j;

newY=curY-1;

clearOldBox();

if(collision(box))

{

newY=curY;

putNewBox();

active=0;

MESSAGE=mLINE;

return 0;

}

putNewBox();

actH=curH+1; actY=newY; curY=newY;

MESSAGE=mDRAW;

return 1;

}

int rotate()

{

int newBox[4][4];

int i,j;

clearOldBox();

for(j=0;j<4;j++)

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

newBox[j][i]=0;

for(j=0;j<4;j++)

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

newBox[curW-i][j]=box[j][i];

newW=curH; newH=curW;

if(collisionRotate(newBox))

{

newW=curW; newH=curH; newX=curX; newY=curY;

putNewBox();

MESSAGE=0;

return 0;

}

for(j=0;j<4;j++)

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

box[j][i]=newBox[j][i];

putNewBox();

actH=newH>curH newH:curH;

actW=curX+actH-newX;

actX=newX; actY=newY; curX=newX;

curY=newY; curW=newW; curH=newH;

MESSAGE=mDRAW;

return 1;

}

int getW()

{

int i,j;

for(i=3;i>0;i--)

for(j=0;j<4;j++)

if(box[j][i]) return i;

return 0;

}

int getH()

{

int i,j;

for(j=3;j>0;j--)

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

if(box[j][i]) return j;

return 0;

}

void clearOldBox()

{

int i,j;

for(j=0;j<=curH; j++)

for(i=0;i<=curW; i++)

if(box[j][i])

area[curY+j][curX+i]=0;

}

void putNewBox()

{

int i,j;

for(j=0;j<=newH;j++)

for(i=0;i<=newW;i++)

if(box[j][i])

area[newY+j][newX+i]=FORCOLOR;

}

int collision(int cbox[][4])

{

int i,j;

if(newX<0) return 1;

if(newX+newW>=MAXX) return 1;

if(newY<0) return 1;

for(j=0;j<=newH;j++)

for(i=0;i<=newW;i++)

if(area[newY+j][newX+i]&&cbox[j][i]) return 1;

return 0;

}

int collisionRotate(int cbox[][4])

{

int i,j;

if(newX+newW>=MAXX) newX=MAXX-1-newW;

if(newY+newH>=MAXY) newY=MAXY-1-newH;

if(collision(cbox)) return 1;

for(i=0;i<=newW;i++)

for(j=0;j<=newH;j++)

if(area[newY+j][newX+i])

{

newX-=newW-i+1; goto L;

}

L: return collision(cbox);

}

int gameOver()

{

if(!active &&(curY+curH>MAXY-3)) return 1;

else return 0;

}

/ the end /

以上就是关于用c语言编写俄罗斯方块的程序全部的内容,包括:用c语言编写俄罗斯方块的程序、俄罗斯双人成行可以联机吗、俄区为什么买不了双人成行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10113918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存