四子棋对决(二)

import com from './common'
cc.Class({
    extends: cc.Component,
    properties: {
        overLab: {
            default: null,
            type:cc.Label
        },
        chessPrefab: {//棋子的预制资源
            default: null,
            type: cc.Prefab
        },
        chessList:{
            default:[],
            type:[cc.Node]
        },
        whiteSpriteFrame: {
            default: null,
            type: cc.SpriteFrame
        },
        blackSpriteFrame: {
            default: null,
            type: cc.SpriteFrame
        },
        touchChess: {
            default: null,
            type: cc.SpriteFrame
        },
        gameState: 'black',
        fourGroup: [],//四元组
        fourGroupScore: [],//四元组
        chessBoard: { //棋盘
            default: null,
            type: cc.Node
        }
    },
    onLoad: function() {
        let self = this;
        
        //初始化棋盘上225个棋子节点,并为每个节点添加事件
        for (var y = 0; y < 15;y++) {
            for (var x = 0; x < 15; x++) {              
                var newNode = cc.instantiate(this.chessPrefab);//复制chess预制资源               
                this.chessBoard.addChild(newNode);
                newNode.setPosition(cc.v2(x * 40 + 20, y * 40 + 20));
                newNode.attr({ tag: y * 15 + x });
                newNode.on(cc.Node.EventType.TOUCH_END, function (event) {  //人下黑棋
                    self.touchChess = this;                  
                    if (this.getComponent(cc.Sprite).spriteFrame === null) {//判断可以下棋
                        if (self.gameState === 'black') {//下黑棋
                            if (com.gameMode === 'random') { //与网友对决

                            } else {                         //与人工智障对决
                                    this.getComponent(cc.Sprite).spriteFrame = self.blackSpriteFrame;
                                    //----------------------------------判断玩家胜利-------------------------------
                                    if (self.jugeOver()) {                              //玩家胜利
                                        self.overLab.string = "胜利";
                                        self.overLab.node.active = true;
                                        self.gameState = 'close';                       //关闭下棋
                                    } else {                                            //玩家当前没有胜利
                                        self.scheduleOnce(function () { self.af() }, 1);//延迟一秒电脑下棋
                                    }
                            }
                        } 
                    }
                }.bind(newNode));
                this.chessList.push(newNode);
            }
        }
        //建立四元组为人工智障埋下伏笔
        for (var y = 0; y < 14;y++) {
            for (var x = 0; x < 14; x++) {
                this.fourGroup.push([y*15+x,y*15+x+1,(y+1)*15+x,(y+1)*15+x+1]);//存储顺序
            }
        }
    },
    af: function () {
        //评分
        for (var i = 0; i < this.fourGroup.length; i++) {
            var b = 0;//四元组里黑棋个数
            var w = 0;//四元组里白棋个数
            //统计黑棋与白棋的个数
            for (var j = 0; j < 4; j++) {
                if (this.chessList[this.fourGroup[i][j]].getComponent(cc.Sprite).spriteFrame === this.blackSpriteFrame) {//黑棋
                    b++;
                } else if (this.chessList[this.fourGroup[i][j]].getComponent(cc.Sprite).spriteFrame === this.whiteSpriteFrame) {//白色
                    w++;
                }
            }
            
            if (b + w === 0) {             //b=w=0
                this.fourGroupScore[i] = 1;
            } else if (b > 0 && w > 0) {   //b<0,w>0
                this.fourGroupScore[i] = 0;
            } else if (b === 0 && w == 1) {//电脑发展壮大自己
                this.fourGroupScore[i] = 2
            } else if (b === 0 && w === 2) {
                this.fourGroupScore[i] = 3;
            } else if (b === 0 && w === 3) {
                this.fourGroupScore[i] = 10;
            } else if (w === 0 && b === 1) {//电脑破坏敌方阵地
                this.fourGroupScore[i] = 2;
            } else if (w === 0 && b === 2) {
                this.fourGroupScore[i] = 3;
            } else if (w === 0 && b === 3) {
                this.fourGroupScore[i] = 9;
            }
        }
        //找到最高分的四元组
        var hScore = 0;
        var mPosition = 0;
        for (var i = 0; i < this.fourGroup.length; i++) {
            if (this.fourGroupScore[i] > hScore) {
                hScore = this.fourGroupScore[i];
                mPosition = i;//记录最高的元组
            }
        }

        //在最高分的四元组找到最优下子位置
        var nPosition = 0;
        for (var i = 0; i < 4; i++) {
            if (this.chessList[this.fourGroup[mPosition][i]].getComponent(cc.Sprite).spriteFrame === null) {
                nPosition = i;
                break;
            }
        }
        //在较优的位置下棋
        this.chessList[this.fourGroup[mPosition][nPosition]].getComponent(cc.Sprite).spriteFrame = this.whiteSpriteFrame;
        this.touchChess = this.chessList[this.fourGroup[mPosition][nPosition]];
        if (this.jugeOver()) {                      //电脑胜利
            this.overLab.string = "失败";
            this.overLab.node.active = true;
            this.gameState = 'close'                 //
        } else {                                     //电脑当前没有胜利
            this.gameState = 'black'                 //设置轮到玩家下棋
        }
    },
    jugeOver: function () {
        //---------获取刚放下去的棋子tag(序号)
        var index = this.touchChess.tag;
        var x = index % 15;
        var y = parseInt(index / 15);      
        var sameCount = 0;
        //结构一
        //[0]0   (x,y)  (index)     (x+1,y)(index+1)
        // 0 0   (x,y-1)(index-15)  (x+1,y-1)(index+16)
        if (x<14 &&y > 0) {
            //判断其余棋是否同一棋型
            if (this.jugeSame(x + 1, y)) {//右侧棋
                sameCount++;
            }
            if (this.jugeSame(x, y - 1)) {//下面棋
                sameCount++;
            }
            if (this.jugeSame(x+1,y-1)) {  //右下棋
                sameCount++;
            }
            //判断下棋结束
            if (sameCount===3) {//相同成功
                return true;
            }
        }

        //结构二
        //0[0]
        //0 0
        sameCount = 0;//同类型棋初始化为零
        if (x > 0 && y > 0) {                 
            if (this.jugeSame(x - 1, y)) { //左侧棋  
                sameCount++;
            }
            if (this.jugeSame(x - 1, y - 1)) {//左下棋
                sameCount++;
            }
            if (this.jugeSame(x, y - 1)) {  //下面棋
                sameCount++;
            }
            //判断下棋结束
            if (sameCount===3) {
                return true;
            }
        }

        //结构三
        // 0 0
        //[0]0
        sameCount = 0;//初始化同类型个数为零
        if (x < 15 && y < 14) {
            if (this.jugeSame(x , y+1)) {     //上面棋
                sameCount++;
            }
            if (this.jugeSame(x + 1, y + 1)) {//右上棋
                sameCount++;
            }
            if (this.jugeSame(x+1, y)) {      //右侧棋
                sameCount++;
            }           
            if (sameCount===3) {
                return true;
            }
        }
        //结构四
        // 0 0
        // 0[0]
        sameCount = 0;//初始化同类型为零
        if (x > 0 && y < 14) {
            if (this.jugeSame(x-1, y + 1)) {   //左上棋
                sameCount++;
            }
            if (this.jugeSame(x, y + 1)) {     //上面棋
                sameCount++;
            }
            if (this.jugeSame(x - 1, y)) {     //左侧棋
                sameCount++;
            }     
            if (sameCount===3) {
                return true;
            }
        }
        return false;
    },
    //判断是否属于同一类型棋子
    jugeSame: function (x, y) {
        if (this.chessList[y * 15 + x].getComponent(cc.Sprite).spriteFrame === this.touchChess.getComponent(cc.Sprite).spriteFrame) {
            return true
        }  
        return false;
    },
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 六子对抗赛c代码是用C语言编写的一个六子游戏程序。它是为了让两个玩家进行盘上的对抗而创造的。 这个代码主要包括以下几个部分:初始化游戏、绘制盘、玩家操作、落子判断、胜负判断等。 在初始化游戏中,代码会创建一个维数组来代表六子盘,然后将其全部设为0,表示盘上都没有子。 在绘制盘中,代码会通过循环遍历盘数组,根据数组中的值来绘制出相应的子。例如,如果数组中的值为1,则绘制一个黑子;如果数组中的值为2,则绘制一个白子。 在玩家操作中,代码会提示当前轮到哪个玩家落子,并等待玩家输入落子的位置。然后,代码会判断该位置是否为空,并将相应的值写入盘数组中,表示该位置被玩家占据。 在落子判断中,代码会根据当前玩家的位置,检查盘数组中是否存在连续六个相同的子,即六子连成一线。如果存在连线,则判断该玩家胜利。 在胜负判断中,代码会检查盘数组中是否还存在空格,如果不存在空格,即盘上已经下满子,则判断为平局。 以上就是关于六子对抗赛c代码的大致说明。编写这个代码可以提高我们的程序设计能力,同时也可以提供一个娱乐的游戏平台给玩家们享受六子的乐趣。 ### 回答2: 六子对抗赛是一场程序之间的对弈比赛,六子是一种类游戏,规则类似于五子。这场对抗赛中,参赛者需要编写一个六子程序,通过算法和策略进行对弈,争夺胜利。 首先,参赛者编写程序需要实现一个六子的游戏界面,包括盘和子。盘应该是一个六行六列的方格,每个方格可以放置一个子。子要有黑白两种颜色,分别代表两方玩家。 其次,参赛者需要实现一个合法判断函数,用于检查玩家下的子位置是否符合游戏规则。在六子中,每位玩家轮流下子,每回合只能在一个空白的方格中放置自己的子。当一方玩家成功在盘上连成六颗子时,即可获得胜利。 最后,参赛者需要编写一个智能算法,用于制定下策略。这个算法可以根据当前盘的状态评估出每个可下子位置的价值,然后选择价值最高的位置进行下。参赛者可以根据自己的思路和经验来设计这个算法,以提高自己程序的胜率。 在比赛中,参赛者的程序将与其他参赛者的程序进行对抗,每个程序在每一回合都会根据当前盘状态选择一个最优的位置进行下子。最终,获得胜利次数最多的程序将成为比赛的冠军。 总之,六子对抗赛是一场程序之间的对决,参赛者需要编写一个六子程序,具备游戏界面、合法判断和智能算法等功能,以获得比赛胜利。这不仅考验了参赛者的编程技巧和算法设计能力,也是一场智力与智能的碰撞。 ### 回答3: 六子对抗赛c代码是指编写一个程序来进行六子的对抗赛。六子是一种在一个19x19的盘上进行的类游戏,目标是在盘上先形成连成六个子的线条的一方获胜。 编程实现六子对抗赛需要考虑以下几个方面: 1. 盘表示:可以使用一个维数组来表示盘,数组的元素可以是数字0表示空位,数字1表示一个玩家的子,数字2表示另一个玩家的子。 2. 游戏规则:编写函数来判断是否有玩家获胜,需要检查水平、垂直和斜向的线条上是否存在连成六个子的情况。还需编写函数来判断是否有平局。 3. 玩家交互:可以先编写一个简单的命令行界面来实现玩家的输入和输出,玩家可以轮流下,程序会在每个玩家下后判断是否获胜或者平局。 4. AI对手:可以实现一个简单的AI算法来作为玩家的对手。AI可以考虑当前盘上的情况,评估下的得分,并选择得分最高的位置下。 以上是实现六子对抗赛的基本思路,具体的代码实现需要根据具体需要进行设计。可以使用C语言编写,包括盘的初始化、玩家交互、判断获胜和平局的函数以及AI算法等。编写代码时应该注重代码的可读性和可维护性,确保程序运行正确且易于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值