程序设计之四:猜数字(C)
来源:互联网 发布:jira 7源码 编辑:程序博客网 时间:2024/06/06 05:10
近来整理硬盘,偶然找到去年冬天写的猜数字程序,运行时,依旧会出现问题。重新修改后,将它整理于此,供自己日后复习。
首先,我们先来看看这个程序的设计要求:
1、游戏开始,电脑随机产生一个数字不重复的四位数;2、将您猜的数填在框内按回车或者确定按钮提交;3、电脑会将您提交的数与它自动产生的数进行比较,结果显示成"*A*B"。A代表位置正确数字也正确,B代表数字正确但位置不正确,比如:"2A2B"表示您有2个数字的位置正确且数值也正确,除此以外,您还猜对了2个数字,但位置不对;4、您共有15次机会,在15次内,如果结果为“4A0B”,游戏成功。如果15次里您都没有猜对游戏失败。
在了解了规则以后,我考虑了如下的算法:
首先应当由计算机随机生成一个4位的随机数,我给它的约束是每一位都不重复,将这个数载入内存。接着,再定义一个函数Compare,判断玩家输入的数字与随机数每一位的相同情况,并以*A*B的形式将这个值返回玩家。系统自动判断,如果A前面的系数为4,游戏结束,否则,继续前面的过程。
在明白了算法之后,我编写了如下的程序。当然,由于本人能力有限,本程序中仍会存在漏洞。
程序清单如下:
// 猜数字.cpp : 定义控制台应用程序的入口点。///////////////////////////////////////////////////////////////////////作者:钩鸿踏月//版本:2010年2月24日 Ver 1.0// 2011年4月21日 Ver 1.1///////////////////////////////////////////////////////////////////#include <stdlib.h> #include <stdio.h> #include <time.h> /////////////////////////////////////////////////////////////////////函数名:ProduceRandomNumber()//功能:四位随机数的产生,并依次将四个位上的数保存下来void ProduceRandomNumber(int data[4]){ int RandomNumber; do { srand( (unsigned)time( NULL ) ); RandomNumber=(rand()%100)*(rand()%100); data[3]=RandomNumber%10; data[2]=RandomNumber/10%10; data[1]=RandomNumber/100%10; data[0]=RandomNumber/1000%10; }while(RandomNumber<1000||data[0]==data[1]||data[0]==data[2] ||data[0]==data[3]||data[1]==data[2]||data[1]==data[3]|| data[2]==data[3]||data[0]==0); return ;} /////////////////////////////////////////////////////////////////////函数名:Compare()//统计每一次的数字和随机数匹配的结果,并返回int Compare(int Data1[4],int Data2[4]) { int i=0,Count=0; //设置循环变量i和计数变量Count int RIGHT=0,WRONG=0; for(i=0;i<4;i++) { { if(Data1[i]==Data2[i]) RIGHT++;//统计RIGHT的值,即m } for(Count=0;Count<4;Count++) if(Count!=i) { if(Data1[i]==Data2[Count]) WRONG++;//统计WRONG的值,即n } } printf("%dA%dB\n",RIGHT,WRONG); //输出mAnB的结果 return(RIGHT); /返回RIGHT的值} /////////////////////////////////////////////////////////////////////主函数,程序开始执行int main(){ int data[4],i; //定义data[4],用于保存随机数 int CHOOSE,RIGHT; int Count=0,Guess[4]; ProduceRandomNumber(data); //生成随机数 printf("猜数字游戏,Release 2011.4.21,Ver:1.1\n"); printf("欢迎进入猜数字游戏,现在请输入您的答案:\n"); for(i=0;i<4;i++) scanf("%1d",&Guess[i]); //玩家输入 while(Count<8) {//判断输入的数字每一位是否相同,给出相应的操作 if(Guess[0]==Guess[1]||Guess[0]==Guess[2]||Guess[0]==Guess[3] ||Guess[1]==Guess[2]||Guess[1]==Guess[3]||Guess[2]==Guess[3]) { Count++; printf("您的输入不合法,并且您浪费了一次机会,请继续输入:\n"); for(i=0;i<4;i++) scanf("%1d",&Guess[i]); continue; } else { RIGHT=Compare(data,Guess); if(RIGHT==4) { printf("恭喜,你猜对了!);break; } else { Count++; printf("很遗憾,您没有猜对。请输入您的答案:\n"); for(i=0;i<4;i++) scanf("%1d",&Guess[i]); } continue; } } if(Count==8) //当猜了8次后,提示 { printf("你已经猜了8次了,还要继续吗?(1:yes/0:false)"); scanf("%d",&CHOOSE); } if(CHOOSE==1) //选择1,则继续,反之,退出程序 { for(i=0;i<4;i++) scanf("%1d",&Guess[i]); while(Count<15) //当次数小于15次时,继续进行游戏 {//判断输入的数字每一位是否相同,给出相应的操作 if(Guess[0]==Guess[1]||Guess[0]==Guess[2]||Guess[0]==Guess[3] ||Guess[1]==Guess[2]||Guess[1]==Guess[3]||Guess[2]==Guess[3]) { Count++; printf("您的输入不合法,并且您浪费了一次机会,请继续输入:\n"); for(i=0;i<4;i++) scanf("%1d",&Guess[i]); continue; } else { RIGHT=Compare(data,Guess); if(RIGHT==4) { printf("恭喜,你猜对了!\n");break; } else { Count++; printf("很遗憾,您没有猜对。请输入您的答案:\n"); for(i=0;i<4;i++) scanf("%1d",&Guess[i]); } continue; } } if(Count==15) //15次满后,自动结束游戏 printf("你已经猜了15次啦,是不是方法不对啊?休息一会再来玩吧!\n"); } else printf("游戏结束!n"); system("pause");}
2011年4月22日星期五
- 程序设计之四:猜数字(C)
- 标准C程序设计(四)
- C语言基础知识之(四):C语言中涉及的数字问题
- 《Windows程序设计》之数字时钟
- 《Windows程序设计》之数字时钟
- 《Objective-C程序设计(第四版)》读书笔记(四)
- 《Windows程序设计》读书笔记之四
- C++“窗口”程序设计启蒙(之二)
- C++“窗口”程序设计启蒙(之二)
- C程序设计之四书五经
- C程序设计之四书五经
- C程序设计之四书五经
- C程序设计之四书五经
- C程序设计之四书五经
- C程序设计之指针
- 汇编语言程序设计(四)
- Windows程序设计(四)
- 程序结构&&程序设计(四)
- Redis加Node.js的全文搜索引擎 Reds在Ubuntu下面 的安装
- Ascii
- rails server error
- Linux进程内存映射
- Linux下的IPC-信号量的使用
- 程序设计之四:猜数字(C)
- Android自动测试之monkeyrunner工具
- 创业型公司或发展中公司请不要随意给员工开空头支票~~!!!
- 模块静态编译到内核和编译成模块实例
- 2011各大知名IT公司校园招聘研发类薪资待遇概述
- 平时收集的SQL用法
- 【数学建模集训系列】眼科病床安排问题——优先级调度
- 图书MYSQL
- VisionMobile: 开放管控指数(六) -- 开源管控:MeeGo