c语言写一个五子棋小游戏

 

部分效果图:

 

  1. 总体设计

 

这里我将叙述一个大概的设计过程。

玩家一使用的棋子是’*’ 玩家二以及电脑使用的棋子是’#’。这两个字符只是方便做相关操作。

实际显示时,我将玩家一显示为白棋子,玩家二显示为黑棋子。而不是直接把’*’和’#’显示给用户。

棋盘用的是二维数组。

一盘游戏几乎所有操作都是在这个二维数组上面实现。主要功能有:游戏背景音乐,实时棋盘的更新,棋子的移动,判断胜负,胜负播报音乐,电脑实现智能化落子。

本程序分为两大部分,一部分是人机对战,另一部分是人人对战。人人对战就不说了。人机对战让电脑实现了一定的智能化,主要算法是Ai()函数。

以下是各个功能函数的简要概述。

int isWin();//判定胜负

void Ai6();//电脑随机放子

void Ai5();//阻止玩家冲三

void Ai4();//电脑实现冲四

void Ai3();//阻止玩家冲四

void Ai2();//让电脑实现冲五

void Ai1();//阻止玩家冲五

void load();//初始界面

void printS();//打印棋盘

void newgame();//游戏主体

void gamer();//双人对战

void movedown(int *x,int *y,int ret);//向上

void moveup(int *x,int *y,int ret);//向下

void moveright(int *x,int *y,int ret);//向右

void moveleft(int *x,int *y,int ret);//向左

void move();//人机模式移动

void move1();//双人对战 玩家一

void move2(); //双人对战 玩家二

void end(int flag);//结束界面

2. 算法设计

 

主要算法函数:电脑智能下棋。

使用了函数嵌套,

优先级:

Ai1()        ->Ai2()         ->Ai3()        ->Ai4()        ->Ai5()        ->Ai6()

阻止玩家冲五->让电脑实现冲五->阻止玩家冲四->电脑实现冲四->阻止玩家冲三->随机放子

函数说明:

阻止玩家冲五:通过遍历棋盘(用两个for循环),得到玩家的棋子位置,判断它的棋子里面是否有连四的情况出现,如果有就进行防守。其它防守函数同理。电脑实现冲五则是通过遍历棋盘上自己的棋子,如果有连四的情况,那么就补上最后一个棋子完成胜局。其它进攻函数同理。

怎样实现优先级?通过函数嵌套,把Ai1()(阻止玩家冲五)作为第一个返回函数,如果能找到相应的位置(成功防守)那么就返回该位置,否则继续进行下一个判断也就是Ai2()(让自己实现冲五),以此类推。

 

void Ai6();//电脑随机放子

void Ai5();//阻止玩家冲三

void Ai4();//电脑实现冲四

void Ai3();//阻止玩家冲四

void Ai2();//让电脑实现冲五

void Ai1();//阻止玩家冲五

void Ai1()//阻止玩家冲五

 

以下是Ai1()的示例:

void Ai1()

{

int i,j;

/*遍历棋盘,找出玩家的棋子是否有连四的情况,四种连四情况都得查找,即

横/纵/左上斜/右下斜*/

for(i=1;i<20;i++)

for(j=1;j<20;j++)

{

if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向

{

if(game[i][j-1]=='.'){

game[i][j-1]='#';return; //如果找到该位置那么把棋子放好之后直接return

}

if(game[i][j+4]=='.'){

game[i][j+4]='#';return;

}

}

if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向

{

if(game[i-1][j]=='.'){

game[i-1][j]='#';return;

}

if(game[i+4][j]=='.'){

game[i+4][j]='#';return;

}

}

if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1

{

if(game[i-1][j-1]=='.'){

game[i-1][j-1]='#';return;

}

if(game[i+4][j+4]=='.'){

game[i+4][j+4]='#';return;

}

 }

if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2

{

if(game[i+1][j-1]=='.'){

game[i+1][j-1]='#';return;

}

if(game[i-4][j+4]=='.'){

game[i-4][j+4]='#';return;

}

}

}

Ai2();//如果没找到那么进入下一个函数

return;

}

 

个人总结

首先对我的编程思维的提升是巨大的,在此之前我从未尝试过去敲一个几百行的代码,甚至在写这个程序的前期(未修改完善之前)一度达到了上千行。写这种工程量稍大的程序项目,令我不敢太马虎应对,因为如果出现bug,那修复Bug 的工作量也是比较恐怖的。所以我在写的时候打了不少的草稿。一开始这个程序的下棋方式是输入坐标进行棋子的定位。但是自己试玩的时候发现这样的方式极不方便,密密麻麻的棋盘线条看着眼睛也很不舒服,下棋的时候很容易出现落下的棋子位置跟自己的意愿不一样的情况。用户体验感极差。于是我就想能不能改成用方向键去移动棋子。这样移动比较直观,也不会出现下错位置的尴尬情况。但是通过方向键去移动棋子,画面就应该实时刷新。不然移动的跨度大了,用户界面上会出现很多个棋盘。所以我又去网上搜索刷新界面的方法。又查到了一个清屏的命令。“system(“cls”)”.这样,我就能够实现棋子的移动并且实时更新画面了。我写完这个程序之后又去学习了一点图形编程,安装了相关的软件。并且又写出了一个小小的图形游戏。总的来说,就是这种自主查阅能力提升了,编程思维也提升了。深刻体会到程序中把若干功能分成各个功能函数的重要性。既美观,排查bug也方便。

不足之处:应该把这个棋盘写成图形界面的,这样会更好看。

以下是完整代码:

#include<stdio.h>
#include<time.h> 
#include<stdlib.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
int FLAG=1;
char game[21][21];//棋盘矩阵 
int isWin();//判定胜负 
void Ai6();
void Ai5();//电脑随机放子
void Ai4();//电脑实现冲四
void Ai3();//阻止玩家冲四
void Ai2();//让电脑实现冲五
void Ai1();//阻止玩家冲五
void load();//初始界面 
void printS();//打印棋盘
void newgame();//游戏主体 
void gamer();//双人对战 
void movedown(int *x,int *y,int ret);//向上 
void moveup(int *x,int *y,int ret);//向下 
void moveright(int *x,int *y,int ret);//向右 
void moveleft(int *x,int *y,int ret);//向左 
void move();//人机模式移动 
void move1();//双人对战 玩家一 
void move2(); //双人对战 玩家二 
void end(int flag);//结束界面 
int main()
{
	while(FLAG)
	{
		load();//游戏入口
	}					
	return 0;
}
 void movedown(int *x,int *y,int ret)
 {
	 /*这里将棋盘返回之前状态*/ 
	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
	game[*x][*y]='.';  
	*x+=1;
	if(*x>=19||*x<=0)return;
	if(game[*x][*y]!='.'){
		*x+=1;
		return;
	}		
 	system("cls");
 	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
 	{
 		if(ret==1)game[*x][*y]='O';
 		if(ret==2)game[*x][*y]='Q';
	 }	
 	printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
 	return;
 }
void moveup(int *x,int *y,int ret)
 {
	 /*这里将棋盘返回之前状态*/ 
	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
	game[*x][*y]='.';   
	*x-=1;
	if(*x>=19||*x<=0)return;
	if(game[*x][*y]!='.'){ 
		*x-=1;
		return;
	}		
 	system("cls");
 	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
 	{
 		if(ret==1)game[*x][*y]='O';
 		if(ret==2)game[*x][*y]='Q';
	 }
 	printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
 	return;
 }
void moveright(int *x,int *y,int ret)
 {
	 /*这里将棋盘返回之前状态*/ 
	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
	game[*x][*y]='.';     
	*y+=1;
	if(*x>=19||*x<=0)return;
	if(game[*x][*y]!='.'){
		*y+=1;
		return;
	}		
 	system("cls");
 	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
 	{
 		if(ret==1)game[*x][*y]='O';
 		if(ret==2)game[*x][*y]='Q';
	 }
 	printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
 	return;
 }
void moveleft(int *x,int *y,int ret)
 {
	 /*这里将棋盘返回之前状态*/ 
	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
	game[*x][*y]='.';    
	*y-=1;
	if(*x>=19||*x<=0)return;
	if(game[*x][*y]!='.'){
		*y-=1;
		return;
	}		
 	system("cls");
 	if(game[*x][*y]!='*'&&game[*x][*y]!='#')
 	{
 		if(ret==1)game[*x][*y]='O';
 		if(ret==2)game[*x][*y]='Q';
	 }
 	printS();printf("你的位置:【%d】 【%d】\n",*x,*y);
 	return;
 } 
 void move()
 {
 	int x=1,y=1;
 	char ret;
 	int shift=1;
 	while(shift)
	{		
		ret=getch();
		switch(ret)
		{
			case 72: moveup(&x,&y,1);break;  
             case 80: movedown(&x,&y,1);break; 
             case 75: moveleft(&x,&y,1);break;
             case 77: moveright(&x,&y,1);break; 
			case 's':movedown(&x,&y,1);break;				
			case 'S':movedown(&x,&y,1);break;			   					
			case 'W':moveup(&x,&y,1);break;								
			case 'w':moveup(&x,&y,1);break;			    					
			case 'a':moveleft(&x,&y,1);break;			    				
			case 'A':moveleft(&x,&y,1);break;							
			case 'd':moveright(&x,&y,1);break;			    					
			case 'D':moveright(&x,&y,1);break;									
			case ' ':				
				game[x][y]='*';
				system("cls");
				printS();
				shift=0;			    					
				break;	
		}		 	
	}
	return;
 }
void move1()
{
	int x=1,y=1;
 	char ret;
 	int shift=1;
 	while(shift)
	{		
		ret=getch();
		switch(ret)
		{
			case 's':movedown(&x,&y,1);break;				
			case 'S':movedown(&x,&y,1);break;			   					
			case 'W':moveup(&x,&y,1);break;								
			case 'w':moveup(&x,&y,1);break;			    					
			case 'a':moveleft(&x,&y,1);break;			    				
			case 'A':moveleft(&x,&y,1);break;							
			case 'd':moveright(&x,&y,1);break;			    					
			case 'D':moveright(&x,&y,1);break;	
						
			case ' ':				
				game[x][y]='*';
				system("cls");
				printS();
				shift=0;			    					
				break;	
		}		 	
	}
	return;
}
void move2()
{
	int x=1,y=1;
 	char ret;
 	int shift=1;
 	while(shift)
	{		
		ret=getch();
		switch(ret)
		{
			case 72: moveup(&x,&y,2);break;  
             case 80: movedown(&x,&y,2);break; 
             case 75: moveleft(&x,&y,2);break;
             case 77: moveright(&x,&y,2);break; 
			 						
			case ' ':				
				game[x][y]='#';
				system("cls");
				printS();
				shift=0;			    					
				break;	
		}		 	
	}
	return;
}
int isWin()//判定胜负 
{
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{		
		if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='*')return 1;//横向赢				
		if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='*') return 1;//纵向赢		
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='*')	return 1; //从左上到右下		
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='*') return 1;//从右上到左下
		/*相同的条件,判定电脑胜利*/
		 if(game[i][j]==game[i][j+1]&&game[i][j+1]==game[i][j+2]&&game[i][j+2]==game[i][j+3]&&game[i][j+3]==game[i][j+4]&&game[i][j+4]=='#')return 2;//横向				
		if(game[j][i]==game[j+1][i]&&game[j+1][i]==game[j+2][i]&&game[j+2][i]==game[j+3][i]&&game[j+3][i]==game[j+4][i]&&game[j+4][i]=='#') return 2;//纵向 
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]==game[i+4][j+4]&&game[i+4][j+4]=='#')return 2;//斜向1 
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]==game[i-4][j+4]&&game[i-4][j+4]=='#') return 2;//斜向2 
	}	
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='.')
		return -1;//比赛继续 
	}
	return 0;//平局即是棋盘上没有.了	
}
void Ai6()//电脑随机放子
{	
	int i,j;
	srand(time(NULL)*10);
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='#')
		{
			if(game[i+1][j]=='.'){
				game[i+1][j]='#';return;
			}
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i][j+1]=='.')
			{
				game[i][j+1]='#';return;
			}
			if(game[i][j-1]=='.'){
				game[i][j-1]='#';return;
			}
		}
	 }
	 while(game[i][j]!='.')
	 {
	 	i=rand()%19+1;
	 	j=rand()%19+1;
	  } 
	  game[i][j]='#';
	  return;
}
void Ai5()//阻止玩家冲三 
{
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='*'&&game[i][j+1]=='*')//横向 
		{
			if(game[i][j-1]=='.'){
			game[i][j-1]='#';return;	
			}			
			if(game[i][j+2]=='.'){
			game[i][j+2]='#';return;	
			}			
		}
		if(game[i][j]=='*'&&game[i+1][j]=='*') //纵向 
		{
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i+2][j]=='.'){
				game[i+2][j]='#';return;
			}
		}
		if(game[i][j]=='*'&&game[i+1][j+1]=='*')//斜向1 
		{
			if(game[i-1][j-1]=='.'){
				game[i-1][j-1]='#';return;
			}
			if(game[i+2][j+2]=='.'){
				game[i+2][j+2]='#';return;
			}
		 } 
		if(game[i][j]=='*'&&game[i-1][j+1]=='*')  //斜向2 
		{
			if(game[i+1][j-1]=='.'){
				game[i+1][j-1]='#';return;
			}
			if(game[i-2][j+2]=='.'){
				game[i-2][j+2]='#';return;
			}
		}
	 } 
	 Ai6();
	 return;
}
void Ai4()//电脑实现冲四
{	
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#')//横向 
		{
			if(game[i][j-1]=='.'){
			game[i][j-1]='#';return;	
			}			
			if(game[i][j+3]=='.'){
			game[i][j+3]='#';return;	
			}			
		}
		if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='#') //纵向 
		{
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i+3][j]=='.'){
				game[i+3][j]='#';return;
			}
		}
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='#') //斜向1 
		{
			if(game[i-1][j-1]=='.'){
				game[i-1][j-1]='#';return;
			}
			if(game[i+3][j+3]=='.'){
				game[i+3][j+3]='#';return;
			}
		 } 
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='#')  //斜向2 
		{
			if(game[i+1][j-1]=='.'){
				game[i+1][j-1]='#';return;
			}
			if(game[i-3][j+3]=='.'){
				game[i-3][j+3]='#';return;
			}
		}
	 } 
	 Ai5();
	 return; 
}
void Ai3()//阻止玩家冲四
{	
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*')//横向 
		{
			if(game[i][j-1]=='.'){
			game[i][j-1]='#';return;	
			}			
			if(game[i][j+3]=='.'){
			game[i][j+3]='#';return;	
			}			
		}
		if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]=='*') //纵向 
		{
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i+3][j]=='.'){
				game[i+3][j]='#';return;
			}
		}
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]=='*')//斜向1 
		{
			if(game[i-1][j-1]=='.'){
				game[i-1][j-1]='#';return;
			}
			if(game[i+3][j+3]=='.'){
				game[i+3][j+3]='#';return;
			}
		 } 
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]=='*')  //斜向2 
		{
			if(game[i+1][j-1]=='.'){
				game[i+1][j-1]='#';return;
			}
			if(game[i-3][j+3]=='.'){
				game[i-3][j+3]='#';return;
			}
		}
	 } 
	 Ai4();
	 return;
}
void Ai2()//让电脑实现冲五
{
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{ 
		if(game[i][j]=='#'&&game[i][j+1]=='#'&&game[i][j+2]=='#'&&game[i][j+3]=='#')//横向 
		{
			if(game[i][j-1]=='.'){
			game[i][j-1]='#';return;	
			}			
			if(game[i][j+4]=='.'){
			game[i][j+4]='#';return;	
			}			
		}
		if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='#') //纵向 
		{
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i+4][j]=='.'){
				game[i+4][j]='#';return;
			}
		}
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='#') //斜向1 
		{
			if(game[i-1][j-1]=='.'){
				game[i-1][j-1]='#';return;
			}
			if(game[i+4][j+4]=='.'){
				game[i+4][j+4]='#';return;
			}
		 } 
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='#')  //斜向2 
		{
			if(game[i+1][j-1]=='.'){
				game[i+1][j-1]='#';return;
			}
			if(game[i-4][j+4]=='.'){
				game[i-4][j+4]='#';return;
			}
		}
	}
	Ai3();
	return;
}
void Ai1()//阻止玩家冲五
{	
	int i,j;
	for(i=1;i<20;i++)
	for(j=1;j<20;j++)
	{
		if(game[i][j]=='*'&&game[i][j+1]=='*'&&game[i][j+2]=='*'&&game[i][j+3]=='*')//横向 
		{
			if(game[i][j-1]=='.'){
			game[i][j-1]='#';return;	
			}			
			if(game[i][j+4]=='.'){
			game[i][j+4]='#';return;	
			}			
		}
		if(game[i][j]==game[i+1][j]&&game[i+1][j]==game[i+2][j]&&game[i+2][j]==game[i+3][j]&&game[i+3][j]=='*')//纵向 
		{
			if(game[i-1][j]=='.'){
				game[i-1][j]='#';return;
			}
			if(game[i+4][j]=='.'){
				game[i+4][j]='#';return;
			}
		}
		if(game[i][j]==game[i+1][j+1]&&game[i+1][j+1]==game[i+2][j+2]&&game[i+2][j+2]==game[i+3][j+3]&&game[i+3][j+3]=='*') //斜向1 
		{
			if(game[i-1][j-1]=='.'){
				game[i-1][j-1]='#';return;
			}
			if(game[i+4][j+4]=='.'){
				game[i+4][j+4]='#';return;
			}
		 } 
		if(game[i][j]==game[i-1][j+1]&&game[i-1][j+1]==game[i-2][j+2]&&game[i-2][j+2]==game[i-3][j+3]&&game[i-3][j+3]=='*') //斜向2 
		{
			if(game[i+1][j-1]=='.'){
				game[i+1][j-1]='#';return;
			}
			if(game[i-4][j+4]=='.'){
				game[i-4][j+4]='#';return;
			}
		}
	}
	Ai2();
	return;
}
void load()//初始界面 
{	
	int i,j;
	char ret;
	for(i=0;i<17;i++){	 
	    for(j=0;j<34;j++)
	   {
		if(i!=8)printf("**");
		else 
		{
		printf("\n                    <<<欢迎进入五子棋游戏>>>\n"); 
		printf("                    <<<输入【1】开始人机游戏>>>\n");	
		printf("                    <<<输入【2】开始双人对战模式>>>\n                    <<<输入【ESC】退出游戏>>>\n");
		printf("                    <<<祝你玩得开心>>>\n");
		system("color 70");
		break;		
		}				
	   }
	   printf("\n"); 
	} 
	ret=getch();puts("\a");
	switch(ret)
	{
		case '1':system("cls");newgame(); break;
		case '2':system("cls");gamer(); break;
		case 27:FLAG=0;return;break;
	} 	
	return; 
}
void printS()//打印棋盘
{
	int i,j;
	for(i=0;i<21;i++)
	for(j=0;j<21;j++)
	{
	if(i==0&&j==0)printf(" 0");	
	if((i==0&&j!=0&&j!=20)||(i==20&&j!=0&&j!=20))printf(" %2d",j);
	if(j==0&&i!=0)printf("%2d",i);
	if(i!=0&&j!=0)
	{
	if(game[i][j]=='.'||game[i][j]=='O'||game[i][j]=='Q')	
	printf("_%c|",game[i][j]);	
	else
	{		
		if(game[i][j]=='*')
		printf("_Ο");
		else if(game[i][j]=='#')
		printf("_●");
		}	
	}
	if(j==19&&i!=20&&i!=0)printf("_%2d",i);
	if(j==20)printf("\n");	
	}
 } 
void newgame()//游戏主体 
{			
	PlaySound(TEXT("song.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 
	int i,j,x=1,y=1,flag,cnt=0;
	char tip,ret;
	srand(time(NULL));		 
	for(i=0;i<20;i++)
	for(j=0;j<20;j++)
	game[i][j]='.';
	printf("开始游戏之前,请选择你想先手还是想后手\n输入【1】你先手,输入【2】你后手,【ESC】返回");	
	tip=getch();puts("\a");	 
	if(tip==27){
		load(); return;
	}   			
         if(tip=='1')//玩家先手 
	{
	     while(1){
	     system("cls");printS();
	     printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");
	     
		 move();	     	
 	     flag=isWin();	
	     if(flag==1||flag==0||flag==2)end(flag);			
	     else 
	     Ai1();//还未分出胜负 电脑落子:智能化
	     system("cls");printS();
	     flag=isWin(); //判定胜负,否则一直循环下棋
	     if(flag==1||flag==0||flag==2){
	     end(flag);	break;
		 }				
	          }	
	}
	else if(tip=='2')//玩家后手 
	{
		while(1){			
		Ai1();
		system("cls");system("cls");printS();							
		flag=isWin();
		if(flag==1||flag==0||flag==2)end(flag);
		printf("<<<轮到你下棋:你是【白棋】>>>\n移动方式:\n【W】上 【A】左 【S】下 【D】右\n【↑】【↓】【←】【→】\n【按空格落子】\n");
		move();
	    flag=isWin();
	if(flag==1||flag==0||flag==2){
		end(flag);	break;
	}
	         }		
	}		
}
void gamer()
{
	PlaySound(TEXT("song2.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 
	int i,j,x=1,y=1,flag,cnt=0;
	char tip,ret;		 	
	for(i=0;i<20;i++)
	for(j=0;j<20;j++)
	game[i][j]='.';
	printf("始游戏之前,请选择:\n输入【1】玩家一先手\n输入【2】玩家二先手\n【ESC】返回");
	tip=getch();puts("\a");	
	if(tip==27){
		load();return;
	}			        			
	if(tip=='1')//玩家一先手 
	{
	     while(1){
	     system("cls");printS();
	     printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");	     
		 move1();	     	
 	     flag=isWin();	
	     if(flag==1||flag==0||flag==2)end(flag);				
	     else 
	     {
	     	printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
	     	move2(); 
		 }
	     system("cls");printS();
	     flag=isWin(); //判定胜负,否则一直循环下棋
	     if(flag==1||flag==0||flag==2){
	     	end(flag);break;;
		 }					
	          }	
	}
	else if(tip=='2')//玩家二先手 
	{
		while(1){			
		printf("轮到【玩家二】下棋:你是黑旗\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
		move2();system("cls");printS();							
		flag=isWin();
		if(flag==1||flag==0||flag==2)end(flag);
		printf("轮到【玩家一】下棋:你是白棋\n玩家一【W】上 【A】左 【S】下 【D】右\n玩家二【↑】【↓】【←】【→】移动棋子\n按【空格】落子");
		move1();
	    flag=isWin();
	if(flag==1||flag==0||flag==2){
		end(flag);	break;
	}
	         }		
	}		
	return;
}
void end(int flag)
{	
	switch(flag)
	{
		case 1:	
		    system("cls");		
			printf("************WINNER**************\n");	
	        printf("************你赢啦*************\n");
	        printf("*************666*****************\n"); 
	        PlaySound(TEXT("win.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 
	        system("pause");
	        load();
			break;
		case 2:
		    system("cls");		
			printf("************LOSER**************\n");	
	        printf("************你输啦*************\n");
	        printf("*************菜鸡*****************\n"); 
	        PlaySound(TEXT("lose.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 
	        system("pause");
	        load();
			break;	
		case 0:
		    system("cls");
			printf("************PEACE**************\n");	
	        printf("************平局*************\n");
	        printf("******************************\n");
	        PlaySound(TEXT("peace.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放音乐 
	        system("pause");
	        load();
		    break;	
	 } 
}

 

评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值