Project1

标题: 水蓝的脚本教程之井字棋的脚本实现 [打印本页]

作者: dbshy    时间: 2009-8-1 19:00
标题: 水蓝的脚本教程之井字棋的脚本实现
本帖最后由 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)

Project5.rar

192.93 KB, 下载次数: 149


作者: 夏季冰川    时间: 2009-8-1 19:10
先占个楼,慢慢学习,感谢LZ支持小游戏区。
作者: 水镜风生    时间: 2009-8-1 20:44
嗯,支持一下。
其实在棋子的赋值上面下点功夫的话,用一个二维数组记录棋盘状态足矣。

例如第一种棋子赋值1,第二种棋子赋值10,那么判定时3和30就分别代表了两种棋子的胜负了。
作者: ONEWateR    时间: 2009-8-1 21:17
话说最近还真多人写教程~
顶顶db前辈~
作者: 蓝の星辰    时间: 2009-8-2 18:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-8-2 21:43
写教程的人多是好事:lol




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1