阅读以下函数说明和C代码,回答问题[说明] 任何一种程序都是为了解决问题而撰写的,解决问题时需要

15 查阅

阅读以下函数说明和C代码,回答问题

[说明]

任何一种程序都是为了解决问题而撰写的,解决问题时需要实现一些特定的运算法则。在策略(Strategy)模式下,可以更换实现算法的部分而不留痕迹,切换整个算法,简化改为采用其他方法来解决同样问题。

以下是一个“剪刀石头布”游戏。猜拳时的“策略”有2种方法:第一种是“猜赢后继续出同样的招式”(WinningStrategy),第二种是“从上一次出的招式种,以概率分配方式求出下一个招式的几率”(ProbStrategy)。程序中定义了Hand类表示猜拳时的“手势”,类内部以0(石头)、1(剪刀)、2(布)来表示。Hand类的实例只会产生3个。

以下是C语言实现,省略了不相关属性及方法,方法实现体亦有所省略,能够正确编译通过。

[C代码]

typedef (1) (*funl)();

enum HandValue{HANDVALUE_GUU=0, HANDVALUE_CHO=1, HANDVALUE_PAA=2};

//手势可取值,依次为“石头”、“剪刀”、“布”

//其大小顺序是循环相克的,即:石头赢剪刀,剪刀赢布,布赢石头

bool won;

struct Hand *WSprevHand;

struct Hand{//手势

enum HandValue handvalue;

}hand[3]={HANDVALUE_GUU, HANDVALUE_CHO, HANDVALUE_PAA};

int fight(struct Hand *h1, struct Hand *h2)

//比较h1和h2。h1代表的手势较大时返回1,h1较小时返回-1,相等时返回0

//

{

if(h1->handvalue == h2->handvalue){

return 0;

}else if((h1->handvalue+1)% (2) == h2>handvalue){

return 1;

}else{

return -1;

}

}

struct Hand* getHand(int handvalue){

//依据手势代表的值取得手势,若handvalue不合法,返回NULL

switch(handvalue){

case 0:

return &hand[0];

break;

case 1:

return &hand[1];

bteak;

case 2;

return &hand[2];

break;

}

return (3) ;

}

struct Strategy{//策略

funl nextHand;//下一个手势

};

struct Hand* WSnextHand()

{

if(!won){

PSprevHand = getHand(rand()%3);

}

return PSprevHand;

}

struct Player{

char name[20];

(4) strategy;//策略

int wincount;

int losecount;

int gamecount;

};

void main()

{

Strategy WS;

WS.nextHand = WSnextHand;

WSpreVHand = NULL;

struct Player WSplayer;

(5)(WSplayer.name,"ww");

WSplayer.wincount = 0;

WSplayer.losecount = 0;

WSplayer.gamecount = 0;

WSplayer.strategy = &WS;

}

参考答案:

struct Hand*3NULLstruct Strategy*strcpystruct Hand*3NULLstruct Strategy*strcpy 解析:条件(h1->handvalue+1)%(2)==h2->handvalue是指h1大于h2,根据手势间大小顺序:石头(0)赢剪刀(1),剪刀(1)赢布(2),布(2)赢石头(0)。可得应填3。例如h1为布(2),h2为石头(0)时,h1->handvalue+1)%(2)的值应为0。所以空(2)填3。 handvalue取值

软考中级