北京邮电大学智能卡实验报告Word文档下载推荐.docx
- 文档编号:21721756
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:33
- 大小:147.04KB
北京邮电大学智能卡实验报告Word文档下载推荐.docx
《北京邮电大学智能卡实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北京邮电大学智能卡实验报告Word文档下载推荐.docx(33页珍藏版)》请在冰豆网上搜索。
00
a0
—
1
C1F5B2A9CEC5
初始化
a1
03
00/01
02
009000—成功电脑先手选00
099000—成功人先手
6301—初始化失败
下棋
a2
00-08
039000成功落子未完
019000成功落子人赢了
029000成功落子电脑赢了
009000成功落子和局
6301落子失败
打印棋盘
a3
08
0x0x0x0x0x0x0x0x0x
棋盘情况
三.测试数据
1.选中
/select627570742e67616d652e31选中
2.身份反馈
/send00a0000010身份反馈
3.初始化
/send00a1030002初始化棋盘并人先手
/send00a1030102初始化棋盘并AI先手
4.落字
/send00a2000002落字到左上角
/send00a2010002落字到第一行中间
/send00a2020002落字到右上角
/send00a2030002落字到中间靠左
/send00a2040002落字到中心
/send00a2050002落字到中间靠右
/send00a2060002落字到左下角
/send00a2070002落字到最后一行中心
/send00a2080002落字到右下角
5.打印棋盘
/send00a3000008
四.关键代码
1.游戏初始化模块:
privatevoidinit(APDUapdu){
byte[]buffer=apdu.getBuffer();
//棋盘维数——报错
if(buffer[ISO7816.OFFSET_P1]!
=(byte)0x03){
ISOException.throwIt(WRONG_P1);
}
//先后手——报错
if(buffer[ISO7816.OFFSET_P2]!
=(byte)0x01){
if(buffer[ISO7816.OFFSET_P2]!
=(byte)0x00)
ISOException.throwIt(WRONG_P2);
}
//将临时变量放进RAM
board=JCSystem.makeTransientByteArray((short)9,JCSystem.CLEAR_ON_DESELECT);
order=JCSystem.makeTransientByteArray((short)1,JCSystem.CLEAR_ON_DESELECT)[0];
turn=JCSystem.makeTransientByteArray((short)1,JCSystem.CLEAR_ON_DESELECT)[0];
depth=JCSystem.makeTransientByteArray((short)1,JCSystem.CLEAR_ON_DESELECT)[0];
answer=JCSystem.makeTransientByteArray((short)1,JCSystem.CLEAR_ON_DESELECT)[0];
result=JCSystem.makeTransientByteArray((short)1,JCSystem.CLEAR_ON_DESELECT)[0];
this.board[0]=(byte)0x00;
this.board[1]=(byte)0x00;
this.board[2]=(byte)0x00;
this.board[3]=(byte)0x00;
this.board[4]=(byte)0x00;
this.board[5]=(byte)0x00;
this.board[6]=(byte)0x00;
this.board[7]=(byte)0x00;
this.board[8]=(byte)0x00;
this.depth=(byte)0x09;
this.order=(byte)0x09;
this.turn=(byte)0x09;
this.answer=(byte)0x09;
this.result=(byte)0x09;
order=buffer[ISO7816.OFFSET_P2];
if(order==0x01){turn=chessCom;
play(apdu);
return;
}
turn=chessHum;
shortle=apdu.setOutgoing();
//if(le<
(byte)1){
//ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//}
apdu.setOutgoingLength((byte)1);
buffer[0]=(byte)0x09;
apdu.sendBytes((short)0,(short)1);
}
2.身份反馈模块
//个人信息--00a000000f
privatevoidmy_info(APDUapdu){
(byte)15){
apdu.setOutgoingLength((byte)16);
//学号,姓名
buffer[0]=0x32;
buffer[1]=0x30;
buffer[2]=0x31;
buffer[3]=0x33;
buffer[4]=0x32;
buffer[5]=0x31;
buffer[6]=0x31;
buffer[7]=0x30;
buffer[8]=0x34;
buffer[9]=0x39;
buffer[10]=(byte)0xc1;
buffer[11]=(byte)0xf5;
buffer[12]=(byte)0xb2;
buffer[13]=(byte)0xa9;
buffer[14]=(byte)0xce;
buffer[15]=(byte)0xc5;
apdu.sendBytes((short)0,(short)16);
3.对战入口模块
privatevoidplay(APDUapdu){
if(board[buffer[ISO7816.OFFSET_P1]]!
=0){ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
if(turn==chessHum)//该人下
{
move(turn,buffer[ISO7816.OFFSET_P1]);
//第二个参数是人的下棋位置
check();
if(result!
=0x00){
shortle=apdu.setOutgoing();
//if(le<
(byte)2){
//ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//}
apdu.setOutgoingLength((byte)2);
buffer[0]=result;
buffer[1]=answer;
apdu.sendBytes((short)0,(short)2);
return;
}}
if(turn==chessCom){//电脑下
//*********************************************************查表
//*********************************************************查表
move(turn,answer);
//刷新棋盘
//检查状态
if(depth==8){
shortle=apdu.setOutgoing();
//if(le<
//ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
//}
apdu.setOutgoingLength((byte)1);
buffer[0]=answer;
apdu.sendBytes((short)0,(short)1);
else
{
4.检查棋盘状态模块
//检查棋盘状态的入口
privatevoidcheck(){
if(win(chessHum)){result=(byte)0x02;
if(win(chessCom)){result=(byte)0x01;
if(draw()){result=(byte)0x03;
elseresult=(byte)0x00;
return;
//胜负
privatebooleanwin(byteturn){
if(board[0]==turn&
&
board[1]==turn&
board[2]==turn)
returntrue;
if(board[3]==turn&
board[4]==turn&
board[5]==turn)
if(board[6]==turn&
board[7]==turn&
board[8]==turn)
board[3]==turn&
board[6]==turn)
if(board[1]==turn&
board[7]==turn)
if(board[2]==turn&
board[5]==turn&
elsereturnfalse;
//平局
privatebooleandraw(){
if(depth==(byte)0)//剩余步数为零
returnfalse;
//**************************************************************检查棋局
5.打印棋盘模块
//打印棋盘
privatevoidqipan_info(APDUapdu){
(byte)8){
apdu.setOutgoingLength((byte)9);
//棋盘信息
buffer[0]=board[0];
buffer[1]=board[1];
buffer[2]=board[2];
buffer[3]=board[3];
buffer[4]=board[4];
buffer[5]=board[5];
buffer[6]=board[6];
buffer[7]=board[7];
buffer[8]=board[8];
apdu.sendBytes((short)0,(short)9);
五.测试结果
1.身份反馈测试
输入
返回
send00a00000000f
2013211209C1F5B2A9CEC5
2.人先手测试
send00a103010001
099000
send00a204000002
00089000
send00a201000002
00079000
send00a205000002
02069000
3.卡先手测试
send00a103000001
069000
00049000
00009000
02089000
4.报错测试
返回
send00a11
6700
send00a102000001
6A86
send00a303000001
6D00
卡片下载不足时
6A84
直接send00a103000001
6E00
send00a203000002
6A88
send00a201000001
6A89
六.团队协作与个人分工
1.团队
通过小组讨论,确定通过一定的策略进行棋谱扫描。
团队公用模板,具体算法实现,各自完成。
2.个人完成
1)自行设计策略算法
先手优先抢角,后手优先占中。
2)所有代码由个人独自完成
3)团队的查表核心部分共633行由我撰写
附录:
中间省略的由我撰写查表核心代码
//*********************************************************查表
if(depth==9){//先手第一步
answer=(byte)0;
if(depth==7){//先手第二步
if(board[4]!
=chessHum)
{answer=(byte)4;
else
{answer=(byte)2;
}
if(depth==5){//先手第三步
if(board[4]==chessCom)//抢到中
{if(board[8]!
=chessHum)//能赢就赢
answer=(byte)8;
else//否则走一步最有利
{if((board[8]==chessHum)&
(board[7]==chessHum))
answer=(byte)6;
if((board[8]==chessHum)&
(board[5]==chessHum))
answer=(byte)2;
(board[6]==chessHum))
answer=(byte)7;
(board[2]==chessHum))
answer=(byte)5;
(board[3]==chessHum))
(board[1]==chessHum))
answer=(byte)3;
}
}
else//占了0和2角,人已占中
{if(board[1]!
answer=(byte)1;
else//被堵
answer=(byte)7;
if(depth==3){//先手第四步
if((board[0]==chessCom)&
(board[4]==chessCom)&
(board[6]==chessCom))//必赢
{if(board[2]!
answer=(byte)2;
answer=(byte)3;
(board[2]==chessCom)&
(board[4]==chessCom))//必赢
{if(board[1]!
answer=(byte)1;
answer=(byte)6;
(board[7]==chessCom)&
(board[8]==chessHum)&
answer=(byte)5;
//最后搏一搏人不下3
(board[5]==chessCom)&
(board[4]==chessCom))
{if(board[3]!
//最后搏一搏人不下7
//最后搏一搏人不下6
(board[3]==chessCom)&
{if(board[5]!
(board[1]==chessHum)&
(board[4]==chessHum))//机器抢完两角,人抢中堵后
{if(board[3]==chessHum)
//准备下8否则和棋
if(board[5]==chessHum)
//准备下6否则和棋
if(board[6]==chessHum)
if(board[8]==chessHum)
}
if(depth==1){//先手第五步
(board[5]==chessCom))
answer=(b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北京邮电 大学 智能卡 实验 报告