龟兔赛跑Game

来源:互联网 发布:lol for mac什么时候 编辑:程序博客网 时间:2024/04/28 05:28





/********************************************************************************* 龟兔赛跑客户控制程序** GTClient.c*   主要功能: 选择难易程度,游戏控制,游戏秘笈,发送控制信息*   *   *** **                                                *                                                *                                                http://blog.csdn.net/zdcsky123******************************************************************************/#include "stdafx.h"#include "stdio.h"#include "time.h"#include "afxmt.h"#include "winsock2.h"//============================ 变量声明 =======================================char SendBuf[10];int CurruntMode;//当前的竞赛模式FILE *fp; //打开单词数据库的指针//============================ 函数声明 =======================================int getResult(int*, int*);//获取计算结果void judgment(int, int, int);//判定计算结果void level();//选择游戏难易程度void selectMode();//选择竞技模式int getStep();//根据单词游戏判断是否前进void printChange(char *);//输出乱序的单词int compare();//qsort排序函数//=============================================================================////  main() 创建socket套接字,并控制游戏流程//int main(int argc, char* argv[]){WSADATA wsaData;WSAStartup(MAKEWORD(2,2), &wsaData);SOCKET SendSocket;SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);sockaddr_in RecvAddr;int Port = 27015;RecvAddr.sin_family = AF_INET;RecvAddr.sin_port = htons(Port);RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");srand((unsigned)time( NULL ));int BufLen = 10;level();//难度选择sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));selectMode();//游戏模式printf("\n\n准备好了吗?(按ok开始!)\n");scanf("%s", SendBuf);sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));if(CurruntMode == 1){printf("\n功能向导0和-1\n\n\n");}while(true)//数字游戏模式{if(CurruntMode == 2){break;}int m1, m2;int result = getResult(&m1, &m2);judgment(result, m1, m2);sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));Sleep(1000);}while(true)//单词游戏模式{if(CurruntMode == 1){break;}if(getStep()){strcpy(SendBuf,"+");}else{strcpy(SendBuf,"-");}sendto(SendSocket, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));Sleep(1000);}closesocket(SendSocket);WSACleanup();return 0;}//=============================================================================////  getStep()  根据单词游戏判断是否前进//int getStep(){char word[10];char inputword[10];if(fgets(word,10,fp)==NULL){fclose(fp);fopen("word.txt","r+");fgets(word,10,fp);}word[strlen(word)-1]='\0';printChange(word);printf("正确的单词:");scanf("%s", inputword);{if(strcmp(word,inputword) == 0){printf("\t\t\tright!\n");memset(inputword,0,10);return 1;}else{printf("\t\t\twrong!\n");memset(inputword,0,10);return 0;}}}//=============================================================================////  selectMode()  选择当前的游戏竞赛方式//void selectMode(){int mode;printf("\n\n竞技方式 :数字游戏--1\t字母游戏--2\n\n");printf("选择:");scanf("%d", &mode);if(mode == 1){CurruntMode=1;//数字游戏}else{CurruntMode=2;//字母游戏fp = fopen("word.txt","r+");}}//=============================================================================////  level()  选择游戏难易程度,并准备将要发送的控制信息//void level(){printf("难易程度 :智商50的乌龟--1\t智商100的乌龟--2\t智商150的乌龟--3\n\n");printf("选择:");int level;scanf("%d", &level);    if(level==1){strcpy(SendBuf,"one");//简单}else if(level==3){strcpy(SendBuf,"three");//困难}else{strcpy(SendBuf,"two");//中等}}//=============================================================================////  compare() qsort排序函数//int compare( const void *arg1, const void *arg2 ){   /* Compare all of both strings: */   return (*(char*)arg1-*(char*)arg2);}//=============================================================================////  printChange() 生成乱序的词汇,并输出//void printChange(char *w){char word[10];strcpy(word,w);qsort( (void *)word, (size_t)strlen(word), sizeof(char), compare);printf("乱序的单词:%s\n",word);}//=============================================================================////  getResult() 随机产生两个数字,并获取计算结果//int getResult(int *m1, int *m2){int result = -1;*m1=rand()%100;*m2=rand()%100;printf("%d+%d=",*m1,*m2);scanf("%d", &result);return result;}//=============================================================================////   judgment() 判定计算结果,并准备将要发送的控制信息//void judgment(int result, int m1, int m2){if(result==(m1+m2)){strcpy(SendBuf,"+");printf("\t\t\tright!\n");}else if(result==0){printf("**********秘笈**********\n\n");printf("1000-----兔子加速10步\n");printf("-1000----乌龟减速10步\n");printf("1111-----乌龟被点穴\n");printf("2222-----乌龟被解穴\n\n");printf("**********秘笈**********\n\n");}else if(result==1000){strcpy(SendBuf,"++");printf("\t\t\t启用秘笈!\n");}else if(result==-1000){strcpy(SendBuf,"--");printf("\t\t\t启用秘笈!\n");}else if(result==1111){strcpy(SendBuf,"**");printf("\t\t\t启用秘笈!\n");}else if(result==2222){strcpy(SendBuf,"%%");printf("\t\t\t启用秘笈!\n");}else if(result==-1){printf("********游戏设置********\n\n");printf("3333-----暂停游戏\n");printf("4444-----恢复游戏\n");printf("5555-----重新开始\n");printf("6666-----托管模式\n\n");printf("********游戏设置********\n\n");}else if(result==3333){strcpy(SendBuf,"stop");printf("\t\t\t暂停游戏!\n");}else if(result==4444){strcpy(SendBuf,"resume");printf("\t\t\t恢复游戏!\n");}else if(result==5555){strcpy(SendBuf,"restart");printf("\t\t\t重新开始!\n");}else if(result==6666){strcpy(SendBuf,"deposit");printf("\t\t\t托管模式!\n");}else{strcpy(SendBuf,"-");printf("\t\t\twrong!\n");}}



/********************************************************************************* 龟兔赛跑主程序** GTKernel.c*   主要功能: 图形显示游戏状态,接收控制信息,控制游戏流程,控制游戏对象*   *   *** **                                                *                                                *                                                http://blog.csdn.net/zdcsky123******************************************************************************/#include "stdafx.h"#include "stdio.h"//#include "Windows.h"#include "time.h"#include "afxmt.h"#include "winsock2.h"//============================ 变量声明 =======================================char race[72];//描述兔子和乌龟的坐标HANDLE hThreadTortoise;//乌龟线程的句柄HANDLE hThreadRabbit;//兔子线程的句柄int RabbitStep = 0;//兔子的坐标int TortoiseStep = 0;//乌龟的坐标CEvent Start(FALSE,TRUE,NULL,NULL);//用于同步主线程、兔子线程和乌龟线程CEvent Stop(FALSE,TRUE,NULL,NULL);//用于挂起乌龟线程int num1, num2, num3, num4, num5;//乌龟的步伐//============================ 函数声明 =======================================void TortoiseRun();//乌龟前进一步void RabbitRun();//兔子前进一步void ThreadTortoise();//乌龟线程void ThreadRabbit();//兔子线程bool InitialAll();//启动乌龟和兔子的线程void DrawRace();//绘制坐标int Judgment();//判定结果int alarm();//相差10步以上出现声音警告void chooseLevel(char *);//选择等级//=============================================================================////  main() 创建线程,并控制游戏流程//int main(int argc, char* argv[]){if(InitialAll()){//printf("Are you ready!?");}else{printf("Error!\n");Sleep(1000);exit(-1);}srand((unsigned)time(NULL));while(true){WaitForSingleObject(Start.m_hObject,INFINITE);DrawRace();if(Judgment()){break;}alarm();Sleep(2000);}getchar();return 0;}//=============================================================================////  InitialAll() 启动乌龟和兔子线程//bool InitialAll(){DWORD ThreadTortoiseID;DWORD ThreadRabbitID;hThreadTortoise=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadTortoise,NULL,0,&ThreadTortoiseID);hThreadRabbit=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadRabbit,NULL,0,&ThreadRabbitID);if(hThreadTortoise!=NULL && hThreadRabbit!=NULL)return true;elsereturn false;}//=============================================================================////  ThreadTortoise() 乌龟线程入口函数//void ThreadTortoise(){while(true){WaitForSingleObject(Start.m_hObject,INFINITE);WaitForSingleObject(Stop.m_hObject,INFINITE);Sleep(2000);TortoiseRun();}}//=============================================================================////  ThreadTortoise() 兔子线程入口函数//void ThreadRabbit(){WSADATA wsaData;WSAStartup(MAKEWORD(2,2), &wsaData);SOCKET RecvSocket;RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);sockaddr_in RecvAddr;int Port = 27015;RecvAddr.sin_family = AF_INET;RecvAddr.sin_port = htons(Port);RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));char RecvBuf[10];int  BufLen = 10;sockaddr_in SenderAddr;int SenderAddrSize = sizeof(SenderAddr);int iResult = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);chooseLevel(RecvBuf);//选择难度iResult = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);if(strcmp(RecvBuf,"ok") == 0 || strcmp(RecvBuf,"OK") == 0 ){Start.SetEvent();Stop.SetEvent();}while(true){int iResult = recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize);if(strcmp(RecvBuf, "+")==0){RabbitRun();}else if(strcmp(RecvBuf, "**")==0){Stop.ResetEvent();//挂起乌龟线程}else if(strcmp(RecvBuf, "%%")==0){Stop.SetEvent();//唤醒乌龟线程}else if(strcmp(RecvBuf, "++")==0){RabbitStep=RabbitStep+10;//兔子加速10步}else if(strcmp(RecvBuf, "--")==0){TortoiseStep=TortoiseStep-10;//乌龟减速10步}else if(strcmp(RecvBuf, "restart")==0){RabbitStep=0;TortoiseStep=0;}else if(strcmp(RecvBuf, "stop")==0){Stop.ResetEvent();//挂起乌龟线程和界面线程Start.ResetEvent();}else if(strcmp(RecvBuf, "resume")==0){Stop.SetEvent();//唤醒乌龟线程和界面线程Start.SetEvent();}else if(strcmp(RecvBuf, "deposit")==0){while(true){Sleep(2000);RabbitRun();}}else{//RabbitStep--;}Sleep(1000);}}//=============================================================================////  DrawRace() 绘制乌龟和兔子的坐标//void DrawRace(){for(int i=0; i<72; i++){race[i]='_';}race[70]='|';race[71]='\0';race[RabbitStep]='T';race[TortoiseStep]='G';if(RabbitStep == TortoiseStep){race[TortoiseStep]='P';}printf("    %s\n",race);}//=============================================================================////  TortoiseRun() 乌龟前进一步//void TortoiseRun(){int number=rand() % 10 + 1;if(number >= 1 && number <=2){        TortoiseStep +=num1; if(TortoiseStep< 0){TortoiseStep = 0;}}if(number >= 3 && number <=4){TortoiseStep += num2;if(TortoiseStep< 0){TortoiseStep = 0;}}if(number == 5 ){TortoiseStep += num3;if(TortoiseStep< 0 ){TortoiseStep = 0;}}if(number >= 6 && number <=8){TortoiseStep += num4;if(TortoiseStep< 0){TortoiseStep = 0;}}  if(number >= 9 && number <= 10){TortoiseStep += num5;if(TortoiseStep< 0){TortoiseStep = 0;}}}//=============================================================================////  RabbitRun() 兔子前进一步//void RabbitRun(){int number=rand() % 10 + 1;if(number >= 1 && number <=2){         RabbitStep=RabbitStep+5;}if(number >= 3 && number <= 4){RabbitStep=RabbitStep+1;}if(number == 5 ){RabbitStep=RabbitStep+4;}if(number >= 6 && number <= 8){RabbitStep=RabbitStep+2;}  if(number >= 9 && number <= 10){RabbitStep=RabbitStep+3;}}//=============================================================================////  Judgment() 判断乌龟和兔子是否有一个到达终点//int Judgment(){if(RabbitStep>=70){TerminateThread(hThreadTortoise,NULL);TerminateThread(hThreadRabbit,NULL);printf("\n\n兔子赢了!");for(int i=0;i<3;i++){printf("\a");}return 1;}if(TortoiseStep>=70){TerminateThread(hThreadRabbit,NULL);TerminateThread(hThreadTortoise,NULL);printf("\n\n乌龟赢了!");for(int i=0;i<3;i++){printf("\a");}return 1;}return 0;}//=============================================================================////  alarm() 距离相差10步,发出声音警告//int alarm(){if((RabbitStep - TortoiseStep)>=10 ||(RabbitStep - TortoiseStep)<=-10){printf("\a");}return 0;}//=============================================================================////  chooseLevel() 选择难易程度//void chooseLevel(char *level){if(strcmp(level,"one")==0){num1 = 1;num2 = -2;num3 = 2;num4 = -2;num5 = 0;}else if(strcmp(level,"three")==0){num1 = 9;num2 = 12;num3 = 6;num4 = 7;num5 = 10;}else{num1 = 2;num2 = 1;num3 = 3;num4 = 4;num5 = 2;}}

http://download.csdn.net/detail/zdcsky123/4224964