如果您没有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;
}