1.【Java】十款经典游戏的数字Java版本
2.猜数字游戏玩法? 9个猜数字游戏?
3.猜数字游戏玩法?9个猜数字游戏?
4.excel中好像有个放置猴子去射气球的游戏,请问哪里有得下啊
【Java】十款经典游戏的华容Java版本
Java语言不仅可以用于开发企业级应用,还能制作出有趣的道游×代小游戏。对于初学者而言,戏源通过制作小游戏来提升技能是码数码一种很好的学习方式。以下是字华松子直装源码一些开源的Java小游戏,供大家参考和学习。容道
1. 数字彩虹雨
这是数字一个简单却有趣的应用,代码易于理解,华容运行时呈现全屏效果,道游×代类似于黑客帝国中的戏源数字雨。除了源代码,码数码我还将程序打包成jar和exe格式,字华方便用户使用。容道配置文件中,数字可以将“colorful”设置为true来启用彩色字体,而“Music”则可以自定义音乐文件名,支持wav格式。此外,字体大小、行数、速度、字体类型、窗口大小等都可以在代码中进行调整。
2. 愤怒的小鸟
这个游戏无需过多介绍,只需修改BuildPath即可。
3. 聊天室
在运行聊天室前,请先启动服务端。客户端支持多开,并具备注册和登录功能。下面是主界面和聊天界面的运行图。
4. 五子棋
五子棋游戏本身比较简单,您可以根据需要添加更高级的算法,使其更加智能。
5. 动态转ASCII码动态
这是一个网上很火的应用。需要注意的是,gif源文件地址和生成的jpg文件夹位置在工程中都有示例,已经为您建好。此外,生成的jpg文件可以通过jpg转Gif工具进行转换。
6. 华容道
这个游戏无需过多介绍,您可以根据需要添加新的。
7. 潜艇大战
这款游戏无需过多介绍。
8. 坦克大战
这款游戏是许多人儿时的回忆。
9. 扫雷
这款经典游戏无需过多介绍。
. 飞机大战
这是一款经典的腾讯游戏。
猜数字游戏玩法? 9个猜数字游戏?
一、猜数字游戏玩法?先解释标准规则,再介绍几种变体。
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 ,而猜的暗黑2 战网源码人猜 ,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
猜数字游戏通常设有猜测次数的上限。根据计算机测算,如果采用严谨的猜测策略,任何数字最多7次就可猜出(即达到 4A0B)。值得注意的是,在有些地方把次数上限定义为最多几次猜测以后就可以肯定数字是几,但这时或还需要再猜一次才能得到 4A0B 的结果。
标准的猜数字游戏由个数码(0-9)和4个数位组成。可以通过变化数码或数位来丰富游戏。例如,可以使用9个数码玩4个数位的游戏。
猜数字游戏的一种变体允许重复的数码。这种规则的游戏被称为 Mastermind。其规则大致为:
除了上面的规则外,如果有出现重复的数字,则重复的数字每个也只能算一次,且以最优的结果为准。例如,如正确答案为,猜的人猜,则在这里不能认为猜测的第一个5对正确答案第二个,根据最优结果为准的原理和每个数字只能有一次的规则,两个比较后应该为1A1B,第一个5位子正确,记为1A;猜测数字中的第三个5或第四个5和答案的第二个5匹配,只能记为1B。当然,如果有猜中的第一个5不能与答案中的第二个5匹配,因此只能记作1A0B。
二、9个猜数字游戏?
《数字推盘》华容道
《数独游戏》数学知力拼图游戏
巜数字消除》锻炼数学反应力
三、猜数字游戏的作文?
今天,老师带我们玩了一个《猜数字》的小游戏。
老师介绍玩猜数字的规定:在秒钟内猜一个以内的数字,其他同学只能说:“高了”或“低了”。
老师说:“谁来做猜数字的人呢?”同学们都高高地举着手。但幸运只会落在一个人的头上,是谁呢?这时老师请沈益炜的同学做猜数字的人,他被老师暂时请出了教室。
接着老师在黑板上写了“”这个数字,又迅速地擦掉,并把沈益炜请回了教室。沈益炜面带微笑,大摇大摆走了进来,一副胸有成竹的样子。但细心的同学却发现他双手不停捏着裤子,有些不知所措,我们知道他也非常紧张。老师问他,有没有信心时,他伸出右手斩钉截铁地说“有”。问答源码 付费功能
“吹牛也不打草稿?”蓝鸿博大声喊道,“吹牛也吹爆了吧!”另一个同学说。
不知怎么的,我心里希望他能成功,但觉得不大可能,毕竟猜数字的范围大了些。
沈益炜想了三四秒钟,大声说道:“”,同学们齐声喊:“高了”。“”同学们又大喊:“高了!”这时我的心又再次紧张起来,因为他猜的“”离正确答案“”只差2了。他有百分之五十可能会猜对,“”,“低了!”同学们又大叫起来,这下容易猜了,因为“”和“”之间之差“5”了。
这场游戏已经到了白热化的阶段,气氛已经越来越紧张了,教室里顿时鸦雀无声。
“”沈益炜的口中吐了出来,“嗡”我真的不敢相信我自己的耳朵,教室里沸腾了,有的拍打着桌子,还有的跺着脚,为沈益炜的成功而祝福。
沈益炜一蹦三尺高,举起右手大喊:“我赢了”!
猜数字游戏真好玩。
四、猜数字游戏。规则为?
通常两个人玩,一个人出数字,另一个人猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
五、1到猜数字游戏?
答:第一个游戏,1,2,3,4,5。屈指可数。
第二个游戏,2,3,4,5,6,7,8,9。QQ空间 php 源码缺衣少食。
第三个游戏,1,2,3,4,5,6,0,9,。七零八落。
第四个游戏,2,4,6,8,。无独有偶。请审核!
六、猜数字游戏0-规则?
先有一个人在纸上写出0~中的一个数字,另外一个人开始猜,如果猜的人说的数字小于第一个人所写的数字的话,第一个人则要说“小了”,反之,则要说“大了”。可以规定要说的次数,超过次数猜的人都会输。
七、0到9猜数字游戏技巧?
猜数字游戏技巧在于确定数字范围和猜测顺序。如果数字在0到9之间,可以先猜5,如果猜对了那么一次就成功了,如果猜测不对,根据反馈来缩小范围,再依次猜4、6、3、7、2、8、1、9、0。这样的猜测顺序可以最大程度地减少猜测次数。当然,如果你有更多的信息,比如是否有重复数字、数字个数等,可以根据不同情况使用不同的策略,进一步提高猜测效率。
八、猜数字游戏1-规则?
猜数字,范围可以在0~或以内,具体根据游戏人数来定。
1、先由坐庄的人来写一个数字(必须在提前规定的范围内);
2、让大家轮流猜,并告诉大家正确数字比当前猜的注册靓号源码数字大或者小;
3、每猜一次范围就会缩小,最后猜中的人受罚;
4、 下一轮由受罚者再写数字,依此循环。
九、c语言猜数字游戏源代码?
#include stdio.h
#include stdlib.h
#include time.h
#define MANY 4
#define TIME_OUT 8
///////////////////////////////////////////////////////////
int a,b,u ;
void game();
void ab(int answer[],int guess[]);
void same(int num[]);
//主目录
void menu()
{
char choice,ch ;
do
{
do
{
system("cls");
printf("/t/t/t/t简单猜数字/n/n/n/n");
printf("/t/t/t/t1.开始游戏/n/n");
printf("/t/t/t/t2.使用说明/n/n");
printf("/t/t/t/t3.退出/n/n");
printf("/t/t/t请输入(1-3): ");
fflush(stdin);
choice=getchar();
}
while(choice!=1choice!=2choice!=3);
switch(choice)
{
case 1 :
{
game();
break ;
}
case 2 :
{
system("cls");
printf("/t/t/t/t欢迎使用本程序/n/n/n");
printf("作者:烈冰/n");
printf("游戏说明: 输入%d位数字,输入后会有提示XaYb,X表示有几",MANY);
printf("个数字与答案数字相同/n");
printf("且位置正确,Y表示有几位数字与答案数字相同但位置不正确。例如:答案数字是/n");
printf(",如果输入,则会提示1a1b。/n");
printf("祝你愉快!/n/n");
printf("按任意键返回主目录……/n");
getch();
break ;
}
case 3 :
{
printf("确定要退出吗?(y/n):");
fflush(stdin);
ch=getchar();
if(ch==y||ch==Y)exit(0);
else continue ;
}
}
}
while(1);
}
十、猜数字游戏0-怎样猜最快?
回答:十个十就猜到最快,数字:十用表示,个用1表示,十用表示,就用表示,猜到用表示,最快用表示,十个十就猜到最快,数字是:
修正回答:0到猜得最快的数字是:l0
猜数字游戏玩法?9个猜数字游戏?
一、猜数字游戏玩法
猜数字游戏通常由两名玩家参与。一名玩家在心中想好一个由四个不重复数字组成的数,而另一名玩家需要猜测这个数字。猜测时,每次猜一个数字,猜错的话,出题者根据猜测的数字给出几个A几个B的提示,A代表猜中的数字在正确位置上的个数,B代表猜中的数字在错误位置上的个数。按照这个提示,猜数字的玩家继续猜测,直到猜中为止。在有些版本的游戏中,如果猜的数字在提示中完全没有A,即四个B,玩家可能需要再猜一次以确定所有数字的正确位置。
二、9个猜数字游戏
这个问题可能指的是基于9个数字或以下的猜数字游戏。这类游戏可能包括:
1. 《数字推盘》:类似于华容道,需要通过移动数字来达到目标位置。
2. 《数独游戏》:在9x9的格子中填入数字,每行、每列以及每个3x3的小格子中数字1至9各出现一次。
3. 《数字消除》:通过消除匹配的数字来锻炼数学反应力。
三、猜数字游戏的作文
今天,老师带领我们进行了一次富有趣味的《猜数字》游戏。
游戏规则由老师介绍:在秒内,一个同学需要在心中想好一个以内的数字,而其他同学轮流猜测。每次猜测后,心中想数字的同学要根据猜测的数字回应“高了”或“低了”。
游戏开始,同学们纷纷举手想要尝试。沈益炜被选中,被请出教室。老师随后在黑板上写下了一个数字,然后迅速擦掉,将沈益炜召回教室。他看起来自信满满,但紧张的双手泄露了他的不安。在老师询问他是否有信心时,他坚定地举手表示有。
随着猜测的进行,沈益炜在紧张和自信间徘徊。他的第一次猜测是,回答是“高了”。第二次猜测,结果依然是“高了”。随着数字的不断缩小,气氛愈发紧张。最终,在沈益炜的第三次猜测中,他成功地说出了数字,教室里顿时沸腾了。
四、猜数字游戏的规则
猜数字游戏的规则是由一名玩家在心中想好一个不重复的四个数字,然后另一名玩家开始猜测。每次猜测后,出题者根据猜测的数字给出几个A几个B的提示,A代表猜中的数字在正确位置上的个数,B代表猜中的数字在错误位置上的个数。猜数字的玩家根据这些提示继续猜测,直到猜中为止。
五、1到猜数字游戏
1. 第一个游戏:1,2,3,4,5。这个游戏简单,屈指可数。
2. 第二个游戏:2,3,4,5,6,7,8,9。这个游戏考验的是缺衣少食的智慧。
3. 第三个游戏:1,2,3,4,5,6,0,9,。这个游戏是七零八落。
4. 第四个游戏:2,4,6,8,。这个游戏显示了无独有偶的规律。
六、猜数字游戏0-规则
猜数字游戏0-的规则是由一名玩家在纸上写下0到之间的一个数字,然后另一名玩家开始猜测。如果猜测的数字小于纸上所写的数字,出题者就要说“小了”,如果猜测的数字大于纸上所写的数字,出题者就要说“大了”。可以规定猜测的最大次数,超过次数则猜的人失败。
七、0到9猜数字游戏技巧
猜数字游戏的技巧在于确定数字范围和猜测顺序。如果数字在0到9之间,可以先猜5,如果猜对了,那么一次就成功了。如果猜测不对,根据反馈来缩小范围,再依次猜4、6、3、7、2、8、1、9、0。这样的猜测顺序可以最大程度地减少猜测次数。如果有更多的信息,比如是否有重复数字、数字个数等,可以根据不同情况使用不同的策略,进一步提高猜测效率。
八、猜数字游戏1-规则
猜数字游戏1-的规则是由一名玩家在心中想好一个1到之间的数字,然后另一名玩家开始猜测。每次猜测后,出题者根据猜测的数字说出正确数字比当前猜的数字大或者小。每次猜测都会缩小范围,最后猜中的人受罚。下一轮由受罚者再写数字,依此循环。
九、C语言猜数字游戏源代码
以下是一个简单的C语言猜数字游戏源代码片段,用于生成一个指定范围的随机数,并允许用户进行猜测,根据用户输入提供提示,直到用户猜中为止。
```c
#include
#include
#include
#define MANY 4
#define TIME_OUT 8
void game();
void ab(int answer[], int guess[]);
void same(int num[]);
int main() {
menu();
return 0;
}
void menu() {
char choice, ch;
do {
system("cls");
printf("简单猜数字\n\n");
printf("1. 开始游戏\n");
printf("2. 使用说明\n");
printf("3. 退出\n");
printf("请输入(1-3): ");
fflush(stdin);
choice = getchar();
} while (choice != '1' && choice != '2' && choice != '3');
switch (choice) {
case '1':
game();
break;
case '2':
system("cls");
printf("欢迎使用本程序\n\n");
printf("作者:烈冰\n");
printf("游戏说明: 输入%d位数字,输入后会有提示XaYb,X表示有几个\n", MANY);
printf("个数字与答案数字相同\n");
printf("且位置正确,Y表示有几位数字与答案数字相同但位置不正确。例如:答案数字是\n");
printf(",如果输入,则会提示1a1b。\n");
printf("祝你愉快!\n\n");
printf("按任意键返回主目录……\n");
getch();
break;
case '3':
printf("确定要退出吗?(y/n):");
fflush(stdin);
ch = getchar();
if (ch == 'y' || ch == 'Y') exit(0);
else continue;
}
}
void game() {
// 游戏逻辑实现
// ...
}
void ab(int answer[], int guess[]) {
// 提示函数实现
// ...
}
void same(int num[]) {
// 相同数字检查实现
// ...
}
```
十、猜数字游戏0-怎样猜最快
最快猜中0到之间的数字的方法是使用十个十的规律。例如,数字可以用表示,而数字则是最快的表示方式,因为它直接由十个十组成。因此,0到猜得最快的数字是:。
excel中好像有个放置猴子去射气球的游戏,请问哪里有得下啊
一:纸牌游戏
启动Excel程序,依次点击工具栏中“工具/自定义”菜单,切换至“命令”标签页,选中左侧“类别”栏中的“工具”菜单,向下拖动右侧“命令”栏侧边滑块,找到带有纸牌图形的“自定义”选项(如图),将它拖至Excel工具栏中,点击“关闭”按钮将“自定义”对话框关闭。现在,Excel工具栏中就多了一个纸牌按钮,点击该按钮,熟悉的纸牌游戏界面就出现在你面前了。
二: MicroSoft Excel 暗藏赛车游戏
1.开启Excel之后随便开一新文档,将它『另存成Web画面 』,按下发布后再将“添加交互对象”打勾,将档案储存为car.htm(文件名可自取)。
2.在IE中开启car.htm,你应该会看到电子表格出现在网页中央,如图1:
图1
3.在这个工作表中,先用PageDown键移动工作表的矩形光标直至第行,注意只能用PageDown键,然后用Tab键横向向右移动光标直至WC列,也是只能用键操作,到此,所有的准备工作已经完毕,该是调出游戏的时候了。
4.同时按住Shift+Crtl+Alt 然后点选左上方的 Office logo 。
5.开始玩了,如图2:
图2
6.玩法提示: 玩游戏的时候,被你控制的是那一辆浅蓝色的汽车,操作的主要是四个箭头按键。作用是:左右箭头可以控制汽车的方向:向上箭头可以加速, 向下的箭头减速;如果汽车运行到了夜间,可用H键打开车灯。
绝对好玩!
三:数字华容道
'先说个简单的。大家玩过那个数字华容道吧,就是有N*N个格,有一格是空的,其他格是次序混乱的拼图或数字,游戏的目的就是利用这唯一的这个空格移动各块拼图把混乱的拼图(数字)恢复(顺序)。这里我们小游戏的目的是要把1至这个次序混乱的数字恢复从1到的顺序排列。
'打开Excel后打开代码编写器(Alt + F),将如下代码写入模块中。程序首先是初始化。定义变量,选择4*4的空格,调整表格大小,改变单元格颜色(标示出游戏区域),然后是让1到非重复随机分布到前格空格中:
Public Const PW = "Excelba.com" '本游戏由Excel吧bengdeng整理!
Public Running As Boolean '用于判断游戏是否进行中,如果要中途退出或玩家需要重玩用此变量控制
Public SRan As Range '游戏左上单元格
Public BRan As Range '游戏空格单元格
Public N As Integer '游戏区域大小
Public GRan As Range '游戏区域,这里由N与SRan生成
Public Bs As Integer '游戏步数
Public STime As Date '游戏开始时间
Sub GameStar()
Dim i As Integer
Dim ii As Integer
Dim temp As Integer
Dim a() As Integer
Dim down As VbMsgBoxResult
'判断游戏是否在运行
If Running Then
down = MsgBox("游戏正在进行!是否重玩?", vbYesNo, "提示 - " & PW)
If down = vbNo Then Exit Sub
End If
Running = True
N = 4 '设定游戏区域为4*4
Set SRan = Range("E5") '设定游戏开始单元格为E5
Set BRan = SRan.Offset(N - 1, N - 1) '设定游戏空单元格
Set GRan = Range(SRan, BRan)
'游戏区域(颜色)初始化,省略了单元格大小的调整,大家可以应该加入相应语句让游戏外观整齐
If ActiveSheet.ProtectContents Then ActiveSheet.Unprotect Password:=PW
GRan.ClearContents
GRan.Interior.ColorIndex =
'随机数数组初始化,这里是编号0到编号共个数
For i = 0 To (N * N - 2)
a(i) = i + 1
Next i
'不重复随机分布各数
For i = N * N - 2 To 0 Step -1
Randomize
ii = Int(Rnd * i)
temp = a(i)
a(i) = a(ii)
GRan.Item(i + 1) = a(i)
a(ii) = temp
Next i
Bs = 0
STime = Now()
ActiveSheet.Protect Password:=PW
End Sub
'很明显,Excel的单元格是游戏的主角。初始化后游戏开始,逻辑很简单:玩家每单击一个单元格(产生Workbook中的SheetSelectionChange事件),游戏就判断这个格是否在游戏区域中,若是就判断上下左右4个方向是否有空格,如果有空格就把原单元格中的数传到空格中,原单元格清空(空格与原单元格交换),然后判断游戏是否结束(1到顺序排序了?),若还没有,什么都不做,等下一次单击事件发生。
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim down As VbMsgBoxResult
Dim i As Integer
If Running Then
'所单击单元格是否就是空格
If Len(ActiveCell) > 0 Then
'所单击单元格是否在游戏区域
If Not (Application.Intersect(ActiveCell, GRan) Is Nothing) Then
'所单击单元格上下左右是否有空格
If ((Abs(BRan.Column - ActiveCell.Column) <= 1 And BRan.row = ActiveCell.row) Or (Abs(BRan.row - ActiveCell.row) <= 1 And BRan.Column = ActiveCell.Column)) Then
'单元格与空格交换
If ActiveSheet.ProtectContents Then ActiveSheet.Unprotect Password:=PW
BRan = ActiveCell
ActiveCell.ClearContents
Set BRan = ActiveCell
Bs = Bs + 1
ActiveSheet.Protect Password:=PW
'判断游戏是否结束?
i = 1
Do While (i < N * N And GRan.Item(i) = i)
i = i + 1
Loop
If i = N * N Then
MsgBox "祝贺你!你成功了!" & vbCrLf & _
"一共用了" & Bs & "步!" & vbCrLf & _
"一共用用时" & Format(Now - STime, "h:m:s"), , PW
Running = False
End If
End If
End If
End If
Else
down = MsgBox("游戏还未进行,是否开始?", vbYesNo, "提示 - " & PW)
If down = vbYes Then GameStar
End If
End Sub
四:跑跑卡丁车.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中发现ms office vba从版本开始支持调用系统API,大家可以拓展office应用了)。
就这样游戏输入、输出、逻辑定时的问题都解决了,我们的吃蛇游戏就仅剩下算法逻辑部分了。我们的游戏逻辑是,游戏初始化后,启动定时器。在每次定时循环中,程序分别实现蛇头移动与蛇尾移动。首先是移动蛇头,游戏判断在移动方向上蛇头下一个的位置是否为空格,若是则把这位置的空格填上颜色(蛇头移动),蛇尾移动标志设为真;如果蛇头下一个位置不是空格(即有食物),则把这位置的空格填上颜色(蛇头移动)后把蛇尾移动标志设为假。接着到蛇尾移动部分,若蛇尾移动标志为真则把蛇尾原所在单元格填回白色(蛇尾移动),并更新蛇尾位置;如果蛇尾移动标志为假,则什么都不做(蛇尾不动蛇头动,蛇身长了)。对于整个游戏来说,效率的瓶颈在于像素操作(对单元格频繁填色)。但从以上算法可以看到,在每次循环中程序只需处理蛇头及蛇尾所在单元格;如果贪吃蛇吃到食物,则只需要更新蛇头单元格。每个时间循环里较少的数据处理量实现了游戏较快的响应速度,贪吃蛇游戏在Excel中实现也有了实际意义。
游戏还是以宏的形式实现。大家新建一个宏,输入如下代码。
' 熟悉VB的程序员知道首先是对调用系统API的声明
Public Declare Function SetTimer Lib "user" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
' 定义数据结构
Type pos_
row As Long
col As Long
End Type
Public timerset As Long ' SetTimer函数的返回值,用以标记已存在的Timer,KillTimer以此为参数销毁所标记的Timer
Public gaming As Boolean
Public pulsed As Boolean
Public head_movement As Long '蛇头新移动方向标志,1、2、3、4代表右上左下
Public tail_movement As Long '蛇尾移动方向标志,意义同上
Public oldhead_movement As Long '蛇头旧有移动方向标志
Dim tailmove As Boolean '蛇尾移动标志
Dim origin_size As Long '贪吃蛇原始大小
Public score As Long
Dim steps As Long
Dim clean As Boolean
Dim sth As pos_
Dim headrow As Long '蛇头所在行位置
Dim headcol As Long '蛇头所在列位置
Dim tailrow As Long '蛇尾所在行位置
Dim tailcol As Long '蛇尾所在列位置
Dim startpos As pos_ '贪吃蛇起始位置
Dim color As Long
Const left As L 5 '游戏区域左边边界
Const right As L '游戏区域右边边界
Const top As L 3 '游戏区域上边边界
Const bottom As L '游戏区域下边边界
Function main() '主函数
gaming = False
If Worksheets.Count < 2 Then
ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
ElseIf (MsgBox("Do you want to run it in a new blank worksheet ?", vbOKCancel, "?") = vbOK) Then
ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
Else
Worksheets(Worksheets.Count).Select
End If
Load UserForm1 '引入窗体
UserForm1.Show
End Function
Function game_initial() '游戏初始化函数
'初始化游戏界面
color = 5
If Not gaming Then
Cells.ColumnWidth = 1
Cells.RowHeight =
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
End If
'贪吃蛇初始化
origin_size = 5
tail_movement = 1
head_movement = 1
oldhead_movement = head_movement
startpos.row = (top + bottom) \ 2 'initialized as
startpos.col = (left + right) \ 2 'initailized as
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
For i = 0 To origin_size - 1
Cells(startpos.row, startpos.col - i).Interior.ColorIndex = color
Next i
gaming = True
'游戏初始化结束
End Function
Sub snake_move()
If gaming Then
Dim nextcol As Long
Dim nextrow As Long
If clean Then
steps = steps + 1
'贪吃蛇食物生成,这里食物的生成过程很简单,蛇每前进6步就生成一块食物
If steps >= 6 Then
steps = 0
Randomize
sth.row = Int((bottom - top) * Rnd) + top + 1
Randomize
sth.col = Int((right - left) * Rnd) + left + 1
Do While sth.row >= bottom
sth.row = sth.row - (bottom - top) + 1
Loop
Do While sth.col >= right
sth.col = sth.col - (right - left) + 1
Loop
Cells(sth.row, sth.col) = "*"
clean = False
End If
End If
''''''蛇头移动部分
tailmove = True
If oldhead_movement <> head_movement Then
If Abs(oldhead_movement - head_movement) <> 2 Then
oldhead_movement = head_movement
Cells(headrow, headcol) = head_movement '当方向改变时在蛇头当前单元格记下前进方向,待蛇尾运行至此时可以按正确方向前进。本来应该用个数组记录,但我懒得再琢磨了。
End If
End If
Select Case oldhead_movement
Case 1 'right
nextrow = headrow
nextcol = headcol + 1
Case 2 'up
nextcol = headcol
nextrow = headrow - 1
Case 3 'left
nextrow = headrow
nextcol = headcol - 1
Case 4 'down
nextcol = headcol
nextrow = headrow + 1
End Select
'看是否超出游戏区域了。
If nextcol = left Then
nextcol = right - 1
ElseIf nextcol = right Then
nextcol = left + 1
End If
If nextrow = top Then
nextrow = bottom - 1
ElseIf nextrow = bottom Then
nextrow = top + 1
End If
If Cells(nextrow, nextcol).Interior.ColorIndex = color Then '蛇头碰到蛇身了,游戏结束
Call game_over: Exit Sub
End If
If Cells(nextrow, nextcol) = "*" Then
Call score_
Cells(nextrow, nextcol).ClearContents
End If
Cells(nextrow, nextcol).Interior.ColorIndex = color
headrow = nextrow
headcol = nextcol
''''''蛇尾移动部分
If tailmove Then
Select Case tail_movement
Case 1 'right
nextrow = tailrow
nextcol = tailcol + 1
Case 2 'up
nextrow = tailrow - 1
nextcol = tailcol
Case 3 'left
nextrow = tailrow
nextcol = tailcol - 1
Case 4 'down
nextcol = tailcol
nextrow = tailrow + 1
End Select
If nextcol = left Then
nextcol = right - 1
ElseIf nextcol = right Then
nextcol = left + 1
End If
If nextrow = top Then
nextrow = bottom - 1
ElseIf nextrow = bottom Then
nextrow = top + 1
End If
If Cells(nextrow, nextcol) <> 0 Then
If (Asc(Cells(nextrow, nextcol)) <> ) Then
tail_movement = Cells(nextrow, nextcol)
Cells(nextrow, nextcol).ClearContents
End If
End If
Cells(tailrow, tailcol).Interior.ColorIndex = 0
tailrow = nextrow
tailcol = nextcol
End If
End If
End Sub
Function game_over()
If timerset <> 0 Then
timerset = KillTimer(0, timerset)
pulsed = False
End If
If MsgBox("Game over...temporarily. Try again?", vbOKCancel, "?") = vbOK Then
Range(Cells(top + 1, left + 1), Cells(bottom - 1, right - 1)).Interior.ColorIndex = 0
Range(Cells(top + 1, left + 1), Cells(bottom - 1, right - 1)).ClearContents
Call game_initial
Else
Cells.ClearContents
Cells.Interior.ColorIndex = 0
gaming = False
SendKeys "%{ F4}" '这句很关键,当引入窗体后要在程序中退出窗体就要用Alt+F4
End If
End Function
Function score_()
clean = True
score = score +
tailmove = False
UserForm1.Label2.Caption = "Now you have the score of " + Str(score)
End Function
上边是主程序(宏)部分,以下是窗体代码部分。在工程中引入用户窗体,名为UserForm1,拖入两个label控件名为Label1、2,再在窗体属性窗口调整好窗体在Excel中出现的位置。完成后在窗体代码窗口键入如下代码:
Private Sub UserForm_Initialize() '窗体初始化事件
Call game_initial
If gaming Then
UserForm1.Label1.Caption = "NO PLAY , NO GAME"
UserForm1.Label2.Caption = "Arrow keys to move. P key to pause the game E key to end the game"
Else
UserForm1.Label1.Caption = "Something happened !"
End If
End Sub
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '响应窗体KeyDown事件
If gaming Then
If Not pulsed Then
pulsed = True
timerset = SetTimer(0, 0, , AddressOf snake_move) '启动定时器,这里时间间隔为毫秒,大家可以加入一些代码用来实现越来越快的游戏速度
UserForm1.Label2.Caption = "Arrow keys to move. P key to pause the game E key to end the game"
End If
Select Case KeyCode
Case vbKeyUp
head_movement = 2
Case vbKeyDown
head_movement = 4
Case vbKeyLeft
head_movement = 3
Case vbKeyRight
head_movement = 1
Case vbKeyP '这里是通过销毁定时器实现游戏暂停
If timerset <> 0 Then
timerset = KillTimer(0, timerset)
pulsed = False
End If
UserForm1.Label2.Caption = "Game paused. Any key to resume. "
Case vbKeyE
Call game_over
End Select
End If
End Sub
Private Sub UserForm_Terminate() '窗体销毁事件,这里是通过主程序发出Alt+F4按键事件引发
If timerset <> 0 Then
timerset = KillTimer(0, timerset)
pulsed = False
End If
MsgBox ("You have finished the game with the score of " + Str(score))
End Sub
不过还没完,我们要找个地方启动整个程序。在工作表sheet1中找个地方拖入一个按钮用作总开关,名为CommandButton1,双击进入代码编写状态,键入
Private Sub CommandButton1_Click()
Call main
End Sub