1.Hermes源码分析(二)——解析字节码
2.金手指代码是源码什么?
3.用C++编写的小游戏源代码
Hermes源码分析(二)——解析字节码
前面一节 讲到字节码序列化为二进制是有固定的格式的,这里我们分析一下源码里面是源码怎么处理的这里可以看到首先写入的是魔数,他的源码值为
对应的二进制见下图,注意是源码小端字节序
第二项是字节码的版本,笔者的源码版本是,也即 上图中的源码奢圈源码4a
第三项是源码的hash,这里采用的源码是SHA1算法,生成的源码哈希值是位,因此占用了个字节
第四项是源码文件长度,这个字段是源码位的,也就是源码下图中的为0aa,转换成十进制就是源码,实际文件大小也是源码这么多
后面的字段类似,就不一一分析了,源码头部所有字段的源码类型都可以在BytecodeFileHeader.h中看到,Hermes按照既定的内存布局把字段写入后再序列化,就得到了我们看到的字节码文件。
这里写入的数据很多,以函数头的写入为例,我们调用了visitFunctionHeader方法,并通过byteCodeModule拿到函数的棋牌时时乐源码签名,将其写入函数表(存疑,在实际的文件中并没有看到这一部分)。注意这些数据必须按顺序写入,因为读出的时候也是按对应顺序来的。
我们知道react-native 在加载字节码的时候需要调用hermes的prepareJavaScript方法, 那这个方法做了些什么事呢?
这里做了两件事情:
1. 判断是否是字节码,如果是则调用createBCProviderFromBuffer,否则调用createBCProviderFromSrc,我们这里只关注createBCProviderFromBuffer
2.通过BCProviderFromBuffer的构造方法得到文件头和函数头的信息(populateFromBuffer方法),下面是这个方法的实现。
BytecodeFileFields的populateFromBuffer方法也是一个模版方法,注意这里调用populateFromBuffer方法的是一个 ConstBytecodeFileFields对象,他代表的是不可变的字节码字段。
细心的读者会发现这里也有visitFunctionHeaders方法, 这里主要为了复用visitBytecodeSegmentsInOrder的逻辑,把populator当作一个visitor来按顺序读取buffer的内容,并提前加载到BytecodeFileFields里面,以减少后面执行字节码时解析的时间。
Hermes引擎在读取了字节码之后会通过解析BytecodeFileHeader这个结构体中的字段来获取一些关键信息,例如bundle是eclipese导入项目源码否是字节码格式,是否包含了函数,字节码的版本是否匹配等。注意这里我们只是解析了头部,没有解析整个字节码,后面执行字节码时才会解析剩余的部分。
evaluatePreparedJavaScript这个方法,主要是调用了HermesRuntime的 runBytecode方法,这里hermesPrep时上一步解析头部时获取的BCProviderFromBuffer实例。
runBytecode这个方法比较长,主要做了几件事情:
这里说明一下,Domain是用于垃圾回收的运行时模块的代理, Domain被创建时是空的,并跟随着运行时模块进行传播, 在运行时模块的整个生命周期内都一直存在。在某个Domain下创建的所有函数都会保持着对这个Domain的强引用。当Domain被回收的时候,这个Domain下的所有函数都不能使用。
未完待续。。。github 源码打包jar
金手指代码是什么?
《口袋妖怪》:圣灰金手指代码大全如下:技能机器:
只要把所在位置上或全部改为,即可拥有每种技巧机个!
所在位置AA--A,一共个!
训练机序号 名称 获得场所 威力 PP
技巧训练机爆裂拳 在丹巴市(唐巴城)的道场主人那里得到。
技巧训练机头撞 在姥目森林(哈威森林)中获得,黄金市百货的5F也可以买到。
技巧训练机诅咒 由位于玉虫市的公寓中获得。 --
技巧训练机滚动 位于号道路的左侧。
技巧训练机吼叫 从在号道路的男子手上获得。 --
技巧训练机剧毒 由石竹市的道场主人杏子那里获得。 --
技巧训练机电磁炮 解决发电厂事件后,由所长那里得到。
技巧训练机岩碎 在第号道路获得,黄金市百货的5F也可以买到。
技巧训练机自我催眠 把No.从黄版传到金银版,把它身上的物品卸下, 便是了。 --
技巧训练机觉醒力量 在愤怒湖或是玉虫市的百货2F得到。 --
技巧训练机日本晴 黄金市广播塔解放后可以得到,也可以在玉虫市的c 源码免杀百货得到。 -- 5
技巧训练机香甜气息 在姥目森林(哈威森林)北边的关卡,与右边的女人谈话。 --
技巧训练机鼾声 第号道路获得。
技巧训练机暴风雪 黄金市游戏中心枚交换。
技巧训练机破坏光线 玉虫市游戏中心枚交换。
技巧训练机冰结之风 从丁香镇(丁字镇)的道场主人手中得到。
技巧训练机守护 玉虫市百货的2楼元购买。--
技巧训练机祈雨 呆呆兽井的地下或在玉虫市百货2楼买到。-- 5
技巧训练机百万威力吸取 由玉虫市道场主人获得。
技巧训练机忍耐 烧毁的塔(宝塔)地下。 5
技巧训练机撒气 星期日在黄金市百货5楼获得。--
技巧训练机太阳光线 号道路下方。
技巧训练机钢之尾 由浅黄市道场主人得到。
技巧训练机龙之息吹 由熏烟市道场主人得到。
技巧训练机闪电 黄金市游戏中心枚交换。
技巧训练机地震 冠军道路。
技巧训练机报恩 星期日在黄金市百货5层获得。--
技巧训练机挖洞 在自然公园左下方。
技巧训练机精神干扰 玉虫市游戏中心得到或山吹市的超能力老人那里。
技巧训练机影子球 由槐树市道场主人得到。
技巧训练机扔泥 由桔梗市(归侨城)道场主人得到。
技巧训练机影分身 在玉虫市游戏中心枚交换。--
技巧训练机冷冻拳 黄金市百货5层元购买。
技巧训练机虚张声势 浅黄市(浅木市)灯塔5层中得到。--
技巧训练机梦话 黄金市百货地下二层。--
技巧训练机泥爆弹 号道路的关卡获得。
技巧训练机沙尘暴 号道路的民家或玉虫市百货2楼。--
技巧训练机大字火 黄金市游戏中心枚交换。
技巧训练机流星 连接道路的洞穴地下1层。
技巧训练机变圆 研钵山(巴奇山)中央入口进去后位于大瀑布洞穴中。--
技巧训练机闪电拳 黄金市百货5层元购买。
技巧训练机食梦 和睡在常磬市(时而镇)左侧的人交谈。
技巧训练机看穿 愤怒湖的左上方。-- 5
技巧训练机睡眠 冰之通道(冰天地)B2F。--
技巧训练机着迷 黄金市(黄金城)道场主人获得。--
技巧训练机盗窃 火箭队老巢的B2F。
技巧训练机钢之翼 号道路上的民家中。
技巧训练机火焰拳 黄金市百货5层元购买。
技巧训练机连续切 柏树镇道场主人得到。
技巧训练机恶梦 将号道路的警卫的信件送到号道路的胖子那里即可得到。--
秘传机器:
只要把秘传机所在位置改为即可!
所在位置AC--A,一共7个!(其实是个,只不过游戏程序不叫我们用那五个,招式太厉害了,破坏游戏平衡性!)
秘传机 序号 名称 获得场所 威力 PP
秘传训练机砍树 姥目森林(哈威森林)帮助寻找大葱鸭得到。
秘传训练机飞行 打败丹巴市(唐巴城)道场主人后与道场前的女子谈话。
秘传训练机冲浪 将槐树市五位使用不同伊贝的少女击败,与观众席上的男子交谈。
秘传训练机怪力 浅黄市(浅木市)民家获得。
秘传训练机闪光 花苞之塔(马丹蕾塔)长老处获得。--
秘传训练机漩涡 摧毁火箭队老巢后,小渡会给你。
秘传训练机攀瀑 冰之通道(冰天地)1层。
精灵球以及取得方法:
名字 颜色 功能 取得地点
精灵球 红 捕获率% 商店/道路
超级球 蓝 捕获率% 商店/道路/洞窟/不可思议的礼物
高级球 金黄 捕获率% 商店/道路/洞窟
大师球 绿 捕获率% 打完8个道馆,找空木博士拿/中头奖
A0 诱饵球 蓝 容易抓钓竿钓到的,把青色种子给工匠。
9F 等级球 浅咖啡 容易抓等级比自己高的,把红色种子给工匠。
A5 月亮球 灰 容易抓用月亮之石进化的,把色种子给工匠。
A4 友谊球 浅咖啡 抓到的怪兽容易亲近,把绿色种子给工匠。
9D 重量球 灰 容易抓比自己重量重的,把黑色种子给工匠。
A6 异性球 橙 容易抓姓别跟自己不同的,把桃色种子给工匠。
A1 速度球 蓝 容易抓速度快的,把白色种子给工匠。
B1 昆虫球 灰 抓虫大会用的,抓虫大会时会给你。
种子和具体位置:
名字 用途 取得地点
白色种子 可作为速度球的材料 哈威城的树。
红色种子 可作为等级球的材料 号道路的树。
青色种子 可作为诱饵球的材料 号道路的树。
黑色种子 可作为重量球的材料 号道路的树。
桃色种子 可作为异性球的材料 号道路的树。
5D 绿色种子 可作为友谊球的材料 号道路的树。
5C **种子 可作为月亮球的材料 号道路的树。
进化道具及位置:
物品名称 进化的pokemon 取得地点
8F 金属外套:飞天螳螂/大岩蛇(通信交换)
1.亚速亚号事件结束后
2.野生的小磁怪身上可能带有
龙之鳞片:海刺龙(通信交换)
1.研钵山2层
2.野生的墨海马/海刺龙/迷你龙身上可能带有
AC 升级卡:3D龙(通信交换)
山吹市
王者之印:呆呆兽/蚊香蝌蚪(通信交换)
1.呆呆兽之井(洞穴深处的那个人给的)
2.野生的呆呆兽/呆河马/蚊香蛙可能带有
火之石:六尾/卡蒂狗/伊布
拿六尾给正辉的爷爷看
水之石:蚊香蛙/大舌贝/海星星/伊布
拿海星星给正辉的爷爷看
雷之石:皮卡丘/伊布
拿皮丘给正辉的爷爷看
草之石:臭臭花/口呆花/蛋蛋
拿行路草给正辉的爷爷看
月亮之石:皮皮/胖丁/尼多力诺/尼多娜
1.妈妈会买给你
2.塔上瀑布
3.星期一晚月见山里的皮皮仪式
A9 太阳石:臭臭花/太阳种子
捉虫大赛第一名
其他道具:
道具前面是它的源代码,比如 就是有一个(就是)精灵球(就是),从A以后就是道具位置,注意,不要修改得超出道具栏了!
代码—正式名称—用途—中文版翻译名称
光粉 降低对手命中率. (装备) 海子球
自行车 旅行速度X2. 单车
月石 进化一些Pokemon 月石
中毒剂 治愈中毒的Pokemon 解毒
0A 烧伤剂 治愈烧伤的Pokemon 治烧伤
0B 冰冻剂 治愈冰冻的Pokemon 解冻
0C 催醒剂 把睡着的Pokemon叫醒 唤醒
0D 麻痹剂 治愈麻痹的Pokemon 解痹
0E 恢复药 恢复所有HP并治愈异常状态 恢复药
0F 最大补血剂 补满Pokemon的HP 金丹
超级补血剂 回复Pokemon的HP. 银丹
高级补血剂 回复的Pokemon的HP 红丹
补血剂 回复的Pokemon的HP 白丹
逃跑绳 在山洞中逃跑用 大年
除虫剂 走步不会遇到Pokemon 皮皮
完全PP回复 回复一个Pokemon的所有PP 表皮
火石 进化一些Pokemon 火焰石
雷石 进化一些Pokemon 雷之石
水石 进化一些Pokemon 水石
1A HP提升 提升一个Pokemon的HP 比秋
1B 蛋白质 提高Pokemon的攻击 牛磺
1C 铁 提高Pokemon的防守 挨汛
1D 碳水化合物 提高Pokemon的速度 沙波
1E 幸运拳套 提高幸运蛋命中要害的机率 其
1F 钙 提高Pokemon的特攻特防 卡思
神奇涛淦鼷 提高Pokemon一级 玛胡
X命中率 战斗中提高命中率 X爱
草石 进化一些Pokemon
金属粉 提高百变怪的防守(装备) 本参
金矿 纯金卖好价钱。 金块
皮皮娃娃 从野生Pokemon逃走 精灵垛
全治愈 治愈所有异常情况 福愈
复活 复活一个Pokemon并回复1/2 HP. 雷胡
精神草 完全复活一个Pokemon
守卫符 防止技能指数受敌人影响 沙事
2A 超级除虫剂 步不遇到Pokemon 拓者
2B 最大除虫剂 步不遇到Pokemon 大皮皮
2C 命中装置 战斗中提高命中要害机率 第雷
2E 新鲜水 回复HP 橙汁
2F 苏打水 回复HP 汁子
柠檬汁 回复HP 椰汁
X攻击 战斗中提高攻击 X击
X防守 战斗中提高防守 X防
X速度 战斗中提高速度 X速
X特殊 战斗中提高特攻特防 X力
硬币盒 可装枚硬币 吉姆
探测器 寻找看不见的物品
EXP分享器 分享经验值(装备) 学习装置
3A 旧钓竿 钓水系Pokemon用 竹杆钩
3B 好钓竿 较好的抓水系Pokemon用的钓竿 木杆钩
3C 银色羽毛 奇怪的银色羽毛 银叶子
3D 超级钓竿 最好钓水系Pokemon用的钓竿 铜杆钩
3E 提高PP 提高一个招式的最大PP
3F 回复PP2 回复一个招式的个PP
完全回复PP2 完全回复一个招式的所有PP 井尖
回复PP3 回复所有招式个PP 尖在
红色鳞片 红色暴鲤龙掉下的鳞片
全能药 治疗好任何Pokemon(剧情道具)
船票 乘船用 船票
神秘的蛋 从精灵爷爷那儿得到的蛋
透明铃铛 捕捉凤凰必带道具 比秋
银翅膀 发亮的银色翅膀 热牛奶
牛奶 回复HP 雪瓜汁
先制之爪 提高速度(装备) 灼灼灼
4A 防毒果实 治愈中毒(装备) 解毒果
4D 金色树叶 奇怪的金色树叶 金叶
4C 软沙子 提高地面系绝招威力(装备) 柔沙
4D 尖利的鸟嘴 提高飞行系绝招威力(装备) 尖啄
4E 防麻果实 治愈麻痹(装备) 解痹
4F 烧过的果实 治愈冰冻(装备) 烧果
冰过的果实 治愈烧伤(装备) 冰果
毒针 提高毒系绝招威力(装备) 仿毒
王者之印 可能惊吓对手(装备) 王印
苦果实 治愈混乱(装备) 苦果
清醒果实 治愈被催眠(装备) 薄果
红栗子 红栗子
小蘑菇 卖不了高价钱
大蘑菇 卖高价
银粉 提高虫系绝招威力(装备) 银粉
蓝栗子 蓝栗子
5B 钱戒指 双倍获得金钱(装备)
5C 黄栗子 黄栗子
5D 绿栗子 绿栗子
5E 避敌丸 装备后就难和Pokemon相遇了 凡票
5F 神秘的水滴 提高水系绝招威力(装备) 神滴
勺子 提高超能系绝招威力(装备) 白栗
白栗子 白栗子
黑腰带 提高格斗系绝招威力(装备) 黑栗
黑栗子 黑栗子
粉红栗子 粉红栗子
墨镜 提高邪恶系绝招威力(装备) 美尾
呆呆兽的尾巴 卖高价 粉带
粉红缎带 提高常规系绝招威力(装备) 长葱
短棍 卖低价 烟弹
6A 烟雾球 从野生Pokemon逃走(装备) 寒冰
6B 千年寒冰 提高冰系绝招威力(装备) 磁石
6C 磁铁 提高电系绝招威力(装备) 奇果
6D 奇迹果 治愈所有异常情况(装备) 小珠
6E 珍珠 卖低价
6F 大珍珠 卖高价
不变石 停止进化(装备) 身符
幽灵标签 提高鬼系绝招威力(装备) 护身符
愤怒湖馒头 回复HP 芝世
济符球 让人不可思议(游戏上是这么显示的) 世革
蓝色的卡 参加电台抽奖用的
奇异种子 提高草系绝招威力(装备) 攻芭
骨头 一种骨头,卖低价 芭凶
毅力缎带 可能防止死(装备) 凶区
能量粉 回复HP
7A 能量根 回复HP
7B 治愈粉 治愈所有异常情况
7C 复活药 复活Pokemon
7D 硬石头 提高岩石系绝招威力(装备) 炙弱
7E 幸运蛋 领取额外的经验值(装备)
7F 卡片钥匙 广播塔百叶窗的钥匙
机器零件 发电场被偷的零件
贸易券 好象是贸易中心用的
掉了的物品 金黄市模仿女孩掉了的娃娃
星尘 红色,卖高价。
星星碎片 卖非常高的价
地下室钥匙 打开门 他砂
车票 乘火车用。 砂仙
8A 木炭 提高火系绝招威力(装备) 贡字
8B 果汁 回复HP.
8C 瞄准镜 提高命中要害机率(装备)
8F 金属外套 提高钢铁类型绝招威力(装备) 顺晨
龙牙 提高龙系绝招威力(装备) 晨或
剩饭 在战斗中回复HP(装备)
神秘果实 回复PP
龙的鳞片 一种珍贵的龙类物品
超梦的遗传因子 提高攻击但会混乱
9C 圣灰 复活所有Pokemon
9E 鲜花邮件 印有鲜花(装备) 晨虎球
A3 心之水滴 提高特攻的奇怪球体(装备) 顺迪
A7 常规箱子 打开看看里面有啥
A8 神秘魔盒 打开看看里面有啥
A9 太阳石 进化一些Pokemon
AA 粉红缎带 提高常规系绝招的威力(装备) 汪及
AC 升级盒 Silph Co.制造的神秘箱子 闪轴
AD 树木果实 一种补血物品(HP,装备)
AE 黄金果实 一种补血物品(HP,装备)
AF 杰尼龟水壶 用来浇树用
B2 彩虹羽毛 彩虹颜色的神秘羽毛 外量
B4 砖型碎片 一种珍贵的碎片 少友
B5 冲浪邮件 邮件上印有乘龙(装备) 友泊
B6 淡蓝色邮件 上面印有迷你龙(装备) 泊宵
B7 肖像邮件 上面印有携带信件精灵 宵欠
B8 可爱邮件 印有心(装备) 欠左
B9 永世邮件 印有伊布(装备) 左电
BA 变形邮件 印有百变怪(装备) 电恨
BB 蓝天邮件 印有蓝天(装备)
BC 音乐邮件 印有超能鸟(装备) 于慢
BD 雾气信件 全则
用C++编写的小游戏源代码
五子棋的代码:#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
using namespace std;
const int N=; //*的棋盘
const char ChessBoardflag = ' '; //棋盘标志
const char flag1='o'; //玩家1或电脑的棋子标志
const char flag2='X'; //玩家2的棋子标志
typedef struct Coordinate //坐标类
{
int x; //代表行
int y; //代表列
}Coordinate;
class GoBang //五子棋类
{
public:
GoBang() //初始化
{
InitChessBoard();
}
void Play() //下棋
{
Coordinate Pos1; // 玩家1或电脑
Coordinate Pos2; //玩家2
int n = 0;
while (1)
{
int mode = ChoiceMode();
while (1)
{
if (mode == 1) //电脑vs玩家
{
ComputerChess(Pos1,flag1); // 电脑下棋
if (GetVictory(Pos1, 0, flag1) == 1) //0表示电脑,真表示获胜
break;
PlayChess(Pos2, 2, flag2); //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break;
}
else //玩家1vs玩家2
{
PlayChess(Pos1, 1, flag1); // 玩家1下棋
if (GetVictory(Pos1, 1, flag1)) //1表示玩家1
break;
PlayChess(Pos2, 2, flag2); //玩家2下棋
if (GetVictory(Pos2, 2, flag2)) //2表示玩家2
break;
}
}
cout << "***再来一局***" << endl;
cout << "y or n :";
char c = 'y';
cin >> c;
if (c == 'n')
break;
}
}
protected:
int ChoiceMode() //选择模式
{
int i = 0;
system("cls"); //系统调用,清屏
InitChessBoard(); //重新初始化棋盘
cout << "***0、退出 1、电脑vs玩家 2、玩家vs玩家***" << endl;
while (1)
{
cout << "请选择:";
cin >> i;
if (i == 0) //选择0退出
exit(1);
if (i == 1 || i == 2)
return i;
cout << "输入不合法" << endl;
}
}
void InitChessBoard() //初始化棋盘
{
for (int i = 0; i < N + 1; ++i)
{
for (int j = 0; j < N + 1; ++j)
{
_ChessBoard[i][j] = ChessBoardflag;
}
}
}
void PrintChessBoard() //打印棋盘,这个函数可以自己调整
{
system("cls"); //系统调用,清空屏幕
for (int i = 0; i < N+1; ++i)
{
for (int j = 0; j < N+1; ++j)
{
if (i == 0) //打印列数字
{
if (j!=0)
printf("%d ", j);
else
printf(" ");
}
else if (j == 0) //打印行数字
printf("%2d ", i);
else
{
if (i < N+1)
{
printf("%c |",_ChessBoard[i][j]);
}
}
}
cout << endl;
cout << " ";
for (int m = 0; m < N; m++)
{
printf("--|");
}
cout << endl;
}
}
void PlayChess(Coordinate& pos, int player, int flag) //玩家下棋
{
PrintChessBoard(); //打印棋盘
while (1)
{
printf("玩家%d输入坐标:", player);
cin >> pos.x >> pos.y;
if (JudgeValue(pos) == 1) //坐标合法
break;
cout << "坐标不合法,重新输入" << endl;
}
_ChessBoard[pos.x][pos.y] = flag;
}
void ComputerChess(Coordinate& pos, char flag) //电脑下棋
{
PrintChessBoard(); //打印棋盘
int x = 0;
int y = 0;
while (1)
{
x = (rand() % N) + 1; //产生1~N的随机数
srand((unsigned int) time(NULL));
y = (rand() % N) + 1; //产生1~N的随机数
srand((unsigned int) time(NULL));
if (_ChessBoard[x][y] == ChessBoardflag) //如果这个位置是空的,也就是没有棋子
break;
}
pos.x = x;
pos.y = y;
_ChessBoard[pos.x][pos.y] = flag;
}
int JudgeValue(const Coordinate& pos) //判断输入坐标是不是合法
{
if (pos.x > 0 && pos.x <= N&&pos.y > 0 && pos.y <= N)
{
if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)
{
return 1; //合法
}
}
return 0; //非法
}
int JudgeVictory(Coordinate pos, char flag) //判断有没有人胜负(底层判断)
{
int begin = 0;
int end = 0;
int begin1 = 0;
int end1 = 0;
//判断行是否满足条件
(pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;
(pos.y + 4) >N ? end = N : end = (pos.y + 4);
for (int i = pos.x, j = begin; j + 4 <= end; j++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&
_ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&
_ChessBoard[i][j + 4] == flag)
return 1;
}
//判断列是否满足条件
(pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;
(pos.x + 4) > N ? end = N : end = (pos.x + 4);
for (int j = pos.y, i = begin; i + 4 <= end; i++)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&
_ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&
_ChessBoard[i + 4][j] == flag)
return 1;
}
int len = 0;
//判断主对角线是否满足条件
pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;
if (len > 4)
len = 4;
begin = pos.x - len; //横坐标的起始位置
begin1 = pos.y - len; //纵坐标的起始位置
pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);
if (len>4)
len = 4;
end = pos.x + len; //横坐标的结束位置
end1 = pos.y + len; //纵坐标的结束位置
for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&
_ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&
_ChessBoard[i + 4][j + 4] == flag)
return 1;
}
//判断副对角线是否满足条件
(pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;
if (len > 4)
len = 4;
begin = pos.x - len; //横坐标的起始位置
begin1 = pos.y + len; //纵坐标的起始位置
(N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);
if (len>4)
len = 4;
end = pos.x + len; //横坐标的结束位置
end1 = pos.y - len; //纵坐标的结束位置
for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j)
{
if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&
_ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&
_ChessBoard[i + 4][j - 4] == flag)
return 1;
}
for (int i = 1; i < N + 1; ++i) //棋盘有没有下满
{
for (int j =1; j < N + 1; ++j)
{
if (_ChessBoard[i][j] == ChessBoardflag)
return 0; //0表示棋盘没满
}
}
return -1; //和棋
}
bool GetVictory(Coordinate& pos, int player, int flag) //对JudgeVictory的一层封装,得到具体那个玩家获胜
{
int n = JudgeVictory(pos, flag); //判断有没有人获胜
if (n != 0) //有人获胜,0表示没有人获胜
{
PrintChessBoard();
if (n == 1) //有玩家赢棋
{
if (player == 0) //0表示电脑获胜,1表示玩家1,2表示玩家2
printf("***电脑获胜***\n");
else
printf("***恭喜玩家%d获胜***\n", player);
}
else
printf("***双方和棋***\n");
return true; //已经有人获胜
}
return false; //没有人获胜
}
private:
char _ChessBoard[N+1][N+1];
};
扩展资料:
设计思路
1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。
2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。
3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。