文章目录
游戏效果
我们在写任何一个小项目之前先要明确自己要实现的效果
所以猜数字游戏能实现什么效果呢?
顾名思义,猜数字游戏就是让系统随机生成一个数字,由玩家来猜,之后系统反馈信息,猜大了还是猜小了,逐一减少默认数字的范围之后,最终锁定目标。
- 电脑随机给出一个目标数字,玩家进行猜测
- 电脑会根据玩家猜测的数字,提示猜大了还是小了
- 直到猜对为止,一轮游戏结束.
- 游戏结束会询问是否继续.1代表继续,0代表停止游戏.
其实简单的猜数字游戏到这里的话就已经可以了
但是我们可以增加一些其他的功能
首先我们可以再设置一下游戏的难度
- 游戏共有3中模式(简单、普通、困难)
- 简单模式:猜25次
- 普通模式:猜15次
- 困难模式:猜5次
除了增加游戏的难度以外,还可以再增加战绩查询模块
- 游戏会记录你的战绩,并存储,当你玩完一把以后,可以在菜单中按2表示查询战绩.
游戏结构
清楚的知道了想要实现的目标,那我们开始搭建逻辑结构.
所以逻辑结构是啥呢?
- 游戏开始会有一个菜单提示,然后让你选择
- 输入0代表退出游戏
- 输入1代表开始游戏
- 输入2代表查询战绩
- 输入其他数字提示输入错误
代码实现
为了实现游戏的基本功能,我们应该有一个游戏菜单,通过菜单玩家可以选择是进入游戏还是退出游戏,且为了可以使该游戏可以反复玩,这个过程应该是一个循环,选择退出游戏时就打破这个循环。为了使代码具有条理性我们定义唯一的主函数,然后按功能写子函数,让每一个子函数都有其意义。
所以我们这个项目的整个设计逻辑结构如下:
- 菜单函数:
menu()
- 游戏函数:
game()
- 游戏模式函数:
model()
- 保存战绩函数:
save()
- 查询战绩函数:
find()
主函数
因为程序从主函数开始运行,到主函数结束时结束,所以主函数应该起到搭建整个游戏基本框架的功能
代码如下:
int main() { int input = 0; do { menu(); printf("请选择:> "); scanf("%d", &input); switch (input) { case 0: printf("成功退出游戏\n"); break; case 1: game(); //玩游戏函数 save(); //保存战绩函数 break; case 2: find(); //查询战绩函数 break; default: printf("输入错误,请重新输入!\n"); } } while (input); return 0; }
菜单函数
菜单功能十分简单
代码示例如下:
void menu() { printf("\n************Welcome To My Game's World*****************\n"); printf("*******************************************************\n"); printf("******************* 0. 退出游戏 *********************\n"); printf("******************* 1. 开始游戏 *********************\n"); printf("******************* 2. 查询战绩 *********************\n"); printf("*******************************************************\n"); }
游戏函数
玩家选择好游戏模式以后,电脑首先会给出一个玩家需要猜的数字(我设置的是1~1000)
玩家开始猜,假如猜大了,系统会提示“猜大了”;假如猜小了,系统会提示“猜小了”;
并且每猜测一次,都会提示还剩余几次机会
为了使整个游戏看起来比较生动,我用了一些比较搞怪的话哈哈哈
void game() { srand(time(NULL)); //随机数生成器 int r = rand() % 1001; //r % 1001 --> 表示生成的随机数范围是:1~1000 int input = 0; //input 代表你输入的猜测的数字 int num = 0; //num代表猜测剩余次数 num = model(); //游戏模式函数 while (1) { printf("\n请输入你猜的数字(0-1000):> "); scanf("%d", &input); if (num == 0) { break; } if (input > r) { printf("\n猜大了,再猜猜\n"); } else if (input < r) { printf("\n猜小了,再猜猜\n"); } else { printf("恭喜你,猜对了\n"); break; } num--; printf("\n加油,你还剩余%d次机会哟\n", num); } if (!num) { printf("\n闯关失败,你不行啊!简直弱爆了!!!\n"); computer++; //标记电脑的战绩 } else { printf("你真的太棒了!!!\n"); player++; //标记玩家战绩 } printf("\n你是否还想继续游戏呢?\n"); //这一步是提醒玩家是否继续 }
关于随机数
生成随机数的方法:
C语言生成随机数要用rand
函数
但是单单使用rand()
函数来生成随机数是不行的,因为它每玩一次生成的随机数都是相同的,即随机数不随机,所以要通过srand()
函数,种下一个随机种子,来产生随机数。
根据时间每时每刻都是变化的,可以用time()
时间函数来产生种子。
这里time_t
的类型就是在C语言中被定义为长整型,而srand()
函数的参数类型为unsigned int (无符号整形)
,所以使用时要强制类型转换,而且time()
函数,不需要设置参数,故用NULL
代替。
游戏模式函数
int model() { int i = 0; int num = 0; printf("请输入游戏模式:1.简单 2.普通 3.困难\n请选择相应的模式:> "); scanf("%d", &i); if (i == 1) { easy(); num = 25; } else if (i == 2) { medium(); num = 15; } else { hard(); num = 5; } return num; }
保存战绩函数
这个的目标是无论啥时候打开游戏,都会记录之前玩过的成绩
void save() { FILE* fp = fopen("grade.txt", "w"); if (fp == NULL) { exit(-1); } else { fprintf(fp, "computer : player = %d : %d\n", computer, player); } fclose(fp); }
查询战绩函数
void find() { FILE* fp = fopen("grade.txt", "r"); int a = 0, b = 0; char p[60] = { 0 }; if (fp == NULL) { exit(-1); } else { fgets(p, 60, fp); printf("%s\n", p); } fclose(fp); printf("是否继续游戏?\n"); }
整体代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int computer = 0; //电脑的战绩 int player = 0; //玩家的战绩 void menu() { printf("\n************Welcome To My Game's World*****************\n"); printf("*******************************************************\n"); printf("******************* 0. 退出游戏 *********************\n"); printf("******************* 1. 开始游戏 *********************\n"); printf("******************* 2. 查询战绩 *********************\n"); printf("*******************************************************\n"); } int model() { int i = 0; int num = 0; printf("请输入游戏模式:1.简单 2.普通 3.困难\n请选择相应的模式:> "); scanf("%d", &i); if (i == 1) { num = 25; } else if (i == 2) { num = 15; } else { num = 5; } return num; } void game() { srand(time(NULL)); int r = rand() % 1001; int input = 0; //input 代表游戏猜测的数字 int num = 0; //num代表猜测剩余次数 num = model(); //游戏模式函数 while (1) { printf("\n请输入你猜的数字(0-1000):> "); scanf("%d", &input); if (num == 0) { break; } if (input > r) { printf("\n猜大了,再猜猜\n"); } else if (input < r) { printf("\n猜小了,再猜猜\n"); } else { printf("恭喜你,猜对了\n"); break; } num--; printf("\n加油,你还剩余%d次机会哟\n", num); } if (!num) { printf("\n闯关失败,你不行啊!简直弱爆了!!!\n"); computer++; //标记电脑的战绩 } else { printf("你真的太棒了!!!\n"); player++; } printf("\n你是否还想继续游戏呢?\n"); //这一步是提醒玩家是否继续 } void find() { FILE* fp = fopen("grade.txt", "r"); int a = 0, b = 0; char p[60] = { 0 }; if (fp == NULL) { exit(-1); } else { fgets(p, 60, fp); printf("%s\n", p); } fclose(fp); printf("是否继续游戏?\n"); } void save() { FILE* fp = fopen("grade.txt", "w"); if (fp == NULL) { exit(-1); } else { fprintf(fp, "computer : player = %d : %d\n", computer, player); } fclose(fp); } int main() { int input = 0; do { menu(); printf("请选择:> "); scanf("%d", &input); switch (input) { case 0: printf("成功退出游戏\n"); break; case 1: game(); //玩游戏函数 save(); //保存战绩函数 break; case 2: find(); //查询战绩函数 break; default: printf("输入错误,请重新输入!\n"); } } while (input); return 0; }
动画演示
我们来看下游戏运行的效果把!!!
其实到了这里的话就基本已经完工了!!!
但是,我觉得选择模式哪里太单调了,想来点不一样的,于是乎!骚操作来了!
升级版
我在游戏模式函数model()
里面,又分别在对应的简单、普通、困难模式里面添加了3个函数
当你选择简单模式时,屏幕会清屏然后慢慢的打印出一句欢迎语!就像这样!
普通和困难模式也一样
我们来看看效果!
简单模式函数
void easy() { char arr1[] = "The Game is about to enter easy mode"; char arr2[] = "####################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("只有菜鸡才会选择简单模式!\n"); return 0; }
普通模式函数
void medium() { char arr1[] = "The Game is about to enter medium mode"; char arr2[] = "######################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("哎哟!你终于不玩简单模式了呀?\n"); return 0; }
困难模式函数
void hard() { char arr1[] = "The Game is about to enter hard mode"; char arr2[] = "####################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("这可不是一般的难哦!拿出你的实力让我看看吧!\n"); return 0; }
注意:需要引用头文件:#include <windows.h>
添加游戏模式函数
int model() { //char str[20] = { 0 }; int i = 0; int num = 0; printf("请输入游戏模式:1.简单 2.普通 3.困难\n请选择相应的模式:> "); scanf("%d", &i); if (i == 1) { easy(); //简单模式函数 num = 25; } else if (i == 2) { medium(); //普通模式函数 num = 15; } else { hard(); //困难模式函数 num = 5; } return num; }
升级版完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> int computer = 0; //电脑的战绩 int player = 0; //玩家的战绩 void menu() { printf("\n************Welcome To My Game's World*****************\n"); printf("*******************************************************\n"); printf("******************* 0. 退出游戏 *********************\n"); printf("******************* 1. 开始游戏 *********************\n"); printf("******************* 2. 查询战绩 *********************\n"); printf("*******************************************************\n"); } void easy() { char arr1[] = "The Game is about to enter easy mode"; char arr2[] = "####################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("只有菜鸡才会选择简单模式!\n"); } void medium() { char arr1[] = "The Game is about to enter medium mode"; char arr2[] = "######################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("哎哟!你终于不玩简单模式了呀?\n"); } void hard() { char arr1[] = "The Game is about to enter hard mode"; char arr2[] = "####################################"; int left = 0; int right = strlen(arr1) - 1; while (left <= right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(100);//睡眠函数-单位是毫秒 system("cls");//执行系统命令的 left++; right--; } printf("这可不是一般的难哦!拿出你的实力让我看看吧!\n"); } int model() { int i = 0; int num = 0; printf("请输入游戏模式:1.简单 2.普通 3.困难\n请选择相应的模式:> "); scanf("%d", &i); if (i == 1) { easy(); num = 25; } else if (i == 2) { medium(); num = 15; } else { hard(); num = 5; } return num; } void game() { srand(time(NULL)); int r = rand() % 1001; int input = 0; //input 代表游戏猜测的数字 int num = 0; //num代表猜测剩余次数 num = model(); //游戏模式函数 while (1) { printf("\n请输入你猜的数字(0-1000):> "); scanf("%d", &input); if (num == 0) { break; } if (input > r) { printf("\n猜大了,再猜猜\n"); } else if (input < r) { printf("\n猜小了,再猜猜\n"); } else { printf("恭喜你,猜对了\n"); break; } num--; printf("\n加油,你还剩余%d次机会哟\n", num); } if (!num) { printf("\n闯关失败,你不行啊!简直弱爆了!!!\n"); computer++; //标记电脑的战绩 } else { printf("你真的太棒了!!!\n"); player++; } printf("\n你是否还想继续游戏呢?\n"); //这一步是提醒玩家是否继续 } void find() { FILE* fp = fopen("grade.txt", "r"); int a = 0, b = 0; char p[60] = { 0 }; if (fp == NULL) { exit(-1); } else { fgets(p, 60, fp); printf("%s\n", p); } fclose(fp); printf("是否继续游戏?\n"); } void save() { FILE* fp = fopen("grade.txt", "w"); if (fp == NULL) { exit(-1); } else { fprintf(fp, "computer : player = %d : %d\n", computer, player); } fclose(fp); } int main() { int input = 0; do { menu(); printf("请选择:> "); scanf("%d", &input); switch (input) { case 0: printf("成功退出游戏\n"); break; case 1: game(); //玩游戏函数 save(); //保存战绩函数 break; case 2: find(); //查询战绩函数 break; default: printf("输入错误,请重新输入!\n"); } } while (input); return 0; }
动画演示