从编程角度看抽象之美-刽子手游戏

今天做了一个编程竞赛题目,可能我自己的层次有点低(看官不要嘲笑,哈哈)觉得它很好的体现了具体问题抽象为编程语言的过程.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

刽子手游戏(Hangman Judge,UVa 489)

问题描述:

刽子手游戏其实是一款猜单词游戏、游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母。如果单词里有那个字母,所有该字母会显示出来。

如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔。这幅画一共需要7笔就能完成,因此你最多只能错6次。

注意,猜一个已经猜过的字母也算错。 

在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了(Youwin.)、输了(You lose. )还是放弃了(You chickened out.)。

每组数据包含了行,第1行是游戏编号(-1 为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

问题的抽象具体化,在编程中:从变量的定义开始.

1.记录玩家猜对的个数不如记录玩家还需猜对几个,解决问题其实就是一步步推进的过程.int left;

2.记录玩家猜错的个数不如记录玩家还剩多少机会,int chance;

3.记录玩家最后的状态,胜利,失败,放弃.int win,lose;

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

程序框架的编码(自上而下方式)

#include <stdio.h>
#include <string.h>
#define  maxn 100

int left,chance;//定义为全局变量,因为在函数中这些变量还要用到,在一直处于变化中,所以实时记录这些值必用全局
int win,lose;
char s[maxn],s2[maxn];//电脑,玩家

void guess(char ch)   {...}

int main(){
int rnd;
while(scanf("%d%s%s",&rnd,s,s2)==3&&rnd!=-1){
printf("Round %d\n",rnd);
win=lose=0;//初始化为0,表示还不知道输赢.之后可转为1
left=strlen(s);
chance=7;//初始化为最大值,满血状态
for(int i=0;i<strlen(s2);i++){//第一层循环,玩家猜的每一个字母
guess(s2[i]);//核心函数
if(win||lose) break;//每比对一次就马上检查状态
}
if(win) printf("You win.\n");
else if(lose) printf("You lose.\n");
else printf("You chickened out.\n");
}
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

guess核心函数编写

问题的抽象具体化,在编程中:在变量的控制其逻辑变化中进行.

1.比对错误,则机会减一,chance--;

2.比对正确,则还需猜对的个数减一,left--;

3.比对正确,因为题目中说猜一个已经猜过的字母也算错,所以直接给答案中的该字母赋值为空,下一个又来比对这个字母则判错.s[i]=' ';

两个字符串对比的过程,可转化为两重for循环,一个字母(玩家猜测字符串)一个字母(答案字符串)对比.

问题的抽象具体化,在编程中:以达到变量的结束状态而结束.

机会用尽,chance=0.输出失败(lose=1)
还需猜对0个,left=0,输出成功(win=1)

void guess(char ch)
{
int bad=1;//表示比对的状态,0为成功
for(int i=0;i<strlen(s);i++)
if(s[i]==ch)
{
left--;s[i]=' ';bad=0;//抽象之美
}
if(bad) chance--;
if(!chance) lose=1;
if(!left) win=1;
}

--------------------------------------------------------------------------------------结束-----------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值