如何用100行python代码做出魔性声控游戏"声控八分音符符酱

声控游戏《八分音符酱》虐翻众人 机智的网友开了挂
游侠网单机新闻
  近日一款名为《不要停下来 八分音符酱(休むな!8分音符ちゃん?)》的游戏从日本火到了国内。游戏角色形象为一八分音符,整体从画风和关卡设计与经典&自虐&游戏《猫里奥》相似,而因为游戏的操作方式,使得游戏在难度上同样的特别&虐&。
  游戏的唯一操作方式是通过麦克风接受音调高低来判断,持续的低音是前进,高音则是跳跃,跳跃高低与音调的高低直接挂钩。这可以说是实打实的&输出靠吼&的游戏,由于游戏实在太虐经常吼了一晚上却还是通不了关,还经常打扰到邻居,所以有网友开发出了游戏&外挂&&&尖叫鸡。
  尖叫鸡(Screaming Chicken)本是一款奇特的玩具,玩家们可以任意&蹂躏&它,它便会发出特别高的啼鸣声。所以这个道具在这款游戏中绝对是通关利器,有网友放出了使用尖叫鸡通关的视频,简直太轻松啊!
更多相关资讯请关注:不要停下来!八分音符酱专题
更多相关讨论请前往:不要停下来!八分音符酱论坛
那么多八分音符热点,我还是最服杜蕾斯的通关秘籍
魔性小游戏!《不要停下来!八分音符酱》专题站上线
注:& 此文章为转载,版权归原作者所有!
新闻TOP10:
内容加载中●●●
Copyright & 2015
All Rights Reserved V3
京ICP备号-3Excel+VBA制作小游戏:俄罗斯方块 - 推酷
Excel+VBA制作小游戏:俄罗斯方块
用VBA做俄罗斯方块起因知乎上的一个问题,但其实我非常不擅长俄罗斯方块这类游戏。因为我实在是太懒了,只要一个动作重复操作超过90s我就恨不得写点什么小程序让它自己完成,然而谁还没点暴露年龄的童年呢~偶尔怀个旧也不错!毕竟也是经历过【【变变变】快把它躺下放右边】【长条怎么还不来】那个阶段的人……再说就成怀旧贴了~
接下来说回怎么用VBA在Excel里实现这个俄罗斯方块,我用了一个类模块来负责方块的对象,一个模块负责操作的方法。首先还是准备界面!
一、准备界面
这次实现的俄罗斯方块在功能细节上比之前几个都要丰富,包括了积分、行数、速度等级、排名、下一个方块等小功能的实现。所以整体界面分两大部分:
1、固定界面
在游戏中不会变动的部分,我们可以先准备好。我们先把A~P16列的列宽设置为2,把整体界面模仿成近似正方形小方块的像素格。然后需要一个10*20的游戏界面,把A1:J20涂白,粗外侧框线。
然后L2:O2合并后居中,做得分;L3:O3合并后居中,显示得分0;底色涂白,整体加上所有框线。行数、等级、积分榜等内容如法炮制,在积分榜下面有一点小不同。积分榜内容,左边输入1、2、3,右边每行合并单元格。
最下方L17:O20这个4*4的涂白加边框,当作下一个方块的提示区。做成像题图那样就差不多了。
2、变化界面
主游戏界面在游戏中是一直在变化的,这个我们需要用方法来完成。得分、行数、等级,以及提示区域也是在游戏中不断变化的,排行榜是游戏结束后更新的。我们先来画一下游戏开始和结束的界面,新增一个模块命名为Tetris,加入代码如下:
Private Sub UI_Init()
Application.ScreenUpdating = False
With Sheet1.Range(&A1:J20&)
.Interior.colorIndex = 2
.Font.Size = 10
.BorderAround Weight:=xlMedium
.Borders(xlEdgeTop).LineStyle = xlNone
Sheet1.Range(&L3&) = 0
Sheet1.Range(&L6&) = 0
Sheet1.Range(&L9&) = 1
With Sheet1.Range(&L17:O20&)
.Interior.colorIndex = 2
.BorderAround Weight:=xlThin
Sheet1.Range(&K21&).Select
Application.ScreenUpdating = True
Private Sub Over_Init()
Application.ScreenUpdating = False
With Sheet1.Range(&C8:H11&)
.Value = &游戏结束!&
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.BorderAround Weight:=xlMedium
.Interior.colorIndex = 2
.Font.colorIndex = 1
.Font.Bold = True
.Font.Size = 16
Application.ScreenUpdating = True
游戏开始的时候我们重置了主界面、分数区域和提示区域,游戏结束的时候画了一个游戏结束的提示框。养成好习惯,在画界面前关闭屏幕更新,画完之后再打开,页面才不会有刷新闪烁的感觉。
二、方块对象
新建一个类模块,命名为Block,需要的一些公共变量如下:
Public typeArr As Variant
Public colorArr As Variant
Public shapeArr As Variant
Public rotatedShape As Variant '旋转后坐标
Public dirs As Variant
Const PI As Double = 3.14
Public x As Integer
'横坐标/行数
Public y As Integer
'纵坐标/列数
Public color As Integer
Public status As Integer
Public typeName As String
Public typeIndex As Integer
在对象创建时,我们需要用默认初始化方法给类型、颜色、坐标数组、移动坐标赋值。
Private Sub Class_Initialize()
typeArr = Array(&I&, &J&, &L&, &O&, &S&, &Z&, &T&)
colorArr = Array(8, 5, 44, 6, 4, 7, 3)
shapeArr = Array(Array(Array(0, 0), Array(0, 1), Array(0, 2), Array(0, -1)), _
Array(Array(0, 0), Array(0, 1), Array(0, -1), Array(-1, -1)), _
Array(Array(0, 0), Array(0, 1), Array(0, -1), Array(-1, 1)), _
Array(Array(0, 0), Array(-1, 1), Array(-1, 0), Array(0, 1)), _
Array(Array(0, 0), Array(0, -1), Array(-1, 0), Array(-1, 1)), _
Array(Array(0, 0), Array(0, 1), Array(-1, 0), Array(-1, -1)), _
Array(Array(0, 0), Array(0, 1), Array(0, -1), Array(-1, 0)))
dirs = Array(Array(0, 1), Array(1, 0), Array(0, -1))
根据官方说法,俄罗斯方块有7个类型的方块,分别用字母I、J、L、O、S、Z、T表示;他们的颜色我随便对照了某个俄罗斯方块,从VBA自带的颜色索引中找了相似的;他们的坐标,指的是 以旋转中心为原点的相对坐标 。我们的坐标是根据旋转中心来确定的,而旋转中心,又是根据俄罗斯的旋转系统来确定的。
俄罗斯方块的基本元素——方块,是由4个正方形小方块组成。除了O型方块,其他方块都能旋转。俄罗斯方块旋转系统的标准很多,以下内容来自俄罗斯方块吧:
这个标准是很多的。
官网上规定的Guideline是Super Rotation System
即超级选转系统的中心如下:
(以上图片来自于Harddrop)
Arika Rotation System
本旋转系统被Arika的俄罗斯方块大师系列(TGM)所用。
这里为了方便实现,我把两种规则综合了下,用了一种比较容易实现的规则。这里允许嘲笑我三秒钟~我就是这么的懒惰!
由于需要使方块旋转,我们在创建一个方块对象的时候必须要知道的变量有四个: 方块旋转中心的横、纵坐标,方块的类型,方块的当前旋转状态 。所以,在手动初始化时,我们需要传入4个变量,如下:
Public Sub Init(ByVal x As Integer, ByVal y As Integer, ByVal typeName As String, ByVal status As Integer)
For i = 0 To 6
If typeName = typeArr(i) Then Me.typeIndex = i: Exit For
Me.typeName = typeName
Me.status = status
Me.color = Me.colorArr(typeIndex)
Call Me.Shape_Rotate(Me.status)
我们首先根据类型的名称,从类型数组中匹配出对应的索引值(这里为什么不直接传入索引数字,我们之后再说)。将4个变量赋值后,由颜色数组读取出相应的颜色。 因为我们的坐标数组中存放的坐标,都是方块初始状态坐标,所以需要再通过一个方块旋转方法,使方块旋转到当前的状态。
2、方块旋转
旋转的方法如下:
Public Sub Shape_Rotate(ByVal toStatus As Integer)
Dim tempArr
tempArr = Me.shapeArr(Me.typeIndex)
For j = 1 To toStatus
For i = 0 To 3
point_x = tempArr(i)(0)
point_y = tempArr(i)(1)
tempArr(i)(0) = CInt(point_x * Math.Cos(PI / 2) - point_y * Math.Sin(PI / 2))
tempArr(i)(1) = CInt(point_x * Math.Sin(PI / 2) + point_y * Math.Cos(PI / 2))
Me.rotatedShape = tempArr
这里对方块状态(status变量)的规定做一下说明,变量从0到3代表了4种不同的旋转状态,每一种都是前一状态逆时针旋转90度的结果。所以我们针对当前需要到达的状态toStatus做一个从1开始的循环,如果当前状态是0则循环不执行。
每次循环都把单个方块的横、纵坐标拿出来,放到变量point_x、point_y中, 通过数学方法计算出旋转后的坐标值 ,再将这个值放回去。我们这里用了一个临时数组tempArr来进行计算,以免干扰原始数据。计算时候的临时数组再赋值给造就准备好的旋转后坐标数组rotatedShape。
3、方块输出
变成当前状态后,我们需要把方块画到游戏界面中。Block_Draw的实现代码如下:
Public Sub Block_Draw(Optional ByVal s As Integer = 0)
Dim colorIndex%, line
colorIndex = Me.color
line = xlContinuous
If s = 1 Then colorIndex% = 2: line = xlLineStyleNone
Sheet1.Cells(Me.x + Me.rotatedShape(0)(0), Me.y + Me.rotatedShape(0)(1)).Font.colorIndex = colorIndex%
For i = 0 To 3
Sheet1.Cells(Me.x + Me.rotatedShape(i)(0), Me.y + Me.rotatedShape(i)(1)).Interior.colorIndex = colorIndex%
Sheet1.Cells(Me.x + Me.rotatedShape(i)(0), Me.y + Me.rotatedShape(i)(1)).Borders.LineStyle = line
Sheet1.Range(&A1:J20&).BorderAround Weight:=xlMedium
Sheet1.Range(&A1:J20&).Borders(xlEdgeTop).LineStyle = xlNone
这里有个可选参数s,用来区分我们是来画这个方块,还是把这个方块擦掉。因为方块变化(包括移动和旋转)的画面,都是通过擦除原有方块再画一个新方块来实现的。而所谓擦除方块,就是把方块涂上白色去掉边框,和画方块时的涂色加边框动作本质相同。
我们规定方块的颜色来自Me.color,边框线默认为xlContinuous,如果s参数传入1则把颜色修改为白色,边框修改为无(xlLineStyleNone)。然后通过循环,给每一个小方块确定颜色和边框。这里有一个细节, 在循环前将旋转中心的字体颜色改成方块颜色 ,这是为什么?最后画的是整个页面的大边框,以及 去掉顶上的边框线 ,为什么要去掉?可以先思考下,后面会说明。
4、移动与判定
方块的基本方法已经介绍完了,接下来是方块的2个主要动作,移动和旋转。方块一共有3个移动方向右、下、左,我之前做的很多小游戏都用到了这个方向的处理。移动的代码很简单:
Public Sub Block_Move(ByVal dir As Integer)
Me.Block_Draw (1)
Me.x = Me.x + Me.dirs(dir)(0)
Me.y = Me.y + Me.dirs(dir)(1)
Me.Block_Draw
想读取一个dir变量(direction的缩写,原谅我的懒惰),我们规定0、1、2分别代表右、下、左,根据这个规定定义数组dirs的内容。然后按照上面说的处理方式,先把原来的方块擦除,再让坐标改变,然后画出新的方块。
移动没什么技术含量,可移动的判定才是较难的内容。接下来注意了,我要变形了!
这部分我们先来分析规则,俄罗斯方块的碰撞判定是: 方块的任意部分与其他方块或边界接触 。碰撞后即不可再向该方向移动,如果产生向下的碰撞则方块停止下沉。所以, 要对每一个小方块进行移动判定 。我们只需要看方块移动后的位置是否超越边界或已存在方块(颜色)即可,但是问题来了!方块自身要被排除在外。
也就是说,我们要 找出移动之后与移动前不重合的方块,判断这个方块是否超越边界或者已存在颜色,如果是则为不可移动 。
Public Function Block_Move_Possible(ByVal dir As Integer) As Boolean
Block_Move_Possible = True
Dim count%
For i = 0 To 3
If Me.x + Me.rotatedShape(i)(0) + Me.dirs(dir)(0) & 20 Or Me.y + Me.rotatedShape(i)(1) + Me.dirs(dir)(1) & 1 Or Me.y + Me.rotatedShape(i)(1) + Me.dirs(dir)(1) & 10 Then
Block_Move_Possible = False
Exit Function
For j = 0 To 3
If Me.rotatedShape(i)(0) + Me.dirs(dir)(0) && Me.rotatedShape(j)(0) Or Me.rotatedShape(i)(1) + Me.dirs(dir)(1) && Me.rotatedShape(j)(1) Then count = count + 1
If count = 4 Then
If Sheet1.Cells(Me.x + Me.rotatedShape(i)(0) + Me.dirs(dir)(0), Me.y + Me.rotatedShape(i)(1) + Me.dirs(dir)(1)).Interior.colorIndex && 2 Then Block_Move_Possible = False: Exit Function
End Function
5、旋转与判定
旋转和移动的性质差不多,在初中数学有三大变化:抽烟、喝酒、烫头,不对!划掉重来,平移、对称、旋转,都是初等几何变换。旋转判定也和移动判定相似,把平移计算变为旋转计算即可,代码如下:
Public Sub Block_Rotate()
Call Shape_Rotate(Me.status)
Me.Block_Draw (1)
toStatus = (Me.status + 1) Mod 4
Call Shape_Rotate(toStatus)
Me.Block_Draw
Me.status = toStatus
Public Function Block_Rotate_Possible() As Boolean
Block_Rotate_Possible = True
If Me.typeName = &O& Then Block_Rotate_Possible = False: Exit Function
beforRotate = Me.rotatedShape
toStatus = (Me.status + 1) Mod 4
Call Shape_Rotate(toStatus)
For i = 0 To 3
If Me.x + Me.rotatedShape(i)(0) & 20 Or Me.x + Me.rotatedShape(i)(0) & 1 Or Me.y + Me.rotatedShape(i)(1) & 1 Or Me.y + Me.rotatedShape(i)(1) & 10 Then
Block_Rotate_Possible = False
Exit Function
For j = 0 To 3
If Me.rotatedShape(i)(0) && beforRotate(j)(0) Or Me.rotatedShape(i)(1) && beforRotate(j)(1) Then count = count + 1
If count = 4 Then
If Sheet1.Cells(Me.x + Me.rotatedShape(i)(0), Me.y + Me.rotatedShape(i)(1)).Interior.colorIndex && 2 Then Block_Rotate_Possible = False: Exit Function
End Function
Block对象创建完毕,接下来就是对程序的主逻辑实现。
三、主程序
1、游戏开始
游戏流程是这样设置的:
游戏开始初始化主界面;
随机放一个方块在主界面,
随机放一个方块在提示区;
判断游戏是否可以继续,是则进入自动下沉,否则结束;
下沉结束,将提示区的方块放到主界面,重复进行3
代码如下:
Public Sub Game_Start()
Call UI_Init
Dim typeName$
typeArr = Array(&I&, &J&, &L&, &O&, &S&, &Z&, &T&)
Randomize (Timer)
typeName = typeArr(Int(7 * Rnd))
'随机方块放入主界面
Sheet1.Cells(2, 5) = typeName & &0&
Dim mainBlock As New Block
Call mainBlock.Init(2, 5, typeName, 0)
mainBlock.Block_Draw
'随机方块放入提示区
typeName = typeArr(Int(7 * Rnd))
Dim hintBlock As New Block
Call hintBlock.Init(19, 13, typeName, 0)
hintBlock.Block_Draw
If Game_Over Then Exit Do
If mainBlock.Block_Move_Possible(1) = False Then Exit Do
Call hintBlock.Block_Draw(1)
Sheet1.Range(&L17:O20&).BorderAround Weight:=xlThin
Loop While (True)
Call Over_Init
Call List_Update
随机方块放入主界面,我们看到是在旋转中心单元格写如typeName和0,比如新生成一个S块就是S0。这就是之前提到的,为什么要用字母而不用索引来代替方块类型。一是没有字母更加直观,二是两个数字写入第一个0会被省略,如果以文本形式写入单元格会有讨厌的绿色小角标。同样解释了,为什么旋转中心单元格的字体颜色要和背景色一致,这是用来隐藏内容的!
这里的UI_Init和Over_Init方法之前都已经做过了,Game_Over是对游戏是否结束的判定,List_Update是对排行榜的更新。游戏结束的判定,其实就是刚放入的方块是否可以向下移动的判定,粗糙一点的话可以直接用mainBlock.Block_Move_Possible (1) = False来代替。如果要详细一点,还要做是否可以放入的判定,显示上处理起来就更麻烦了。这里姑且先简化处理吧!
排行榜更新代码如下:
Private Sub List_Update()
Dim score%, listArr
score = Sheet1.Range(&L6&)
listArr = Sheet1.Range(&M12:M14&)
If score & listArr(3, 1) Then listArr(3, 1) = score
For i = 3 To 2 Step -1
If listArr(i, 1) & listArr(i - 1, 1) Then
temp = listArr(i - 1, 1)
listArr(i - 1, 1) = listArr(i, 1)
listArr(i, 1) = temp
Sheet1.Range(&M12:M14&) = listArr
排行榜更新的逻辑是,当前分数大于排行榜最小值时就代替第三名记入榜内,然后按大小排序。这里的排序可以用Excel自带的排序功能实现,因为数量很少,又是对数组的处理,所以自己写了个冒泡。懒得查Excel排序的VBA代码了……
2、方块下沉
方块下沉就是执行一段延时的循环,延迟的时间又速度等级决定。这一段的流程是这样的:
获取当前速度等级;
获取当前方块位置、状态;
判断方块是否可以下沉,是则继续,否则跳出循环执行7;
方块自动下沉一格;
开启键盘事件,进行延时处理,关闭键盘事件;
重复执行2;
清空方块状态,执行消行方法;
代码如下:
Private Sub Down()
'获取当前速度等级
level = Sheet1.Range(&L9&)
'获取当前方块位置状态
Dim coordinate
coordinate = Block_Center
If coordinate(0) = 20 Then Exit Do
Dim x%, y%, typeName$, status%
x = coordinate(0)
y = coordinate(1)
typeName = coordinate(2)
status = coordinate(3)
Application.ScreenUpdating = False
Dim b As New Block
Call b.Init(x, y, typeName, status)
'判断方块是否可以下沉
If b.Block_Move_Possible(1) = False Then Exit Do
'方块下沉一格
b.Block_Move (1)
Sheet1.Cells(x, y) = &&
Sheet1.Cells(x + 1, y) = typeName & status
Application.ScreenUpdating = True
'进入延时处理
Application.EnableEvents = True
Sleep (1000 / level)
Application.EnableEvents = False
Loop While (True)
Application.ScreenUpdating = True
Application.EnableEvents = False
'清空方块状态
Sheet1.Cells(x, y) = &&
Call Line_Clear
这里 获取当前方块位置的方法 ,实现如下:
Private Function Block_Center() As Variant
arr = Sheet1.UsedRange
For i = 1 To 20
For j = 1 To 10
If IsEmpty(arr(i, j)) = False Then GoTo Exit_For
Dim typeName$, status%
typeName = Left(arr(i, j), 1)
status = CInt(Right(arr(i, j), 1))
Block_Center = Array(i, j, typeName, status)
End Function
简而言之,就是对游戏主界面区域进行遍历,找到第一个非空单元格,把行列序号和内容通过数组的方式返回。
这里的延时方法Sleep也是自己写的,要用的API是GetTickCount,这是我觉得一个比较高效的延时方法。先在头部引用API:
#If VBA7 And Win64 Then
Private Declare PtrSafe Function GetTickCount Lib &kernel32& () As Long
Private Declare Function GetTickCount Lib &kernel32& () As Long
然后创建方法:
Private Sub Sleep(numa As Double)
Dim num1 As Double
Dim num2 As Double
Dim numb As Double
num1 = GetTickCount
Do While numa - numb & 0
num2 = GetTickCount
numb = num2 - num1
最后的Line_Clear清行方法,需要实现清空可消除的行,计入行数、分数,判断等级等多个内容。代码如下:
Private Sub Line_Clear()
Application.ScreenUpdating = False
Dim rowCount%
For i = 20 To 1 Step -1
For j = 1 To 10
If Sheet1.Cells(i, j).Interior.colorIndex = 2 Then Exit For
If j & 10 Then
Sheet1.Range(Cells(i, 1), Cells(i, 10)).Interior.colorIndex = 2
Sheet1.Range(Cells(1, 1), Cells(i - 1, 10)).Copy
Sheet1.Range(Cells(2, 1), Cells(i, 10)).PasteSpecial
Sheet1.Range(Cells(1, 1), Cells(1, 10)).Interior.colorIndex = 2
rowCount = rowCount + 1
If rowCount & 0 Then
Sheet1.Range(&K21&).Select
Dim score%, lines%, level%
score = Sheet1.Range(&L3&)
lines = Sheet1.Range(&L6&)
level = Sheet1.Range(&L9&)
Select Case rowCount
score = score + 1
score = score + 2
score = score + 5
score = score + 10
End Select
lines = lines + rowCount
If lines &= level * 30 Then level = level + 1
Sheet1.Range(&L3&) = score
Sheet1.Range(&L6&) = lines
Sheet1.Range(&L9&) = level
Application.ScreenUpdating = True
实现原理很简单,从下往上遍历游戏区域,如果行内单元格出现白色则跳出,整行都没有白色则进行消除。消除之后还需要将该行以上的所有游戏区域都下沉,简单的复制粘贴就可以了。这就是之前提到的,为什么要将顶部的框线去掉,因为复制粘贴的时候会出现……这里利用了Excel的首行顶部框线本来就是不显示的,算是小小的偷个懒吧……
3、键盘动作
键盘动作还是老样子,我基本复制的以前的代码,以下代码放在Sheet1的代码页中:
#If VBA7 And Win64 Then
Private Declare PtrSafe Function GetKeyboardState Lib &user32& (pbKeyState As Byte) As Long
Private Declare Function GetKeyboardState Lib &user32& (pbKeyState As Byte) As Long
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
Dim keycode(0 To 255) As Byte
GetKeyboardState keycode(0)
Dim status%
If keycode(38) & 127 Then Call Block_Rotate
If keycode(39) & 127 Then Call Block_Move(0) '右
If keycode(40) & 127 Then Call Block_Move(1) '下
If keycode(37) & 127 Then Call Block_Move(2) '左
Sheet1.Range(&K21&).Select
Application.EnableEvents = True
这里涉及到的Block_Rotate和Block_Move都不是类模块中的类方法,而是在Tetris模块中的公共方法。
Public Sub Block_Move(ByVal dir As Integer)
Application.ScreenUpdating = False
Dim coordinate, dirs
coordinate = Block_Center
dirs = Array(Array(0, 1), Array(1, 0), Array(0, -1))
Dim x%, y%, typeName$, status%
x = coordinate(0)
y = coordinate(1)
typeName = coordinate(2)
status = coordinate(3)
Dim b As New Block
Call b.Init(x, y, typeName, status)
If b.Block_Move_Possible(dir) = False Then Exit Sub
Call b.Block_Move(dir)
Sheet1.Cells(x, y) = &&
Sheet1.Cells(x + dirs(dir)(0), y + dirs(dir)(1)) = typeName & status
Application.ScreenUpdating = True
Public Sub Block_Rotate()
Dim coordinate
coordinate = Block_Center
Dim x%, y%, typeName$, status%
x = coordinate(0)
y = coordinate(1)
typeName = coordinate(2)
status = coordinate(3)
Dim b As New Block
Call b.Init(x, y, typeName, status)
If b.Block_Rotate_Possible = False Then Exit Sub
Call b.Block_Rotate
status = (status + 1) Mod 4
Sheet1.Cells(x, y) = typeName & status
其实还是用类方法实现移动,只是需要在前后加一些规则,读取/修改方块的位置、状态。
以上,VBA实现俄罗斯方块的代码就完成了。文章已经很长了,完成代码就不放了吧~
文件下载:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致共 3 页/3条记录首页
日本独立游戏开发者的新脑洞,走路靠发声跳跃靠怒吼,一夜之间走红中国,虽然游戏看上去无聊但玩起来魔性,根本停不下来!现在就来看看这究竟是款什么样的游戏吧。
众所周知,日本的独立特别擅长开一些奇奇怪怪的脑洞。前不久,一款来自日本的PC单机游戏《不要停!八分音符酱?(休むな!8分音符ちゃん?)》(以下简称&八分音符酱&)在中国网络上突然爆红。甚至在没有在中国发行的情况下,相关微博的阅读量超过1711万,百度指数接近7万,并还在不断攀升,可以说就非常奇葩了。而更为奇葩的是其声控玩法,游戏全程靠吼。
怎么玩?声控玩法 输出全程靠吼
&八分音符酱&最早在今年的2月1日在日本的免费游戏平台Freem上发布,是一款设计非常简单的2D横版动作游戏。游戏中既没有介绍,也没有什么背景音乐。在一个以黑白为色调的场景中,玩家需要控制&音符酱&不断往前跑。关卡中也会出现各种不同的机关,玩家需要控制其躲避陷阱不断前进。
不过游戏最大的特色就在于其声控操作模式,根据玩家所发出的不同,&音符酱&跳跃的高度也会不同。当玩家窃窃的时候&音符酱&则会缓慢向前移动。而当平台过高的时候,玩家就得声嘶力竭,才有可能跳得更高。
这里我们也要说一句,虽然声控玩法看起来会显得非常标新立异,但事实上,这种玩法早在上世纪80年代FC上的《北野武的挑战状》中就已经出现过了,在某一个关卡中,玩家需要使用2P手柄上的麦克风连续唱3首歌才能顺利进行游戏。海外市场曾经也有过一些声控玩法的游戏。
《北野武的挑战状》游戏截图
共 3 页/3条记录首页
您可以使用“←
→”键快速翻页广播电视节目制作经营许可证:(沪)字第1248号
网络文化经营许可证:沪网文[6号
信息网络传播视听节目许可证:0910417
互联网ICP备案:沪ICP备号-3
沪ICP证:沪B2-
违法不良信息举报邮箱:
违法不良信息举报电话: 转 3

我要回帖

更多关于 声控游戏八分音符 的文章

 

随机推荐