EXCEL 游戏.docx

上传人:b****8 文档编号:9184312 上传时间:2023-02-03 格式:DOCX 页数:17 大小:23.04KB
下载 相关 举报
EXCEL 游戏.docx_第1页
第1页 / 共17页
EXCEL 游戏.docx_第2页
第2页 / 共17页
EXCEL 游戏.docx_第3页
第3页 / 共17页
EXCEL 游戏.docx_第4页
第4页 / 共17页
EXCEL 游戏.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

EXCEL 游戏.docx

《EXCEL 游戏.docx》由会员分享,可在线阅读,更多相关《EXCEL 游戏.docx(17页珍藏版)》请在冰豆网上搜索。

EXCEL 游戏.docx

EXCEL游戏

一:

纸牌游戏

启动Excel程序,依次点击工具栏中“工具/自定义”菜单,切换至“命令”标签页,选中左侧“类别”栏中的“工具”菜单,向下拖动右侧“命令”栏侧边滑块,找到带有纸牌图形的“自定义”选项(如图),将它拖至Excel工具栏中,点击“关闭”按钮将“自定义”对话框关闭。

现在,Excel工具栏中就多了一个纸牌按钮,点击该按钮,熟悉的纸牌游戏界面就出现在你面前了。

二:

MicroSoftExcel2000暗藏赛车游戏

1.开启Excel之后随便开一新文档,将它『另存成Web画面』,按下发布后再将“添加交互对象”打勾,将档案储存为car.htm(文件名可自取)。

2.在IE中开启car.htm,你应该会看到电子表格出现在网页中央,如图1:

图1

3.在这个工作表中,先用PageDown键移动工作表的矩形光标直至第2000行,注意只能用PageDown键,然后用Tab键横向向右移动光标直至WC列,也是只能用键操作,到此,所有的准备工作已经完毕,该是调出游戏的时候了。

4.同时按住Shift+Crtl+Alt然后点选左上方的Officelogo。

5.开始玩了,如图2:

图2

6.玩法提示:

玩游戏的时候,被你控制的是那一辆浅蓝色的汽车,操作的主要是四个箭头按键。

作用是:

左右箭头可以控制汽车的方向:

向上箭头可以加速,向下的箭头减速;如果汽车运行到了夜间,可用H键打开车灯。

绝对好玩!

三:

数字华容道

'先说个简单的。

大家玩过那个数字华容道吧,就是有N*N个格,有一格是空的,其他格是次序混乱的拼图或数字,游戏的目的就是利用这唯一的这个空格移动各块拼图把混乱的拼图(数字)恢复(顺序)。

这里我们小游戏的目的是要把1至15这15个次序混乱的数字恢复从1到15的顺序排列。

'打开Excel后打开代码编写器(Alt+F11),将如下代码写入模块中。

程序首先是初始化。

定义变量,选择4*4的空格,调整表格大小,改变单元格颜色(标示出游戏区域),然后是让1到15非重复随机分布到前15格空格中:

PublicConstPW="E"'本游戏由Excel吧bengdeng整理!

PublicRunningAsBoolean'用于判断游戏是否进行中,如果要中途退出或玩家需要重玩用此变量控制

PublicSRanAsRange'游戏左上单元格

PublicBRanAsRange'游戏空格单元格

PublicNAsInteger'游戏区域大小

PublicGRanAsRange'游戏区域,这里由N与SRan生成

PublicBsAsInteger'游戏步数

PublicSTimeAsDate'游戏开始时间

SubGameStar()

DimiAsInteger

DimiiAsInteger

DimtempAsInteger

Dima(14)AsInteger

DimdownAsVbMsgBoxResult

'判断游戏是否在运行

IfRunningThen

down=MsgBox("游戏正在进行!

是否重玩?

",vbYesNo,"提示-"&PW)

Ifdown=vbNoThenExitSub

EndIf

Running=True

N=4'设定游戏区域为4*4

SetSRan=Range("E5")'设定游戏开始单元格为E5

SetBRan=SRan.Offset(N-1,N-1)'设定游戏空单元格

SetGRan=Range(SRan,BRan)

'游戏区域(颜色)初始化,省略了单元格大小的调整,大家可以应该加入相应语句让游戏外观整齐

IfActiveSheet.ProtectContentsThenActiveSheet.UnprotectPassword:

=PW

GRan.ClearContents

GRan.Interior.ColorIndex=35

'随机数数组初始化,这里是编号0到编号14共15个数

Fori=0To(N*N-2)

a(i)=i+1

Nexti

'不重复随机分布各数

Fori=N*N-2To0Step-1

Randomize

ii=Int(Rnd*i)

temp=a(i)

a(i)=a(ii)

GRan.Item(i+1)=a(i)

a(ii)=temp

Nexti

Bs=0

STime=Now()

ActiveSheet.ProtectPassword:

=PW

EndSub

'很明显,Excel的单元格是游戏的主角。

初始化后游戏开始,逻辑很简单:

玩家每单击一个单元格(产生Workbook中的SheetSelectionChange事件),游戏就判断这个格是否在游戏区域中,若是就判断上下左右4个方向是否有空格,如果有空格就把原单元格中的数传到空格中,原单元格清空(空格与原单元格交换),然后判断游戏是否结束(1到15顺序排序了?

),若还没有,什么都不做,等下一次单击事件发生。

PrivateSubWorkbook_SheetSelectionChange(ByValShAsObject,ByValTargetAsRange)

DimdownAsVbMsgBoxResult

DimiAsInteger

IfRunningThen

'所单击单元格是否就是空格

IfLen(ActiveCell)>0Then

'所单击单元格是否在游戏区域

IfNot(Application.Intersect(ActiveCell,GRan)IsNothing)Then

'所单击单元格上下左右是否有空格

If((Abs(BRan.Column-ActiveCell.Column)<=1AndBRan.row=ActiveCell.row)Or(Abs(BRan.row-ActiveCell.row)<=1AndBRan.Column=ActiveCell.Column))Then

'单元格与空格交换

IfActiveSheet.ProtectContentsThenActiveSheet.UnprotectPassword:

=PW

BRan=ActiveCell

ActiveCell.ClearContents

SetBRan=ActiveCell

Bs=Bs+1

ActiveSheet.ProtectPassword:

=PW

'判断游戏是否结束?

i=1

DoWhile(i

i=i+1

Loop

Ifi=N*NThen

MsgBox"祝贺你!

你成功了!

"&vbCrLf&_

"一共用了"&Bs&"步!

"&vbCrLf&_

"一共用用时"&Format(Now-STime,"h:

m:

s"),,PW

Running=False

EndIf

EndIf

EndIf

EndIf

Else

down=MsgBox("游戏还未进行,是否开始?

",vbYesNo,"提示-"&PW)

Ifdown=vbYesThenGameStar

EndIf

EndSub

四:

跑跑卡丁车.xls

网上到处可下!

注:

打开Excel后,若不能玩,点菜单栏上的工具→宏→安全性,将安全级别设为低,便可以玩了

五:

贪吃蛇源码

首先要解决游戏显示的问题。

对我们来说,小游戏最好的平台是Excel的工作区,由于大小可调、颜色可填的单元格操作方便,我们完全可以把它们当像素来使用。

于是我们的贪吃蛇游戏就有了以单元格为基础的像素形式的显示方式了。

其次是游戏的控制方法。

在这里我摸索了好久,其中走了弯路不说,我最后的结论是在Excel中要实现按键事件的方法是引入窗体,然后在窗体中响应Keydown与Keypress事件。

这样的话,既可以快速响应还可以根据情况修改对应按键。

最后是游戏的定时问题。

所有的游戏事实上都是在一个时间大循环里面定时接收输入信息更新状态的程序,我们的小游戏都不例外。

老实说,我写这个游戏大部分的思考时间就浪费在如何实现游戏定时这里。

Excel的VBA中与定时有关的只有onTime函数,没有其他相关函数提供了,onTime函数可以实现某一事件在指定时间发生,但只能以秒为最小单位,对我们要在一秒内更新数十次信息的小游戏不适合,我们只能另找方法。

用过VB的人都知道VB控件中有个定时控件,用它来实现游戏定时是最好的,但在Excel中却没有,难道我要把VB中的定时控件移植到VBA中?

这也是个很值得研究的课题,但是我想到了另外的方法。

VB的程序员都知道要想VB程序发挥大作用一定离不开调用系统的API,于是我查看了系统相关API的帮助,发现系统API中实现相应功能的有settimer与killtimer函数,具体定义和用法大家可以参考相关帮助,但从字面大家都已经可以知道它们就是我们要找的东西了。

那么现在的问题就是如何在vba环境下调用系统API。

心想微软称vba就是office中的vb,那么在vba中调用系统API应该也与在VB中的一样。

一试,呵呵,果然非虚,这微软真不是盖的(后在msdn中发现msofficevba从2000版本开始支持调用系统API,大家可以拓展office应用了)。

就这样游戏输入、输出、逻辑定时的问题都解决了,我们的吃蛇游戏就仅剩下算法逻辑部分了。

我们的游戏逻辑是,游戏初始化后,启动定时器。

在每次定时循环中,程序分别实现蛇头移动与蛇尾移动。

首先是移动蛇头,游戏判断在移动方向上蛇头下一个的位置是否为空格,若是则把这位置的空格填上颜色(蛇头移动),蛇尾移动标志设为真;如果蛇头下一个位置不是空格(即有食物),则把这位置的空格填上颜色(蛇头移动)后把蛇尾移动标志设为假。

接着到蛇尾移动部分,若蛇尾移动标志为真则把蛇尾原所在单元格填回白色(蛇尾移动),并更新蛇尾位置;如果蛇尾移动标志为假,则什么都不做(蛇尾不动蛇头动,蛇身长了)。

对于整个游戏来说,效率的瓶颈在于像素操作(对单元格频繁填色)。

但从以上算法可以看到,在每次循环中程序只需处理蛇头及蛇尾所在单元格;如果贪吃蛇吃到食物,则只需要更新蛇头单元格。

每个时间循环里较少的数据处理量实现了游戏较快的响应速度,贪吃蛇游戏在Excel中实现也有了实际意义。

游戏还是以宏的形式实现。

大家新建一个宏,输入如下代码。

'熟悉VB的程序员知道首先是对调用系统API的声明

PublicDeclareFunctionSetTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong,ByValuElapseAsLong,ByVallpTimerFuncAsLong)AsLong

PublicDeclareFunctionKillTimerLib"user32"(ByValhwndAsLong,ByValnIDEventAsLong)AsLong

'定义数据结构

Typepos_

rowAsLong

colAsLong

EndType

PublictimersetAsLong'SetTimer函数的返回值,用以标记已存在的Timer,KillTimer以此为参数销毁所标记的Timer

PublicgamingAsBoolean

PublicpulsedAsBoolean

Publichead_movementAsLong'蛇头新移动方向标志,1、2、3、4代表右上左下

Publictail_movementAsLong'蛇尾移动方向标志,意义同上

Publicoldhead_movementAsLong'蛇头旧有移动方向标志

DimtailmoveAsBoolean'蛇尾移动标志

Dimorigin_sizeAsLong'贪吃蛇原始大小

PublicscoreAsLong

DimstepsAsLong

DimcleanAsBoolean

DimsthAspos_

DimheadrowAsLong'蛇头所在行位置

DimheadcolAsLong'蛇头所在列位置

DimtailrowAsLong'蛇尾所在行位置

DimtailcolAsLong'蛇尾所在列位置

DimstartposAspos_'贪吃蛇起始位置

DimcolorAsLong

ConstleftAsL5'游戏区域左边边界

ConstrightAsL30'游戏区域右边边界

ConsttopAsL3'游戏区域上边边界

ConstbottomAsL25'游戏区域下边边界

Functionmain()'主函数

gaming=False

IfWorksheets.Count<2Then

ActiveWorkbook.Sheets.Addafter:

=Worksheets(Worksheets.Count)

ElseIf(MsgBox("Doyouwanttorunitinanewblankworksheet?

",vbOKCancel,"?

?

?

?

?

")=vbOK)Then

ActiveWorkbook.Sheets.Addafter:

=Worksheets(Worksheets.Count)

Else

Worksheets(Worksheets.Count).Select

EndIf

LoadUserForm1'引入窗体

UserForm1.Show

EndFunction

Functiongame_initial()'游戏初始化函数

'初始化游戏界面

color=5

IfNotgamingThen

Cells.ColumnWidth=1

Cells.RowHeight=10

Range(Cells(top,left),Cells(top,right)).Interior.ColorIndex=1

Range(Cells(top+1,left),Cells(bottom-1,left)).Interior.ColorIndex=1

Range(Cells(bottom,left),Cells(bottom,right)).Interior.ColorIndex=1

Range(Cells(top+1,right),Cells(bottom-1,right)).Interior.ColorIndex=1

Range(Cells(top+1,left+1),Cells(bottom-1,right-1)).Font.ColorIndex=color

EndIf

'贪吃蛇初始化

origin_size=5

tail_movement=1

head_movement=1

oldhead_movement=head_movement

startpos.row=(top+bottom)\2'initializedas16

startpos.col=(left+right)\2'initailizedas20

pulsed=False

tailmove=True

headrow=startpos.row

headcol=startpos.col

tailrow=startpos.row

tailcol=startpos.col-origin_size+1

clean=True

steps=0

score=0

Fori=0Toorigin_size-1

Cells(startpos.row,startpos.col-i).Interior.ColorIndex=color

Nexti

gaming=True

'游戏初始化结束

EndFunction

Subsnake_move()

IfgamingThen

DimnextcolAsLong

DimnextrowAsLong

IfcleanThen

steps=steps+1

'贪吃蛇食物生成,这里食物的生成过程很简单,蛇每前进6步就生成一块食物

Ifsteps>=6Then

steps=0

Randomize

sth.row=Int((bottom-top)*Rnd)+top+1

Randomize

sth.col=Int((right-left)*Rnd)+left+1

DoWhilesth.row>=bottom

sth.row=sth.row-(bottom-top)+1

Loop

DoWhilesth.col>=right

sth.col=sth.col-(right-left)+1

Loop

Cells(sth.row,sth.col)="*"

clean=False

EndIf

EndIf

''''''蛇头移动部分

tailmove=True

Ifoldhead_movement<>head_movementThen

IfAbs(oldhead_movement-head_movement)<>2Then

oldhead_movement=head_movement

Cells(headrow,headcol)=head_movement'当方向改变时在蛇头当前单元格记下前进方向,待蛇尾运行至此时可以按正确方向前进。

本来应该用个数组记录,但我懒得再琢磨了。

EndIf

EndIf

SelectCaseoldhead_movement

Case1'right

nextrow=headrow

nextcol=headcol+1

Case2'up

nextcol=headcol

nextrow=headrow-1

Case3'left

nextrow=headrow

nextcol=headcol-1

Case4'down

nextcol=headcol

nextrow=headrow+1

EndSelect

'看是否超出游戏区域了。

Ifnextcol=leftThen

nextcol=right-1

ElseIfnextcol=rightThen

nextcol=left+1

EndIf

Ifnextrow=topThen

nextrow=bottom-1

ElseIfnextrow=bottomThen

nextrow=top+1

EndIf

IfCells(nextrow,nextcol).Interior.ColorIndex=colorThen'蛇头碰到蛇身了,游戏结束

Callgame_over:

ExitSub

EndIf

IfCells(nextrow,nextcol)="*"Then

Callscore_

Cells(nextrow,nextcol).ClearContents

EndIf

Cells(nextrow,nextcol).Interior.ColorIndex=color

headrow=nextrow

headcol=nextcol

''''''蛇尾移动部分

IftailmoveThen

SelectCasetail_movement

Case1'right

nextrow=tailrow

nextcol=tailcol+1

Case2'up

nextrow=tailrow-1

nextcol=tailcol

Case3'left

nextrow=tailrow

nextcol=tailcol-1

Case4'down

nextcol=tailcol

nextrow=tailrow+1

EndSelect

Ifnextcol=leftThen

nextcol=right-1

ElseIfnextcol=rightThen

nextcol=left+1

EndIf

Ifnextrow=topThen

nextrow=bottom-1

ElseIfnextrow=bottomThen

nextrow=top+1

EndIf

IfCells(nextrow,nextcol)<>0Then

If(Asc(Cells(nextrow,nextcol))<>42)Then

tail_movement=Cells(nextrow,nextcol)

Cells(nextrow,nextcol).ClearContents

EndIf

EndIf

Cells(tailrow,tailcol).Interior.ColorIndex=0

tailrow=nextrow

tailcol=nextcol

EndIf

EndIf

EndSub

Functiongame_over()

Iftimerset<>0Then

timerset=KillTimer(0,timerset)

pulsed=False

EndIf

IfMsgBox("Gameover...temporarily.Tryagain?

",vbOKCancel,"?

?

?

?

?

")=vbOKThen

Range(Cells(top+1,left+1),Cells(bottom-1,right-1)).Interior.ColorIndex=0

Range(Cells(top+1,left+1),Cells(bottom-1,right

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 环境科学食品科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1