转载自:http://www.aisidachina.com/forum/thread-105-1-2.html
二吃一又名四步顶或是四棋,起源于中国民间。规则是两块吃一块,就是在一条直线上的自己的两个棋子可以吃掉对方的一个棋子。
在这说一下这个游戏的主要思想和大家分享一下,这个游戏分为双人模式和单人模式,双人模式主要是规则下边会简单介绍一下,人机对战涉及到比较复杂的算法想和大家一块探讨一下。
1.规则方法:
我用数组qizi存8个棋子,用数组position存17个位置,其实棋谱上有16个第17个是用来设置被吃的那个棋子的位置的。每个棋子都是一个Button,刚开始时想用UIImageView但是UIImageView不支持相应事件所以改为使用Button,每一个棋子都有不同的tag属性(从0到7)用来从数组中取对象,然后是用两个数组分别存双方棋子的位置从0到3和从12到15,每个数组4个对象,通过这两个数组把棋子和位置对应起来。每个棋子可以向4个方向走(用1、-1、4、-4表示),所以首先要判断是否越界了然后判断是否可以向这个方向移动,因为有可能那里已经有棋子了。然后要做的就是改变数组的值设置位置在界面上体现出来。
2.人机对战算法实现:
在以上规则的基础上添加玩家走棋后机器要执行的代码。主要是一个判断的过程,我分了三种情况(要建立三对数组分别存这三种情况所对应的棋子tag和方向),
首先模拟走一步棋,然后循环模拟对方(玩家)走每一步可以走的操作,
之后如果判断出可以吃掉对方(玩家)但不被玩家吃掉就把这个棋子的tag和走的方向放入第一对数组中,如果没吃掉对方也没被对方吃掉就放到第二对数组中,如果没吃掉对方的反而能被对方的吃掉就把它放到第三对数组中,其实这是一个循环的过程,
放完后随即取一个小于第一个数组个数的数从第一对数组中取出相应的值进行操作,如果第一对数组个数为零就从第二对数组中取值,之后是第是三个。这样我就取到了最理想的那个旗子和要做的操作,之后就按规则进行。
介绍一下这个实例实现的是两个带有蓝牙设备的touch之间的一个小游戏,在界面上有个可以响应事件的UIView(之前说过)可以点击,然后看谁新达到WINNING_TAP_COUNT (游戏中一常量可以自己设置)谁先达到谁就赢了,然后通知对方。还要引入GameKit.framework框架
头文件BlueToothViewController.h:
//
//
// BlueToothViewController.h
// BlueTooth
//
// Created by mingchun liu on 09-11-24.
// Copyright sdie 2009. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>
#define START_GAME_KEY @"startgame"
#define END_GAME_KEY @"endgame"
#define TAP_COUNT_KEY @"taps"
#define WINNING_TAP_COUNT 50
#define AMIPHD_P2P_SESSION_ID @"amiphdp2p2"//这个是蓝牙协议
@interface BlueToothViewController : UIViewController<GKPeerPickerControllerDelegate,GKSessionDelegate>{
BOOL actingAsHost;//是否提供服务,客户端还是服务器端
int playerTapCount;//记录玩家点击次数
int opponentTapCount;//对方点击次数
IBOutle