代码实例——猜数字游戏

游戏要求:

1.  电脑⾃动⽣成1~100的随机数
2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束;(也可以加大难度,设置猜数的次数)
想要完成该游戏,首先要创建一个菜单,菜单如下:
    printf("******************\n");
    printf("*****1.猜字游戏***\n");
    printf("*****0.退出*******\n");
    printf("******************\n");

可以将菜单封装起来(meau())然后使用switch语句;

switch (i)
{
case 1:
	game();
	break;
case 0:
	printf("退出\n");
	break;
default:
	printf("输入有误\n");
	break;
}

因为该菜单至少要执行一次(即运行代码就要自动执行一次),因此使用do...while循环,完成框架;

do {
	meau();
	printf("请选择:>");
	scanf("%d", &i);
	switch (i)
	{
	case 1:
		game();
		break;
	case 0:
		printf("退出\n");
		break;
	default:
		printf("输入有误\n");
		break;
	}
}
	
while (i);

meau()函数中封装的就是菜单页面,直接引用就行;

game()函数中封装游戏中主要代码;

想要解决游戏代码问题,需要先解决随机数问题,首先C语言中提供了rand()函数,该函数是随机生成一个伪随机数的.....(具体在个人的gitee仓库2023-10-22中讲过rand、srand以及time函数)first: 学习C语言的终极版本——第一个仓库(first) (gitee.com)

srand((unsigned int)time(NULL));为rand()函数确定一个“种子”,由于srand参数类型是unsigned int而time的返回值是time_t,因此使用了强制类型转换;

解决随机生成的数字问题,剩下的问题就可以轻松化解了,代码如下:

void game() {
	int ret = rand()%100+1;
	int guess = 0;
	while (count)
	{
		printf("请猜数字>:");
		scanf("%d", &guess);
		if (guess > ret) {
			printf("猜大了\n");
		}
		else if (guess < ret) {
			printf("猜小了\n");
		}
		else{
			printf("猜对了\n");
			break;
		}
    }
}

因此,便完成该有趣的小游戏,下面来总结一下重点:

(1)srand((unsigned int)time(NULL));这句代码的位置,是放在main函数里面呢,还是game里面呢;这也是一个易错点,大家可以通过自己运行代码感受一下,如果放在game函数里面,每次生成的随机数ret会非常相近,而且如果手速很快,生成的甚至可能是一样的数。这是因为如果放在game函数中,每次循环都会调用game函数,因此会每次都重新赋一次种子,每次没有必要的,我们只需要给rand函数赋一次种子即可,因此将该代码放在main函数中,在gam函数中直接调用rand函数就行;

(2)添加猜数的次数(增加游戏的趣味性);

大家可以想一想怎么在源代码上修改可以添加该功能;代码如下:

void game() {
	int ret = rand()%100+1;
	int guess = 0;
	int count = 5;
	//printf("%d", ret);
	while (count)
	{
		printf("请猜数字>:");
		scanf("%d", &guess);
		if (guess > ret) {
			printf("猜大了\n");
		}
		else if (guess < ret) {
			printf("猜小了\n");
		}
		else{
			printf("猜对了\n");
			break;
		}
		count--;
	}
	if (count == 0) {
		printf("猜失败了,正确答案是%d", ret);
	}
}

(3)随机数范围;rand的范围是0~RAND_MAX;

该游戏中要求的是0~100,怎么解决的呢,ret%100(任何数%100,都在0~99,因为+1,范围就就变成了0~100);同理得ret%(200-100+1);即可得到规律,ret%(b-a+1),范围是a~b;

易错点:

do...while循环中的while的循环条件是i(即为输入的数字),大家可以进行思考一下.....

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己写的关于猜数字的aspx文件,using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class number : System.Web.UI.Page { private static readonly Random random = new Random(); private static readonly object syncLock = new object(); public static int RandomNumber(int min, int max) { lock (syncLock) { // synchronize return random.Next(min, max); } } public static int i = RandomNumber(1, 100); protected void Page_Load(object sender, EventArgs e) { // Label4.Visible = false; Label3.Visible = false; if (!IsPostBack) { ViewState["timeout"] = 60; } Label4.Text = i.ToString(); } protected void Button1_Click(object sender, EventArgs e) { int j = int.Parse(TextBox1.Text); Label3.Visible = true; if (j >= 1 & j <= 100) { if (j > i) { Label3.Text = "你的输入偏大,请重新输入! "; } else if (j < i) { Label3.Text = "你的输入偏小,请重新输入! "; } else { Label3.Text = "恭喜你,你猜对了!"; } } else { Label3.Text = "输入有误,请重新输入!"; } } protected void Button2_Click(object sender, EventArgs e) { Label4.Visible = true; } protected void Button3_Click(object sender, EventArgs e) { Label4.Text = i.ToString(); TextBox1.Text = ""; Label4.Visible = false; } protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e) { } protected void TextBox1_TextChanged(object sender, EventArgs e) { } protected void Timer1_Tick(object sender, EventArgs e) { var timeout = int.Parse(ViewState["timeout"].ToString()); if(timeout > 0) { Label5 .Text = + timeout + "秒"; ViewState["timeout"] = --timeout; } else { Response.Redirect("任务结束"); } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值