【C语言】仿照管理系统做的游戏菜单系统(源码分享)

【C语言】仿照管理系统做的游戏菜单系统

程序介绍:【C语言】游戏菜单界面设计 与 游戏整合

/*-----------------
实际写了1500行
这个游戏是第一次做大工程,其实语言可以更简练压缩到800行左右。
后续再改进。
----------------*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h> 
int x,y,i,j,k,p,q,num = 1,round,place_x1 = 0,place_y1 = 0,place_x2 = 0,place_y2 = 0;              //象棋游戏的全局变量                                          //基本参数 
int check_x,check_y,check_turn;
char ch, turn = 'O',turn1 = 'N',temp,temp1;    	
char check_1[9][3] ={"车","马","象","士","将","炮","兵","+-"};  //取棋子时只判断前8合法, 
char check_2[9][3] ={"車","馬","相","仕","帥","砲","卒","+-"};	//下棋子时判断多一个空位合法 
char check[3];
void menu()             //主菜单 
{
	system("cls"); 
	system("mode con cols=40 lines=25");      //迷你界面 
    system("color 06");
	printf("\n\n[=====================================]\n");
	Sleep(100);
    printf("[[-----------------------------------]]\n");
    	Sleep(100);
    printf("[[       |                    |      ]]\n");
    	Sleep(100);
    printf("[[       |   【C语言小游戏】  |      ]]\n");
    	Sleep(100);
    printf("[[       |                    |      ]]\n");
    	Sleep(100);
    printf("[[       |    【菜单/nemu】   |      ]]\n");
    	Sleep(100);
    printf("[[       |                    |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ① 双人单机象棋   |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ②双人单机五子棋  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ③ 待开发的游戏   |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ④   更多信息     |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[       |  ⑤    退出        |      ]]\n");
    	Sleep(100);
    printf("[[       |  ----------------  |      ]]\n");
    	Sleep(100);
    printf("[[                                   ]]\n");
    	Sleep(100);
	printf("[=====================================]\n");
		Sleep(200);
	printf("         <<按下相应数字进行选择>>\n");
    return;
}
void more()              //更多内容 
{
	system("cls"); 
	system("mode con cols=100 lines=30");      //迷你界面 
    system("color 66");
	printf("[[---------------------------------------------------------------------------]]\n");
    	Sleep(500);
    printf("[[       |                                                             |     ]]\n");
    	Sleep(500);
    printf("[[       |   author: llz           blog:https://404name.github.io      |     ]]\n");
    	Sleep(500); 
    printf("[[       |   创作历程:                                                |     ]]\n");
    	Sleep(500);
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    	Sleep(500);
    printf("[[       |  1.小游戏《走迷宫》学会wasd控制移动                         |     ]]\n");
    	Sleep(500);
    printf("[[       |  -------------------------------------------------------    |     ]]\n");
    	Sleep(500);
    printf("[[       |  2.在其基础上制作了简易的五子棋                             |     ]]\n");
    	Sleep(500);
    printf("[[       |  --------------------------------------------------------   |     ]]\n");
    	Sleep(500);
    printf("[[       |  3.在制作五子棋过程中学会巧妙的用temp储存状态               |     ]]\n");
    	Sleep(500);
    printf("[[       |  让五子棋的二维数组都可以在动态稳定                         |     ]]\n");
    	Sleep(500);
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    	Sleep(500);
    printf("[[       |  4.在五子棋基础上做象棋使2个字节的汉字也能同时移动实现取棋和杀棋  ]]\n");
    	Sleep(500);
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    	Sleep(500);
    printf("[[       |  5.通过定义每一个棋子规则使规则完善                        |     ]]\n");
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    	Sleep(500);
    printf("[[       |  6.最后参考图书馆管理系统制作了小游戏合集系统界面           |     ]]\n");
    printf("[=============================================================================]\n");
    	Sleep(100);
    printf("若有bug记得告诉下我,谢谢0.0\n"); 
    printf("任意键继续\n");
    getch();
     printf("[[       |  --------------------------------------------------------- |     ]]\n");
    	Sleep(500);
    printf("[[       |  游戏缺陷:                                                 |     ]]\n");
    	Sleep(500);
    printf("[[       |  -------------------------------------------------------    |     ]]\n");
    	Sleep(500);
    printf("[[       |  1.编程语言不够简练,代码太长不够精简                       |     ]]\n");
    	Sleep(500);
    printf("[[       |  --------------------------------------------------------   |     ]]\n");
    	Sleep(500);
    printf("[[       |  2.呈现游戏界面不能直白的分辨双方棋子                       |     ]]\n");
    	Sleep(500);
    printf("[[       |  --------------------------------------------------------   |     ]]\n");
    	Sleep(500);
    printf("[[       |  3.第一次做这类程序,许多游戏细节上未能处理好               |     ]]\n");                                 
    	Sleep(500);
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    	Sleep(500);
    printf("[[       |  更多:https://404name.github.io                            |     ]]\n");                                 
    	Sleep(500);
    printf("[[       |  ---------------------------------------------------------  |     ]]\n");
    printf("按任意键返回");
	getch();
	return ; 	
}
void check_main1(char* temp,char* temp1,char* turn,char* turn1,int *num,int *if_return,char map[1000][1000])         //(象棋函数 判断 将方  下棋是否合法 
{
	check[0] = *temp;
	check[1] = *temp1;
	check[2] = '\0';
	char a,b;								
	for ( i = 0; i < 8; i++)        
	{
		if( strcmp(check_2[i],check) == 0)
		{	
			*temp = *turn;
			*temp1 = *turn1;
			*turn = 'O';
			*turn1 = 'N'; 
			if( i < 7){
				printf("帅方的%s被吃\n",check_2[i]);
				Sleep(500);
			}	
			*num = *num + 1;
			for( k = 4; k <= 8; k = k + 2)   //判断帥是否死亡 
			{
				for(j = 15; j <= 23; j= j+ 4)
				{
					if(map[k][j] == check_2[4][0]  && map[k][j+1] == check_2[4][1])
					{
						place_x2 = k;
						place_y2 = j;
						break;
					}
				}
				if( j <= 23)
					break;
		    }
			if( k == 10)
			{
				printf("帥 被将死  将方获得胜利\n");
				printf("按任意键返回菜单"); 
					getch();
					*if_return = 1; 
					return;
			}
			for( k = 18; k <= 22; k = k + 2)   //判断将是否死亡 
			{
				for(j = 15; j <= 23; j= j+ 4)
				{
					if(map[k][j] == check_1[4][0]  && map[k][j+1] == check_1[4][1])
					{
						place_x1 = k;
						place_y1 = j;
						break;
					}	
				}
				if( j <= 23)
					break;
			}
			if( k == 24)
				{
					printf("将方 被将死  帥方获得胜利\n");
					printf("按任意键返回菜单"); 
					getch(); 
					*if_return = 1; 
					return; 
				}
			if( place_y1 == place_y2)
			{
				for( k = place_x2 + 2; k <= place_x1 - 2; k = k +2)
				{
					if(map[k][place_y1] != '+')
					break;	
				}
				if( k == place_x1)
				{
					if(round == 1)
						printf(" 将方对将   帥方胜利");
					else if( round == 2)
						printf(" 帥方对将   将方胜利");
					printf("按任意键返回菜单"); 
					getch(); 
					*if_return = 1; 
					return;
				}   	
			}
			break; 
		}	
	}
	if( i == 8)
	{
		printf("不合法的走法\n");
		Sleep(500);
	} 	 
} 
void check_main2(char* temp,char* temp1,char* turn,char* turn1,int *num,int *if_return,char map[1000][1000]) //象棋函数 判断  帥方下棋是否合法 
{   
	check[0] = *temp;
	check[1] = *temp1;
	check[2] = '\0';
	char a,b;
	for ( i = 0; i < 8; i++)        
	{
		if( strcmp(check_1[i],check) == 0)
		{	
			*temp = *turn;
			*temp1 = *turn1;
			*turn = 'O';
			*turn1 = 'N'; 
			if( i < 7)
			{
				printf("将方的%s被吃",check_1[i]);
				Sleep(500);
			}	
		    *num = *num + 1; 
			for( k = 4; k <= 8; k = k + 2)   //判断帥是否死亡 
		    {
				for(j = 15; j <= 23; j= j+ 4)
				{
					if(map[k][j] == check_2[4][0]  && map[k][j+1] == check_2[4][1])
					{
						place_x2 = k;
						place_y2 = j;
						break;
					}
				}
				if( j <= 23)
					break;
			}
			if( k == 10)
			{
				printf("帥 被将死  将方获得胜利\n");
				printf("按任意键返回菜单"); 
					getch();
					*if_return = 1; 
					return; 
			}
			for( k = 18; k <= 22; k = k + 2)   //判断将是否死亡 
			{
				for(j = 15; j <= 23; j= j+ 4)
				{
					if(map[k][j] == check_1[4][0]  && map[k][j+1] == check_1[4][1])
					{
						place_x1 = k;
						place_y1 = j;
						break;
					}	
				}
				if( j <= 23)
					break;
			}
			if( k == 24)
				{
					printf("将方 被将死  帥方获得胜利\n");
					printf("按任意键返回菜单"); 
					getch(); 
					*if_return = 1; 
					return;
				}
			if( place_y1 == place_y2)
			{
				for( k = place_x2 + 2; k <= place_x1 - 2; k = k +2)
				{
					if(map[k][place_y1] != '+')
						break;	
				}
				if( k == place_x1)
				{
					if(round == 1)
						printf(" 将方对将   帥方胜利");
					else if( round == 2)
						printf(" 帥方对将   将方胜利");
					printf("按任意键返回菜单"); 
					getch();
					*if_return = 1;  
					return;
				}   	
			} 
			break; 
		}	
	}
	if( i == 8)
	{
	printf("不合法的走法\n");
	Sleep(500);
	} 	 
}
void xiangqi()    //象棋主程序 
{
	char map[1000][1000]= {  "[[===================================]]",
                             "[|①将         【|象棋|】        ②帥|]",
                             "[====================================]]",
                             "[[-----------------------------------]]",
                             "[[ 車—馬—相—仕—帥—仕—相—馬—車]]", 
                             "[[ |   |   |   | \\ | / |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-]]",                            
                             "[[ |   |   |   | / | \\ |   |   |   | ]]",                           
                             "[[ +-—砲—+-—+-—+-—+-—+-—砲—+-]]",
                             "[[ |   |   |   |   |   |   |   |   | ]]",
                             "[[ 卒—+-—卒—+-—卒—+-—卒—+-—卒]]",
                             "[[ |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[===================================]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   | ]]",
                             "[[ 兵—+-—兵—+-—兵—+-—兵—+-—兵]]",
                             "[[ |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—炮—+-—+-—+-—+-—+-—炮—+-]]",
                             "[[ |   |   |   | \\ | / |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   | / | \\ |   |   |   | ]]",
                             "[[ 车—马—象—士—将—士—象—马—车]]",
                             "[[-----------------------------------]]",
                             "[=====================================]"};
	int if_return = 0;
	system("mode con cols=40 lines=30");      //迷你界面 
    system("color 70");
    printf("[====================================]\n");
    printf("[[----------------------------------]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |       【<<游戏规则>>】       | ]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  控制wasd双方轮流控制指针下棋| ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  键盘输入大小写 ' L '        | ]]\n");
    printf("[[ |  都视为确认下棋              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  为了方便区分棋子	          | ]]\n");
    printf("[[ |  后手方全设为繁体复杂字体    | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  Tip目前已实现所有象棋规则   | ]]\n");
    printf("[[ |  能检测出的bug都已解决       | ]]\n");
    printf("[[ |  若因过程存在未发现bug见谅   | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  我已阅读规则,按任意键继续  | ]]\n");
    printf("[[ |------------------------------| ]]\n");
	printf("[===================================]\n");
	getch();
	system("mode con cols=40 lines=30");      //迷你界面 
    system("color 70"); 				
	for ( i = 0; i < 27; i++)
	{
			puts(map[i]);
			Sleep(100);
	}
	x = 6,y = 19;
    temp = map[x][y];
	temp1 = map[x][y+1];     
    while(num)            
    {    
	if(num % 2 == 1 &&num / 2 % 2 == 0){
    	printf("现在是'将'的回合\n");
    	round = 1;
	}	
	else if( num %2 == 1){
		printf("现在轮到'帥'的回合了\n");
		round = 2;  	
	}               
    ch = getch();
    if ( ch == 's')         //下移 
    {
        if( map[x+1][y]!= '-')
        {
            map[x][y] =temp;
            map[x][y+1] = temp1;
            x = x + 2;
            temp = map[x][y];
            temp1 = map[x][y+1];
            map[x][y] = turn;
            map[x][y+1] = turn1;
        }
    }
    else if ( ch == 'a')    //左移 
    {
        if(map[x][y-1]!=' ')
        {
            map[x][y] =temp;
            map[x][y+1] = temp1;
            y = y - 4;
            temp = map[x][y];
            temp1 = map[x][y+1];
            map[x][y] = turn;
            map[x][y+1] = turn1;
        }
    }
    else if ( ch == 'w')    //上移 
    {
        if(  map[x-1][y]!= '-')
        {
            map[x][y] =temp;
            map[x][y+1] = temp1;
            x = x - 2;
            temp = map[x][y];
            temp1 = map[x][y+1];
            map[x][y] = turn;
            map[x][y+1] = turn1;
        }
    }
    else if ( ch == 'd')    //右移 
    {
        if(map[x][y+2]!=']')
        {
            map[x][y] =temp;
            map[x][y+1] = temp1;
            y = y + 4;
            temp = map[x][y];
            temp1 = map[x][y+1];
            map[x][y] = turn;
            map[x][y+1] = turn1;
        }
    }
        else if( ch == 'l' || ch =='L') 
        {
        	if(num % 2 == 1 && temp != '+' && temp1 != '-')   //取 
        	{
				check[0] = temp;
				check[1] = temp1;
				check[2] = '\0';
				if( round == 1)
				{
					for (  i = 0; i < 7; i++)           //将方 
					{
						if( strcmp(check_1[i],check) == 0)
						{
							turn = temp;
        					turn1 = temp1;
        					temp = '+';
        					temp1 = '-';  
							check_x = x;
							check_y = y;
							check_turn = 10 + i;  
							num++;    
							break; 
						}	
					}
					if( i == 7){
						printf("这不是你的棋子\n");
						Sleep(500);
					}
				 }
				else if( round == 2)
				{
					for ( i = 0; i < 7; i++)           //将方 
					{
						if( strcmp(check_2[i],check) == 0)
						{
							turn = temp;
        					turn1 = temp1;
        					temp = '+';
        					temp1 = '-';
							check_x = x;
							check_y = y;
							check_turn = 20 + i;   
							num++;    
							break; 
						}	
					}
					if( i == 7){
						printf("这不是你的棋子\n");
						Sleep(500);
					}
				} 
			}
			else if( num % 2 == 0)                 //放 
			{             
		/*char check_1[8][3] ={"车","马","象","士","将","炮","卒","+-"}; 
		char check_2[8][3] ={"俥","馬","相","仕","帥","軳","兵","+-"};*/ 
			/*
		中界 楚河上下坐标  12    15 
		*/     
		//  往下2  往又4 
				if( check_turn < 20)          //将方 
				{
					if( check_turn == 10) 				//车    的走法规范     完成 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if(  y == check_y  )
						{
							if( x > check_x)
							{
								for(j = check_x + 2; j < x;j = j + 2)
								{
									if(map[j][y] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j >= x)
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 
							if( x < check_x)
							{
								for(j = check_x - 2; j > x;j = j - 2)
								{
									if(map[j][y] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j <= x)
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 	
						}
						else if(  x == check_x  )
						{
							if( y > check_y)
							{
								for(j = check_y + 4; j < y;j = j + 4)
								{
									if(map[x][j] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j >= y)
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 
							if( y < check_y)
							{
								for(j = check_y - 4; j > y;j = j - 4)
								{
									if(map[x][j] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j <= y)
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 	
						}	
						else
						{
							printf("不合法的下法\n");
							Sleep(500);
						}
					}
					if( check_turn == 11) 				//马    的走法规范   ok 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
							else if( (abs( x - check_x) == 2&& abs( y - check_y) == 8)&& map[check_x][(y+check_y)/2] =='+')
						{
							check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else if( (abs( x - check_x) == 4&& abs( y - check_y) == 4)&& map[(x + check_x)/2][check_y] == '+' )
						{
							check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}	
						if( check_turn == 12) 				//相    的走法规范     完成 
					{
						if((x == check_x && y == check_y))
							{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
						else if( x >= 15 &&(abs(y - check_y) == 8 && abs(x - check_x) == 4))
							{
							 if((x == 22 && (y == 11 || y == 27))||(x == 18 && ( y == 3 || y == 19 || y == 35)) ||(x == 14 && (y == 11|| y ==27)))
							{		
								if( map[(x+check_x)/2][(y+check_y)/2] == '+')
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else
								{
									printf("棋子卡住,不可执行");
									Sleep(500); 
								} 
							}
							else
							{
									printf("不合法的下法\n");
								Sleep(500);
							}
						}
						else
						{
							printf("不合法的下法\n");
							Sleep(500);
						}  
					}
						if( check_turn == 13) 				//士    的走法规范    ok 
					{
						if((x == check_x && y == check_y))
						{		
						temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if( abs(x - check_x)== 2 && abs( y - check_y) == 4 &&((x==22 && (y == 15 || y == 23)) || ( x == 20 && y == 19) || ( x == 18 && ( y == 15 || y == 23))))
						{
							check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}
						if( check_turn == 14) 				//将    的走法规范 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
					else if( ((abs(x - check_x)== 2 && abs( y - check_y) == 0 )|| (abs(x - check_x)== 0 && abs( y - check_y) == 4)) && x >= 18 && x <= 22 && y >= 15 && y <= 23 )
						{
							check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}
						if( check_turn == 15) 				//炮    的走法规范 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if( y == check_y )
						{
							int check_pao = 0;
							if( x > check_x)
							{
								for(j = check_x + 2; j<= x ;j = j+ 2)
								{
									if(map[j][y] == '+' );
									else									
										check_pao++;
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
							else
							{
								for(j = check_x - 2; j>= x;j = j - 2)
								{
									if(map[j][y] == '+' );
									else
									{
										check_pao++;
									}
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
						}
						else if( x == check_x )
						{
								int check_pao = 0;
							if( y > check_y)
							{
								for(j = check_y + 4; j<= y ;j = j+4)
								{
									if(map[x][j] == '+' );
									else									
										check_pao++;
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
							else
							{
								for(j = check_y - 4; j>= y;j = j - 4)
								{
									if(map[x][j] == '+' );
									else
										check_pao++;
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}	
					if( check_turn == 16) 				//卒    的走法规范     成功 
					{
						if( x >= 14){
							if((x == check_x && y == check_y))
							{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
							else if( x == check_x - 2 && y == check_y)
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
							else
							{
								printf("不合法的下法\n");
								Sleep(500);
							}		
						}
						else{
							if((x == check_x && y == check_y))
							{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
							else if((x - check_x == 0 && abs(y-check_y) ==4) ||( x - check_x == -2 && abs(y-check_y) == 0))
								check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
							else
							{
							printf("不合法的下法\n");
							Sleep(500);
							}	
						}
					}		
				}
				else						   //帅方 
				{ 
					if( check_turn == 20) 				//车    的走法规范       完成 
					{ 
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if(  y == check_y  )
						{
							if( x > check_x)
							{
								for(j = check_x + 2; j < x;j = j + 2)
								{
									if(map[j][y] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j >= x)
								check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 
							if( x < check_x)
							{
								for(j = check_x - 2; j > x;j = j - 2)
								{
									if(map[j][y] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j <= x)
								check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 	
						}
						else if(  x == check_x  )
						{
							if( y > check_y)
							{
								for(j = check_y + 4; j < y;j = j + 4)
								{
									if(map[x][j] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j >= y)
								check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 
							if( y < check_y)
							{
								for(j = check_y - 4; j > y;j = j - 4)
								{
									if(map[x][j] == '+');
									else
									{
									printf("不合法的下发\n");
									Sleep(500);
									break;
									}
								}
								if( j <= y)
								check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								} 	
						}	
						else
						{
							printf("不合法的下法\n");
							Sleep(500);
						}
					}
					if( check_turn == 21) 				//马    的走法规范   ok 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
							else if( (abs( x - check_x) == 2&& abs( y - check_y) == 8)&& map[check_x][(y+check_y)/2] =='+')
						{
							check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else if( (abs( x - check_x) == 4&& abs( y - check_y) == 4)&& map[(x + check_x)/2][check_y] == '+' )
						{
							check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}	
						if( check_turn == 22) 				//相    的走法规范    完成 
					{
						if((x == check_x && y == check_y))
							{		
						temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
						else if( x <= 12 && (abs(y - check_y) == 8 && abs(x - check_x) == 4))
						{
							if((x == 4 && (y == 11 || y == 27))||(x == 8 && ( y == 3 || y == 19 || y == 35)) ||(x == 12 && (y == 11|| y ==27)))
							{		
								if( map[(x+check_x)/2][(y+check_y)/2] == '+')
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else
								{
									printf("棋子卡住,不可执行");
									Sleep(500); 
								} 
							}
							else
							{
									printf("不合法的下法\n");
								Sleep(500);
							}
						}
						else
						{
							printf("不合法的下法\n");
							Sleep(500);
						}  
					}
						if( check_turn == 23) 				//士    的走法规范   ok 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if( abs(x - check_x)== 2 && abs( y - check_y) == 4 &&((x==4 && (y == 15 || y == 23)) || ( x == 6 && y == 19) || ( x == 8 && ( y == 15 || y == 23))))
						{
							check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}
						if( check_turn == 24) 				//将    的走法规范   ok
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if( ((abs(x - check_x)== 2 && abs( y - check_y) == 0 )|| (abs(x - check_x)== 0 && abs( y - check_y) == 4)) && x >= 4 && x <= 8 && y >= 15 && y <= 23 )
						{
							check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}
					if( check_turn == 25) 				//炮    的走法规范 
					{
						if((x == check_x && y == check_y))
						{		
							temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
						}
						else if( y == check_y )
						{
							int check_pao = 0;
							if( x > check_x)
							{
								for(j = check_x + 2; j<= x ;j = j+ 2)
								{
									if(map[j][y] == '+' );
									else									
										check_pao++;
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
							else
							{
								for(j = check_x - 2; j>= x;j = j - 2)
								{
									if(map[j][y] == '+' );
									else
									{
										check_pao++;
									}
								}
								if(check_pao == 1&& temp== '+')       //  直线行走但不可吃棋子 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
						}
						else if( x == check_x )
						{
								int check_pao = 0;
							if( y > check_y)
							{
								for(j = check_y + 4; j<= y ;j = j+4)
								{
									if(map[x][j] == '+' );
									else									
										check_pao++;
								}
								if(check_pao == 1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2 && temp != '+')      //跳跃吃棋 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
							else
							{
								for(j = check_y - 4 ; j>= y;j = j - 4)
								{
									if(map[x][j] == '+' );
									else
										check_pao++;
								}
								if(check_pao ==1&& temp == '+')       //  直线行走但不可吃棋子 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else if( check_pao == 2&& temp != '+')      //跳跃吃棋 
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); 
								else
								{
									printf("不合法的下法\n");
									Sleep(500);
								}
							}
						}
						else
						{
								printf("不合法的下法\n");
							Sleep(500);
						}
					}	
					if( check_turn == 26) 				//卒    的走法规范     成功 
					{
						if( x <= 12){
							if((x == check_x && y == check_y))
							{		
								temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
							else if( x == check_x + 2 && y == check_y)
								check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
							else
							{
								printf("不合法的下法\n");
								Sleep(500);
							}		
						}
						else{
							if((x == check_x && y == check_y))
							{		
								temp = turn;
							temp1 = turn1;
							turn = 'O';
							turn1 = 'N';
							num--;
							printf("三思而后行\n");
							printf("还是你的回合"); 
							Sleep(500);
							}
								else if((x - check_x == 0 && abs(y-check_y) ==4) ||( x - check_x == 2 && abs(y-check_y) == 0))
									check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
								else{
								printf("不合法的下法\n");
								Sleep(500);
								}	
						}
					}
				} 
			}
        }
        system("cls");
        if( if_return) return;
        for(i = 0; i < 27; i++)
        puts(map[i]);
    }
    Sleep(5000);
 }
void wuziqi()
{
   int x,y,i,p,q,num = 1,check;
    char ch, turn,temp;
    system("mode con cols=40 lines=30");      //迷你界面 
    system("color 30");
    printf("[====================================]\n");
    printf("[[----------------------------------]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |       【<<游戏规则>>】       | ]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  控制wasd双方轮流控制指针下棋| ]]\n");
    printf("[[ |  游戏保证了棋子不会重叠      | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  键盘输入大小写 ' L '        | ]]\n");
    printf("[[ |  都视为确认下棋              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  移动鼠标指针会覆盖原有棋子  | ]]\n");
    printf("[[ |  移开即恢复坐标原有状态      | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  我已阅读规则,按任意键继续  | ]]\n");
    printf("[[ |------------------------------| ]]\n");
	printf("[===================================]\n");
	getch();
	system("mode con cols=65 lines=43");      //迷你界面 
    system("color 30");
   char map[1000][1000]= {  "||===========================================================||",
                             "||   x                   ||欢乐五子棋||                 o    ||",
                             "||                       ==============                      ||",
                             "[=============================================================]",
                             "[[===========================================================]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[ |   |   |   |   |   |   |   |   |   |   |   |   |   |   | ]]",
                             "[[ +-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-—+-]]",
                             "[[===========================================================]]",
                             "[=============================================================]"
    };
    printf("游戏加载中ing\n将窗口上移以便获取下方信息\n"); 
	for(i = 0; i < 37; i++)
    {
		puts(map[i]);
		Sleep(100); 
	}
    x = 11,y = 19;
    temp = map[x][y];           //temp是关键:保存光标所指坐标上一次的状态 ,方便恢复与新建状态 
    while(num)                 //主程序:实现移动光标并指定坐标下棋 
    {                          //保证不出界,且保证已下棋位置不会再次被覆盖 
        if(num % 2 != 0){
        	turn = 'x';
			printf("轮到 %c 下了\n这是你的第 %d 步棋\n",turn,(num + 1) / 2); 
		}
        else{
        	turn = 'o';
        	printf("这是 %c 的回合\n这是你的第 %d 步棋\n",turn,num /2);
		} 
		if(num > 544)
			return;
		else if(num > 540)
		 	printf("有的惊喜就是在你也想不到的的情况下发生"); 
		else if( num > 500)
        	printf("填满有惊喜喔") ;
		else if( num > 200)
        	printf("你可以填满棋盘的"); 
		else if( num > 150)
        	printf("你眼睛不花吗") ;
		else if( num > 100)
        	printf("还没有分出胜负ne ") ;	
		else if( num > 80) 
        	printf("距离成功不远了") ; 
		else if( num > 50)
        	printf("看来你还能继续下") ;
		else if( num > 30)
        	printf("你还能清楚的看清棋盘吗?") ;
		else if( num > 20)
        	printf("快接近胜利了吗?\n") ;
        ch = getch();
        if ( ch == 's')         //下移 
        {
            if( map[x+1][y]!= '=' &&map[x+1][y]!= '-')
            {
                map[x][y] = temp;
                x = x + 2;
                temp = map[x][y];
                map[x][y] = turn;
            }
        }
        else if ( ch == 'a')    //左移 
        {
            if( map[x][y-3]== '-' )
            {
                map[x][y] = temp;
                y = y - 4;
                temp = map[x][y];
                map[x][y] = turn;
            }
        }
        else if ( ch == 'w')    //上移 
        {
            if(  map[x-1][y]!= '=' && map[x-1][y]!= '-')
            {
                map[x][y] = temp;
                x = x - 2;
                temp = map[x][y];
                map[x][y] = turn;
            }
        }
        else if ( ch == 'd')    //右移 
        {
            if( map[x][y+5]== '-' )
            {
                map[x][y] =temp;
                y = y + 4;
                temp = map[x][y];
                map[x][y] = turn;
            }
        }
        else if( ch == 'l' || ch =='L')   //确认下棋后改变坐标状态,并且判断是否伍连。 
        {
            if(temp == '+')
            {
                map[x][y] = turn;
                temp = map[x][y];
                num++;
                check=1;                                //判断水平方向 
                {
                    p=x;
                    q=y;
                    q = q - 4;
                    if( q >=0&& q<  62)
                    while(q >=0&& q< 62  &&  map[p][q]== turn)//防止数组下标越界
                    {
                    	check++;
                   		q = q - 4;
                    }  
                    p=x;
                    q=y;
                    q = q + 4;
                    if( q >=0&& q< 62 )
                    while(q >=0&& q<  62 &&  map[p][q] == turn)//防止数组下标越界
                    {
                    	check++;
                    	q = q + 4;
                    } 
                    if(check  >= 5 ){
                    printf("%c win the game\n按任意键退出游戏",turn);
                    getch();
                    return ;}
                }
                check=1;								//判断垂直方向 
                {
                    p=x;
                    q=y;
                    p = p - 2;
                    if( p >=0&& p<= 37)
	                    while(p >=0&& p<= 37  &&  map[p][q]== turn)//防止数组下标越界
	                    {
	                    	check++;
	                   		p = p - 2;
	                    }  
                    p=x;
                    q=y;
                    p = p + 2;
                    if( p >=0&& p<= 37 )
	                    while(p >=0&& p<=  37 &&  map[p][q] == turn)//防止数组下标越界
	                    {
	                    	check++;
	                    	p = p + 2;
	                    } 
	                if(check  >= 5 ){
	                printf("%c win the game\n多次按任意键退出游戏",turn);
	                getch();
	                getch();
					getch(); 
                    return;}
                }
                check=1;                                //判断左斜方向 
                {
                    p=x;
                    q=y;
                    q = q - 4;
                    p = p - 2; 
                    if( q >=0&& q<  62 && p >=0 && p <= 37)
                    while(q >=0&& q<  62 && p >=0 && p <= 37 &&  map[p][q]== turn)//防止数组下标越界
                    {
                    	check++;
                   		q = q - 4;
                   		p = p - 2;;
                    }  
                    p=x;
                    q=y;
                    q = q + 4;
                    p = p + 2;
                    if( q >=0&& q<  62 && p >=0 && p <= 37 )
                    while(q >=0&& q<  62 && p >=0 && p <= 37 && map[p][q] == turn)//防止数组下标越界
                    {
                    	check++;
                    	q = q + 4;
                    	p = p + 2; 
                    } 
                    if(check  >= 5 ){
                    printf("%c win the game\n按任意键退出游戏",turn);
                    getch();
                      getch();
                        getch();
                    return;}
                    check=1;                                //判断右斜方向 
                {
                    p=x;
                    q=y;
                    q = q + 4;
                    p = p - 2; 
                    if( q >=0&& q<  62 && p >=0 && p <= 37)
                    while(q >=0&& q<  62 && p >=0 && p <= 37 &&  map[p][q]== turn)//防止数组下标越界
                    {
                    	check++;
                   		q= q + 4;
                   		p = p - 2;
                    }  
                    p=x;
                    q=y;
                    q = q - 4;
                    p = p + 2;
                    if( q >=0&& q<  62 && p >=0 && p <= 37 )
                    while(q >=0&& q<  62 && p >=0 && p <= 37 && map[p][q] == turn)//防止数组下标越界
                    {
                    	check++;
                    	q = q - 4;
                    	p = p + 2; 
                    } 
                    if(check  >= 5 ){
                    printf("%c win the game\n按任意键退出游戏",turn);
                    getch();
                    return;}
                }                                    
                }
            }
            else if( temp =='o') {
                printf("此处不可以下棋!!\n");
                Sleep(500);
            }
            else if( temp =='x') {
                printf("此处不可以下棋!!\n");
                Sleep(500);
            }
        }
        system("cls");
        for(i = 0; i < 37; i++)
            puts(map[i]);
    }
}
int main()
{ 
	int choise;
    while(1)
    {
		menu();
		char choise;
		choise = getch();
        switch(choise)
        {
        case '1': xiangqi();break; 
        case '2': wuziqi();break;
        case '3': system("cls");printf("\n\n还在开发呢~~返回菜单\n\n");Sleep(1000);break;
        case '4': more();break; 
        case '5': {system("cls");
				printf("\n\n确定退出吗\n\n1.Yes    2.No\n");
				printf("\n( 1 / 2 )\n");
				char b;
				b = getch();
				if( b == '1') return 0;
				else if( b == '2') break; 
				else break;
		default: printf("请输入1 / 2确定是与否");Sleep(1000);break;
			}
        }
    }
}

posted @ 2020-10-27 13:09  404name  阅读(148)  评论(0编辑  收藏  举报