精华内容
下载资源
问答
  • 大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式...
    9c2dec9c4cbaef7c816614467e7fbc1e.png

    大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式应用游戏部门的大佬设计的,适合于喜欢用C语言写一些简易的游戏的朋友,逻辑性很强。

    一、2048游戏原理

    在最初的游戏, 它始于一个空4 x 4游戏板。

    1)在空位置的游戏板上,每一轮游戏产生一个“2”或“4”随机的数字。

    2)接下来,玩家输入的上移,下移,左移或右移命令移动块。两个相邻块相同的号码,若是Q,可以组合成一个块数量2Q。

    3)如果没有空间产生一个新的数字块,玩家则game over。

    4)想赢得游戏,玩家需要产生一块2048数字块。

    5bd16b90af59cd929fee87eb30aad1cd.png

    二、2048游戏文档

    当然,这些游戏的逻辑不是大家闷着脑子就能空想出来的,它一定有很规范的说明文档,由专业的人来书写,最后软件工程师参考对应的文档编写自己的代码

    d3fdfb0a75b369b82b84f1df625381cd.png
    71dd240db1d996fcdcbfe547dfb18fbc.png

    原版本如下:

    #include #include #include #include #include //num#define FALSE0#define TRUE1#define EMPTY_CELL     0#define GMAE_ROW 4#define GMAE_COL4//GameState#define STATE_SELECT   0#define STATE_PREPARE  1#define STATE_PALYING  2#define STATE_EXIT      3//GameMode#define MODE_NONE      0#define MODE_NORMAL    1#define MODE_DEBUG     2//Select Index#define INDEX_MAXNUM    3#define INDEX_NORMAL    0#define INDEX_DEBUG     1#define INDEX_EXIT      2//Command#define COM_LEFT'a'#define COM_RIGHT'd'#define COM_UP'w'#define COM_DOWN 's'#define COM_QUIT'q'//direction#define DIR_HEAD        0xe0#define KEY_UP0xe048#define KEY_DOWN 0xe050#define KEY_LEFT0xe04b#define KEY_RIGHT0xe04d#define ESC 0x1B#define ENTER0x0D//typetypedef unsigned int    Uint;typedef unsigned short  Ushort;typedef unsigned char   Uchar;//declarationstatic void GM_Init(void);static void GM_End(void);static Uint GM_SelectInit(void);static Uint GM_SelectHandle(void);static Uint GM_SelectEnd(void);static Uint GM_PrepareInit(void);static Uint GM_PrepareHandle(void);static Uint GM_PrepareEnd(void);static Uint GM_PlayingInit(void);static Uint GM_PlayingHandle(void);static Uint GM_PlayingEnd(void);static Uint GM_SelectHandleEnter(void);static Uint GM_SelectHandleEsc(void);static void GM_PrintSelectMode(void);static void GM_RandAddOneNum(void);static Uchar GM_FromFileAddNum(void);static Uchar GM_InputAddOneNum(void);static Uchar GM_NotMoreMove(void);static void GM_PrintBoard(void);static Uchar GM_CheckWin2048(void);static Uchar GM_PlayingPull(void);static Uchar GM_CombineRight(Uint *array, int num);static Uchar GM_CombineLeft(Uint *array, int num);static Uchar GM_MoveRight(Uint *array, int num);static Uchar GM_MoveLeft (Uint *array, int num);//structtypedef  struct gameinfo {Uint  Board[GMAE_ROW][GMAE_COL];Uchar GameState;Uchar GameMode;Uchar StateSelectIndex;Uint  PlayingCommand;}GameInfo, *P_GameInfo;GameInfo GM;int main(void){GM_Init();while(1){switch(GM.GameState){case STATE_SELECT:GM_SelectHandle();break;case STATE_PREPARE:GM_PrepareHandle();break;case STATE_PALYING:GM_PlayingHandle();break;case STATE_EXIT:    goto GAME_EXIT;default:break;  }              }GAME_EXIT:    GM_End();    return 0;}static void GM_Init(void){memset(&GM, 0, sizeof(GameInfo));srand((int)time(NULL));GM_SelectInit();}static void GM_End(void){memset(&GM, 0, sizeof(GameInfo));fflush(stdin);printf("Command [q] can quit");while('q' != getch());}static Uint GM_SelectInit(void){GM.GameState = STATE_SELECT;    GM.StateSelectIndex = INDEX_NORMAL;GM_PrintSelectMode();}static Uint GM_SelectHandle(void){GM_PrintSelectMode();    fflush(stdin);    Uchar  ch1 = getch();if( ENTER == ch1){GM_SelectHandleEnter();}else if( ESC == ch1 ){GM_SelectEnd();GM.GameState = STATE_EXIT;}else if ( DIR_HEAD == ch1){Uchar  ch2 = getch();Ushort Key = (ch1 << 8)&0xff00 | ch2;switch(Key){    case KEY_UP:GM.StateSelectIndex = (GM.StateSelectIndex + INDEX_MAXNUM - 1) % INDEX_MAXNUM;break;case KEY_DOWN:GM.StateSelectIndex = (GM.StateSelectIndex + 1) % INDEX_MAXNUM;break;default:break;}}}static Uint GM_SelectEnd(void){}static Uint GM_PrepareInit(void){Uchar OldState = GM.GameState;    GM.GameState = STATE_PREPARE;//from STATE_SELECT -->  STATE_PREPAREif(STATE_SELECT == OldState){if(MODE_NORMAL == GM.GameMode){GM_RandAddOneNum();GM_RandAddOneNum();}else{GM_FromFileAddNum();}}//from STATE_PALYING -->  STATE_PREPAREelse{if(MODE_NORMAL == GM.GameMode){GM_RandAddOneNum();}else{GM_PrintBoard();while(FALSE == GM_InputAddOneNum());}}GM_PrintBoard();}static Uint GM_PrepareHandle(void){if(TRUE != GM_NotMoreMove()){    GM_PrepareEnd();GM_PlayingInit();}else{printf("Game Over!");GM.GameState = STATE_EXIT;}}static Uint GM_PrepareEnd(void){}static Uint GM_PlayingInit(void){GM.GameState = STATE_PALYING;printf( "PULL: [a]LEFT [d]RIGHT [w]UP [s]DOWN [q]QUIT" );printf( "Command: ");    fflush(stdout);}static Uint GM_PlayingHandle(void){fflush(stdin);GM.PlayingCommand = getch();switch(GM.PlayingCommand){case COM_LEFT:case COM_RIGHT:case COM_UP:case COM_DOWN:if( FALSE == GM_PlayingPull()){printf("[Error] invalid direction");printf( "Command: ");}else{if( TRUE == GM_CheckWin2048() ){GM_PrintBoard();printf("you win !");GM.GameState = STATE_EXIT;}else{GM_PlayingEnd();GM_PrepareInit();}}break;case COM_QUIT:printf("Bye !");GM.GameState = STATE_EXIT;break;default:printf("[Error] Command is a, d, w, s, q ");printf( "Command: ");fflush(stdout);break;}//GM_PrintBoard();}static Uint GM_PlayingEnd(void){GM.PlayingCommand = 0;}static Uint GM_SelectHandleEnter(void){switch(GM.StateSelectIndex){case INDEX_NORMAL:case INDEX_DEBUG:    if(INDEX_NORMAL == GM.StateSelectIndex){GM.GameMode = MODE_NORMAL;}    else{GM.GameMode = MODE_DEBUG;}GM_SelectEnd();GM_PrepareInit();break;case INDEX_EXIT:GM_SelectEnd();GM.GameState = STATE_EXIT;break;default:printf("error");break;}}static Uint GM_SelectHandleEsc(void){}static void GM_PrintSelectMode(void){system("cls");printf("# -  -  -  -  -  -  -  - #");printf("#     welcome to 2048    #");printf("# -  -  -  -  -  -  -  - #");printf("      MODU  SELECT        ");printf("      ");printf(GM.StateSelectIndex==INDEX_NORMAL?"-->NORMAL":"   NORMAL");     printf("      ");printf(GM.StateSelectIndex==INDEX_DEBUG? "-->DEBUG ":"   DEBUG ");printf("      ");printf(GM.StateSelectIndex==INDEX_EXIT?  "-->EXIT  ":"   EXIT  ");}static void GM_RandAddOneNum(void){int row, col;while (1){row = rand() % GMAE_ROW;col = rand() % GMAE_COL;if ( GM.Board[row][col] == EMPTY_CELL ){GM.Board[row][col] = ((rand() % 2) + 1) * 2;break;}}}static Uchar GM_FromFileAddNum(void){FILE  *infp;Uchar tmp[6],tmp1;Uchar ret = 0;Uchar i,j;if(infp = fopen("map.txt", "rb")){    for(i = 0; i < GMAE_ROW * GMAE_COL; i++){j = 0;memset(tmp, 0, sizeof(tmp));while(1){if(!fread(&tmp[j], 1, 1, infp))ret |= 0x02;if(tmp[j] == ' ' || tmp[j] == '' || tmp[j] == 0)break;j++;}*(&GM.Board[0][0]+i) =  atoi((const char *)tmp);}}else{ret |= 0x01;}if(NULL != infp){fclose(infp);}if(ret != 0){printf("read map txt fail");}return ret;}static Uchar GM_InputAddOneNum(void){int row, col, value;int ret = TRUE;printf("please input add one num!");printf("Row,Col,Value :");fflush(stdout);fflush(stdin);scanf("%d,%d,%d", &row, &col, &value);if(row >= GMAE_ROW || row < 0){printf("[Error] Row is between 0 and %d !", GMAE_ROW-1);ret = FALSE;}if(col >= GMAE_COL || col < 0){printf("[Error] Col is between 0 and %d !", GMAE_COL-1);ret = FALSE;}if(ret == TRUE && GM.Board[row][col] != 0){printf("[Error] ( %d , %d ) is occupied!", row, col);ret = FALSE;}if(value != 2 && value != 4){printf("[Error] Cell Value is either 2 or 4");ret = FALSE;}if(ret == TRUE){GM.Board[row][col] = value;}return ret;}static Uchar GM_NotMoreMove(void){int NotMoreMove = TRUE;int row, col;for ( row = 0; row < GMAE_ROW; row++){for ( col = 0; col < GMAE_COL; col++){if(GM.Board[row][col] == 0){NotMoreMove = FALSE;break;}if( col+1 < GMAE_COL && GM.Board[row][col] == GM.Board[row][col+1]){NotMoreMove = FALSE;break;}if( row+1 < GMAE_ROW && GM.Board[row][col] == GM.Board[row+1][col]){NotMoreMove = FALSE;    break;}}if(FALSE == NotMoreMove)break;}return NotMoreMove;}static void GM_PrintBoard(void){int row, col;system("cls");printf("# -  -  -  -  -  -  -  - #");printf("#     welcome to 2048    #");printf("# -  -  -  -  -  -  -  - #");for ( row = 0; row < GMAE_ROW; row++){for ( col = 0; col < GMAE_COL; col++){printf(" + - -", GM.Board[row][col]);}printf(" +");for ( col = 0; col < GMAE_COL; col++){if(0 == GM.Board[row][col])printf(" |    ");elseprintf(" |%4d", GM.Board[row][col]);}printf(" |");}printf(" + + + + + + + + + + + + + ");}static Uchar GM_CheckWin2048(void){int row,col; for ( row = 0; row < GMAE_ROW; row++){for ( col = 0; col < GMAE_COL; col++){if( GM.Board[row][col] == 2048 ){return TRUE;}}}return FALSE;}static Uchar GM_PlayingPull(void){//GMAE_ROW  行 4//GMAE_COL  列 4int index;int col, row;Uchar PullFlag = FALSE;Uint array[GMAE_ROW > GMAE_COL? GMAE_ROW:GMAE_COL];//******************COM_LEFT*******************if( COM_LEFT == GM.PlayingCommand)for ( row = 0; row < GMAE_ROW; row++){PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );PullFlag |= GM_CombineLeft( (Uint *)GM.Board[row], GMAE_COL );PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );}//******************COM_RIGHT******************else if( COM_RIGHT == GM.PlayingCommand)for ( row = 0; row < GMAE_ROW; row++){PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );PullFlag |= GM_CombineRight( (Uint *)GM.Board[row], GMAE_COL );PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );}//******************COM_UP*********************else if( COM_UP == GM.PlayingCommand)for ( col = 0; col < GMAE_COL; col++){for ( row = 0; row < GMAE_ROW; row++){array[row] = GM.Board[row][col];}//a col move LeftPullFlag |= GM_MoveLeft( (Uint *)array, GMAE_ROW );PullFlag |= GM_CombineLeft( (Uint *)array, GMAE_ROW );PullFlag |=GM_MoveLeft( (Uint *)array, GMAE_ROW );//write a colfor ( row = 0; row < GMAE_ROW; row++){GM.Board[row][col] = array[row];}}//******************COM_DOWN******************else if( COM_DOWN == GM.PlayingCommand)for ( col = 0; col < GMAE_COL; col++){//read a colfor ( row = 0; row < GMAE_ROW; row++){array[row] = GM.Board[row][col];}//a col move rightPullFlag |= GM_MoveRight( (Uint *)array, GMAE_ROW );PullFlag |= GM_CombineRight( (Uint *)array, GMAE_ROW );PullFlag |=GM_MoveRight( (Uint *)array, GMAE_ROW );//write a colfor ( row = 0; row < GMAE_ROW; row++){GM.Board[row][col] = array[row];}}return PullFlag;}static Uchar GM_CombineLeft(Uint *array, int num){int i;Uchar CombineFlag = FALSE;for ( i = 0; i < num-1; i++ ){if( array[i] != 0 && array[i] == array[i+1] ){array[i]  *= 2;array[i+1] = 0;CombineFlag = TRUE;}}return CombineFlag;}static Uchar GM_CombineRight(Uint *array, int num){int i;Uchar CombineFlag = FALSE;for ( i = num-1; i >= 1; i-- ){if( array[i] != 0 && array[i] == array[i-1] ){array[i]  *= 2;array[i-1] = 0;CombineFlag = TRUE;}}return CombineFlag;}static Uchar GM_MoveRight(Uint *array, int num){int i;int index = num - 1;Uchar moveflg = FALSE;for(i = num-1; i >= 0; i--){if(array[i] != 0){if(array[i] != array[index]){array[index] = array[i];moveflg = TRUE;}index--;}}while(index != -1){array[index] = 0;index--;}return moveflg;}static Uchar GM_MoveLeft(Uint *array, int num){int i;int index = 0;Uchar moveflg = FALSE;for(i = 0; i < num; i++){if(array[i] != 0){if(array[i] != array[index]){array[index] = array[i];moveflg = TRUE;}index++;}}while(index != num){array[index] = 0;index++;}return moveflg;}四、运行结果游戏主菜单界面,通过方向键选择,分别有NORMAL(正常进行游戏)、DEBUG(调试模式)、EXIT(退出游戏)按回车键进入对应的模式。用字母a、d、w、s、q分别代替左右上下以及退出键。如果最后游戏成功了,则会提示成功,如果失败则会退出程序。详细的游戏逻辑可通过代码以及文档进行了解。

    如果你也希望提升你的编程能力,了解C/C++更多知识,点击下方【了解更多】,接受牛人大牛们的指导,听听他们对写代码的建议,一起快乐学习,共同进步~

    展开全文
  • 现在只实现了可以获取到网页的源代码,但想获取的是指定网页中的部分网络请求,像是加载该网页用到的所有图片的URL。
  • 大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式...

     

    大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力,2048相信大家都应该熟悉,不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式应用游戏部门的大佬设计的,适合于喜欢用C语言写一些简易的游戏的朋友,逻辑性很强。

    C/C++的学习裙【七一二 二八四 七零五 】,无论你是小白还是进阶者,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!(点击蓝字进入)

     

    一、2048游戏原理

    在最初的游戏, 它始于一个空4 x 4游戏板。

    1)在空位置的游戏板上,每一轮游戏产生一个“2”或“4”随机的数字。

    2)接下来,玩家输入的上移,下移,左移或右移命令移动块。两个相邻块相同的号码,若是Q,可以组合成一个块数量2Q。

    3)如果没有空间产生一个新的数字块,玩家则game over。

    4)想赢得游戏,玩家需要产生一块2048数字块。

     

    二、2048游戏文档

    当然,这些游戏的逻辑不是大家闷着脑子就能空想出来的,它一定有很规范的说明文档,由专业的人来书写,最后软件工程师参考对应的文档编写自己的代码

     

     

    原版本如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <conio.h>
    
    //num
    #define FALSE	0
    #define TRUE	1
    
    #define EMPTY_CELL     	0
    
    #define GMAE_ROW	 	4
    #define GMAE_COL		4
    
    //GameState
    #define STATE_SELECT   	0
    #define STATE_PREPARE  	1
    #define STATE_PALYING  	2
    #define STATE_EXIT      3
    
    //GameMode
    #define MODE_NONE      	0
    #define MODE_NORMAL    	1
    #define MODE_DEBUG     	2
    
    //Select Index
    #define INDEX_MAXNUM    3
    #define INDEX_NORMAL    0
    #define INDEX_DEBUG     1
    #define INDEX_EXIT      2
    
    //Command
    #define COM_LEFT		'a'
    #define COM_RIGHT		'd'
    #define COM_UP			'w'
    #define COM_DOWN 		's'
    #define COM_QUIT		'q'
    
    //direction
    #define DIR_HEAD        0xe0
    #define KEY_UP			0xe048
    #define KEY_DOWN 		0xe050
    #define KEY_LEFT		0xe04b
    #define KEY_RIGHT		0xe04d
    
    
    #define ESC 			0x1B
    #define ENTER			0x0D
    
    //type
    typedef unsigned int    Uint;
    typedef unsigned short  Ushort;
    typedef unsigned char   Uchar;
    
    //declaration
    static void GM_Init(void);
    static void GM_End(void);
    
    static Uint GM_SelectInit(void);
    static Uint GM_SelectHandle(void);
    static Uint GM_SelectEnd(void);
    
    static Uint GM_PrepareInit(void);
    static Uint GM_PrepareHandle(void);
    static Uint GM_PrepareEnd(void);
    
    static Uint GM_PlayingInit(void);
    static Uint GM_PlayingHandle(void);
    static Uint GM_PlayingEnd(void);
    
    
    static Uint GM_SelectHandleEnter(void);
    static Uint GM_SelectHandleEsc(void);
    static void GM_PrintSelectMode(void);
    static void GM_RandAddOneNum(void);
    static Uchar GM_FromFileAddNum(void);
    static Uchar GM_InputAddOneNum(void);
    static Uchar GM_NotMoreMove(void);
    static void GM_PrintBoard(void);
    
    static Uchar GM_CheckWin2048(void);
    static Uchar GM_PlayingPull(void);
    static Uchar GM_CombineRight(Uint *array, int num);
    static Uchar GM_CombineLeft(Uint *array, int num);
    static Uchar GM_MoveRight(Uint *array, int num);
    static Uchar GM_MoveLeft (Uint *array, int num);
    
    //struct
    typedef  struct gameinfo {
    	Uint  Board[GMAE_ROW][GMAE_COL];
    	
    	Uchar GameState;
    	Uchar GameMode;
    	
    	Uchar StateSelectIndex;
    	
    	Uint  PlayingCommand;
    	
    }GameInfo, *P_GameInfo;
    
    GameInfo GM;
    
    int main(void)
    {
    	GM_Init();
    
    	while(1)
    	{	
    		switch(GM.GameState)
    		{
    			case STATE_SELECT:		
    				GM_SelectHandle();	
    				break;
    			case STATE_PREPARE:
    				GM_PrepareHandle();
    				break;	
    			case STATE_PALYING:
    				GM_PlayingHandle();
    				break;	
    			case STATE_EXIT:
    			    goto GAME_EXIT;
    			default:
    				break;	  	
    		}	       	   
        }
    
    GAME_EXIT:
        GM_End();
        return 0;	
    }
    
    static void GM_Init(void)
    {
    	memset(&GM, 0, sizeof(GameInfo));
    	srand((int)time(NULL));
    	
    	GM_SelectInit();
    }
    
    static void GM_End(void)
    {	
    	memset(&GM, 0, sizeof(GameInfo));	
    	
    	fflush(stdin);	
    	printf("\nCommand [q] can quit\n");
    	while('q' != getch());
    	
    }
    
    static Uint GM_SelectInit(void)
    {
    	GM.GameState = STATE_SELECT;
        GM.StateSelectIndex = INDEX_NORMAL;
    	GM_PrintSelectMode();
    }
    
    static Uint GM_SelectHandle(void)
    {	
    	GM_PrintSelectMode();	
    	
        fflush(stdin);
        Uchar  ch1 = getch();
    	if( ENTER == ch1)
    	{
    		GM_SelectHandleEnter();	
    	}
    	else if( ESC == ch1 )
    	{	
    		GM_SelectEnd();
    		GM.GameState = STATE_EXIT;
    	}
    	else if ( DIR_HEAD == ch1)
    	{
    		Uchar  ch2 = getch();
    		Ushort Key = (ch1 << 8)&0xff00 | ch2;
    		switch(Key)
    		{	    
    			case KEY_UP:
    				GM.StateSelectIndex = (GM.StateSelectIndex + INDEX_MAXNUM - 1) % INDEX_MAXNUM;
    				break;
    			
    			case KEY_DOWN:
    				GM.StateSelectIndex = (GM.StateSelectIndex + 1) % INDEX_MAXNUM;
    				break;
    
    			default:
    				break;	
    		}
    	}
    }
    
    static Uint GM_SelectEnd(void){}
    
    
    static Uint GM_PrepareInit(void)
    {
    	Uchar OldState = GM.GameState;
        GM.GameState = STATE_PREPARE;
    	
    	//from STATE_SELECT -->  STATE_PREPARE
    	if(STATE_SELECT == OldState)
    	{
    		if(MODE_NORMAL == GM.GameMode)
    		{
    			GM_RandAddOneNum();
    			GM_RandAddOneNum();	
    		}
    		else
    		{
    			GM_FromFileAddNum();	
    		}
    	}	
    	//from STATE_PALYING -->  STATE_PREPARE
    	else
    	{
    		if(MODE_NORMAL == GM.GameMode)
    		{
    			GM_RandAddOneNum();
    		}
    		else
    		{
    			GM_PrintBoard();		
    			while(FALSE == GM_InputAddOneNum());
    		}	
    	}
    	GM_PrintBoard();
    }
    
    static Uint GM_PrepareHandle(void)
    {
    	if(TRUE != GM_NotMoreMove())
    	{
    	    GM_PrepareEnd();
    		GM_PlayingInit();
    	}
    	else
    	{
    		printf("Game Over!\n");	
    		GM.GameState = STATE_EXIT;	
    	}	
    	
    }
    
    static Uint GM_PrepareEnd(void){}
    
    static Uint GM_PlayingInit(void)
    {
    	GM.GameState = STATE_PALYING;
    	printf( "PULL: [a]LEFT [d]RIGHT [w]UP [s]DOWN [q]QUIT\n" );	
    	printf( "Command: ");
        fflush(stdout);
    }
    
    static Uint GM_PlayingHandle(void)
    {		
    	fflush(stdin);
    	GM.PlayingCommand = getch();
    
    	
    	switch(GM.PlayingCommand)
    	{
    		case COM_LEFT:
    		case COM_RIGHT:
    		case COM_UP:
    		case COM_DOWN:
    			if( FALSE == GM_PlayingPull())
    			{	
    				printf("[Error] invalid direction\n");		
    				printf( "Command: ");	
    			}
    			else
    			{
    				if( TRUE == GM_CheckWin2048() )
    				{
    					GM_PrintBoard();
    					printf("you win !\n");
    					GM.GameState = STATE_EXIT;
    				}
    				else
    				{
    					GM_PlayingEnd();
    					GM_PrepareInit();
    				}
    			}
    			break;
    		case COM_QUIT:
    			printf("Bye !\n");	
    			GM.GameState = STATE_EXIT;	
    			break;
    		default:
    			printf("[Error] Command is a, d, w, s, q \n");
    			printf( "Command: ");
    			fflush(stdout);
    			break;
    	}
    	//GM_PrintBoard();
    }
    
    static Uint GM_PlayingEnd(void)
    {
    	GM.PlayingCommand = 0;
    }
    
    
    static Uint GM_SelectHandleEnter(void)
    {
    	switch(GM.StateSelectIndex)
    	{
    		case INDEX_NORMAL:			
    		case INDEX_DEBUG:
    		    if(INDEX_NORMAL == GM.StateSelectIndex)
    			{
    				GM.GameMode = MODE_NORMAL;
    			}
    		    else
    			{
    				GM.GameMode = MODE_DEBUG;
    			}
    			GM_SelectEnd();
    			GM_PrepareInit();
    			break;
    			
    		case INDEX_EXIT:
    			GM_SelectEnd();
    			GM.GameState = STATE_EXIT;	
    			break;
    			
    		default:
    			printf("error\n");
    			break;
    	}					
    		
    }
    
    static Uint GM_SelectHandleEsc(void){}
    
    
    static void GM_PrintSelectMode(void)
    {
    	system("cls");
    	printf("# -  -  -  -  -  -  -  - #\n");
    	printf("#     welcome to 2048    #\n");	
    	printf("# -  -  -  -  -  -  -  - #\n");		
    	printf("      MODU  SELECT        \n");
    	
    	printf("\n      ");
    	printf(GM.StateSelectIndex==INDEX_NORMAL?"-->NORMAL":"   NORMAL");	 
        printf("\n      ");	
    	printf(GM.StateSelectIndex==INDEX_DEBUG? "-->DEBUG ":"   DEBUG ");
    	printf("\n      ");	
    	printf(GM.StateSelectIndex==INDEX_EXIT?  "-->EXIT  ":"   EXIT  ");
    }
    
    
    static void GM_RandAddOneNum(void)
    {
    	int row, col;
    		
    	while (1)
    	{
    		row = rand() % GMAE_ROW;
    		col = rand() % GMAE_COL;
    		if ( GM.Board[row][col] == EMPTY_CELL )
    		{
    			GM.Board[row][col] = ((rand() % 2) + 1) * 2;
    			break;
    		}
    	}	
    }
    
    static Uchar GM_FromFileAddNum(void)
    {
    	FILE  *infp;
    	Uchar tmp[6],tmp1;
    	Uchar ret = 0;
    	Uchar i,j;
    	
    	if(infp = fopen("map.txt", "rb"))
    	{
    	    for(i = 0; i < GMAE_ROW * GMAE_COL; i++)
    		{
    			j = 0;
    			memset(tmp, 0, sizeof(tmp));
    			while(1)
    			{
    				if(!fread(&tmp[j], 1, 1, infp))
    					ret |= 0x02;
    				
    				if(tmp[j] == ' ' || tmp[j] == '\n' || tmp[j] == 0)
    					break;
    				
    				j++;	
    			}	
    			*(&GM.Board[0][0]+i) =  atoi((const char *)tmp);		
    		}
    	}
    	else
    	{
    		ret |= 0x01;
    	}
    	
    	if(NULL != infp)
    	{
    		fclose(infp);
    	}
    	
    	if(ret != 0)
    	{
    		printf("read map txt fail\n");
    	}
    	return ret;
    				
    }
    
    static Uchar GM_InputAddOneNum(void)
    {
    	int row, col, value;
    	int ret = TRUE;
    	printf("please input add one num!\n");
    	printf("Row,Col,Value :");
    	fflush(stdout);
    	fflush(stdin);
    	scanf("%d,%d,%d", &row, &col, &value);
    		
    	if(row >= GMAE_ROW || row < 0)
    	{
    		printf("[Error] Row is between 0 and %d !\n", GMAE_ROW-1);
    		ret = FALSE;
    	}
    	
    	if(col >= GMAE_COL || col < 0)
    	{
    		printf("[Error] Col is between 0 and %d !\n", GMAE_COL-1);
    		ret = FALSE;
    	}	
    	
    	if(ret == TRUE && GM.Board[row][col] != 0)
    	{
    		printf("[Error] ( %d , %d ) is occupied!\n", row, col);
    		ret = FALSE;
    	}
    	
    	if(value != 2 && value != 4)
    	{
    		printf("[Error] Cell Value is either 2 or 4\n");
    		ret = FALSE;
    	}
    	
    	if(ret == TRUE)
    	{
    		GM.Board[row][col] = value;
    	}
    	return ret;
    }
    
    static Uchar GM_NotMoreMove(void)
    {
    	int NotMoreMove = TRUE;
    	int row, col;
    	for ( row = 0; row < GMAE_ROW; row++)
    	{
    		for ( col = 0; col < GMAE_COL; col++)
    		{		
    			if(GM.Board[row][col] == 0)
    			{
    				NotMoreMove = FALSE;
    				break;	
    			}
    			
    			if( col+1 < GMAE_COL && GM.Board[row][col] == GM.Board[row][col+1])
    			{
    				NotMoreMove = FALSE;
    				break;
    			}	
    			
    			if( row+1 < GMAE_ROW && GM.Board[row][col] == GM.Board[row+1][col])
    			{
    				NotMoreMove = FALSE;	
    			    break;	
    			}							
    		}
    		if(FALSE == NotMoreMove)
    			break;
    	}	
    	return NotMoreMove;
    }
    
    static void GM_PrintBoard(void)
    {
    	int row, col;	
    	system("cls");
    	printf("# -  -  -  -  -  -  -  - #\n");
    	printf("#     welcome to 2048    #\n");	
    	printf("# -  -  -  -  -  -  -  - #\n");	
    	for ( row = 0; row < GMAE_ROW; row++)
    	{
    		for ( col = 0; col < GMAE_COL; col++)
    		{
    			printf(" + - -", GM.Board[row][col]);
    		}
    		printf(" +\n");
    		for ( col = 0; col < GMAE_COL; col++)
    		{
    			if(0 == GM.Board[row][col])
    				printf(" |    ");
    			else	
    				printf(" |%4d", GM.Board[row][col]);
    		}
    		printf(" |\n");
    	}
    	printf(" + + + + + + + + + + + + + \n");	
    	
    }
    
    static Uchar GM_CheckWin2048(void)
    {
    	int row,col;
    	 
    	for ( row = 0; row < GMAE_ROW; row++)
    	{
    		for ( col = 0; col < GMAE_COL; col++)
    		{
    			if( GM.Board[row][col] == 2048 )
    			{
    				return TRUE;	
    			}			
    		}
    	}			
    	return FALSE;
    }
    
    static Uchar GM_PlayingPull(void)
    {
    	//GMAE_ROW  行 4
    	//GMAE_COL  列 4	
    	
    	int index;
    	int col, row;
    	Uchar PullFlag = FALSE;
    	Uint array[GMAE_ROW > GMAE_COL? GMAE_ROW:GMAE_COL];
    
    	//******************COM_LEFT*******************
    	if( COM_LEFT == GM.PlayingCommand)	
    	for ( row = 0; row < GMAE_ROW; row++)
    	{
    		PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );
    		PullFlag |= GM_CombineLeft( (Uint *)GM.Board[row], GMAE_COL );
    		PullFlag |= GM_MoveLeft( (Uint *)GM.Board[row], GMAE_COL );	
    	}
    		
    	//******************COM_RIGHT******************	
    	else if( COM_RIGHT == GM.PlayingCommand)	
    	for ( row = 0; row < GMAE_ROW; row++)
    	{	
    		PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );
    		PullFlag |= GM_CombineRight( (Uint *)GM.Board[row], GMAE_COL );
    		PullFlag |= GM_MoveRight( (Uint *)GM.Board[row], GMAE_COL );		
    	}
    		
    	//******************COM_UP*********************
    	else if( COM_UP == GM.PlayingCommand)			
    	for ( col = 0; col < GMAE_COL; col++)
    	{
    		for ( row = 0; row < GMAE_ROW; row++)
    		{
    			array[row] = GM.Board[row][col];				
    		}
    		
    		//a col move Left		
    		PullFlag |= GM_MoveLeft( (Uint *)array, GMAE_ROW );
    		PullFlag |= GM_CombineLeft( (Uint *)array, GMAE_ROW );
    		PullFlag |=	GM_MoveLeft( (Uint *)array, GMAE_ROW );	
    				
    		//write a col
    		for ( row = 0; row < GMAE_ROW; row++)
    		{
    			GM.Board[row][col] = array[row];				
    		}			
    	}		
    
    	//******************COM_DOWN******************
    	else if( COM_DOWN == GM.PlayingCommand)			
    	for ( col = 0; col < GMAE_COL; col++)
    	{	
    		//read a col
    		for ( row = 0; row < GMAE_ROW; row++)
    		{
    			array[row] = GM.Board[row][col];				
    		}
    		
    		//a col move right		
    		PullFlag |= GM_MoveRight( (Uint *)array, GMAE_ROW );
    		PullFlag |= GM_CombineRight( (Uint *)array, GMAE_ROW );	
    		PullFlag |=	GM_MoveRight( (Uint *)array, GMAE_ROW );
    	
    		//write a col
    		for ( row = 0; row < GMAE_ROW; row++)
    		{
    			GM.Board[row][col] = array[row];				
    		}									
    	}		
    
    	return 	PullFlag;	
    }
    
    static Uchar GM_CombineLeft(Uint *array, int num)
    {
    	int i;
    	Uchar CombineFlag = FALSE;
    	for ( i = 0; i < num-1; i++ )
    	{
    		if( array[i] != 0 && array[i] == array[i+1] )
    		{
    			array[i]  *= 2;
    			array[i+1] = 0;
    			CombineFlag = TRUE;
    		}						
    	}		
    	return CombineFlag;
    }
    
    
    static Uchar GM_CombineRight(Uint *array, int num)
    {
    	int i;
    	Uchar CombineFlag = FALSE;
    	for ( i = num-1; i >= 1; i-- )
    	{
    		if( array[i] != 0 && array[i] == array[i-1] )
    		{
    			array[i]  *= 2;
    			array[i-1] = 0;
    			CombineFlag = TRUE;
    		}						
    	}		
    	return CombineFlag;
    }
    
    
    static Uchar GM_MoveRight(Uint *array, int num)
    {
    	int i;
    	int index = num - 1;
    	Uchar moveflg = FALSE;
    		
    	for(i = num-1; i >= 0; i--)
    	{
    		
    		if(array[i] != 0)
    		{
    			if(array[i] != array[index])
    			{
    				array[index] = array[i];							
    				moveflg = TRUE;
    			}	
    			index--;			
    		}		
    	}
    	
    	while(index != -1)
    	{
    		array[index] = 0;
    		index--;
    	}
    	
    	return moveflg;
    	
    }
    
    
    static Uchar GM_MoveLeft(Uint *array, int num)
    {
    	int i;
    	int index = 0;
    	Uchar moveflg = FALSE;
    		
    	for(i = 0; i < num; i++)
    	{
    		
    		if(array[i] != 0)
    		{
    			if(array[i] != array[index])
    			{
    				array[index] = array[i];							
    				moveflg = TRUE;
    			}	
    			index++;			
    		}		
    	}
    	
    	while(index != num)
    	{
    		array[index] = 0;
    		index++;
    	}
    	
    	return moveflg;
    	
    }
    四、运行结果游戏主菜单界面,通过方向键选择,分别有NORMAL(正常进行游戏)、DEBUG(调试模式)、EXIT(退出游戏)按回车键进入对应的模式。用字母a、d、w、s、q分别代替左右上下以及退出键。如果最后游戏成功了,则会提示成功,如果失败则会退出程序。详细的游戏逻辑可通过代码以及文档进行了解。

     

     

    展开全文
  • C语言编程宝典教程 (html),一个短小精悍的小技巧,分两部分,一部分是基础篇,另一部分是函数篇。在基础篇中主要讲到了以下内容:1.1Turbo C语言概述 1.2 C 语言的特点 1.3 Turbo C 概述 1.4 Turbo C 2.0的安装和...
  • C语言编程宝典

    2007-04-11 11:20:10
    强烈推荐,C语言编程宝典,网页形式 方便浏览
  • 这是一个通过socket编程实现的一个模拟http服务器,在服务器接收到浏览器的连接后,发送一个HTML网页过去,然后在浏览器上显示出来; 主要问题:只能在局域网内使用,不能运行在公网上(运行了也无法正确发送HTML...

    这是一个通过socket编程实现的一个模拟http服务器,在服务器接收到浏览器的连接后,发送一个HTML网页过去,然后在浏览器上显示出来;

    /*
    	实现通过tcp/ip协议实现当服务器接收到浏览器请求后,发送一段HTML网页给浏览器
    */
    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <string.h>
    #include <unistd.h>
    #include <pthread.h>
    
    //初始化地址端口及开启服务器等待连接
    int init_net()
    {
    	//创建套接字
    	int socketfd = socket(AF_INET,SOCK_STREAM,0);
    	if(socketfd < 0)
    	{
    		perror("socket failed");
    		return -1;
    	}
    
    	//======================设置地址复用====================================
    	 int on=1;
    	 int rret = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    
    	//=====================================================================
    
    
    	//=======================绑定套接字=====================================
    	struct sockaddr_in my_addr;
    	memset(&my_addr,0,sizeof(my_addr));
    
    	my_addr.sin_family = AF_INET;//使用的协议:ipv4
    	my_addr.sin_port = htons(9988);//绑定的端口号
    	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定任意地址
    
    	int ret = bind(socketfd,(struct sockaddr *)&my_addr,sizeof(my_addr));
    	if(ret < 0)
    	{
    		perror("bind failed");
    		close(socketfd);
    		return -1;
    	}
    	//=======================================================================
    
    	
    	//=======================监听套接字=======================================
    	ret = listen(socketfd,5);
    	if(ret == -1)
    	{
    		perror("listen failed");
    		close(socketfd);
    		return -1;
    	}
    	//========================================================================
    	
    
    	//初始化完毕,返回套接字
    	return socketfd;
    }
    
    
    //线程函数,用于每个客户端连接后创建一个线程进行调用
    void *func(void *arg)
    {
    		//================先发送头部信息,再打开本地文件读取发送=======================
    		int acceptfd = *(int *)arg;//把传递的参数强转为int类型
    		
    		//
    		//	tcp服务器响应头部信息:
    		//		HTTP:使用http 1.1协议
    		//		Accept-Ranges:范围请求的单位是 bytes (字节)
    		//		Content-Length:内容长度
    		//		Connection:短连接
    		//		最后必须加上\r\n(格式要求)
    		//
    		char head_buf[] = "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\n\
    					 Content-Length: 1024\r\n\
    					 Content-Type: text/html;charset=UTF-8\r\n\
    					 Connection: close\r\n\r\n";
    		
    		int ret = send(acceptfd,head_buf,strlen(head_buf),0);
    		if(ret == -1)
    		{
    			perror("send failed");
    			close(acceptfd);
    			return NULL;
    		}
    		//============================================================================
    
    
    		//网页正文代码,在网页打印一个“text”
    		/*char text_buf[] = "<!DOCTYPE html>\n\
    <html>\n\
    <head></head>\n\
    <body>test</body>\n\
    </html>";*/
    
    		
    		///html网页代码编码格式
    		///		http-equiv:设置指定页面使用的编码集
    		///	<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\
    		
    
    		char text_buf[] = "<!DOCTYPE html>\n\
    <html>\r\n\
    <head>\r\n\
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\
    <script>\r\n\
    function checkForm()\r\n\
    {\r\n\
    alert(\"表单已提交!\");\r\n\
    }\r\n\
    </script>\r\n\
    </head>\r\n\
    <body>\r\n\
    <form action=\"open\" οnsubmit=\"checkForm()\">\r\n\
    <label type=\"text\" value=\"开灯\">\r\n\
    <input type=\"submit\" value=\"开灯\">\r\n\
    </form>\r\n\
    <form action=\"close\" οnsubmit=\"checkForm()\">\r\n\
    <label type=\"text\" value=\"关灯\">\r\n\
    <input type=\"submit\" value=\"关灯\">\r\n\
    </form>\r\n\
    </body>\r\n\
    </html>";
    		ret = send(acceptfd,text_buf,strlen(text_buf),0);
    		if(ret < 0)
    		{
    			perror("text write failed");
    		}
    
    		//如果关闭套接字则会导致浏览器发送多次命令后无法再次发送数据
    		//close(acceptfd);
    		
    		//线程退出
    		pthread_exit(NULL);
    }
    
    
    //主函数入口
    int main(int argc,char **argv)
    {	
    
    	//初始化
    	int socketfd = init_net();
    
    	while(1)
    	{
    		struct sockaddr_in addr;//保存客户端ip,端口等信息的结构体
    		socklen_t len = sizeof(addr);//保持多少个字节
    		
    		//阻塞等待客户端开始连接
    		int acceptfd = accept(socketfd,(struct sockaddr*)&addr,&len);
    		if(acceptfd == -1)
    		{
    			perror("acceptfd failed");
    			close(acceptfd);
    			return -1;
    		}
    
    		//当有连接时,打印连接的客户端ip号
    		char *ip = inet_ntoa(addr.sin_addr);
    		printf("\n\n\n有客户端连接:%s\n",ip);
    
    
    		//创建线程让其工作
    		pthread_t pid = -1;
    		int ret = pthread_create(&pid,NULL,func,&acceptfd);
    		if(ret != 0)
    		{
    			printf("pthread_create failed\n");
    			continue;
    		}
    
    		//线程分离
    		pthread_detach(pid);
    
    	}
    	
    	return 0;	
    }
    
    
    主要问题:个人仅在局域网内测试过,未在公网上测试(有服务器的可以在公网上测试下是否可行);而且速度有点慢,有想过这个问题但是没有思路,加上有其他事要忙就只能先放到一边
    展开全文
  • http协议C语言编程实现

    万次阅读 2012-12-08 10:32:54
    HTTP协议的C语言编程实现实例 关键词:http 客户端 RFC2616 协议 下载 大家都很熟悉HTTP协议的应用,因为每天都在网络上浏览着不少东西,也都知道是HTTP协议是相当简单的。每次用到FlashGet之类的下载软件下载...

    转载:http://zhoulifa.bokee.com/4640913.html

    HTTP协议的C语言编程实现实例
    关键词:http 客户端 RFC2616 协议 下载
    大家都很熟悉HTTP协议的应用,因为每天都在网络上浏览着不少东西,也都知道是HTTP协议是相当简单的。每次用到FlashGet之类的下载软件下载网页,当用到那个“用FlashGet下载全部链接”时总觉得很神奇。
    后来想想,其实要实现这些下载功能也并不难,只要按照HTTP协议发送request,然后对接收到的数据进行分析,如果页面上还有href之类的链接指向标志就可以进行深一层的下载了。HTTP协议目前用的最多的是1.1版本,要全面透彻地搞懂它就参考RFC2616文档吧。
    下面是我用C语言编程写的一个http下载程序,希望对大家有些启发。源代码如下:

    /******* http客户端程序 httpclient.c ************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <limits.h>
    #include <netdb.h>
    #include <arpa/inet.h>
    #include <ctype.h>

    //httpclient.c 开始///

    /********************************************
    功能:搜索字符串右边起的第一个匹配字符
    ********************************************/
    char * Rstrchr(char * s, char x) {
    int i = strlen(s);
    if(!(*s)) return 0;
    while(s[i-1]) if(strchr(s + (i - 1), x)) return (s + (i - 1)); else i--;
    return 0;
    }

    /********************************************
    功能:把字符串转换为全小写
    ********************************************/
    void ToLowerCase(char * s) {
    while(*s) *s=tolower(*s++);
    }

    /**************************************************************
    功能:从字符串src中分析出网站地址和端口,并得到用户要下载的文件
    ***************************************************************/
    void GetHost(char * src, char * web, char * file, int * port) {
    char * pA;
    char * pB;
    memset(web, 0, sizeof(web));
    memset(file, 0, sizeof(file));
    *port = 0;
    if(!(*src)) return;
    pA = src;
    if(!strncmp(pA, "http://", strlen("http://"))) pA = src+strlen("http://");
    else if(!strncmp(pA, "https://", strlen("https://"))) pA = src+strlen("https://");
    pB = strchr(pA, '/');
    if(pB) {
    memcpy(web, pA, strlen(pA) - strlen(pB));
    if(pB+1) {
    memcpy(file, pB + 1, strlen(pB) - 1);
    file[strlen(pB) - 1] = 0;
    }
    }
    else memcpy(web, pA, strlen(pA));
    if(pB) web[strlen(pA) - strlen(pB)] = 0;
    else web[strlen(pA)] = 0;
    pA = strchr(web, ':');
    if(pA) *port = atoi(pA + 1);
    else *port = 80;
    }

    /*********************************************************************
    *filename: httpclient.c
    *purpose: HTTP协议客户端程序,可以用来下载网页
    *wrote by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com)
    Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言
    *date time:2006-03-11 21:49:00
    *Note: 任何人可以任意复制代码并运用这些代码,当然包括你的商业用途
    * 但请遵循GPL
    *********************************************************************/
    int main(int argc, char *argv[])
    {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr;
    struct hostent *host;
    int portnumber,nbytes;
    char host_addr[256];
    char host_file[1024];
    char local_file[256];
    FILE * fp;
    char request[1024];
    int send, totalsend;
    int i;
    char * pt;

    if(argc!=2)
    {
    fprintf(stderr,"Usage:%s web-address\a\n",argv[0]);
    exit(1);
    }
    printf("parameter.1 is: %s\n", argv[1]);
    ToLowerCase(argv[1]);/*将参数转换为全小写*/
    printf("lowercase parameter.1 is: %s\n", argv[1]);

    GetHost(argv[1], host_addr, host_file, &portnumber);/*分析网址、端口、文件名等*/
    printf("webhost:%s\n", host_addr);
    printf("hostfile:%s\n", host_file);
    printf("portnumber:%d\n\n", portnumber);

    if((host=gethostbyname(host_addr))==NULL)/*取得主机IP地址*/
    {
    fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
    exit(1);
    }

    /* 客户程序开始建立 sockfd描述符 */
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*建立SOCKET连接*/
    {
    fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
    exit(1);
    }

    /* 客户程序填充服务端的资料 */
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(portnumber);
    server_addr.sin_addr=*((struct in_addr *)host->h_addr);

    /* 客户程序发起连接请求 */
    if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*连接网站*/
    {
    fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
    exit(1);
    }

    sprintf(request, "GET /%s HTTP/1.1\r\nAccept: */*\r\nAccept-Language: zh-cn\r\n\
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
    Host: %s:%d\r\nConnection: Close\r\n\r\n", host_file, host_addr, portnumber);
    printf("%s", request);/*准备request,将要发送给主机*/

    /*取得真实的文件名*/
    if(host_file && *host_file) pt = Rstrchr(host_file, '/');
    else pt = 0;

    memset(local_file, 0, sizeof(local_file));
    if(pt && *pt) {
    if((pt + 1) && *(pt+1)) strcpy(local_file, pt + 1);
    else memcpy(local_file, host_file, strlen(host_file) - 1);
    }
    else if(host_file && *host_file) strcpy(local_file, host_file);
    else strcpy(local_file, "index.html");
    printf("local filename to write:%s\n\n", local_file);

    /*发送http请求request*/
    send = 0;totalsend = 0;
    nbytes=strlen(request);
    while(totalsend < nbytes) {
    send = write(sockfd, request + totalsend, nbytes - totalsend);
    if(send==-1) {printf("send error!%s\n", strerror(errno));exit(0);}
    totalsend+=send;
    printf("%d bytes send OK!\n", totalsend);
    }

    fp = fopen(local_file, "a");
    if(!fp) {
    printf("create file error! %s\n", strerror(errno));
    return 0;
    }
    printf("\nThe following is the response header:\n");
    i=0;
    /* 连接成功了,接收http响应,response */
    while((nbytes=read(sockfd,buffer,1))==1)
    {
    if(i < 4) {
    if(buffer[0] == '\r' || buffer[0] == '\n') i++;
    else i = 0;
    printf("%c", buffer[0]);/*把http头信息打印在屏幕上*/
    }
    else {
    fwrite(buffer, 1, 1, fp);/*将http主体信息写入文件*/
    i++;
    if(i%1024 == 0) fflush(fp);/*每1K时存盘一次*/
    }
    }
    fclose(fp);
    /* 结束通讯 */
    close(sockfd);
    exit(0);
    }
    //httpclient.c 结束///

    展开全文
  • 《精通Unix下C语言编程与项目实践》之九 设计网页投票器(一) 作者:朱云翔,胡平 15.5项目:网页投票器――HTTP客户端 在互联网时代,很多服务程序采用了超文本传输协议HTTP进行报文传输,比如中国联合通信公司...
  • 说到linux的编程,我们就不得不提到C语言,linux系统就是用C编写的,如果你要在ubuntu下用c语言编写程序,首先要牵涉的是编写环境的搭建,以下是环境搭建的步骤: 第一,按照下面网页的提示来添加新的软件源: ...
  • 保存的.html就和网页右击另存为生成的那个.html是一样的,程序自动保存的.html双击能打开网页是检验标准。 有没有大神提点一下,有代码更好。求大神。
  • 15.4.4网页刷新器 程序http1在访问页面上存在着如下不足:其一,只能根据IP地址而不能根据域名访问网页;其二,只能访问一个特定的网页;其三,只读取一次WEB服务端返回的信息。事实上,在大多数页面的响应报文中,...
  • 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机、办公的电脑、你点击的页面、浏览的网页,都是有程序让它执行你要它做的事情。 PLC与编程有什么样的联系? 其实在自动化、电气这一块都是需要对自动化...
  • 展开全部如图,此题难度较大,要用到队列62616964757a686964616fe58685e5aeb931333365643566(我优化为循环队列...源代码如下:(网页端比较好看哦)#include#defineLIFETIME13//兔子寿命,单位半年(年龄小于此!)#defin...
  • 15.4.3网页投票器 本处设计一个网页投票器,它访问“www.zhiliaowang.com”上的服务程序“/toupiaoceshi.asp”,并通过“name”参数向选手投票。如代码15-16所示: 代码15-16网页投票器(节自/code/chapter15/...
  • 本人从网页收集技术文档并打包便于查阅学习:设计的领域有线程、进程、网络编程、网站安防、linux攻防、linux裁剪、内存等等
  • 在cgi编程中,c语言实现是很好的选择。   在使用printf等函数来绘制网页时,在最开始的时候一定要有: printf("Content-type: text/html/r/n"); printf("/r/n");   cgi机制会...
  • HTTP协议的C语言编程实现实例http://blog.csdn.net/hwz119/archive/2007/04/29/1591817.aspx 大家都很熟悉HTTP协议的应用,因为每天都在网络上浏览着不少东西,也都知道是HTTP协议是相当简单的。每次用到FlashGet之...
  • http协议C语言编程实例

    千次阅读 2010-01-19 10:03:00
    关键词: http 客户端 RFC2616 协议 下载 大家都很熟悉HTTP协议的应用,因为每天都在网络上...每次用到FlashGet之类的下载软件下载网页,当用到那个“用FlashGet下载全部链接”时总觉得很神奇。后来想想,其实要实
  • 拿我身边的一个例子来讲,她找身边的学长借了计算机相关的书籍,包含java,CSS等等,但是一本书看下来,还是不能制作网页,只知道一些基础的语法。最开始通过这些基础的语法,做出了不同颜色的页面和排版,她是很开心...
  • 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机、办公的电脑、你点击的页面、浏览的网页,都是有程序让它执行你要它做的事情。 PLC与编程有什么样的联系? 其实在自动化、电气这一块都是需要对自动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,018
精华内容 407
关键字:

c语言网页编程

c语言 订阅