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();
}