过桥问题动画显示(多线程,简陋版)

Code:
  1. #include<windows.h>   
  2. #include<iostream.h>   
  3. #include<stdio.h>   
  4. void gotoxy(int x,int y)     
  5. {   
  6.     COORD c;   
  7.     c.X=x;   
  8.     c.Y=y;   
  9.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);   
  10. }   
  11.   
  12. /*四个信号量,东,西方向信号量,东,西段互斥信号量,用信号量控制过桥的对象,同时过桥的对象仅且  
  13. 只有两个,并且不能同向,多个线程用同一个线程入口函数*/  
  14.   
  15. HANDLE hE_Dir;  //从西往东信号量   
  16. HANDLE hW_Dir; //从西往东信号量    
  17. HANDLE hE_Mutex; //西段线程间的互斥   
  18. HANDLE hW_Mutex;  //东段线程互斥   
  19.   
  20. DWORD WINAPI EtoW1_Proc(LPVOID lpParameter);//东到西边线程   
  21.   
  22. DWORD WINAPI WtoE1_Proc(LPVOID lpParameter);//西到东边线程   
  23.   
  24.   
  25. void bridge();  //创建过桥函数   
  26. int i;   
  27. int j;   
  28. int time1=100,time2=300;   
  29. BOOL E_Release;   
  30. BOOL W_Release;   
  31.   
  32. int main()   
  33. {   
  34.     bridge();  //桥型   
  35.     gotoxy(12,12);  //光标第一次到(12,12)   
  36.      //各个互斥信号量   
  37.     hE_Dir = CreateMutex(NULL,FALSE,NULL);      
  38.     hW_Dir = CreateMutex(NULL,FALSE,NULL);   
  39.     hE_Mutex = CreateMutex(NULL,FALSE,NULL);   
  40.     hW_Mutex = CreateMutex(NULL,FALSE,NULL);   
  41.     //线程创建   
  42.     HANDLE hThread1,hThread2;   
  43.     hThread1=CreateThread(NULL,0,WtoE1_Proc,NULL,0,NULL);   
  44.     hThread2=CreateThread(NULL,0,EtoW1_Proc,NULL,0,NULL);   
  45.     CloseHandle(hThread1);   
  46.     CloseHandle(hThread2);   
  47.   
  48.   
  49.   
  50.        
  51.     Sleep(200000);  //主线程沉睡200秒   
  52.   
  53.     return 0;   
  54. }   
  55.   
  56. //西到东边线程   
  57. DWORD WINAPI WtoE1_Proc(LPVOID lpParameter)   
  58. {   
  59.     while(TRUE)   
  60.     {   
  61.   
  62.         WaitForSingleObject(hE_Dir,INFINITE);   //从西到东互斥   
  63.         WaitForSingleObject(hE_Mutex,INFINITE); //进入西段,互斥   
  64.         gotoxy(12,12);   
  65.         for(i=14;i<=34;i++)   
  66.         {   
  67.             gotoxy(i,12);   
  68.             time1=(time1+180)%500;   //随机速度   
  69.             Sleep(time1);   
  70.             gotoxy(i,12);//切换线程后,回到原地   
  71.             printf("☆");   
  72.             //gotoxy(i,12);   
  73.         }   
  74.   
  75.         W_Release = ReleaseMutex(hE_Mutex); //离开西段   
  76.         if(W_Release)/*判断谁先到,先到等1秒钟*/ Sleep(1000);   //到中间区域休息,等待另一方到来   
  77.         gotoxy(i,12);   
  78.         printf(" ");   
  79.         gotoxy(34,11);   
  80.         printf("☆");   
  81.         Sleep(100);   
  82.         gotoxy(34,11);   
  83.         printf("");   
  84.         gotoxy(35,11);   
  85.         printf("☆");   
  86.         Sleep(100);   
  87.         gotoxy(35,11);   
  88.         printf(" ");   
  89.   
  90.         WaitForSingleObject(hW_Mutex,INFINITE);    //进入东段,互斥   
  91.   
  92.         for(i=35;i<=56;i++)   
  93.         {   
  94.             gotoxy(i,12);   
  95.             Sleep(90);   
  96.             gotoxy(i,12);   
  97.             printf("☆");   
  98.             gotoxy(i,12);   
  99.         }   
  100.         gotoxy(i,12);   
  101.         printf(" ");   
  102.         ReleaseMutex(hW_Mutex);     //解开东段互斥   
  103.         //ReleaseMutex(hE_Mutex);   
  104.     }   
  105. //  return 0;   
  106. }   
  107.   
  108. //东到西边线程   
  109. DWORD WINAPI EtoW1_Proc(LPVOID lpParameter)   
  110. {   
  111. while(TRUE)   
  112.     {   
  113.   
  114.         WaitForSingleObject(hW_Dir,INFINITE);   //从东到西互斥   
  115.         WaitForSingleObject(hW_Mutex,INFINITE); //进东段 ,互斥   
  116.          
  117.         gotoxy(56,12);   
  118.         for(j=54;j>=36;j--)   
  119.         {   
  120.             gotoxy(j,12);   
  121.             time2=(time2+80)%500;   
  122.             Sleep(time2);     
  123.             gotoxy(j,12);  //切换线程后,回到原地   
  124.             printf("★");   
  125.             gotoxy(j,12);   
  126.         }   
  127.            
  128.         E_Release = ReleaseMutex(hW_Mutex);   //离开东段,   
  129.         if(E_Release) Sleep(1000);   
  130.         gotoxy(j+1,12);   
  131.         printf(" ");   
  132.         gotoxy(36,13);   
  133.         printf("★");   
  134.         Sleep(100);   
  135.         gotoxy(36,13);   
  136.         printf("");   
  137.         gotoxy(35,13);   
  138.         printf("★");   
  139.         Sleep(100);   
  140.         gotoxy(35,13);   
  141.         printf(" ");   
  142.         gotoxy(34,13);   
  143.         printf("★");   
  144.         Sleep(100);   
  145.         gotoxy(34,13);   
  146.         printf(" ");   
  147.   
  148. WaitForSingleObject(hE_Mutex,INFINITE);//进入西段,互斥   
  149.   
  150.         for(j=32;j>=12;j--)   
  151.         {   
  152.             gotoxy(j,12);   
  153.             Sleep(100);   
  154.             gotoxy(j,12);   
  155.             printf("★");   
  156.         }   
  157.         gotoxy(j+1,12);   
  158.         printf(" ");   
  159.           ReleaseMutex(hE_Mutex);//离开西段段   
  160.            
  161.     }   
  162. return 0;   
  163. }   
  164.   
  165.   
  166. void bridge()   
  167. {   
  168.     //☆   █   ★   //   
  169.     ///创建小桥//   
  170.     gotoxy(20+10,8);                                                //8行30列    
  171.     printf("█████");     
  172.     gotoxy(20+10,9);                                                //9行30列   
  173.     printf("█      █");      
  174.     gotoxy(20+10,10);                                               //10行30列   
  175.     printf("█      █");   
  176.     gotoxy(4+10,11);                                                //11行14列   
  177.     printf("█████████      █████████");   
  178.     gotoxy(4+10,13);                                               //13行14列   
  179.     printf("█████████      █████████");   
  180.     gotoxy(20+10,14);                                               //14行30列   
  181.     printf("█      █");   
  182.     gotoxy(20+10,15);                                               //15行30列   
  183.     printf("█      █");   
  184.     gotoxy(20+10,16);                                                //16行30列   
  185.     printf("█████");   
  186.        
  187.     //gotoxy(56,12);   //右边起始点   
  188.     //printf("★");   
  189.     //gotoxy(13,12);    //左边起始点   
  190.     //printf("☆");   
  191.     //          右边中间        gotoxy(38,12);    
  192.     //          左边中间        gotoxy(30,12);   
  193. //   
  194. }  

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值