【C语言】猜数字小游戏详细教程
共 13655字,需浏览 28分钟
·
2022-01-13 06:35
游戏效果
先带大家看下游戏效果,
1.首页面
2.模式选择页面
3.游戏页面
4.成功页面
项目源码分享
注:VS2019编译器不能用scanf,若想用要在第一行加上下面的代码
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
void gotoxy(short x, short y); //将光标移动到指定位置
void date(); //时间函数
void Menu(); //游戏首页面
void menu1(); //游戏模式选择页面
void menu2(); //魔鬼模式页面
void menu3(); //变态模式页面
void quit(); //游戏结束页面
void fault(); //错选提示
void win(); //获胜页面
void fail(); //失败页面
void game1(); //简单模式
void game2(); //正常模式
void game3(); //魔鬼模式
void game4(); //变态模式
void pattern(); //模式选择程序
int main()
{
system("COLOR 0A");
int input = 0;
srand((unsigned int)time(0));
do
{
system("cls"); //清屏
date(); //打印时间。
Menu(); //打印菜单
gotoxy(54, 25); //将光标定位
printf("请选择->");
while (scanf("%d", &input) != EOF)
{
getchar();
if (input == 1 || input == 2)
break;
fault();
Sleep(1500);
system("cls"); //清屏
date(); //打印时间。
Menu(); //打印菜单
gotoxy(54, 25); //将光标定位
printf("请选择->");
}
switch (input)
{
case 1:
pattern();
break;
//case 2:
// system("cls"); //清屏
// date();
// rule();
// break;
case 2:
system("cls"); //清屏
quit();
Sleep(3000);
exit(0);
break;
//default:
// //system("cls"); //清屏
// fault();
// Sleep(1500);
// break;
}
} while (1);
return 0;
}
void gotoxy(short x, short y)
{
COORD coord = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void date() //显示当前日期
{
printf("\n当前日期:");
system("date/t");
printf("当前时间:");
system("time/t");
}
void Menu() {
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入猜数字小游戏 * ▓\n");
printf("\n########################################################################################################################\n");
printf("\n ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf(" |◆|******|◆| |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 开始游戏 请按 1 |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 退出游戏 请按 2 |◆|******|◆|\n");
printf(" |◆|******|◆| |◆|******|◆|\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ************************* ▓\n");
printf("\n########################################################################################################################\n");
}
void menu1() {
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎使用 * ▓\n");
printf("\n########################################################################################################################\n");
printf("\n ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf(" |◆|******|◆| |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 简单模式 请按 1 |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 正常模式 请按 2 |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 魔鬼模式 请按 3 |◆|******|◆|\n");
printf(" |◆|******|◆| ☆ 变态模式 请按 4 |◆|******|◆|\n");
printf(" |◆|******|◆| |◆|******|◆|\n");
printf(" ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ************************* ▓\n");
printf("\n########################################################################################################################\n");
}
//*******************************************************************************************************************
//game3页面
void menu2()
{
system("cls"); //清屏
date(); //打印时间。
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入魔鬼模式 * ▓\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ☆规则:系统随机生成一组0到9不重复的数,具体生成几个由玩家设定 ▓\n");
printf("\n▓ ☆规则:玩家需要输入和系统顺序一致且数字相同的数,即可获胜。 ▓\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ☆提示:A表示数字和位置都正确,B代表只有数字正确,顺序不对。 ▓\n");
printf("\n▓ ☆提示: 字母前面的数字表示个数 ▓\n");
printf("\n########################################################################################################################\n");
}
//*******************************************************************************************************************
//game4页面
void menu3()
{
system("cls"); //清屏
date(); //打印时间。
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入魔鬼模式 * ▓\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ☆规则:系统随机生成一组0到19不重复的数,具体生成几个由玩家设定 ▓\n");
printf("\n▓ ☆规则:玩家需要输入和系统顺序一致且数字相同的数,即可获胜。 ▓\n");
printf("\n########################################################################################################################\n");
printf("\n▓ ☆提示:A表示数字和位置都正确,B代表只有数字正确,顺序不对。 ▓\n");
printf("\n▓ ☆提示: 字母前面的数字表示个数 ▓\n");
printf("\n########################################################################################################################\n");
}
//*******************************************************************************************************************
//结束页面
void quit()
{
printf("\n\n");
printf("########################################################################################################################\n");
printf("### ###\n");
printf("### \t\t\t||================================================================||\t\t\t ###\n");
printf("### \t\t\t|| *猜数字小游戏* ||\t\t\t ###\n");
printf("### \t\t\t||================================================================||\t\t\t ###\n");
printf("### \t\t\t|| ☆☆☆☆☆☆☆☆☆☆ ||\t\t\t ###\n");
printf("### \t\t\t|| ☆ ☆ ||\t\t\t ###\n");
printf("### \t\t\t|| ☆☆ 欢迎玩家下次挑战 ☆☆ ||\t\t\t ###\n");
printf("### \t\t\t|| ☆ ☆ ||\t\t\t ###\n");
printf("### \t\t\t|| ☆☆☆☆☆☆☆☆☆☆ ||\t\t\t ###\n");
printf("### \t\t\t|| ||\t\t\t ###\n");
printf("### \t\t\t||================================================================||\t\t\t ###\n");
printf("### \t\t\t||================================================================||\t\t\t ###\n");
printf("### ###\n");
printf("########################################################################################################################\n");
}
//*******************************************************************************************************************
//错选提示
void fault()
{
printf("\n\n *********************************************** \n");
printf(" ▓ $#$ 选择错误,重新选择 $#$ ▓\n");
printf("\n *********************************************** \n");
}
//*******************************************************************************************************************
//成功页面
void win()
{
printf("\n\n\n\n\n\n");
printf(" \t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf(" \t\t\t|#| |#|\n");
printf(" \t\t\t|#| ☆☆☆☆☆☆☆☆☆☆ |#|\n");
printf(" \t\t\t|#| ☆ ☆ |#|\n");
printf(" \t\t\t|#| ☆☆ 恭喜你,挑战成功! ☆☆ |#|\n");
printf(" \t\t\t|#| ☆ ☆ |#|\n");
printf(" \t\t\t|#| ☆☆☆☆☆☆☆☆☆☆ |#|\n");
printf("\t\t\t|#| |#|\n");
printf("\t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
system("COLOR 0A");
}
//*******************************************************************************************************************
//失败页面
void fail()
{
printf("\n\n\n\n\n\n");
printf(" \t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
printf(" \t\t\t|#| |#|\n");
printf(" \t\t\t|#| ☆☆☆☆☆☆☆☆☆☆ |#|\n");
printf(" \t\t\t|#| ☆ ☆ |#|\n");
printf(" \t\t\t|#| ☆☆ 挑战失败! ☆☆ |#|\n");
printf(" \t\t\t|#| ☆ ☆ |#|\n");
printf(" \t\t\t|#| ☆☆☆☆☆☆☆☆☆☆ |#|\n");
printf("\t\t\t|#| |#|\n");
printf("\t\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
}
//*******************************************************************************************************************
//简单模式
void game1()
{
system("cls"); //清屏
date(); //打印时间。
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入简单模式 * ▓\n");
printf("\n▓ * 在1-100之间系统会随机生成一个数字 * ▓\n");
printf("\n▓ * 请用户猜该数字 * ▓\n");
printf("\n########################################################################################################################\n");
int n = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("\n▓#$请猜数字:>");
scanf("%d", &guess);
if (guess < n)
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜小了 $# ▓\n");
printf("\n **************************************** \n");
}
else if (guess > n)
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜大了 $# ▓\n");
printf("\n **************************************** \n");
}
else
{
system("COLOR 04");
system("cls"); //清屏
date(); //打印时间。
win();
break;
}
}
}
//*******************************************************************************************************************
//正常模式
void game2()
{
LOOP:date(); //打印时间。
system("COLOR A0");
system("cls"); //清屏
date(); //打印时间。
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入正常模式 * ▓\n");
printf("\n########################################################################################################################\n");
printf("\n▓ * 提醒:这是个镜像世界 * ▓\n");
printf("\n########################################################################################################################\n");
int n = rand() % 100 + 1;
int guess = 0;
int i = 0, k = 1, s;
printf("\n▓#$请输入挑战次数:>");
scanf("%d", &s);
for (i = 0; i < s; i++)
{
printf("\n▓#$请猜数字:>");
scanf("%d", &guess);
if (guess < n)
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜大了 $# ▓\n");
printf("\n **************************************** \n");
}
else if (guess > n)
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜小了 $# ▓\n");
printf("\n **************************************** \n");
}
else
{
system("COLOR 04");
system("cls"); //清屏
date(); //打印时间。
win();
k = 0;
break;
}
}
if (k)
{
system("cls"); //清屏
date(); //打印时间。
win();
Sleep(3000);
printf("\n ************************************ \n");
printf("\n ▓ $#$ 嘻嘻,逗你呢! $#$ ▓\n");
printf("\n ************************************ \n");
Sleep(3000);
goto LOOP;
}
}
//*******************************************************************************************************************
//魔鬼模式
void game3()
{
int acount, bcount, n = 0, i, j, k = 0, flag, a[10], b[10];
do
{
menu2();
printf("\n▓ #$请输入要猜几个数字(1);
while (n <= 1 || n > 10)
scanf("%d", &n);
flag = 0;
for (i = 0; i < n; i++)
{
a[i] = rand() % 10; //每次产生0-9范围内任意的一个随机数字并存到数组a中
}
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] == a[j]) //判断数组a中是否有相同数字
{
flag = 1; //若有上述情况则标志位置1
break;
}
}
}
//for (i = 0; i < n; i++)
// printf("%d ", a[i]);
//printf("\n");
} while (flag == 1); //若标志位为1则重新分配数据
do
{
k++; //记录猜数字的次数
acount = 0; //每次猜的过程中位置和数字都正确的个数
bcount = 0; //每次猜的过程中位置不正确但数字正确的个数、
printf("\n▓#$请猜%d个数,用空格分开:>", n);
for (i = 0; i < n; i++)
{
scanf("%d", &b[i]); //输入猜测的数据到数组b中
getchar();
}
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (a[i] == b[i]) //检测输入的数据与计算机分配的数据相同且位置相同的个数
{
acount++;
break;
}
if (a[i] == b[j] && i != j) //检测输入的数据与计算机分配的数据相同但位置不同的个数
{
bcount++;
break;
}
}
printf("▓#$提示:%dA , %dB\n\n", acount, bcount);
if (acount == n)
{
system("COLOR 04");
system("cls"); //清屏
date(); //打印时间。
win();
break;
}
} while (1);
}
//*******************************************************************************************************************
//变态模式
void game4()
{
int acount, bcount, i, j, k = 0, flag, a[20], b[20], n = 0;
do
{
menu3();
printf("\n▓ #$请输入要猜几个数字(5);
while (n <= 5 || n >= 20)
scanf("%d", &n);
flag = 0;
for (i = 0; i < n; i++)
{
a[i] = rand() % 20; //每次产生0-19范围内任意的一个随机数字并存到数组a中
}
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (a[i] == a[j]) //判断数组a中是否有相同数字
{
flag = 1; //若有上述情况则标志位置1
break;
}
}
}
//for (i = 0; i < n; i++)
// printf("%d ", a[i]);
//printf("\n");
} while (flag == 1); //若标志位为1则重新分配数据
do
{
k++; //记录猜数字的次数
acount = 0; //每次猜的过程中位置和数字都正确的个数
bcount = 0; //每次猜的过程中位置不正确但数字正确的个数、
printf("\n▓#$请猜%d个数,用空格分开:>", n);
for (i = 0; i < n; i++)
{
scanf("%d", &b[i]); //输入猜测的数据到数组b中
getchar();
}
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (a[i] == b[i]) //检测输入的数据与计算机分配的数据相同且位置相同的个数
{
acount++;
break;
}
if (a[i] == b[j] && i != j) //检测输入的数据与计算机分配的数据相同但位置不同的个数
{
bcount++;
break;
}
}
printf("▓#$提示:%dA , %dB\n\n", acount, bcount);
if (acount == n)
{
system("COLOR 04");
system("cls"); //清屏
date(); //打印时间。
win();
break;
}
} while (1);
}
//*******************************************************************************************************************
//模式选择页面
void pattern()
{
int input1 = 0, n = 0;
char s = 0;
do
{
system("cls"); //清屏
date();
menu1();
gotoxy(54, 25);
printf("请选择->");
while (scanf("%d", &input1) != EOF)
{
getchar();
if (input1 >= 1 && input1 <= 4)
break;
fault();
Sleep(1500);
system("cls"); //清屏
date();
menu1();
gotoxy(54, 25);
printf("请选择->");
}
switch (input1)
{
case 1:
game1();
goto LINK;
case 2:
game2();
goto LINK;
case 3:
game3();
goto LINK;
case 4:
game4();
goto LINK;
}
} while (1);
LINK:printf("\n\n *********************************************** \n");
printf(" ▓ $#$ 按ENTER键进入、返回主菜单 $#$ ▓\n");
printf("\n *********************************************** \n");
getchar();
while ((s = getchar()) != '\n')
{
;
}
}
分步讲解以下为代码块,在编译器上不能执行,只用于理解
一、主函数
int main()
{
system("COLOR 0A"); //改变字体背景颜色
int input = 0;
srand((unsigned int)time(NULL)); //设置随机种子
do
{
system("cls"); //清屏
date(); //打印时间。
Menu(); //打印菜单
gotoxy(54, 25); //将光标定位
printf("请选择->");
while (scanf("%d", &input) != EOF) //处理当用户输入信息为字母或其他数字的bug
{
getchar();
if (input == 1 || input == 2)
break;
fault();
Sleep(1500); //程序停止运行,vs2019的单位是毫秒。
system("cls"); //清屏
date(); //打印时间。
Menu(); //打印菜单
gotoxy(54, 25); //将光标定位
printf("请选择->");
}
switch (input)
{
case 1:
pattern(); //进入模式选择页面
break;
case 2:
system("cls"); //清屏
quit(); //进入游戏结束页面
Sleep(3000);
exit(0); //程序结束。
break;
}
} while (1); //能多次玩游戏
return 0;
}
1)system("COLOR 0A");
system头文件
其中COLOR后面的0是背景色代号,A是前景色代号
颜色代号
0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 淡蓝色 A 淡绿色 B 淡浅绿色 C 淡红色 D 淡紫色 E 淡黄色 F 亮白色
2)srand((unsigned int)time(NULL));srand()函数用来设置算法的种子,time(NULL)返回当前的时间,先调用srand(time(NULL))是把当前的时间作为种子,使程序每次运行产生不同的随机数序列。
3)system("cls"); //清屏
gotoxy(54, 25) //光标定位1、在 Turbo C 或 Borland C 中可以使用 gotoxy 函数,包含在头文件 conio.h中。
2、而在 Visual C++ 或 GCC 中使用 gotoxy 函数,就需要把上面自定义的 gotoxy 函数写在自己的程序中。
下面这个 C 程序将在屏幕中第5行10列(横向为X,纵向为Y轴)中央输出“你好 陌生人”
#include
#include
void gotoxy(short x, short y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int main(void) {
gotoxy(10, 5);
printf("你好 陌生人\n");
return 0;
}
来源于百度gotoxyhttps://baike.baidu.com/item/gotoxy/2986529?fr=aladdin
5)Sleep()Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。
windows下的Sleep函数,首字母大写 #include
linux下的sleep函数,首字母小写 #include
sleep函数https://baike.baidu.com/item/Sleep%E5%87%BD%E6%95%B0
6)exit(0);exit(0)的意思指的是正常状态退出。
exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出。退出程序,括号中的0表示程序的退出返回代码,无实际意义。exit()就是退出 , 0就是返回的参数, 也可以返回 1 -1 等 你可以用来判断函数是否正确返回
二、pattern子函数
void pattern()
{
int input1 = 0, n = 0;
char s = 0;
do
{
system("cls"); //清屏
date(); //显示日期
menu1();
gotoxy(54, 25);
printf("请选择->");
while (scanf("%d", &input1) != EOF)
{
getchar();
if (input1 >= 1 && input1 <= 4)
break;
fault();
Sleep(1500);
system("cls"); //清屏
date();
menu1();
gotoxy(54, 25);
printf("请选择->");
}
switch (input1)
{
case 1:
game1();
goto LINK;
case 2:
game2();
goto LINK;
case 3:
game3();
goto LINK;
case 4:
game4();
goto LINK;
}
} while (1);
LINK:printf("\n\n *********************************************** \n");
printf(" ▓ $#$ 按ENTER键进入、返回主菜单 $#$ ▓\n");
printf("\n *********************************************** \n");
getchar();
while ((s = getchar()) != '\n')
{
;
}
}
1)goto语句goto (无条件转换语句)函数可以出现在程序的任意一条语句之前,
一般形式:
goto 标号 ;
标号 : 语句;程序可直接由goto跳的标号的那一个语句。
三、简单模式
void game1()
{
system("cls"); //清屏
date(); //打印时间。
printf("\n########################################################################################################################\n");
printf("\n▓ * 欢迎进入简单模式 * ▓\n");
printf("\n▓ * 在1-100之间系统会随机生成一个数字 * ▓\n");
printf("\n▓ * 请用户猜该数字 * ▓\n");
printf("\n########################################################################################################################\n");
int n = rand() % 100 + 1; //去1——100之间的随机变量赋值给n
int guess = 0;
while (1)
{
printf("\n▓#$请猜数字:>");
scanf("%d", &guess);
if (guess < n) //猜的数比系统产生的数小。
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜小了 $# ▓\n");
printf("\n **************************************** \n");
}
else if (guess > n) //猜的数比系统产生的数大。
{
printf("\n **************************************** \n");
printf("\n ▓ #$ 猜大了 $# ▓\n");
printf("\n **************************************** \n");
}
else //猜对了,
{
system("COLOR 04"); //换颜色
system("cls"); //清屏
date(); //打印时间。
win();
break;
}
}
}
「游戏设置思路」先由系统产生一个随机数。用个变量先存起来。再设个变量来存玩家猜的数,然后让再让这两数比较不同给出提示,相同则游戏通过。
注意:猜错了的提示不要弄反,猜错了之后不要结束程序要有循环让玩家继续猜。
四、魔鬼模式
void game3()
{
int acount, bcount, n = 0, i, j, k = 0, flag, a[10], b[10];
do
{
menu2(); //打印魔鬼模式的界面
printf("\n▓ #$请输入要猜几个数字(1);
while (n <= 1 || n > 10)
scanf("%d", &n);
flag = 0;
for (i = 0; i < n; i++) //把随机生成的数存到数组a中
{
a[i] = rand() % 10; //每次产生0-9范围内任意的一个随机数字并存到数组a中
}
for (i = 0; i < n - 1; i++) //若有一样的数,重新分配数字。
{
for (j = i + 1; j < n; j++)
{
if (a[i] == a[j]) //判断数组a中是否有相同数字
{
flag = 1; //若有上述情况则标志位置1
break;
}
}
}
//for (i = 0; i < n; i++) //用来打印出产生的a数组,
// printf("%d ", a[i]);
//printf("\n");
} while (flag == 1); //若标志位为1则重新分配数据
do
{
k++; //记录猜数字的次数
acount = 0; //每次猜的过程中位置和数字都正确的个数
bcount = 0; //每次猜的过程中位置不正确但数字正确的个数、
printf("\n▓#$请猜%d个数,用空格分开:>", n);
for (i = 0; i < n; i++)
{
scanf("%d", &b[i]); //输入猜测的数据到数组b中
getchar();
}
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (a[i] == b[i]) //检测输入的数据与计算机分配的数据相同且位置相同的个数
{
acount++;
break;
}
if (a[i] == b[j] && i != j) //检测输入的数据与计算机分配的数据相同但位置不同的个数
{
bcount++;
break;
}
}
printf("▓#$提示:%dA , %dB\n\n", acount, bcount);
if (acount == n) //玩家猜的数组与系统产生的一样,游戏通过
{
system("COLOR 04");
system("cls"); //清屏
date(); //打印时间。
win();
break;
}
} while (1);
}
「1)游戏设置思路」先让玩家输入一个数字作为产生数组a的个数,例如:输入5,就产生5的随机数并存到数组a中。
玩家在输入一组数存到数组b中,让数组b与a比较完全相同则游戏通过
提示A:顺序与数字相同 B顺序不对,但系统生成的随机数里有这个数字。
来源:https://blog.csdn.net/weixin_62263267/article/details/122389955
仅供大家学习参考与知识传播,版权归原作者所有,如有侵权,麻烦联系进行删除,感谢~
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧