-
个人简介
#include<cstdio> #include<iostream> #include<ctime> #include<stdlib.h> #include<windows.h> #include <conio.h> using namespace std; #define frame_width 50 #define frame_height 25 typedef struct{ int x,y; } Food; typedef struct{ int x[100],y[100],len,state; } Snake; void gotoxy(int x,int y); //最重要的一个函数,控制光标的位置 void print_map(); void get_newfood();//生成新食物 bool check_foodinsnake();//检查新食物有没有在蛇身上 void move_snake(); void check_foodeating(); bool check_snakealive(); //需要用到的全局变量 int score; Snake snake; Food food; bool check_eaten; int main() { system("color 0B"); do { system("cls"); print_map(); score=0,check_eaten=0; //贪吃蛇的每回合运行控制 while(1) { check_foodeating();//system("pause"); move_snake(); Sleep(max(50,300-score));//控制速度(与长度呈反比) if(!check_snakealive()) break; } printf("Game Over!\n"); printf("1:Restart\t2:exit\n"); char com2; cin>>com2; if(com2=='2') break; }while(1); } void gotoxy(int x,int y) { COORD pos;//COORD是一种自带结构体,表示一个字符在控制台屏幕上的坐标 HANDLE han=GetStdHandle(STD_OUTPUT_HANDLE); //从标准输出设备里取出一个句柄 pos.X=y,pos.Y=x; SetConsoleCursorPosition(han,pos);//定位光标的函数 } void print_map() { //打印墙壁 for(int i=0;i<frame_height;i++) { gotoxy(i,0); printf("#"); gotoxy(i,frame_width-1);//因为这个标记是长度,从零开始所以最后要减1 printf("#"); } for(int i=0;i<frame_width;i++) { gotoxy(0,i); printf("#"); gotoxy(frame_height-1,i); printf("#"); } //蛇身初始化 snake.len=3; snake.state='w'; snake.x[1]=frame_height/2; snake.y[1]=frame_width/2; gotoxy(snake.x[1],snake.y[1]); printf("@"); for(int i=2;i<=snake.len;i++) { snake.x[i]=snake.x[i-1]+1; snake.y[i]=snake.y[i-1]; gotoxy(snake.x[i],snake.y[i]); printf("@"); } //打印初始食物 get_newfood(); //打印右边状态栏 gotoxy(2,frame_width+3); printf("WELCOME TO THE GAME OF RETRO SNAKE"); gotoxy(4,frame_width+3); printf("UP: w"); gotoxy(6,frame_width+3); printf("DOWN: s"); gotoxy(8,frame_width+3); printf("LEFT: a"); gotoxy(10,frame_width+3); printf("RIGHT:d"); gotoxy(12,frame_width+3); printf("Your score:%d",score); gotoxy(28,frame_width+3); printf("Made by jokersio"); } bool check_foodinsnake() { for(int i=1;i<=snake.len;i++) if(snake.x[i]==food.x&&snake.y[i]==food.y) return 1; return 0; } void get_newfood() { do{ srand(time(0)); food.x=rand()%(frame_height-2)+1; food.y=rand()%(frame_width-2)+1; }while(check_foodinsnake()); gotoxy(food.x,food.y); cout<<"$"; } void move_snake() { char com; while(kbhit())//键盘有输入 com=getch();//从控制台读取一个字符,但不显示在屏幕上 //没有吃到去除蛇尾 if(!check_eaten) { gotoxy(snake.x[snake.len],snake.y[snake.len]); printf(" "); } //将除蛇头外的其他部分向前移动 for(int i=snake.len;i>1;i--) snake.x[i]=snake.x[i-1], snake.y[i]=snake.y[i-1]; //移动蛇头 switch(com) { case 'w': { if(snake.state=='s') //如果命令与当前方向相反不起作用 snake.x[1]++; else snake.x[1]--,snake.state='w'; break; } case 's': { if(snake.state=='w') snake.x[1]--; else snake.x[1]++,snake.state='s'; break; } case 'a': { if(snake.state=='d') snake.y[1]++; else snake.y[1]--,snake.state='a'; break; } case 'd': { if(snake.state=='a') snake.y[1]--; else snake.y[1]++,snake.state='d'; break; } default: //按其余键保持状态前进 { if(snake.state=='s') snake.x[1]++; else if(snake.state=='w') snake.x[1]--; else if(snake.state=='d') snake.y[1]++; else if(snake.state=='a') snake.y[1]--; break; } } gotoxy(snake.x[1],snake.y[1]); printf("@"); check_eaten=0; gotoxy(frame_height,0); } void check_foodeating() { if(snake.x[1]==food.x&&snake.y[1]==food.y) { score+=10; check_eaten=1; gotoxy(12,frame_width+3); printf("Your score:%d",score); snake.len++; get_newfood(); } } bool check_snakealive() { if(snake.x[1]==0||snake.x[1]==frame_height-1||snake.y[1]==0||snake.y[1]==frame_width-1)//撞墙 return 0; for(int i=2;i<=snake.len;i++) if(snake.x[i]==snake.x[1]&&snake.y[i]==snake.y[1]) return 0; return 1; }
/* 狼人杀代码(洛谷原创) */ #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; const int daytime=0,night=1; int day=0, during_time=daytime, player_number, my_number; HWND hwnd=GetForegroundWindow(); const int blue=0,yellow=1,red=2,green=3,purple=4,white=5;//颜色常量 void color(int c){ switch(c){ case red:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);break; case green:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);break; case yellow:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN);break; case blue:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);break; case white:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_GREEN | FOREGROUND_BLUE);break; case purple:SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED |FOREGROUND_BLUE);break; } } int idx_police=-1; void gotoxy(int x,int y){ COORD position; position.X=x; position.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position); } void init_Show_Window(){ system("mode con lines=60 cols=188"); ShowWindow(hwnd,SW_MAXIMIZE);//窗口最大化 DeleteMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND); DrawMenuBar(GetConsoleWindow());//删除×字符 } /*玩家类*/ const int nvwu=0,cunmin=1,yuyanjia=2,langren=3,lieren=4,shouwei=5,good=6,die=1,life=2; class player{ public: int type; int die_or_life; int how(){ return die_or_life; } int is_light;//是否已经公布 int killer; }; player players[1000]; /*转换白天模式*/ void change_daytime(){ during_time=daytime; day++; } /*转换黑夜模式*/ void change_night(){ during_time=night; } int nnvwu=0,ncunmin=0,nyuyanjia=0,nlangren=0,nlieren=0,nshouwei=0; int idxnvwu,idxshouwei,idxyuyanjia,idxlieren,idxlangren[4]={-1,-1,-1,-1}; /*b是否在Arr中*/ bool is_include(int arr[],int b,int l){ for(int i=0;i<l;i++){ if(arr[i]==b) return true; } return false; } /*初始化人数*/ void init_players(){ my_number=rand()%player_number; if(player_number==12) nlangren=4; else if(player_number>=10) nlangren=3; else nlangren=2; for(int i=0;i<player_number;i++) { players[i].die_or_life=life; players[i].is_light=0; players[i].type=-1; players[i].killer=2147483647; } for(int i=0;i<nlangren;i++) { int p=rand()%player_number; if(!is_include(idxlangren,p,4)) idxlangren[i]=p,players[p].type=langren; else i--; Sleep(rand()%80+100); } if(player_number==12) { do{ idxshouwei=rand()%player_number; }while(players[idxshouwei].type!=-1); players[idxshouwei].type=shouwei; } do{ idxnvwu=rand()%player_number; }while(players[idxnvwu].type!=-1); players[idxnvwu].type=nvwu; if(player_number>=10) { do{ idxlieren=rand()%player_number; }while(players[idxlieren].type!=-1); players[idxlieren].type=lieren; } do{ idxyuyanjia=rand()%player_number; }while(players[idxyuyanjia].type!=-1); players[idxyuyanjia].type=yuyanjia; for(int i=0;i<player_number;i++) if(players[i].type==-1) players[i].type=cunmin, ncunmin++; if(players[my_number].type==langren) { for(int i=0;i<nlangren;i++) { players[idxlangren[i]].is_light=1; } } players[my_number].is_light=1; } /*在屏幕上打印东西*/ void print(){ gotoxy(0,0); cout<<"作者:洛谷393864"; gotoxy(90,0); if(during_time==night) color(red); else color(blue); printf("第%d天 | ",day); if(during_time==night) cout<<"黑夜"; else cout<<"白天"; gotoxy(0,3); color(blue); cout<<" 我的号位:"<<my_number+1; for(int i=0;i<player_number;i++){ gotoxy(i*8+1,4); if(i==idx_police) color(yellow); else color(blue); cout<<i+1<<"号位"; gotoxy(i*8+1,5); if(players[i].how()==die){ color(red); cout<<"死 亡"; }else{ color(green); cout<<"存 活"; } gotoxy(i*8+1,6); color(blue); if(players[i].is_light){ if(players[i].is_light==1){ switch(players[i].type){ case nvwu: cout<<"女 巫";break; case yuyanjia: cout<<"\b预言家";break; case cunmin: cout<<"村 民";break; case langren:cout<<"狼 人"; break; case lieren:cout<<"猎 人"; break; case shouwei:cout<<"守 卫"; break; } }else{ cout<<"好人"; } }else{ cout<<"未知"; } } } /*判断是否结束,没结束返回0 好人胜利返回1 狼人胜利返回2 平局返回3*/ int is_end(){ int die_bad=0; int die_people=0; int die_god=0; for(int i=0;i<player_number;i++){ if((players[i].type == nvwu || players[i].type == yuyanjia || players[i].type == shouwei)&&players[i].die_or_life==die) die_god++; else if(players[i].type == langren && players[i].die_or_life==die) die_bad++; else if(players[i].type == cunmin && players[i].die_or_life==die) die_people++; } if((die_bad==die_people || die_bad==die_god)&&(die_bad>=nlangren)) return 3; if(die_bad>=nlangren) return 1; if(die_people>=ncunmin||die_god>=(player_number>=10 ? 3:2)) return 2; return 0; } /*游戏开始前的骚操作*/ void before_game(){ srand(time(NULL)); init_Show_Window(); color(green); cout<<"欢迎来到狼人杀游戏\t\t\t为了更好的游戏体验,请右键点击上方↑↑,点击\"属性\",点击\"字体\"栏目,将字体修改为宋体或新宋体,将字号改为20\n作者:洛谷393864\n请勿私自转载,违者依法追究法律责任 注:10 11 12人局开设猎人 12人局开设守卫警长\n______________________\n"; cout<<"请输入玩家人数(8-12人):"; cin>>player_number; while(player_number<8||player_number>12) { cout<<"请重新输入!\n"; cin>>player_number; } system("cls"); cout<<"初始化身份中,请稍等."; for(int i=0;i<6;i++){ for(int j=0;j<12;j++){ cout<<"."; Sleep(50); } cout<<"\b\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b\b"; } system("cls"); init_players(); cout<<"我的号位:"<<my_number+1<<endl <<"我的身份:"; switch(players[my_number].type){ case nvwu: cout<<"女巫\n";break; case yuyanjia: cout<<"预言家\n";break; case cunmin: cout<<"村民\n";break; case langren:cout<<"狼人\n";break; case lieren:cout<<"猎人\n"; break; case shouwei:cout<<"守卫\n";break; } change_daytime(); system("pause"); system("cls"); cout<<"游戏加载中.";int ppppp=rand()%3+2; for(int i=0;i<ppppp;i++){ for(int j=0;j<6;j++){ cout<<"."; Sleep(rand()%100+150); } cout<<"\b\b\b\b\b\b \b\b\b\b\b\b"; } print(); } /*每一天开始前的操作*/ void something_before_everyday(){ change_night(); system("cls"); print(); gotoxy(0,7); cout<<"________________________"; gotoxy(0,8); color(white); cout<<"天黑~请闭眼~~~\n"; } /*守卫操作*/ int shouweishou=0; int ShouWei(){ color(blue); cout<<"守卫~请睁眼~~\n"; Sleep(1500); cout<<"你要守护的是?\n"; if(players[my_number].type==shouwei&&players[my_number].die_or_life == life){ cin>>shouweishou; while(!(shouweishou>=1&&shouweishou<=player_number&&players[shouweishou-1].die_or_life == life)){ cout<<"请重新输入!\n"; cin>>shouweishou; } cout<<"你今晚要守护的是"<<shouweishou<<"号\n"; Sleep(1500); shouweishou--; }else{ if(players[idxshouwei].die_or_life == life){ shouweishou=rand()%10; while(!(shouweishou>=1&&shouweishou<=player_number&&players[shouweishou-1].die_or_life == life)){ shouweishou=rand()%10; } } } Sleep(2000); cout<<"守卫请闭眼"<<endl<<endl; return shouweishou; } /*狼人操作*/ int LangRen(){ int langrensha=-1; color(red); cout<<"狼人~请睁眼~~~\n"; Sleep(1500); cout<<"你们今晚要杀~谁~~??\n"; if(players[my_number].type==langren&&players[my_number].die_or_life == life){ cin>>langrensha; while(!(langrensha>=1&&langrensha<=player_number&&players[langrensha-1].die_or_life==life)){ cout<<"请重新输入!\n"; cin>>langrensha; } cout<<"你们今晚要杀的是"<<langrensha--<<"号\n"; Sleep(3500); }else{ while(langrensha==-1 || players[langrensha].die_or_life == die || players[langrensha].type==langren){ langrensha=rand()%player_number; } Sleep(3000); } cout<<"狼人请~闭眼~~\n\n"; return langrensha; } /*女巫操作*/ int nvwujiu=0,nvwudu=0,is_nvwujiu=0,is_nvwudu=0; int NvWu(int langrensha){ color(purple); cout<<"女巫~~请睁眼~~\n"; Sleep(2000); if(players[my_number].type==nvwu&&players[my_number].die_or_life == life){ if(is_nvwujiu) cout<<"你已经用过解药\n",Sleep(1500); else { cout<<"今晚"<<langrensha+1<<"号死了,你想用解药吗?(1想 / 2不想)\n"; int is_nvwujie=0; cin>>is_nvwujie; while(is_nvwujie!=1&&is_nvwujie!=2){ cout<<"请重新输入\n"; cin>>is_nvwujie; } if(is_nvwujie==1) { Sleep(1000); cout<<"已经解救"<<langrensha+1<<"号\n"; nvwujiu=langrensha; } is_nvwujiu=1; } Sleep(1500); if(::is_nvwudu) cout<<"你已经用过解药\n",Sleep(1500); else { cout<<"你想用毒药吗?(1想 / 2不想)\n"; Sleep(1500); int is_nvwudu=0; cin>>is_nvwudu; while(is_nvwudu!=1&&is_nvwudu!=2){ cout<<"请重新输入\n"; cin>>is_nvwudu; } if(is_nvwudu==1){ Sleep(1500); cout<<"你想毒谁?\n"; cin>>nvwudu; while(!(nvwudu>=1&&nvwudu<=player_number&&players[nvwudu].die_or_life==life)){ cout<<"请重新输入\n"; cin>>nvwudu; } nvwudu--; Sleep(1500); cout<<"已经毒死了"<<nvwudu+1<<"号\n"; } ::is_nvwudu=1; } }else{ if(players[idxnvwu].die_or_life == life){ if(!is_nvwujiu) { int is_jiu=rand()%8; if(is_jiu==0){ nvwujiu=langrensha; is_nvwujiu=1; } } if(!is_nvwudu) { int is_du=rand()%4; if(is_du==0){ int num=rand()%player_number; nvwudu=num; is_nvwudu=1; } } } } cout<<"女巫~请闭眼~~\n\n"; return nvwujiu*10000+nvwudu;//传回两个变量,“加密”操作 } int yuyanjiabixutoupiao=-1; /*预言家操作*/ void YuYanJia(){ color(green); cout<<"预言家~请睁眼~~\n"; Sleep(2000); if(players[my_number].type==yuyanjia&&players[my_number].die_or_life == life){ cout<<"请问你想查验谁的身份\n"; int p; cin>>p; while(!(p>=1&&p<=player_number)){ cout<<"请重新输入!\n"; cin>>p; } Sleep(2000); cout<<p<<"号的身份是——"; Sleep(1000); if(players[p-1].type == langren){ cout<<"狼人\n"; players[p-1].is_light = 1; }else{ cout<<"好人\n"; players[p-1].is_light = 2; } }else{ int p=-1; while(p==-1||players[p].die_or_life==die||p==idxlieren) p=rand()%player_number; if(players[p].type==langren)//锁定目标! { yuyanjiabixutoupiao=p; } } cout<<"预言家~~请闭眼~~\n"; } /*黑夜操作*/ int LANGRENSHA=-1,NVWUDU=-1,NVWUJIU=-1,SHOUWEISHOU=-1; void Night(){ LANGRENSHA=-1,NVWUDU=-1,NVWUJIU=-1,SHOUWEISHOU=-1; //如果有12人局,添加守卫 if(player_number==12){ SHOUWEISHOU=ShouWei(); Sleep(2000); } /*狼人部分*/ LANGRENSHA=LangRen(); Sleep(3500); /*女巫部分*/ int nvwu=NvWu(LANGRENSHA); NVWUDU=nvwu%10+nvwu/10%10; NVWUJIU=nvwu/10000%10+nvwu/100000%10; Sleep(3000); /*预言家部分*/ YuYanJia(); Sleep(2000); } /*猎人操作*/ void Lieren(){ int lierendai=-1; cout<<idxlieren+1<<"号是猎人\n"; players[idxlieren].is_light = 1; Sleep(1000); if(idxlieren==my_number){ cout<<"你想带走几号?\n"; cin>>lierendai; while(lierendai<1||lierendai>player_number||players[lierendai].die_or_life==die){ cout<<"请重新输入!\n"; cin>>lierendai; } lierendai--; }else{ lierendai=rand()%player_number; while(players[lierendai].die_or_life == die){ lierendai=rand()%player_number; } } Sleep(2000); cout<<"猎人选择带走"<<lierendai+1<<"号\n"; Sleep(2000); players[lierendai].die_or_life = die; } void police_die(); /*判断谁死了*/ void panduansiwang(){ system("cls"); print(); gotoxy(0,7); cout<<"________________________\n"; Sleep(3000); color(white); cout<<"天亮了\n"; Sleep(2000); gotoxy(0,9); cout<<"昨晚"; bool is_die[15]={false},is_die_lieren=false,flag=false; for(int i=0;i<player_number;i++) { if(players[i].die_or_life==life) { if(i==LANGRENSHA||i==NVWUDU) { if(players[i].type==lieren) is_die_lieren=true; players[i].killer= (i==LANGRENSHA ? langren:nvwu); players[i].die_or_life=die; is_die[i]=true; } if(i==SHOUWEISHOU||i==NVWUJIU) { if(players[i].type==lieren) is_die_lieren=false; players[i].killer=-1; players[i].die_or_life=life; is_die[i]=false; } } } bool is_police_die=false; for(int i=0;i<player_number;i++) { if(is_die[i]) { if(flag) cout<<"和"<<i+1<<"号"; else cout<<i+1<<"号",flag=true; if(i==idx_police) is_police_die=true; } } if(flag) cout<<"死了\n"; else cout<<"是平安夜\n"; if(is_die_lieren) Lieren(); if(is_police_die) police_die(); } /*选警长*/ void choose_police(){ system("cls"); print(); color(blue); gotoxy(0,7); cout<<"________________________\n"; color(yellow); cout<<"下面开始选举警长,各位不能选举自己~\n"; int tong[100]={0},cannot[100],must[100]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; memset(cannot,-1,sizeof(cannot)); CHOOSE: color(yellow); Sleep(1500); for(int i=0;i<player_number;i++) { if(players[i].die_or_life==life&&!is_include(cannot,i,player_number)) { if(i==my_number) { cout<<"你要选举几号?\n"; int n; cin>>n; while(n<1||n>player_number||n==i+1||players[n-1].die_or_life==die||!is_include(must,n-1,player_number)) { cout<<"请重新输入!\n"; cin>>n; } cout<<i+1<<"号选举"<<n--<<"号\n"; tong[n]++; } else { int n=rand()%player_number; while(n==i||players[n].die_or_life==die||!is_include(must,n,player_number)) n=rand()%player_number; cout<<i+1<<"号选举"<<n+1<<"号\n"; tong[n]++; } Sleep(1500); } } int idx_max=-1,maxn=-1,len=0; for(int i=0;i<player_number;i++) if(maxn<tong[i]) { maxn=tong[i]; idx_max=i; } int maxn_arr[15]={0}; for(int i=0;i<player_number;i++) { if(tong[i]==maxn) { maxn_arr[len++]=i; } } color(blue); if(len>1) { for(int i=0;i<len;i++) { if(i==len-1) { cout<<maxn_arr[i]+1<<"号平票\n"; } else { cout<<maxn_arr[i]+1<<"号,"; } } for(int i=0;i<len;i++) cannot[i]=maxn_arr[i]; for(int i=0;i<player_number;i++) { if(is_include(cannot,i,len)) must[i]=i; else must[i]=-1; } color(white); goto CHOOSE; } cout<<"恭喜"<<idx_max+1<<"号当选警长\n"; Sleep(3000); idx_police=idx_max; return; } /*投票*/ int toupiao(){ int tong[100]={0},cannot[100]={},must[100]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; memset(cannot,-1,sizeof(cannot)); gotoxy(0,7); color(blue); cout<<"________________________\n"; color(white); cout<<"下面进入投票环节\n"; memset(tong,0,sizeof(tong)); Sleep(2000); TOUPIAO: for(int i=0;i<player_number;i++){ if(players[i].die_or_life == life&&!is_include(cannot,i,player_number)){ if(i==my_number){ color(white); cout<<"你要投几号?\n"; int n; cin>>n; while(!(n>=1&&n<=player_number&&is_include(must,n-1,player_number))){ cout<<"请重新输入!\n"; cin>>n; } Sleep(2000); cout<<setw(2)<<my_number+1<<"号投了"<<setw(2)<<n<<"号"; if(my_number==n-1) color(red),cout<<"快来看!这有个疯子投自己!"; if(i==idx_police) color(yellow),cout<<"(警长)\n"; else cout<<"\n"; if(i==idx_police) tong[n-1]++; tong[n-1]++; }else{ color(white); int t=-1; while(t==-1 || players[t].die_or_life == die || t==i || !is_include(must,t,player_number)){ if(i==idxyuyanjia&&yuyanjiabixutoupiao!=-1) { t=yuyanjiabixutoupiao; yuyanjiabixutoupiao=-1; continue; } t=rand()%player_number; if(is_include(idxlangren,i,nlangren)) { if(players[t].type == langren) t=-1; } } cout<<setw(2)<<i+1<<"号"<<"投了"<<setw(2)<<t+1<<"号"; if(i==idx_police) cout<<"(警长2票)\n"; else cout<<"\n"; if(i==idx_police) tong[t]++; tong[t]++; } Sleep(rand()%1000+1000); } } int idx_max=-1,maxn=-1,len=0; for(int i=0;i<player_number;i++) if(maxn<tong[i]) { maxn=tong[i]; idx_max=i; } int maxn_arr[15]={0}; for(int i=0;i<player_number;i++) { if(tong[i]==maxn) { maxn_arr[len++]=i; } } color(blue); if(len>1) { for(int i=0;i<len;i++) { if(i==len-1) { cout<<maxn_arr[i]+1<<"号平票\n"; } else { cout<<maxn_arr[i]+1<<"号,"; } } for(int i=0;i<len;i++) cannot[i]=maxn_arr[i]; for(int i=0;i<player_number;i++) { if(is_include(cannot,i,len)) must[i]=i; else must[i]=-1; } color(white); goto TOUPIAO; } cout<<idx_max+1<<"号"<<"出局\n"; Sleep(4000); players[idx_max].die_or_life = die; players[idx_max].killer = good; return idx_max; } /*警长死亡*/ void police_die(){ color(yellow); int type; if(idx_police==my_number) { Sleep(1550); cout<<"你是想撕毁警徽还是移交警徽?(撕毁输入1,移交输入2)"; cin>>type; while(!(type==1||type==2)) { cout<<"请重新输入!\n"; cin>>type; } } else{ type=rand()%3+1; } if(type==1) { cout<<"警长选择撕毁警徽\n"; Sleep(1000); idx_police=-1; } else { int lucky=-1; while(lucky==-1||players[lucky].die_or_life==die) lucky=rand()%player_number; cout<<"警长选择把警徽移交给"<<lucky+1<<"号\n"; Sleep(1500); idx_police=lucky; } } /*故事的最后*/ void the_end(){ system("cls"); switch(is_end()){ case 1:cout<<"好人胜利\n\n"; break; case 2:cout<<"狼人胜利\n\n"; break; case 3:cout<<"本局平局\n\n"; break; } for(int i=0;i<player_number;i++){ cout<<i+1<<"号位:\t"; switch(players[i].type){ case nvwu: cout<<"女巫\t";break; case yuyanjia: cout<<"预言家\t";break; case cunmin: cout<<"村民\t";break; case langren:cout<<"狼人\t";break; case lieren:cout<<"猎人\t"; break; case shouwei:cout<<"守卫\t";break; } cout<<"最终"; switch(players[i].killer){ case nvwu:cout<<"被女巫毒死\n"; break; case langren:cout<<"被狼人杀死\n"; break; case good:cout<<"被投票出局\n"; break; case lieren:cout<<"被猎人带走\n";break; default :cout<<"存活\n"; } cout<<endl; } } /*主函数*/ int main(){ int wheel=0; before_game(); while(!is_end()){ //黑夜准备 something_before_everyday(); Sleep(1500); //黑夜部分 Night(); //进入黑夜! change_daytime(); //换天 //天亮了 panduansiwang();//判断谁死了 Sleep(2000); system("cls"); print(); if(is_end()) break; //选警长 if(!wheel&&player_number==12) { choose_police(); system("cls"); print(); } //投票环节 int idx_max=toupiao();//票数最多的人 if(idx_max==idx_police){ police_die(); } if(players[idx_max].type==lieren){//启动猎人程序 Lieren(); if(is_end()) break; } system("cls"); print(); wheel++; } the_end(); system("pause"); return 0; }
#include<cstdio> #include<cstring> #include<algorithm> #include<conio.h> #include<windows.h> #include<cstdlib> #include<ctime> using namespace std; #define MAXN 35 #define MIDX 10 #define MIDY 40 #define CG 25 #define CK 80 int G,K,Lnum,Wnum;//G为地图高,K为地图,Lnum为地图中的雷数,Wnum为剩余的小旗数 int nx,ny;//现在光标所在的位置 bool QR=0,Lose=0,is_flag_true[MAXN][MAXN];//QR为确认模式是否打开,Lose为是否输,第三个是这个位置上的旗是否放对 char map[MAXN][MAXN],tmap[MAXN][MAXN];//第一个是只有雷和空地的地图,第二个是玩家能看到的地图 int map1[MAXN][MAXN],mapc[MAXN][MAXN];//map1为数字的地图,其中0代表空地,-1为雷,1-8为周围雷的个数 //mapc为当前格子的颜色 int col[10]={240,249,242,252,241,244,243,240,248};//col[i]表示windows扫雷中i的颜色,col[0]为空格的颜色 int d[10][4]={{0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};//8个方向 bool ZB;//作弊是否打开 /*各种函数*/ void color(int);//颜色 void gto(int,int);//光标位置 void make();//制作随机地图 void print();//打印地图等 bool check(int,int);//判断坐标是否合法 bool is_win();//判断是否赢 bool is_lose();//是否输 void dfs(int,int);//用深搜来打开方块 void st(int,int);//试探,即windows扫雷中的左右键同时按 void flag(int,int);//小旗 void bj(int,int);//标记 void swt();//确认模式 void again();//重新开始 void zb();//作弊模式 void mainmain();//主函数 void print_real_map();//打印最终的地图 void begin();//各种操作 int main() { mainmain(); } void color(int a){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);} void gto(int x,int y) { COORD pos;pos.X=y;pos.Y=x; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } void make() { for(int i=1;i<=G;i++) for(int j=1;j<=K;j++) map[i][j]='#';//初始化 for(int i=1;i<=Lnum;i++) { int x=rand()%G+1,y=rand()%K+1; while(map[x][y]=='O') x=rand()%G+1,y=rand()%K+1; map[x][y]='O'; }//随机放雷 for(int i=1;i<=G;i++) for(int j=1;j<=K;j++) { if(map[i][j]=='O')map1[i][j]=-1,mapc[i][j]=240;//如果是雷 else { for(int k=1;k<=8;k++) if(map[i+d[k][0]][j+d[k][1]]=='O') map1[i][j]++;//计算周围雷的个数 mapc[i][j]=col[map1[i][j]];//根据格子上的数设置颜色 } } for(int i=1;i<=G;i++) for(int j=1;j<=K;j++) if(mapc[i][j]==0)//空地 mapc[i][j]=240; } void print() { system("cls"); gto(0,MIDY-4); color(233); printf("扫雷"); color(240); gto(1,MIDY); for(int i=2;i<=G+1;i++) { gto(i,0); for(int j=1;j<=K;j++) printf("#"),tmap[i-1][j]='#';//初始化玩家所看到的地图 } gto(2,0); nx=2,ny=0; color(15); printf("@"); color(15); gto(2,2*K+5);printf("-----规则-----"); gto(3,2*K+5);printf("wasd:选择位置"); gto(4,2*K+5);printf("空格:打开"); gto(5,2*K+5);printf("1键:试探周围8个方块,如果其中有雷则不会打开,无"); gto(6,2*K+5);printf(" 雷或旗帜标对了则会将周围无雷的位置打开,"); gto(7,2*K+5);printf(" 如果试探时周围有标错的旗帜,则会游戏失败"); gto(8,2*K+5);printf(" 必须额外确认一次,以便查看周围被试探的区域"); gto(9,2*K+5);printf("2键:放置/取消小旗(F)"); gto(10,2*K+5);printf("3键:放置/取消标记(?)"); gto(11,2*K+5);printf("4键:打开/关闭确认模式,即每次操作需再按一次确认"); gto(12,2*K+5);printf("5键:打开/关闭作弊模式,即显示原本地图"); gto(13,2*K+5);printf("0键:重新开始");//打印规则 gto(G+4,0);printf("-----操作提示-----\n"); printf("请选择方块进行操作"); gto(1,2*K+10);color(12);printf("剩余小旗数:%d",Wnum=Lnum); } bool check(int x,int y){return y>=0&&y<K&&x>=2&&x<G+2;} //因为地图是从2行0列开始打的,而地图是从1行1列开始存的,所以gto(x,y)走到的是map[x-1][y+1] bool is_win() { int cnt=0; for(int i=1;i<=G;i++) for(int j=1;j<=K;j++) if(map[i][j]=='#'&&map1[i][j]==-1) cnt++; if(cnt==Lnum) return 1; //所有没被打开的方块都是雷=>胜利 for(int i=1;i<=G;i++) for(int j=1;j<=K;j++) if((tmap[i][j]!='F'&&map1[i][j]==-1)||(tmap[i][j]=='F'&&map1[i][j]!=-1)) return 0; return 1; //所有雷都标有旗 } bool is_lose(){return Lose;} void dfs(int x,int y) { if(map1[x-1][y+1]>0)//只要边界全部是数字就return { gto(x,y),color(mapc[x-1][y+1]),printf("%d",map1[x-1][y+1]); tmap[x-1][y+1]=map1[x-1][y+1]+'0'; return; } gto(x,y);color(255); tmap[x-1][y+1]=' '; printf(" ");//因为下面判断了雷,上面判断了数字,这里就一定是空地 for(int i=1;i<=8;i++) { int xx=x+d[i][0]-1,yy=y+d[i][1]+1;//这里的xx和yy是在map中的,而不是gto中的 if(check(xx+1,yy-1)&&tmap[xx][yy]=='#'&&map1[xx][yy]!=-1)//所以check和dfs的参数要变化 dfs(xx+1,yy-1); } } void st(int x,int y) { for(int i=1;i<=8;i++) { int xx=x+d[i][0],yy=y+d[i][1]; if(check(xx,yy)) { gto(xx,yy); if(tmap[xx-1][yy+1]!='#') color(mapc[xx-1][yy+1]-128);//减去128使周围的8个格子的背景颜色变为灰色 else color(112);//这里特判一下'#',应该可以不用 printf("%c",tmap[xx-1][yy+1]); } } gto(G+5,0),color(15),printf("请确认 "); //试探必须额外确认一次,规则上有说 char c=getch(); if(c=='1') { for(int i=1;i<=8;i++) { int xx=x+d[i][0],yy=y+d[i][1]; if(check(xx,yy)) if(tmap[xx-1][yy+1]=='F'&&map1[xx-1][yy+1]!=-1)//试探时有格子的小旗标错了=>失败 { Lose=1; return; } } for(int i=1;i<=8;i++) { int xx=x+d[i][0],yy=y+d[i][1]; if(check(xx,yy)) if(map1[xx-1][yy+1]==-1&&tmap[xx-1][yy+1]!='F')//试探是有格子为雷=>取消打开 return; } for(int i=1;i<=8;i++) { int xx=x+d[i][0],yy=y+d[i][1]; if(check(xx,yy)&&tmap[xx-1][yy+1]=='#')//打开周围8个格子 dfs(xx,yy); } } } void flag(int x,int y) { x-=1,y+=1; if(tmap[x][y]=='F')//原本为小旗=>取消小旗 { tmap[x][y]='#';mapc[x][y]=240; gto(x+1,y-1),color(240),printf("#"); Wnum++;//更新小旗数 } else//否则就放置小旗 { is_flag_true[x][y]=map1[x][y]==-1;//判断小旗是否放对 tmap[x][y]='F';mapc[x][y]=253; gto(x+1,y-1),color(253),printf("F"); Wnum--;//更新小旗数 } gto(1,2*K+10);color(12);printf("剩余小旗数: "); gto(1,2*K+22);printf("%d",Wnum);//更新小旗数 } void bj(int x,int y)//和放小旗差不多,只是不用更新is_flag_true { x-=1,y+=1; if(tmap[x][y]=='?') { gto(x+1,y-1),color(240),printf("#"); tmap[x][y]='#';mapc[x][y]=240; } else { if(tmap[x][y]=='F')//如果原本这个位置上是小旗,而你把它变为了标记,就要更新小旗数 { Wnum++; gto(1,2*K+10);color(12);printf("剩余小旗数: "); gto(1,2*K+22);printf("%d",Wnum); } gto(x+1,y-1),color(240),printf("?"); tmap[x][y]='?';mapc[x][y]=240; } } void swt(){QR=!QR;} void zb() { if(ZB)//如果本来作弊打开了就把作弊地图清除 { for(int i=1;i<=G;i++) { gto(i+1,K+2); for(int j=1;j<=K;j++) color(15),printf(" "); } ZB=0; } else//否则打印作弊地图 { for(int i=1;i<=G;i++) { gto(i+1,K+2); for(int j=1;j<=K;j++) { color(mapc[i][j]); if(map1[i][j]==-1) printf("O"); else if(map1[i][j]>0) printf("%d",map1[i][j]); else printf(" "); } } ZB=1; } } void again() { G=K=Lnum=nx=ny=Lose=ZB=0; QR=0; memset(is_flag_true,0,sizeof(is_flag_true)); memset(map,0,sizeof(map)); memset(tmap,0,sizeof(tmap)); memset(map1,0,sizeof(map1)); memset(mapc,0,sizeof(mapc)); color(15); system("cls");//初始化 mainmain(); } void begin()//各种操作 { char c=getch(); gto(G+5,0),color(15),printf("请选择方块进行操作"); color(240); if(c=='w'&&check(nx-1,ny)) { gto(nx,ny); if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ') color(mapc[nx-1][ny+1]); printf("%c",tmap[nx-1][ny+1]); gto(nx-=1,ny);color(15);printf("@"); } else if(c=='s'&&check(nx+1,ny)) { gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]); gto(nx+=1,ny);color(15);printf("@"); } else if(c=='a'&&check(nx,ny-1)) { gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]); gto(nx,ny-=1);color(15);printf("@"); } else if(c=='d'&&check(nx,ny+1)) { gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]); gto(nx,ny+=1);color(15);printf("@"); } //上下左右移动 else { if(c==' '&&(!(tmap[nx-1][ny+1]<='9'&&tmap[nx-1][ny+1]>='0'))&&tmap[nx-1][ny+1]!='F') { mapc[nx-1][ny+1]=col[map1[nx-1][ny+1]];//如果本来放了标记,mapc[nx-1][ny+1]的颜色为黑色,在打开时里面的颜色却不一定是黑色 if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()==' ') { if(map1[nx-1][ny+1]==-1) {Lose=1;return;} dfs(nx,ny); } } else { if(map1[nx-1][ny+1]==-1) {Lose=1;return;} dfs(nx,ny); } } else if(c=='1') { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='1') st(nx,ny); } else st(nx,ny); for(int i=1;i<=8;i++) { int xx=nx+d[i][0],yy=ny+d[i][1]; if(check(xx,yy)) { gto(xx,yy); if(tmap[xx-1][yy+1]!='#') color(mapc[xx-1][yy+1]); else color(240); printf("%c",tmap[xx-1][yy+1]); } } } else if(c=='2'&&(tmap[nx-1][ny+1]>'9'||tmap[nx-1][ny+1]<'1')) { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='2') flag(nx,ny); } else flag(nx,ny); } else if(c=='3'&&(tmap[nx-1][ny+1]>'9'||tmap[nx-1][ny+1]<'1')) { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='3') bj(nx,ny); } else bj(nx,ny); } else if(c=='4') { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='4') swt(); } else swt(); } else if(c=='5') { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='5') zb(); } else zb(); } else if(c=='0') { if(QR) { gto(G+5,0),color(15),printf("请确认 "); if(getch()=='0') again(); } else again(); } } } void mainmain() { system("mode con cols=120 lines=35");//设置窗口大小 srand((unsigned)time(NULL)); int mode; printf("1.初级\n2.中级\n3.高级\n4.自定义\n"); scanf("%d",&mode);if(mode>4) mode=4; if(mode==1) G=9,K=9,Lnum=10; else if(mode==2) G=16,K=16,Lnum=40; else if(mode==3) G=16,K=30,Lnum=99;//三种等级的参数 else { printf("请输入雷区高度:");scanf("%d",&G); printf("请输入雷区宽度:");scanf("%d",&K); printf("请输入雷个数(建议不超过总大小的三分之一):");scanf("%d",&Lnum); if(G>24) G=24;if(K>30) K=30; if(G<9) G=9;if(K<9) K=9; if(Lnum<10) Lnum=10;if(Lnum>G*K*9/10) Lnum=G*K*9/10; //控制参数的范围,最后一个if是雷的数量不超过地图大小的9/10 } make(); print(); while(1) { begin(); bool f1=is_win(),f2=is_lose(); if(f1||f2) { gto(0,0); if(f1) color(202),gto(0,0),printf("你 赢 了!!是否重来?(y/n)"); if(f2) color(137),gto(0,0),printf("你 输 了!!是否重来?(y/n)");//输赢 print_real_map(); char c=getch(); if(c=='y'||c=='Y') again(); else { color(15); system("cls"); gto(MIDX,MIDY-5); printf("欢迎下次再来"); return; } } } } void print_real_map() { color(240); for(int i=1;i<=G;i++) { gto(i+1,0); for(int j=1;j<=K;j++) { if(tmap[i][j]=='F'&&is_flag_true[i][j]==0)//如果旗标错了显示红色的X color(252),printf("X"); else if(map1[i][j]==-1)//雷为黑色O color(240),printf("O"); else if(map1[i][j]==0)//空 color(240),printf(" "); else//数字 color(mapc[i][j]),printf("%d",map1[i][j]); } }}
下面,请听我吟诗几首
————————————————————————————————————————————————————
其一:
抗言用武真非策,
日日庭闱盼树柯。
战场实事膏兼血,
争奈书生薄命何。
中间名种鸡群鹤,
国恨家仇奈若何。
必欲满堂阴有乐,
胜境目前皆了了。 ———————————————————————————————————————————————————— 其二:
刷题是一种出路,枚举是一种思想
打表是一种勇气,搜索是一种信仰
剪枝是一种精神,骗分是一种日常
爆零是一种宿命,W A是一种绝望
T L E是一种痛苦,R E 是一种放弃
U K E是一种无奈,AC是一种原谅
A K 是一种幻想,弃赛是一种颓废
吊打是一种必然,进队是一种奢望
模拟只会猜题意,贪心只能过样例
数学上来先打表,DP一般看规律
组合数学靠运气,计算几何瞎暴力
图论强行套模板,数论只会GCD
递归递推伤不起,搜索茫然TLE
分治做得像枚举,暴力枚举数第一
数据结构干瞪眼,怒刷水题找信心
涨姿势也不容易,考试一来全懵逼
————————————————————————————————————————————————————
其三:
暴力出奇迹,骗分过样例。
数学先打表,DP看运气。
穷举TLE,递推UKE。
模拟MLE,贪心还CE。
想要骗到分,就要有方法。
图论背模板,数论背公式。
动规背方程,高精背代码。
如果都没背,干脆输样例。
模拟定想全,动规定找对。
贪心定证明,二分L M+1。
宜考N O I P , 小心别爆零。
————————————————————————————————————————————————————
其四:
山重水复疑无路,make后面不加to。
秦时明月汉时关,高价氧化低价还。
君问归期未有期,点裂加倍匀两极。
酒酣胸胆尚开张,G M = g R 方。
碧云天,黄叶地,高温高压催化剂。
横看成岭侧成峰,洛伦兹力不做功。
草树知春不久归,b 方减去 4 a c。
瀚海阑干百丈冰,酸脱羟基醇脱氢。
————————————————————————————————————————————————————
其五:
明月 A C 惊鹊, R E 半夜鸣蝉。
稻花香里说丰年,听取W A声一片。
七八个 T L E,两三点 M L E。
旧时茅店社林边,路转 C E 忽见。
————————————————————————————————————————————————————
满级评测标准:
Waiting 评测:评测请求正在等待被评测机抓取
Fetched 评测:评测请求已被评测机抓取,正在准备开始评测
Compiling 评测:正在编译中
Judging 评测:编译成功,正在评测中
Accepted 通过:程序输出完全正确
Wrong Answer 通过:好答案
Time Limit Exceeded通过:时间充裕
Memory Limit Exceeded 通过:内存充裕
Runtime Error 通过:完美运行
Compile Error 通过:轻松通过编译
System Error 正常:系统正常
Unknown Error程序太好:被称赞
Canceled 非常棒:评测没问题
Ignored 其他:被关注
————————————————————————————————————————————————————
-
最近活动
- csp-j 第二次普及组模拟赛-补题 作业
- 2024年8月22日CSP-X初赛模拟赛3 OI
- 2024年8月16日CSP-X初赛模拟赛2 OI
- 2024年7月12日 初赛练习(3)【小学组】 OI
- 2024年7月6日 初赛练习(2)【小学组】 ACM/ICPC
- 2024.7.9 初赛练习 2【小学组】补题场 作业
- 2024.6.23 图灵六月月赛小学组(CSP-X)模拟赛 作业
- 2024年6⽉第三场周赛-小学组 IOI
- 2024 图灵5月月赛 - 小学组 OI
- 2024.5.16 周赛补题-小学组 作业
- 2024年5⽉第二场周赛-小学组 IOI
- 2024图灵4月月赛 - 小学组 作业
- 2024 图灵4月月赛 - 小学组 ACM/ICPC
- 2024.4.26 周赛补题-小学组 作业
- 城阳区51劳动节小学组趣味模拟赛 OI
- 2024年5⽉第一场周赛-小学组 IOI
- 2024.4.18 周赛补题-小学组 作业
- 2024年4⽉第三场周赛-小学组 IOI
- 2024.4.11 周赛补题-小学组 作业
- 2024年4⽉第二场周赛-小学组 IOI
- 2022-2023年市北区区赛历年真题 - 小学组 IOI
- 2022-2023年市北区区赛历年真题 - 初中组 IOI
- 2024.3.31 图灵三月月赛 - 小学组 补题场 作业
- 图灵三月月赛 - 小学组 赛题 ACM/ICPC
- 2024.3.25 周赛补题-小学组 作业
- 2024年3⽉第三场周赛-小学组 OI
- 2024.3.18 周赛补题-小学组 作业
- 2024年3⽉第二场周赛-小学组 IOI
- 2024.3.11 周赛补题-小学组 作业
- 2024年3⽉第⼀场周赛-小学组 IOI
-
Stat
-
Rating