C语言小游戏

C语言小游戏


不足:各种(等级、经验、攻击…)计算不好(没有防御)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <conio.h>
float Max_Damage,Min_Damage;//最大攻击 最小攻击 金钱
int HP=100,Max_HP=1000,Money=100,exp=0,leave;
char map[999][999]= {"主城","秋日森林","落日森林","荒芜沙漠","北国","神灵沼泽","祭坛","离开"};
int mapf=7,now,mf;
void setColor(unsigned short ForeColor,unsigned short BackGroundColor);//设置颜色
void SetPos(int x,int y);//定义设置光标位置的函数
void Initialization(); //初始化
void knapsack();//打开背包
void Map();//打开地图
void Main_menu();//打开主菜单
void HP_HD(int a,int b,int c,int d);
void HD();
void Preservation();//保存
void shop();
void read();
int random(int a,int b);//随机数
void Attribute_calculation();//属性计算
struct monster { //怪物
	char name[60];
	int HP;
	int Ma_Damage;
	int Mi_Damage;
	int Ma_exp;
	int Mi_exp;
	int Ma_Money;
	int Mi_Money;
} monster[100];
struct thing {//结构体
	int Ma_damage;
	int Mi_damage;
	char name[100];
	char present[300];//介绍
	bool number;//数量
	int grade;//品质
	int add_HP;//血量
	float Multiple_Damage;//攻击倍数加成(默认0%)
	int Money;
} arm[100]; //武器
//等级计算:(leave+10)*(leave+10);

void HP_HD(int a,int b,int c,int d) { //显示血量
	SetPos(40,0);
	printf("你:");
	int e=a*1.0/b*20;
	int f=c*1.0/d*20;
	setColor(7,4);
	for(int i=0; i<e; i++)
		printf(" ");
	setColor(7,0);



	SetPos(40,1);
	printf("它:");
	setColor(7,2);
	for(int i=0; i<f; i++)
		printf(" ");
	setColor(7,0);
}
void shop() { //商店
	system("cls");
	int li=1;
	char nam[100][100];
	for(int i=0; i<mf; i++) {
		strcpy(nam[i],arm[i].name);
	}
	strcpy(nam[mf],"离开");
	while(1) {
		system("cls");
		for(int i=0; i<=mf; i++) {
			if(li==i+1)setColor(7,14);
			else setColor(7,0);
			printf("%s\n",nam[i]);
		}
		int d;
		d=getch();
		if(d==72 && li!=1)li--;
		else if(d==80 && li!=mf+1)li++;
		else if(li==mf+1 && d==80)li=1;
		else if(li==1 && d==72)li=mf+1;

		if(li!=mf+1&& d==13) {
			system("cls");
			if(arm[li-1].number==1) {
				printf("你已经拥有了它,无法再次购买<任意键继续>");
				getch();
			} else {
				bool yui=1;
				while(1) {
					system("cls");
					printf("名字:");
					setColor(arm[li-1].grade,0);
					printf("%s\n",arm[li-1].name);
					setColor(7,0);
					printf("\t攻击力:%d-%d\n",arm[li-1].Mi_damage,arm[li-1].Ma_damage);
					printf ("\t攻击倍数加成:%.2f%%\n",arm[li-1].Multiple_Damage*100);
					printf("\t血量加成:%d\n",arm[li-1].add_HP);
					printf("\t介绍:%s\n",arm[li-1].present);
					printf("\t价钱:%d\n",arm[li-1].Money);
					if(yui) {
						setColor(7,14);
						printf("是");
						setColor(7,0);
						printf("\t否");
					} else if(!yui) {
						setColor(7,0);
						printf("是\t");
						setColor(7,14);
						printf("否");
					}
					int c;
					c=getch();
					if(c==75) yui=1;
					else if(c==77) yui=0;
					else if(yui && c==13) {
						if(Money>=arm[li-1].Money) {
							arm[li-1].number=1;
							Money-=arm[li-1].Money;
							printf("\n恭喜你成功购买<按任意键继续>");
							getch();
							shop();
						} else {
							printf("\n你没有足够的钱<按任意键继续>");
							getch();
							shop();
						}
					} else if((!yui) && c==13) {
						shop();
						return;
					}



				}

			}
		} else if(li==mf+1&& d==13) {
			Main_menu();
		}

	}
}
int random(int a,int b) { //随机数
	return (rand()%(b-a+1)+a);
}
void HD() {//面板输出
	Attribute_calculation();
	SetPos (50,0);
	printf("┌─────────────┐");
	SetPos (50,1);
	printf("│                          │");
	SetPos (50,2);
	printf("│                          │");
	SetPos (50,3);
	printf("│                          │");
	SetPos (50,4);
	printf("│                          │");
	SetPos (50,5);
	printf("│                          │");
	SetPos (50,6);
	printf("│                          │");
	SetPos (50,7);
	printf("│                          │");
	SetPos (50,8);
	printf("└─────────────┘");
	SetPos (52,1);
	printf("Money:%d",Money);
	SetPos (52,2);
	printf("HP:%d/%d",HP,Max_HP);
	SetPos (52,3);
	printf("攻击力:%.2lf-%.2lf",Min_Damage,Max_Damage);
	SetPos (52,4);
	printf("当前所在地:%s",map[now]);
	SetPos (52,5);
	printf("当前等级:%d",leave);
	SetPos (52,6);
	printf("经验:%d/%d",exp,(leave+2)*(leave+100));
	SetPos (52,7);
	double iop=exp*1.0/(leave+2)/(leave+100);
	int uio=iop*13;
	setColor(2,0);
	for(int i=0; i<uio; i++) {
		printf("▇");
	}
	setColor(7,0);
	for(int i=0; i<(13-uio); i++) {
		printf("▇");
	}


}
void Start_fight() {//战斗
	if(now!=0) {
		system("cls");
		int r_HP=monster[now-1].HP;
		int p_kill,r_kill;
		while(HP!=0 && r_HP!=0) {
			system("cls");
			p_kill=random(Min_Damage,Max_Damage);
			r_kill=random(monster[now-1].Mi_Damage,monster[now-1].Ma_Damage);
			r_HP-=p_kill;
			HP-=r_kill;
			r_HP<0?r_HP=0:0;

			printf("%s对你造成%d点伤害\n",monster[now-1].name,r_kill);
			printf("你对%s造成%d点伤害\n",monster[now-1].name,p_kill);
			printf("%s的血量%d/%d 你的血量%d/%d\n\n",monster[now-1].name,r_HP,monster[now-1].HP,HP,Max_HP);
			HP_HD(HP,Max_HP,r_HP,monster[now-1].HP);
			Sleep(1000);
			if(HP<0)HP=0;
			if(r_HP<0)r_HP=0;
		}

		system("cls");
		SetPos(0,0);
		if(HP==0 && r_HP!=0) {
			printf("你死了,一位陌生人将你救了回来");
			HP=Max_HP/5;
		} else if(r_HP==0) {
			printf("你胜利了\n");
			int mo,ex;
			mo=random(monster[now-1].Mi_Money,monster[now-1].Ma_Money);
			ex=random(monster[now-1].Mi_exp,monster[now-1].Ma_exp);
			Money+=mo;
			exp+=ex;
			printf("你获得了%dmoney\t%dexp",mo,ex);
		} else {
			printf("你与怪物同归于尽,一位陌生人将你救了回来");
			HP=Max_HP/3;
		}
		printf("\n<按任意键继续>");
		getch();
	}
	while(exp>=(leave+2)*(leave+100)) {
		exp-=(leave+2)*(leave+100);
		printf("经过艰苦的战斗,你升级了!");
		leave++;
		printf("\n<按任意键继续>");
		getch();
		Attribute_calculation();
	}


	Main_menu();
}
void knapsack() { //打开背包
	system("cls");
	setColor(7,0);
	int i=0;
	for(int i=0; i<mf; i++) {
		if(arm[i].number==1) {
			setColor(arm[i].grade,0);
			printf("%s\n",arm[i].name);
			setColor(7,0);
			printf("\t攻击力:%d-%d\n",arm[i].Mi_damage,arm[i].Ma_damage);
			printf ("\t攻击倍数加成:%.2f%%\n",arm[i].Multiple_Damage*100);
			printf("\t血量加成:%d\n",arm[i].add_HP);
			printf("\t介绍:%s\n",arm[i].present);
		}
	}
	printf("(按任意键返回)");
	getch();
	Main_menu();
}
void Attribute_calculation() { //属性计算
	Max_Damage=3;
	Min_Damage=2;
	Max_HP=100;
	system("cls");
	setColor(7,0);
	int i=0;
	for(int i=0; i<mf; i++) {
		if(arm[i].number==1) {
			Max_Damage+=arm[i].Ma_damage;
			Min_Damage+=arm[i].Mi_damage;
			Max_HP+=arm[i].add_HP;
			Max_Damage*=arm[i].Multiple_Damage+1;
			Min_Damage*=arm[i].Multiple_Damage+1;
			Max_Damage+=leave*leave/10;
			Min_Damage+=leave*leave/10;
			Max_HP+=leave*leave;
		}

	}
}
void Main_menu() { //打开主菜单
	int li=1;
	char a[10][100]= {"商店","打开背包","打开地图","进行攻击","加血","保存","读档"};
	int f=7;//与上对应
	while(1) {
		system("cls");
		HD();
		for(int i=0; i<f; i++) {
			if(li==i+1)setColor(7,14);
			else setColor(7,0);
			SetPos(0,i);
			printf("%s",a[i]);
		}
		SetPos(5,4);
		setColor(7,0);
		printf("(%dmoney)",Max_HP/5);
		int d=getch();
		if(d==72 && li!=1)li--;
		else if(d==80 && li!=f)li++;
		else if(li==f && d==80)li=1;
		else if(li==1 && d==72)li=f;
		if(d==13 && li==2) {
			knapsack();
			return;
		} else if(d==13 && li==1) {
			shop();
			return;
		} else if(d==13 && li==3) {
			Map();
			return;
		} else if(d==13 && li==5) {
			if(Money>=Max_HP/5) {
				HP=Max_HP;
				Money-=Max_HP/5;
			}
		} else if(d==13 && li==4) {
			Start_fight();
		} else if(d==13 && li==6) {
			Preservation();
		}else if(d==13 && li==7) {
			read();
		}
		
		
	}

}
void Preservation(){//存档 
	FILE *fp1=fopen("A","w");
	fprintf(fp1,"%d ",mf);
	for(int i=0;i<mf;i++){
		fprintf(fp1,"%d ",arm[i].number);
	}
	fclose(fp1); 
	
	FILE *fp2=fopen("B","w");
	fprintf(fp2,"%d %d %d %d",leave,exp,Money,HP);
	fclose(fp2); 
	
}
void read(){//读存档 
	FILE *fp1=fopen("A","r");
	int ap;
	fscanf(fp1,"%d",&ap);
	for(int i=0;i<ap;i++)
	{
		fscanf(fp1,"%d",&(arm[i].number));
	}
	fclose(fp1); 
	FILE *fp2=fopen("B","r");
	fscanf(fp2,"%d %d %d %d",&leave,&exp,&Money,&HP);
	fclose(fp2);
	Attribute_calculation();
}
void Initialization_thing() { //物品初始化
	int k=0;
	/*
	1 7
	2 3
	3 2
	4 1
	5 6
	6 5
	7 4
	*/
	arm[k].Ma_damage=10;
	arm[k].Mi_damage=1;
	arm[k].number=0;
	strcpy(arm[k].name,"大宝剑");
	strcpy(arm[k].present,"不知道是谁遗落在草地上的,被一位流浪汉捡到");
	arm[k].grade=7;
	arm[k].add_HP=10;
	arm[k].Multiple_Damage=0;
	arm[k].Money=100;
	k=1;
	arm[k].Ma_damage=100;
	arm[k].Mi_damage=40;
	arm[k].number=0;
	strcpy(arm[k].name,"屠龙宝剑");
	strcpy(arm[k].present,"传说,我的世界中有条龙,这把宝剑杀了它");
	arm[k].grade=1;
	arm[k].add_HP=200;
	arm[k].Multiple_Damage=0.3;
	arm[k].Money=10000;
	k=2;
	arm[k].Ma_damage=600;
	arm[k].Mi_damage=300;
	arm[k].number=0;
	strcpy(arm[k].name,"钻石剑");
	strcpy(arm[k].present,"由钻石制成");
	arm[k].grade=6;
	arm[k].add_HP=300;
	arm[k].Multiple_Damage=0.5;
	arm[k].Money=1000000;
	k=3;
	arm[k].Ma_damage=120;
	arm[k].Mi_damage=30;
	arm[k].number=0;
	strcpy(arm[k].name,"铜剑");
	strcpy(arm[k].present,"青铜锻造");
	arm[k].grade=2;
	arm[k].add_HP=300;
	arm[k].Multiple_Damage=0;
	arm[k].Money=1000;
	k=4;
	arm[k].Ma_damage=0;
	arm[k].Mi_damage=0;
	arm[k].number=0;
	strcpy(arm[k].name,"生命之心碎片<2>");
	strcpy(arm[k].present,"增加1200生命");
	arm[k].grade=5;
	arm[k].add_HP=1200;
	arm[k].Multiple_Damage=0;
	arm[k].Money=4000;
	k=5;
	arm[k].Ma_damage=0;
	arm[k].Mi_damage=0;
	arm[k].number=0;
	strcpy(arm[k].name,"生命之心碎片<3>");
	strcpy(arm[k].present,"增加24000生命");
	arm[k].grade=5;
	arm[k].add_HP=24000;
	arm[k].Multiple_Damage=0;
	arm[k].Money=40000;
	k=6;
	arm[k].Ma_damage=0;
	arm[k].Mi_damage=0;
	arm[k].number=0;
	strcpy(arm[k].name,"生命之心碎片<4>");
	strcpy(arm[k].present,"增加48000生命");
	arm[k].grade=5;
	arm[k].add_HP=48000;
	arm[k].Multiple_Damage=0;
	arm[k].Money=4000000;
	k=7;
	arm[k].Ma_damage=0;
	arm[k].Mi_damage=0;
	arm[k].number=0;
	strcpy(arm[k].name,"力量符文");
	strcpy(arm[k].present,"2被攻击");
	arm[k].grade=5;
	arm[k].add_HP=0;
	arm[k].Multiple_Damage=1;
	arm[k].Money=1000000;
	k=7;
	arm[k].Ma_damage=0;
	arm[k].Mi_damage=0;
	arm[k].number=0;
	strcpy(arm[k].name,"生命之心碎片<1>");
	strcpy(arm[k].present,"增加600生命");
	arm[k].grade=5;
	arm[k].add_HP=600;
	arm[k].Multiple_Damage=0;
	arm[k].Money=1000;

	mf=k+1;
}
void Initialization_monster() { //怪物初始化
	int k=0;

	monster[k].Ma_exp=5;
	monster[k].Mi_exp=10;
	monster[k].HP=35;
	monster[k].Ma_Damage=10;
	monster[k].Mi_Damage=2;
	monster[k].Mi_Money=10;
	monster[k].Ma_Money=200;
	strcpy(monster[k].name,"哥布林");
	k=1;
	monster[k].Ma_exp=20;
	monster[k].Mi_exp=50;
	monster[k].HP=200;
	monster[k].Ma_Damage=30;
	monster[k].Mi_Damage=15;
	monster[k].Mi_Money=100;
	monster[k].Ma_Money=800;
	strcpy(monster[k].name,"土匪");
	k=2;
	monster[k].Ma_exp=70;
	monster[k].Mi_exp=200;
	monster[k].HP=8000;
	monster[k].Ma_Damage=80;
	monster[k].Mi_Damage=50;
	monster[k].Mi_Money=1000;
	monster[k].Ma_Money=4000;
	strcpy(monster[k].name,"土匪头目");
	k=3;
	monster[k].Ma_exp=400;
	monster[k].Mi_exp=1000;
	monster[k].HP=20000;
	monster[k].Ma_Damage=200;
	monster[k].Mi_Damage=100;
	monster[k].Mi_Money=3000;
	monster[k].Ma_Money=9000;
	strcpy(monster[k].name,"冰雪精灵");
	k=4;
	monster[k].Ma_exp=1000;
	monster[k].Mi_exp=6000;
	monster[k].HP=900000;
	monster[k].Ma_Damage=900;
	monster[k].Mi_Damage=600;
	monster[k].Mi_Money=20000;
	monster[k].Ma_Money=90000;
	strcpy(monster[k].name,"泥人");
	k=4;
	monster[k].Ma_exp=10000;
	monster[k].Mi_exp=60000;
	monster[k].HP=9000000;
	monster[k].Ma_Damage=9000;
	monster[k].Mi_Damage=6000;
	monster[k].Mi_Money=200000;
	monster[k].Ma_Money=900000;
	strcpy(monster[k].name,"魂灵");
}
void Map() { //打开地图
	int li=1;
	while(1) {
		system("cls");
		HD();

		for(int i=0; i<mapf; i++) {
			if(i+1==li)setColor(7,14);
			else setColor(7,0);
			SetPos(0,i);
			printf("%s",map[i]);
		}
		int d;
		d=getch();
		if(d==72 && li!=1)li--;
		else if(d==80 && li!=mapf)li++;
		if(d==13 && li==mapf) {
			Main_menu();
		} else if(d==13) {
			now=li-1;
			Main_menu();
		}
	}

}
void Initialization() { //初始化
	srand((unsigned int)time(NULL));//设置随机数种子
	Initialization_thing();//物品初始化
	Initialization_monster();//怪物初始化
}
void setColor(unsigned short ForeColor,unsigned short BackGroundColor) { //设置颜色
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);//获取当前窗口句柄
	SetConsoleTextAttribute(handle,ForeColor+BackGroundColor*0x10);//设置颜色
	/*
	对应的颜色码表:
	0 = 黑色       8 = 灰色
	1 = 蓝色       9 = 淡蓝色
	2 = 绿色       10 = 淡绿色
	3 = 浅绿色     11 = 淡浅绿色
	4 = 红色       12 = 淡红色
	5 = 紫色       13 = 淡紫色
	6 = 黄色       14 = 淡黄色
	7 = 白色       15 = 亮白色
	*/
}
void SetPos(int x,int y) { //定义设置光标位置的函数
	COORD pos;
	HANDLE handle;
	pos.X=x;
	pos.Y=y;
	handle=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(handle,pos);
}
int main() {
	printf("进行攻击无反应请选择地图");
	Sleep(1000);
	Initialization();
	Main_menu();
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值