野人渡河1

本文分享了在dev-c++环境下进行C++编程的经验,指出在线编程器可能无法支持某些特定功能,建议使用dev-c++进行本地开发。
摘要由CSDN通过智能技术生成

 如果您没有dev-c++软件,请下载,线上编程器不支持程序中的某些功能,不信自己试一下:GDB online Debugger | Compiler - Code, Compile, Run, Debug online C, C++

废话不多说,开始呈现代码:                                                                                                          

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define INF 200000000
#define PI 3.1415926
using namespace std;
int personal_state[6]= {0};
int number_of_person_in_boat=0;
int The_boat_position=0;
int personnum_comparation[3]= {0};
char usenum[200];

//移动到指定屏幕坐标的函数
void cursor_to_the_position(int x, int y) {
COORD coord; //定义一个坐标结构变量
HANDLE hsetcolorr; //定义一个句柄
coord.X = y; //给坐标赋值
coord.Y = x;
hsetcolorr = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄(就是显示器)
SetConsoleCursorPosition(hsetcolorr, coord); //设置控制台光标的到指定坐标
}

//设置输出背景和字体 的颜色的函数
void set_output_font_color(unsigned short BackGroundColor,unsigned short ForeColor) {
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));
}

//是能够正确输入一个数字而不至于出错的函数
int to_corect_input_a_number() {
rekey0:
gets(usenum);
if(strlen(usenum)==0)goto rekey0;
int s=0,i=0;
s=i=0;
do {
if(usenum[i]>='0'&&usenum[i]<='9') {
s*=10;
s+=(int)(usenum[i]-48);
if(s>INF) {
cout<<"您的输入有误,请重新输入。\n";
goto rekey0;//超出数值
}
}
i++;
} while(i<strlen(usenum));
if(s<=0) {
cout<<"您的输入有误,请重新输入。\n";
goto rekey0;//小于数值
}
return s;
}


//输出当前所有人的位置状态
int pr() {

system("cls");
cout<<"当前所有的人状态如下:\n";
for(int i=0; i<=2; i++) {
set_output_font_color(0,15);
cout<<"教士 "<<i+1<<" 当前状态:";
switch(personal_state[i]) {
case 0:
set_output_font_color(0,14);
cout<<"在左岸";
break;
case 1:
set_output_font_color(0,13);
cout<<"在船上";
break;
case 2:
set_output_font_color(0,10);
cout<<"在右岸";
break;
default:
cout<<"抱歉,出了点差错哦,请重新加载这个程序或向开发者报告吧!";
}
cout<<endl;


}

for(int i=3; i<=5; i++) {
set_output_font_color(0,15);
cout<<"野人 "<<i+1<<" 当前状态:";
switch(personal_state[i]) {
case 0:
set_output_font_color(0,14);
cout<<"在左岸";
break;
case 1:
set_output_font_color(0,13);
cout<<"在船上";
break;
case 2:
set_output_font_color(0,10);
cout<<"在右岸";
break;
default:
cout<<"抱歉,出了点差错哦,请重新加载这个程序或向开发者报告吧!";
}
cout<<endl;
}
set_output_font_color(0,15);
cout<<"当前行船状态:停靠";
switch(The_boat_position) {
case 0:
set_output_font_color(0,14);
cout<<"在左岸";
break;
case 1:
set_output_font_color(0,10);
cout<<"在右岸";
break;
default:
cout<<"抱歉,出了点差错哦,请重新加载这个程序或向开发者报告吧!";
}
cout<<endl<<endl;

}

int g;
int missionaries_num[3]= {0};

//判断是否因为船上,两岸的野人人数多于传教士而输掉
int to_judge_if_lose() {
memset(missionaries_num,0,3*sizeof(int));
memset(personnum_comparation,0,3*sizeof(int));
for(int i=0; i<=2; i++) {

personnum_comparation[personal_state[i]]--;
missionaries_num[personal_state[i]]++;
}

for(int i=3; i<=5; i++) {
personnum_comparation[personal_state[i]]++;
}

if(personnum_comparation[0]>0&&missionaries_num[0]) {

MessageBox(0,"在船离岸之后......左岸上的野人合力杀死了左岸上的传教士","提示:",MB_ICONWARNING|MB_SYSTEMMODAL);
return 0;
} else if(personnum_comparation[1]>0&&missionaries_num[1]) {
MessageBox(0,"在船行驶过程中......船上的野人合力杀死了船上的传教士","提示:",MB_ICONWARNING|MB_SYSTEMMODAL);
return 0;
} else if(personnum_comparation[2]>0&&missionaries_num[2]) {
MessageBox(0,"在船离岸之后......右岸上的野人合力杀死了右岸上的传教士","提示:",MB_ICONWARNING|MB_SYSTEMMODAL);
return 0;



} else
return 1;
}

//根据用户的输入来进行操作
int operation_for_player() {
set_output_font_color(0,15);
cout<<"请输入对应序号的当前对象来进行操作:输入1~6时表示对应序号成员切换状态(下船或上船)\n输入其他数字(如7)时将执行开船操作(船会带着其上的人驶向彼岸)";
cout<<endl;
g=to_corect_input_a_number();
if(The_boat_position==0) {


switch(g) {

case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
if(number_of_person_in_boat>=2&&personal_state[g-1]!=1) {
cout<<endl<<endl<<"不能执行此操作,船上人已满。。。。。。\n";
system("pause");
// number_of_person_in_boat=3;
// 因为没看见上面这句没改过来所以出现了bug
} else {
if(personal_state[g-1]<2) {
number_of_person_in_boat=(personal_state[g-1]==0)?number_of_person_in_boat+1:number_of_person_in_boat-1;
personal_state[g-1]=(personal_state[g-1]+1)%2;
} else {
cout<<endl<<endl<<"船离得太远了!。。。。。。\n";
system("pause");
if(g>=4) cout<<endl<<endl<<"也许野人会游泳,但是还不值得冒这个险。。。。。。\n";
system("pause");
}
}
break;
default:
if(number_of_person_in_boat>=1) {
cout<<endl<<endl<<"即将开始渡船";
for(int f=0; f<=6; f++) {
cout<<"。";
Sleep(300);
}
cout<<"\n";
if(!to_judge_if_lose())return 0;
The_boat_position=1;
for(int i=0; i<=5; i++) {
if(personal_state[i]==1)personal_state[i]=2;
}
if(!to_judge_if_lose())return 0;
cout<<endl<<endl<<"所有人已下船。。。。。。\n";
number_of_person_in_boat=0;
if(!to_judge_if_lose())return 0;
system("pause");
break;
} else {
cout<<endl<<endl<<"至少要一人才能开船!\n";
system("pause");

}

}

}

else if(The_boat_position==1) {


switch(g) {

case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
if(number_of_person_in_boat>=2&&personal_state[g-1]!=1) {
cout<<endl<<endl<<"不能执行此操作,船上人已满。。。。。。\n";
system("pause");
// number_of_person_in_boat=3;
// 因为没看见上面这句没改过来所以出现了bug
} else {
if(personal_state[g-1]>0) {
number_of_person_in_boat=(personal_state[g-1]==2)?number_of_person_in_boat+1:number_of_person_in_boat-1;
personal_state[g-1]=personal_state[g-1]%2+1;
}


else {
cout<<endl<<endl<<"船离得太远了!。。。。。。\n";
system("pause");
if(g>=4) cout<<endl<<endl<<"也许野人会游泳,但是不值得冒这个险。。。。。。\n";
system("pause");
}
}

break;
default:
if(number_of_person_in_boat>=1) {
cout<<endl<<endl<<"即将开始渡船";
for(int f=0; f<=6; f++) {
cout<<"。";
Sleep(300);
}
cout<<"\n";
if(!to_judge_if_lose())return 0;
The_boat_position=0;
for(int i=0; i<=5; i++) {
if(personal_state[i]==1)personal_state[i]=0;

}
if(!to_judge_if_lose())return 0;

cout<<endl<<endl<<"所有人已下船。。。。。。\n";
number_of_person_in_boat=0;
if(!to_judge_if_lose())return 0;
system("pause");


}

else {
cout<<endl<<endl<<"至少要一人才能开船!\n";
system("pause");

}
}

}

return 1;

}

//判断最终是否胜利
int Sucess() {
int cc=0;
for(int i=0; i<=2; i++) {
if(personal_state[i]==2)cc++;
}

for(int i=3; i<=5; i++) {
if(personal_state[i]==2)cc++;

}
if(cc==6)return 1;
return 0;

}
void first1() {
system("color 90");
while(1) {
if(kbhit()==NULL) {
cout<<"\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t任意键开始!!!!!\n\n\n\n\n\n\n";
Sleep(1000);
system("cls");
Sleep(400);
} else {
break;
}
}
getch();
}

//游戏的最终运行过程
int game() {

system("cls");
memset(personal_state,0,6*sizeof(int));
memset(missionaries_num,0,3*sizeof(int));
memset(personnum_comparation,0,3*sizeof(int));
// 如果重开始就把数据清空
number_of_person_in_boat=0;
The_boat_position=0;
g=0;

while(1) {
pr();
if(!operation_for_player()) {
pr();
return 0;
} else if(Sucess()) {
pr();
return 1;
}
}

}




//一系列的画图操作,不再赘述了
int drawbar(int h=40,int l=120) {
for(int i=0; i<h; i++) {
cursor_to_the_position(i,0);
set_output_font_color(i,0);
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)printf(" ");
}
}
int drawbar_right(int h=40,int l=120) {
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++) {
for(int i=0; i<h; i++) {
cursor_to_the_position(i,to_judge_if_lose);
set_output_font_color(i,0);
printf(" ");
}
}
}
int drawbar_left(int h=40,int l=120) {
for(int to_judge_if_lose=l-1; to_judge_if_lose>=0; to_judge_if_lose--) {
for(int i=h-1; i>=0; i--) {
cursor_to_the_position(i,to_judge_if_lose);
set_output_font_color(i,0);
printf(" ");
}
}
}

int drawbar_up(int h=40,int l=120) {
for(int i=h-1; i>=0; i--) {
cursor_to_the_position(i,0);
set_output_font_color(i,0);
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)printf(" ");
}
}

int drawbar1(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=0; i<h; i++) {
missionaries_num=rand()%15+1;
cursor_to_the_position(i,0);
set_output_font_color(missionaries_num,0);
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)printf(" ");
}
}

int drawbar1up(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=h-1; i>=0; i--) {
missionaries_num=rand()%15+1;
cursor_to_the_position(i,0);
set_output_font_color(missionaries_num,0);
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)printf(" ");
}
}
int drawbar1right(int h=40,int l=120) {
int m[h];
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=0; i<h; i++) {
m[i]=rand()%15+1;
}
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)
for(int i=0; i<h; i++) {
cursor_to_the_position(i,to_judge_if_lose);
set_output_font_color(m[i],0);
printf(" ");
}
}
int drawbar1left(int h=40,int l=120) {
int m[h];
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=h-1; i>=0; i--) {
m[i]=rand()%15+1;
}
for(int to_judge_if_lose=l-1; to_judge_if_lose>=0; to_judge_if_lose--)
for(int i=h-1; i>=0; i--) {
cursor_to_the_position(i,to_judge_if_lose);
set_output_font_color(m[i],0);
printf(" ");
}
}



//一系列的画图操作,不再赘述了
int drawbar2(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=0; i<h; i++) {

cursor_to_the_position(i,0);

for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++) {
missionaries_num=rand()%15+1;
set_output_font_color(missionaries_num,0);
printf(" ");
}
}
}


int drawbar2up(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int i=h-1; i>=0; i--) {

for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++) {
missionaries_num=rand()%15+1;
cursor_to_the_position(i,to_judge_if_lose);
set_output_font_color(missionaries_num,0);
printf(" ");
}
}
}
int drawbar2right(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++)
for(int i=0; i<h; i++) {
cursor_to_the_position(i,to_judge_if_lose);
missionaries_num=rand()%15+1;
set_output_font_color(missionaries_num,0);
printf(" ");
}
}
int drawbar2left(int h=40,int l=120) {
srand(time(NULL));
int s=rand()%4343536+1,missionaries_num;
srand(s);
for(int to_judge_if_lose=l-1; to_judge_if_lose>=0; to_judge_if_lose--)
for(int i=h-1; i>=0; i--) {
cursor_to_the_position(i,to_judge_if_lose);
missionaries_num=rand()%15+1;
set_output_font_color(missionaries_num,0);
printf(" ");
}
}

int drawrad(int h=40,int l=120,int z=0) {
int x=h/2,y=l/2;
double e,d;
double m[17];
double w=8.0;
for(int i=0; i<=16; i++) {
m[i]=PI*(double)(i-w)/(2*w);
}
for(int i=0; i<h; i++)
for(int to_judge_if_lose=0; to_judge_if_lose<l; to_judge_if_lose++) {
e=(double)(i-x)/(double)(to_judge_if_lose-y)*2;
d=atan(e);
for(int k=0; k<16; k++) {
if(d>m[k]&&d<m[k+1]) {
set_output_font_color(k+z,0);
}
}
cursor_to_the_position(i,to_judge_if_lose);
cout<<" ";
}
}

int drawX(int x,int y,char missionaries_num[]="※") {
for(int i=0; i<60; i++) {
cursor_to_the_position(i,y);
printf("%s",missionaries_num);
}
for(int i=0; i<180; i++) {
cursor_to_the_position(x,i);
printf("%s",missionaries_num);
}
}

int drawrow(int x,char missionaries_num[]="※") {
for(int i=0; i<180; i++) {
cursor_to_the_position(x,i);
printf("%s",missionaries_num);
}
}
int drawcol(int y,char missionaries_num[]="※") {
for(int i=0; i<60; i++) {
cursor_to_the_position(i,y);
printf("%s",missionaries_num);
}
}


int direc(int x1,int y1,int x2,int y2,char p[]) {
for(int i=y1; 2*i<=y2; i++) {
cursor_to_the_position(x1,2*i);
printf("%s",p);
}
for(int i=y1; 2*i<=y2; i++) {
cursor_to_the_position(x2,2*i);
printf("%s",p);
}
for(int i=x1; i<=x2; i++) {
cursor_to_the_position(i,y1);
printf("%s",p);
}
for(int i=x1; i<=x2; i++) {
cursor_to_the_position(i,y2);
printf("%s",p);
}
}
int dires(int x1,int y1,int x2,int y2,char p[]) {
for(int i=x1; i<=x2; i++) {
for(int to_judge_if_lose=y1; 2*to_judge_if_lose<=y2; to_judge_if_lose++) {
cursor_to_the_position(i,2*to_judge_if_lose);
printf("%s",p);
}
}

}

int erase(int x1,int y1,int x2,int y2) {
for(int i=x1; i<=x2; i++) {
cursor_to_the_position(i,y1);
for(int to_judge_if_lose=y1; 2*to_judge_if_lose<=y2; to_judge_if_lose++) {
printf(" ");
}
}

}

int showjindu(char missionaries_num[]="",int x=0,int y=0,int speed=-1) {

for(int i=1; i<=100; i++) {
cursor_to_the_position(x,y);
printf("%s %d%%",missionaries_num,i);
if(speed<0)
Sleep(rand()%(abs(speed)));
else Sleep(speed);
}

}

//展示进度条
//一定要记得清空输入流
int showjindutiao(char a[],int x,int y,int speed,double jian) {
for(int i=1; i<=100; i++) {
cursor_to_the_position(x,y);
printf("%s %d%%\n",missionaries_num,i);
for(int to_judge_if_lose=0; to_judge_if_lose<=(double)i/jian; to_judge_if_lose++)printf("▇",missionaries_num,i);
if(speed<0)
Sleep(rand()%(abs(speed)));
else Sleep(speed);
}
while(kbhit())getch();
}

//设置窗口的大小和位置
void setwindowsize_tocompare() {
RECT rect;
HWND hungforegroundwindow= GetForegroundWindow();
GetWindowRect(hungforegroundwindow, &rect);
MoveWindow(hungforegroundwindow, 0,0,1000,600, TRUE);
}

void slow_out_words(char *p,int s=100) { //控制输出速度s
while(*p!=0) {
if(kbhit()==0)
Sleep(s);
printf("%c",*p++);
}
if(kbhit()!=0)getch();
}

int set_the_window_bigest() {
system("mode con lines=40 cols=120");
}


//程序的入口函数
int main() {
set_the_window_bigest();
srand(time(NULL));
// setwindowsize_tocompare();
int first_set_rand_num;
Sleep(1000);
cse:
system("cls");
slow_out_words("\t\t\t野人过河\n\n\n");
slow_out_words(" 有三个传教士和三个野人过河,\n");

slow_out_words("只有一条能装下两个人的船,\n");


slow_out_words("在河的任何-方或者船上,\n");
slow_out_words("如果野人的人数大于传教士的人数,\n");
slow_out_words("那么传教士就会有危险.\n");

slow_out_words("你能否想出一些办法让他们渡过河呢?\n\n\n");
system("pause");
showjindutiao("游戏加载中",20,50,-45,1);
first_set_rand_num=rand()%9;
first1();
switch(first_set_rand_num) {
case 1:
drawbar1();
break;
case 2:
drawbar1up();
break;
case 3:
drawbar1left();
break;
case 4:
drawbar1right();
break;
case 5:
drawbar2();
break;
case 6:
drawbar2up();
break;
case 7:
drawbar2left();
break;
case 8:
drawbar2right();
break;
case 0:
drawrad();
break;
}
while(kbhit())getch();
getch();
int mm=game();
if(mm==1) {
MessageBox(0," 恭喜您挑战成功!您成功让野人传教士完成渡河!\n感谢您为教化传播做出的伟大贡献!\n","提示:",MB_OK|MB_SYSTEMMODAL);
MessageBox(0," \n ","提示:",MB_OK|MB_SYSTEMMODAL);

}

else if(mm==0) {
MessageBox(0,"游戏失败!","提示:",MB_ICONWARNING|MB_SYSTEMMODAL);
}


int i=MessageBox(0,"感谢您的游玩,您还想再玩一次吗?","提示:",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL);//MB_OK
if(i==6) {
goto cse;
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兔子递归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值