作业要求:运用到结构体,数组,指针,地址传参等
说明:我是一名刚入门的小白,代码有问题请大佬指正,分享自己完成的作业。
刚接触c语言和我一样的同学可以一起交流,代码中不懂的可以问我,希望我的代码对你理解c语言有所帮助
头文件准备:
下面x,boss,hp,s,f分别代表 自身坐标,boss坐标,自身血量,血瓶数量,钓竿数量
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int x,boss,hp,s,f=10;
角色结构体
typedef struct {//运用结构体 创建角色系统 角色血量和药剂量有所不同
int hp;
int s;
} Role;
菜单
void menu() {//游戏菜单
printf("欢迎来到冒险游戏!\n");
printf("1.开始新游戏\n");
printf("2.读取存档\n");
printf("3.保存游戏\n");
printf("4.退出游戏\n");
printf("5.游戏说明\n");
}
前进与休息指令
其中使用rand函数,用来形成一些随机事件,例如休息时遇到偷袭等
go(){//前进指令
int z;
srand(time(NULL));
z=rand()%100;
if(z>40)
{
printf("一路上风平浪静,似乎什么都没有发生\n");
Sleep(1500);
x=x+1;
}
else if(z>20){
printf("遭遇哥布林!你的团队血战!生命-20,收获战利品血瓶\n");
Sleep(1500);
hp=hp-20;
s=s+1;
}
else
{
printf("你遇到了恶龙手下的埋伏,不得不后退,退回一千米稍作休整\n");
Sleep(1500);
x=x-1;
}
}
rest(){//休息
int z;
srand(time(NULL));
z=rand()%100;
if(z>30)
{
printf("你原地休息,生命值大幅恢复!\n");
hp=hp+50;
Sleep(1500);
}
else if(z>20)
{
printf("你睡得很死!并没有发现偷袭,你逃走的时候已伤痕累累\n");
Sleep(1500);
hp=21;
Sleep(1000);
printf("你的血瓶被哥布林偷走啦!\n");
Sleep(1500);
s=0;
printf("你退后了两千米!\n");
Sleep(1500);
x=x-2;
}
else
{
printf("你睡得很轻,发现了偷袭,逃跑成功并退后一千米!\n");
Sleep(1500);
x=x-1;
}
}
寻宝,钓鱼,血瓶指令,我在其中加入了一些小彩蛋增加可玩性。
find(){//附近寻找 宝藏
int z;
srand(time(NULL));
z=rand()%100;
if(z>70)
{
printf("遭遇怪兽,生命值-10,然而没有战利品\n");
hp=hp-10;
}
else if(z>40)
{
printf("找到一个血瓶\n");
s=s+1;
}
else if(z>20)
{
printf("找到一个钓竿\n");
f=f+1;
}
else if(z>5)
{
printf("并没有什么新鲜东西,遗憾返回营地\n");
}
else
{
printf("你竟发现直接传送到恶龙巢穴的传送门!\n");
Sleep(1500);
printf("被迫强制传送!\n");
Sleep(1500);
x= boss;
}
}
fish(){//钓鱼系统
int z;
srand(time(NULL));
z=rand()%100;
if(z>80)
{
printf("你竟然钓到一个血瓶!\n");
s=s+1;
f=f-1;
}
else if(z>60)
{
printf("你钓到了一条草鱼,你烤了,吃了,为你恢复了一点生命值\n");
hp=hp+2;
f=f-1;
}
else if(z>40)
{
printf("你掉到了一条胖鱼,你吃掉它,生命值扣了一点点\n");
hp=hp-1;
f=f-1;
}
else if(z>5)
{
printf("你坐在河岸旁沉思,什么事都没有发生,浪费了点时间,所以你的生命值有所下降\n");
Sleep(1000);
printf("时间就是生命!\n");
hp=hp-1;
f=f-1;
}
else
{
printf("震惊!你在钓鱼的时候突然从湖里来了一个老头,并问你:\n");
Sleep(1000);
printf("年轻人,这个金钓竿是你的,还是银钓竿是你的,还是这个木制钓竿是你的?\n");
int d;
printf("1.金钓竿 2.银钓竿 3.木钓竿 4.都不是我的 5.别打扰老子钓鱼\n");
scanf("%d",&d);
if(d==1)
{
printf("老者将金钓竿赠于你,你获得了500点生命!\n");
hp=hp+500;
}
else if(d==2)
{
printf("老者将银钓竿赠于你,你获得了200点生命!\n");
hp=hp+200;
}
else if(d==3)
{
printf("你获得一个钓竿\n");
f=f+1;
}
else if(d==4)
{
printf("老者点点头很是欣慰,转头就走了\n");
Sleep(1000);
printf("对,你什么都没有获得。\n");
Sleep(1000);
}
else if(d==5)
{
printf("老者非常愤怒,一气之下利用降龙十八掌将你拍到对面的山头\n");
printf("你粉身碎骨,已经断气了\n");
hp=0 ;
}
else
{
printf("你说了一个不相关的回答,老者见你傻啦吧唧的\n");
Sleep(2000);
printf("可怜你的遭遇,便把他的毕生功力传授于你!\n");
Sleep(3000);
printf("是的,你无敌了!\n");
hp=hp+9999;
}
}
}
xueping(){//使用血瓶恢复生命值
if(s>0)
{
printf("成功使用血瓶\n");
hp=hp+10;
s=s-1;
}
if(s==0)
printf("你没有剩余的血瓶!\n");
}
保存游戏与读取游戏 我只是将游戏数据简单的储存了起来,例如人物血量,与boss的距离
void loadgame(){//加载游戏
FILE *fp;
if((fp=fopen("save01.txt","r"))==NULL)
{
printf("无法打开该文件");
exit(0) ;
}
fscanf(fp,"%d,%d,%d,%d",&x,&hp,&boss,&s);
fclose(fp);
printf("游戏进度加载成功!");
}
void savegame(){//保存游戏
FILE *fp;
if((fp=fopen("save01.txt","w"))==NULL)
{
printf("无法打开该文件");
exit(0) ;
}
fprintf(fp,"%d,%d,%d,%d",x,hp,boss,s);
fclose(fp);
printf("游戏进度保存成功!");
}
整理背包(这项没什么用,只是写作业要求需要运用到数组,临时加的,冒泡排序)
void check(){//利用数组排序背包
printf("该项会帮助你从小到大排序你的 钓竿数量 boss巢穴坐标 生命值 血瓶 前进的距离\n");
int a[5],temp,v,b,z;
a[0]=x;
a[1]=boss;
a[2]=hp;
a[3]=s;
a[4]=f;
for( v=0;v<4;v++){
for( b=0;b<4-v;b++)
{
if(a[b]>a[b+1])
{
temp=a[b];
a[b]=a[b+1];
a[b+1]=temp;
}
}
}
for( z=0;z<5;z++)
{
printf("%d ",a[z]);
}
printf("\n");
}
接下来是类似交代背景,和游戏主要运行的界面
void background(){//背景故事
printf("故事发生在一个风雨交加的夜晚\n") ;
Sleep(1000);
printf("城堡中的公主被恶龙抓走了\n");
Sleep(1000);
printf("现在国王征集勇士讨伐恶龙,砍下龙头者将获得丰富的奖励,你是否选择参加?\n");
Sleep(1000);
printf("1.主动参与! 2.拒绝参加!\n");
}
void stratgame(){//开始游戏
background();
srand(time(NULL));
boss=rand()%10+10;//生成boss巢穴的距离
x=0;
int i;
scanf("%d",&i);
do{ //小背景
if(i==1){
printf("冒险开始\n"); break;
}
else if(i==2){
printf("没有勇士参与讨伐恶龙,国王思考再三,决定谁救女儿回来,谁就是驸马\n");
Sleep(2000);
printf("条件诱人,你无法拒绝\n");
Sleep(2000);
break;
}
else
{
printf("输入有误!,请重新选择!\n");
scanf("%d",&i);
}
}while(i==1||i==2);//背景的一部分
printf("你参与到了讨伐恶龙的队伍,请你勇敢参战!解救公主!\n");
Sleep(1000);
printf("请选择你的职业:1.战士(血量高) 2.法师(血瓶多)\n") ;//选择职业
int n;
scanf("%d",&n);
do{
if(n==1)
{
Role k={200,0};
hp=k.hp;
s=k.s;
break;
}
else if(n==2)
{
Role f={150,5};
hp=f.hp;
s=f.s;
break;
}
else
{
printf("输入有误,请重新输入!");
scanf("%d",&n);
}
}while(n==1||n==2);
while(1){
printf("----------------------------------------------------------------\n");//状态条
printf("当前生命值;%d 距离恶龙;%d 千米,你现在拥有血瓶:%d,你拥有鱼竿:%d\n",hp,boss-x,s,f);
if(x>=boss) break;
if(hp<=0)
{
printf("很遗憾!您的生命值已耗尽!\n");
break;
}
printf("请你选择当前行动;1.前进 2.原地休息 3.附近寻宝 4.使用血瓶\n");//进行操作指令
printf(" 5.保存进度 6.调取进度 7.湖中钓鱼 8.检查背包\n") ;
printf(" 9.不想丸辣,我要开挂! \n");
int j;
do{
scanf("%d",&j);
if(j==1)
{
go();
break;
}
else if(j==2)
{
rest();
break;
}
else if(j==3)
{
find();
break;
}
else if(j==4)
{
xueping();
break;
}
else if(j==5)
{
savegame();
break;
}
else if(j==6)
{
loadgame();
break;
}
else if(j==7)
{
fish();
break;
}
else if(j==8)
{
check();
break;
}
else if(j==9)
{
printf("你想增加你的什么属性:1.生命 2.钓竿 \n");
int o;
scanf("%d",&o);
if(o==1)
{
gua(hp);
printf("已增加生命值!");
}
else if(o==2)
{
gua(f);
printf("已增加钓竿数量!");
}
else
{
printf("输入有误!开挂失败!\n");
}
break;
}
else
{
printf("你的输入有误,请重新输入!\n");
scanf("%d",&j);
}
}while(j==1||j==2||j==3||j==4|j==5|j==6|j==7|j==8|j==9);
//达到特定条件 跳出循环(生命值过低或者已经接触boss)
if(hp>0&&x>=boss)
{
printf("您与恶龙遭遇,与之恶战!\n");
printf("生命值-150\n");
hp=hp-150;
if(hp>0)
{
printf("勇士屠杀恶龙成功!游戏结束!\n");
Sleep(2000);
printf("你救回了公主!你和公主喜结连理,过上了幸福的生活");
Sleep(2000);
return;
}
else{
printf("很遗憾!您的生命值已耗尽!\n");
Sleep(2000);
}
}
if(hp<=0){
printf("通关失败,再接再厉!\n");
return;
}
}
}
void explain(){
printf("在这个游戏里,你将会拯救被恶龙抓走的公主,你有很多选项可以选择\n");
Sleep(1000);
printf("你可以附近寻宝,也可靠近恶龙,积攒你的战力去击败恶龙吧!\n");
Sleep(1000);
printf("在这里生命值是你最重要的属性,你必须保证你的生命值健康,才能够击败恶龙.\n");
Sleep(1000);
printf("我还在游戏中设置了一些彩蛋,耐心找找吧\n");
}
开挂(这项也没什么用,为了完成地址传参的要求,在startgame里有所运用)
void gua(int &e){//利用地址传递值 完成开挂操作
e=e+10000;
}
主函数
int main() {
int data;
printf("作者:\n");
while (data!= 4) {
menu();
printf("请输入你的选择:");
scanf("%d", &data);
switch (data) {
case 1:
stratgame();
break;
case 2:
loadgame();
break;
case 3:
savegame();
break;
case 4:
printf("谢谢游玩!\n");
break;
case 5:
explain();
break;
break;
default:
printf("无效的选择,请重新输入!\n");
break;
}
}
return 0;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int x,boss,hp,s,f=10;
typedef struct {//运用结构体 创建角色系统 角色血量和药剂量有所不同
int hp;
int s;
} Role;
go(){//前进指令
int z;
srand(time(NULL));
z=rand()%100;
if(z>40)
{
printf("一路上风平浪静,似乎什么都没有发生\n");
Sleep(1500);
x=x+1;
}
else if(z>20){
printf("遭遇哥布林!你的团队血战!生命-20,收获战利品血瓶\n");
Sleep(1500);
hp=hp-20;
s=s+1;
}
else
{
printf("你遇到了恶龙手下的埋伏,不得不后退,退回一千米稍作休整\n");
Sleep(1500);
x=x-1;
}
}
rest(){//休息
int z;
srand(time(NULL));
z=rand()%100;
if(z>30)
{
printf("你原地休息,生命值大幅恢复!\n");
hp=hp+50;
Sleep(1500);
}
else if(z>20)
{
printf("你睡得很死!并没有发现偷袭,你逃走的时候已伤痕累累\n");
Sleep(1500);
hp=21;
Sleep(1000);
printf("你的血瓶被哥布林偷走啦!\n");
Sleep(1500);
s=0;
printf("你退后了两千米!\n");
Sleep(1500);
x=x-2;
}
else
{
printf("你睡得很轻,发现了偷袭,逃跑成功并退后一千米!\n");
Sleep(1500);
x=x-1;
}
}
find(){//附近寻找 宝藏
int z;
srand(time(NULL));
z=rand()%100;
if(z>70)
{
printf("遭遇怪兽,生命值-10,然而没有战利品\n");
hp=hp-10;
}
else if(z>40)
{
printf("找到一个血瓶\n");
s=s+1;
}
else if(z>20)
{
printf("找到一个钓竿\n");
f=f+1;
}
else if(z>5)
{
printf("并没有什么新鲜东西,遗憾返回营地\n");
}
else
{
printf("你竟发现直接传送到恶龙巢穴的传送门!\n");
Sleep(1500);
printf("被迫强制传送!\n");
Sleep(1500);
x= boss;
}
}
xueping(){//使用血瓶恢复生命值
if(s>0)
{
printf("成功使用血瓶\n");
hp=hp+10;
s=s-1;
}
if(s==0)
printf("你没有剩余的血瓶!\n");
}
fish(){//钓鱼系统
int z;
srand(time(NULL));
z=rand()%100;
if(z>80)
{
printf("你竟然钓到一个血瓶!\n");
s=s+1;
f=f-1;
}
else if(z>60)
{
printf("你钓到了一条草鱼,你烤了,吃了,为你恢复了一点生命值\n");
hp=hp+2;
f=f-1;
}
else if(z>40)
{
printf("你掉到了一条胖鱼,你吃掉它,生命值扣了一点点\n");
hp=hp-1;
f=f-1;
}
else if(z>5)
{
printf("你坐在河岸旁沉思,什么事都没有发生,浪费了点时间,所以你的生命值有所下降\n");
Sleep(1000);
printf("时间就是生命!\n");
hp=hp-1;
f=f-1;
}
else
{
printf("震惊!你在钓鱼的时候突然从湖里来了一个老头,并问你:\n");
Sleep(1000);
printf("年轻人,这个金钓竿是你的,还是银钓竿是你的,还是这个木制钓竿是你的?\n");
int d;
printf("1.金钓竿 2.银钓竿 3.木钓竿 4.都不是我的 5.别打扰老子钓鱼\n");
scanf("%d",&d);
if(d==1)
{
printf("老者将金钓竿赠于你,你获得了500点生命!\n");
hp=hp+500;
}
else if(d==2)
{
printf("老者将银钓竿赠于你,你获得了200点生命!\n");
hp=hp+200;
}
else if(d==3)
{
printf("你获得一个钓竿\n");
f=f+1;
}
else if(d==4)
{
printf("老者点点头很是欣慰,转头就走了\n");
Sleep(1000);
printf("对,你什么都没有获得。\n");
Sleep(1000);
}
else if(d==5)
{
printf("老者非常愤怒,一气之下利用降龙十八掌将你拍到对面的山头\n");
printf("你粉身碎骨,已经断气了\n");
hp=0 ;
}
else
{
printf("你说了一个不相关的回答,老者见你傻啦吧唧的\n");
Sleep(2000);
printf("可怜你的遭遇,便把他的毕生功力传授于你!\n");
Sleep(3000);
printf("是的,你无敌了!\n");
hp=hp+9999;
}
}
}
void menu() {//游戏菜单
printf("欢迎来到冒险游戏!\n");
printf("1.开始新游戏\n");
printf("2.读取存档\n");
printf("3.保存游戏\n");
printf("4.退出游戏\n");
printf("5.游戏说明\n");
}
void loadgame(){//加载游戏
FILE *fp;
if((fp=fopen("save01.txt","r"))==NULL)
{
printf("无法打开该文件");
exit(0) ;
}
fscanf(fp,"%d,%d,%d,%d",&x,&hp,&boss,&s);
fclose(fp);
printf("游戏进度加载成功!");
}
void savegame(){//保存游戏
FILE *fp;
if((fp=fopen("save01.txt","w"))==NULL)
{
printf("无法打开该文件");
exit(0) ;
}
fprintf(fp,"%d,%d,%d,%d",x,hp,boss,s);
fclose(fp);
printf("游戏进度保存成功!");
}
void check(){//利用数组排序背包
printf("该项会帮助你从小到大排序你的 钓竿数量 boss巢穴坐标 生命值 血瓶 前进的距离\n");
int a[5],temp,v,b,z;
a[0]=x;
a[1]=boss;
a[2]=hp;
a[3]=s;
a[4]=f;
for( v=0;v<4;v++){
for( b=0;b<4-v;b++)
{
if(a[b]>a[b+1])
{
temp=a[b];
a[b]=a[b+1];
a[b+1]=temp;
}
}
}
for( z=0;z<5;z++)
{
printf("%d ",a[z]);
}
printf("\n");
}
void gua(int &e){//利用地址传递值 完成开挂操作
e=e+10000;
}
void background(){//背景故事
printf("故事发生在一个风雨交加的夜晚\n") ;
Sleep(1000);
printf("城堡中的公主被恶龙抓走了\n");
Sleep(1000);
printf("现在国王征集勇士讨伐恶龙,砍下龙头者将获得丰富的奖励,你是否选择参加?\n");
Sleep(1000);
printf("1.主动参与! 2.拒绝参加!\n");
}
void stratgame(){//开始游戏
background();
srand(time(NULL));
boss=rand()%10+10;//生成boss巢穴的距离
x=0;
int i;
scanf("%d",&i);
do{ //小背景
if(i==1){
printf("冒险开始\n"); break;
}
else if(i==2){
printf("没有勇士参与讨伐恶龙,国王思考再三,决定谁救女儿回来,谁就是驸马\n");
Sleep(2000);
printf("条件诱人,你无法拒绝\n");
Sleep(2000);
break;
}
else
{
printf("输入有误!,请重新选择!\n");
scanf("%d",&i);
}
}while(i==1||i==2);//背景的一部分
printf("你参与到了讨伐恶龙的队伍,请你勇敢参战!解救公主!\n");
Sleep(1000);
printf("请选择你的职业:1.战士(血量高) 2.法师(血瓶多)\n") ;//选择职业
int n;
scanf("%d",&n);
do{
if(n==1)
{
Role k={200,0};
hp=k.hp;
s=k.s;
break;
}
else if(n==2)
{
Role f={150,5};
hp=f.hp;
s=f.s;
break;
}
else
{
printf("输入有误,请重新输入!");
scanf("%d",&n);
}
}while(n==1||n==2);
while(1){
printf("----------------------------------------------------------------\n");//状态条
printf("当前生命值;%d 距离恶龙;%d 千米,你现在拥有血瓶:%d,你拥有鱼竿:%d\n",hp,boss-x,s,f);
if(x>=boss) break;
if(hp<=0)
{
printf("很遗憾!您的生命值已耗尽!\n");
break;
}
printf("请你选择当前行动;1.前进 2.原地休息 3.附近寻宝 4.使用血瓶\n");//进行操作指令
printf(" 5.保存进度 6.调取进度 7.湖中钓鱼 8.检查背包\n") ;
printf(" 9.不想丸辣,我要开挂! \n");
int j;
do{
scanf("%d",&j);
if(j==1)
{
go();
break;
}
else if(j==2)
{
rest();
break;
}
else if(j==3)
{
find();
break;
}
else if(j==4)
{
xueping();
break;
}
else if(j==5)
{
savegame();
break;
}
else if(j==6)
{
loadgame();
break;
}
else if(j==7)
{
fish();
break;
}
else if(j==8)
{
check();
break;
}
else if(j==9)
{
printf("你想增加你的什么属性:1.生命 2.钓竿 \n");
int o;
scanf("%d",&o);
if(o==1)
{
gua(hp);
printf("已增加生命值!");
}
else if(o==2)
{
gua(f);
printf("已增加钓竿数量!");
}
else
{
printf("输入有误!开挂失败!\n");
}
break;
}
else
{
printf("你的输入有误,请重新输入!\n");
scanf("%d",&j);
}
}while(j==1||j==2||j==3||j==4|j==5|j==6|j==7|j==8|j==9);
//达到特定条件 跳出循环(生命值过低或者已经接触boss)
if(hp>0&&x>=boss)
{
printf("您与恶龙遭遇,与之恶战!\n");
printf("生命值-150\n");
hp=hp-150;
if(hp>0)
{
printf("勇士屠杀恶龙成功!游戏结束!\n");
Sleep(2000);
printf("你救回了公主!你和公主喜结连理,过上了幸福的生活");
Sleep(2000);
return;
}
else{
printf("很遗憾!您的生命值已耗尽!\n");
Sleep(2000);
}
}
if(hp<=0){
printf("通关失败,再接再厉!\n");
return;
}
}
}
void explain(){
printf("在这个游戏里,你将会拯救被恶龙抓走的公主,你有很多选项可以选择\n");
Sleep(1000);
printf("你可以附近寻宝,也可靠近恶龙,积攒你的战力去击败恶龙吧!\n");
Sleep(1000);
printf("在这里生命值是你最重要的属性,你必须保证你的生命值健康,才能够击败恶龙.\n");
Sleep(1000);
printf("我还在游戏中设置了一些彩蛋,耐心找找吧\n");
}
int main() {
int data;
printf("作者:萨萨里\n");
while (data!= 4) {
menu();
printf("请输入你的选择:");
scanf("%d", &data);
switch (data) {
case 1:
stratgame();
break;
case 2:
loadgame();
break;
case 3:
savegame();
break;
case 4:
printf("谢谢游玩!\n");
break;
case 5:
explain();
break;
break;
default:
printf("无效的选择,请重新输入!\n");
break;
}
}
return 0;
}