赞 | 0 |
VIP | 136 |
好人卡 | 4 |
积分 | 1 |
经验 | 2058 |
最后登录 | 2013-1-17 |
在线时间 | 142 小时 |
Lv1.梦旅人 辉瑞中国首席研究员<
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 142 小时
- 注册时间
- 2008-1-18
- 帖子
- 2129
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 dbshy 于 2009-8-1 19:01 编辑
大家好,大家好,我是水蓝
爱生活,爱RUBY,发扬奥特曼精神
这个本来不准备写教程的,昨天晚上打DOTA比较郁闷,就写了个井字棋的小游戏
结果写完后突然看到以前柳之一曾经发过井字棋,所以就不发这个游戏了,就写个教程
做为一个有文化有素养有道德有人品的四有药师,在下非常有人品的
提醒各位,这个教程需要有一点脚本知识,另外高手退散
首先写两个类Scene_jzq 和 Spriteset_jzq
scene_jzq
作为游戏的场景,主刷新
spriteset_jzq
则作为棋盘和棋子等BITMAP的显示
忘了说了,必须要一个很重要的外挂脚本,那就是鼠标脚本
没必要把整个鼠标脚本都拷下来,只需要把鼠标模块拷下来
就差不多了,另外上面的API声明一定要
好,现在来说一下算法
首先就是生成两个二维数组,这个用来对AI和判断胜负有帮助
@tp_yq = Table.new(4, 4)
@tp_cc = Table.new(4, 4)
for i in 1..3
for j in 1..3
@tp_yq[i,j] = 0
@tp_cc[i,j] = 0
end
end
为什么要两个呢?因为有两种不同的棋子
如果一个位置下了棋子的响应的数组元素赋值
第一种棋子赋为1,第二种棋子赋为2,比如[1,1]的位置下了第一个 棋子,就是@tp_yq[1,1] = 1
然后就是判断胜负的方法,井字棋的胜负只有八种情况
所以用枚举法来判断胜负
if @tp_yq[1,1] + @tp_yq[1,2] + @tp_yq[1,3] == 3 or
@tp_yq[2,1] + @tp_yq[2,2] + @tp_yq[2,3] == 3 or
@tp_yq[3,1] + @tp_yq[3,2] + @tp_yq[3,3] == 3 or
@tp_yq[1,1] + @tp_yq[2,1] + @tp_yq[3,1] == 3 or
@tp_yq[1,2] + @tp_yq[2,2] + @tp_yq[3,2] == 3 or
@tp_yq[1,3] + @tp_yq[2,3] + @tp_yq[3,3] == 3 or
@tp_yq[1,1] + @tp_yq[2,2] + @tp_yq[3,3] == 3 or
@tp_yq[1,3] + @tp_yq[2,2] + @tp_yq[3,1] == 3 then
$judge = 1
end
if @tp_cc[1,1] + @tp_cc[1,2] + @tp_cc[1,3] == 6 or
@tp_cc[2,1] + @tp_cc[2,2] + @tp_cc[2,3] == 6 or
@tp_cc[3,1] + @tp_cc[3,2] + @tp_cc[3,3] == 6 or
@tp_cc[1,1] + @tp_cc[2,1] + @tp_cc[3,1] == 6 or
@tp_cc[1,2] + @tp_cc[2,2] + @tp_cc[3,2] == 6 or
@tp_cc[1,3] + @tp_cc[2,3] + @tp_cc[3,3] == 6 or
@tp_cc[1,1] + @tp_cc[2,2] + @tp_cc[3,3] == 6 or
@tp_cc[1,3] + @tp_cc[2,2] + @tp_cc[3,1] == 6 then
$judge = 2
end
end
现在就是写主刷新的时候
分为两个部分,一个是我方的刷新,一个是电脑的刷新
我方刷新部分
IF 按下鼠标左键 THEN
IF 在棋盘区域 THEN
获得鼠标的位置,这里不仅是坐标,而且要找出在二维数组中
的位置
IF 位置没有下过 THEN
显示棋子
在所在的二维数组中赋值
敌方除了要自己写AI算出要走的位置,其他的一样
脚本如下
case $game_phase
when 1
if Input.trigger?(Input::C) then
if in_area? then
course_x,course_y = judge_course_positon
if @tp_yq[course_x,course_y] != 1 and @tp_cc[course_x,course_y] != 2 then
@spriteset_jzq.require_position(1, ((course_y - 1) * 3 + course_x))
@tp_yq[course_x,course_y] = 1
$game_phase = 2
end
end
end
when 2
course_x,course_y = make_action
@spriteset_jzq.require_position(2, ((course_y - 1) * 3 + course_x))
@tp_cc[course_x,course_y] = 2
$game_phase = 1
end
end
最后就是电脑的AI
我这个人比较懒,就说一下大概的思路
一.电脑先手一定要强中央的位置,这一点是毋庸置疑的
二.电脑攻击,如果在赢的八种情况中,如果任意一种情况上有二个棋子的话,就要下第三个
三.电脑防御,同上
上面所说都可以用枚举法,也就是IF写出来
棋盘和棋子等的显示,比较简单,就不说了
更多的内容,可以看我的工程中的脚本
Project5.rar
(192.93 KB, 下载次数: 314)
|
|