java语言,c语言,五子棋的实现(键盘输入坐标)。
java语言,c语言,五子棋的实现(键盘输入坐标)。
奔跑的码农 发表于1年前
java语言,c语言,五子棋的实现(键盘输入坐标)。
  • 发表于 1年前
  • 阅读 367
  • 收藏 9
  • 点赞 2
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 五子棋的实现还是比较简单的。主要是用到for()循环。do while() 循环 以及while()循环。字符串比较函数strcmp()。在java中用的==。在java中初始化棋盘用了静态代码块。只有在类第一次加载时执行。感觉写个单列模式也可以。

实现思路:

1.初始化一个棋盘并打印,用一个二维数组储存棋盘。

2.下棋,就是输入一个坐标,将 数组对应的位置替换成棋子。

3.在下棋时判断棋子是否越界,判断是否重复。

4.判断输赢,遍历整个棋盘(还有别的实现方式)五个棋子连在一起为赢(其他规则没有考虑)。横着方向:

a b c d e f g h i j

假如这是棋盘的第一行。我们用四个个值 i,j,k。sum1首先i指示的是行数,i=1(注意数组下标为0)。j用来遍历这一行 .第一次j=1(数组下标为0)。指向a这里 令k=a。k向后遍历5个。如果每次与第一个棋子颜色相同就sum就加1.否则不加。遍历五个后如果sum0等于5.即有一方胜利。注意sum0弄成最内层的局部变量。其他方向思想相同 。


一下是java语言的实现(上课写的找不到了,这些不全只写到了下棋,c语言的全,两个代码几乎一样)。

package base;
import java.util.*;
class cheassBoard
{
	final static int SIZE=20;
	static char[][] board=new char[SIZE][SIZE];

	static{
		for(int i=0;i<SIZE;i++)
		{
			for(int j=0;j<SIZE;j++)
			{
				if(i==0&&j==0)
				{
					board[i][j]='┏';
				} 
				else if(i==0&&j==SIZE-1)
				{
					board[i][j]='┓';
				}
				else if(i==SIZE-1&&j==0)
				{
					board[i][j]='┗';	
				}
				else if(i==SIZE-1&&j==SIZE-1)
				{
					board[i][j]='┛';
				}
				else if(i==0)  //首行除了边角的元素 
				{
					board[i][j]='┳';
				}
				else if(i==SIZE-1)//底行 
				{
					board[i][j]='┻'; 
				} 
				else if(j==0) //第一列 
				{
					board[i][j]='┣';
				} 
				else if(j==SIZE-1) //最后列 
				{
					board[i][j]='┫';
				}
				else board[i][j]='╋';//中间的 
			}
		}
	}
	public void printBoard()
	{
		for(int i=0;i<SIZE;i++)
		{
			for(int j=0;j<SIZE;j++)
			{
				System.out.print(board[i][j]);
			}
			System.out.println();
		}
	}

	int[] play(int player,int x,int y)//下棋函数
	{	
		
		board[x][y]=(player==1 )? '●':'○';
		new cheassBoard().printBoard();
		player=(player==1)?2:1;
		int[]a={player,0};//数组有两个变量,第一个返回几号玩家,第二个返回0或者1;
		return a;
		
	}
}
public class Test {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		cheassBoard cb=new cheassBoard();
		cb.printBoard();
		int play=1;int[] a={1,0};
		int judje;
		do
		{
			System.out.println("请选手"+play+"号下棋:中间空格隔开如(3 4)。");
			int x,y;
			x=sc.nextInt();y=sc.nextInt();
			a=cb.play(a[0], x, y);
			play=a[0];judje=a[1];
		}while(judje==0);
	}
}

strcmp(str1,str2) 设这两个字符串为str1,str2,若str1==str2,则返回零;若str1>str2,则返回正数;若str1<str2,则返回负数。注意导入头文件<string.h>。

一下是c语言的:

#include <stdio.h> //标准输入输出函数 
#include <windows.h> //屏幕幕光标操作等 
#include <string.h> //字符串操作函数 
//定义一个棋盘大小的宏 
#define SIZE 20 
//全局二维数组,表示棋盘 
char * board[SIZE][SIZE];

//初始化棋盘的函数
int playError(int x,int y);
void printBoard(void);  //
int play(int* player);
int playCorrect(int x,int y);
int verticalWin(int x,int y);
int horizonWin(int x,int y);
int positiveDiagonalWin(int x,int y);
int negativeDiagonalWin(int x,int y);
void initBoard()
{
	int i;
	for(i=0;i<SIZE;i++)
	{
		int j;
		for(j=0;j<30;j++)
		{
			//左上角
			if(i==0&&j==0)
			{
				board[i][j]="┏";
			} 
			else if(i==0&&j==SIZE-1)
			{
				board[i][j]="┓";
			}
			else if(i==SIZE-1&&j==0)
			{
				board[i][j]="┗";	
			}
			else if(i==SIZE-1&&j==SIZE-1)
			{
				board[i][j]="┛";
			}
			else if(i==0)  //首行除了边角的元素 
			{
				board[i][j]="┳";
			}
			else if(i==SIZE-1)//底行 
			{
				board[i][j]="┻"; 
			} 
			else if(j==0) //第一列 
			{
				board[i][j]="┣";
			} 
			else if(j==SIZE-1) //最后列 
			{
				board[i][j]="┫";
			}
			else board[i][j]="╋";//中间的 
		}
	}
} 
void printBoard()  //打印棋盘 
{
	system("cls");
	int i;
	for(i=0;i<SIZE;i++)
	{
		int j;
		for(j=0;j<SIZE;j++)
		{
			printf("%s",board[i][j]);
			
		}
		printf("\n"); 
	}
}
int play(int* player)//下棋 
{
	

	int x,y;
	do
	{
		printf("请输入玩家%d的坐标如(10,5):",*player); 
		scanf("%d,%d",&x,&y);
	}while(!playCorrect(x,y));
	board[x][y]=(*player==1?"●":"○");
	printBoard();	  
	if(win(x,y)==1)
	{
		printf("玩家%d获胜!\n",*player);
		return 1;
	} 	
	*player=(*player==1)?2:1;
	return 0;
}
int playCorrect(int x,int y)
{
	//判断越界 
	int noOverStep;
	noOverStep=(x<SIZE&&x>=0)&&(y<SIZE&&y>=0);
	 //判断重复
	 if(noOverStep==0)
	 {
 		printf("输入有误\n");	
 	 	return 0;
	  }
	 int Repeat;
	Repeat=(strcmp(board[x][y],"●")==0)||(strcmp(board[x][y],"○")==0);
	 //正确返回1
	 //错误返回0 
	 if(noOverStep&&!Repeat)
	{
		return 1; //输入正确返回1 
		
	}
	return 0;
}
//判断一方胜利
int win(int x,int y)
{
	 int horizon=horizonWin(x,y); //横向胜利 
	 int vertical=verticalWin(x,y); //竖向胜利 
	 int positiveDiagonal=positiveDiagonalWin(x,y);
	 int negtiveDiagoanl=negativeDiagonalWin(x,y);
	 
     if(horizon||vertical||positiveDiagonal||negtiveDiagoanl)
	 {
 		return 1;
 	} 
	return 0;
} 
//横向

int horizonWin(int x,int y)
{
	int i;
	for(i=0;i<SIZE;i++)
	{
		int j;
		for(j=0;j<SIZE-4;j++)
		{
			int k;
			int res1=0;
			int res2=0;
			for(k=0;k<5;k++)
			{
				res1+=(strcmp(board[i][k+j],"●")==0);
				res2+=(strcmp(board[i][j+k],"○")==0);
			}
		//	printf("%d,%d\n",res1,res2);
			if(res1==5||res2==5)
			{
				return 1;
			}
		}
	}
	return 0;
} 
int verticalWin(int x,int y)//纵向 
{
	int i;
	for(i=0;i<SIZE;i++)
	{
		int j;
		for(j=0;j<SIZE-4;j++)
		{
			int k;
			int res1=0;
			int res2=0;
			for(k=0;k<5;k++)
			{
				res1+=(strcmp(board[k+j][i],"●")==0);
				res2+=(strcmp(board[k+j][i],"○")==0);
			}
			if(res1==5||res2==5)
			{
				return 1;
			}
		}
	}
	return 0;
} 
//正斜线胜利判断
int positiveDiagonalWin(int x,int y)
{
	int i;//表面行的下标
	for(i=0;i<SIZE-4;i++)
	{
		int j;
		for(j=0;j<=SIZE-5;j++)
		{
			int res1=0; //表示有n个黑色棋子 
			int res2=0; //表示有n个白色棋子 
			int k;
			for(k=0;k<5;k++)
			{
				if(strcmp(board[i+k][j+k],"●")==0) 
				{
					res1+=1;
				}
				if(strcmp(board[i+k][k+j],"○")==0)
				{
					res2+=1;
				}
			} 
			if(res1==5||res2==5)
			{
				return 1;
			}
		}
	}
	return 0;	
}
int negativeDiagonalWin(int x,int y)//反斜方向 
{
	int i;//行的下标
	for(i=4;i<SIZE;i++)
	{
		int j;
		for(j=0;j<=SIZE-4;j++)
		{
			int res1=0; //表示有n个黑色棋子 
			int res2=0; //表示有n个白色棋子 
			int k;
			for(k=0;k<5;k++)
			{
				if(strcmp(board[i-k][j+k],"●")==0) 
				{
					res1+=1;
				}
				if(strcmp(board[i-k][j+k],"○")==0)
				{
					res2+=1;
				}
			} 
			if(res1==5||res2==5)
			{
				return 1;
			}
		}
	}
	return 0;	
}
int main()
{
	initBoard();
	printBoard(); 
	//下棋
	int gameOver; 
	int gamer=1; ////做一个循环,如果玩家输入有误,循环执行
	do
	{	
		
		gameOver=play(&gamer);
		//	printBoard(); 
		
	}while(!gameOver);
	printf("GameOver!");
	return 0;
} 

实践周学习记录。

共有 人打赏支持
粉丝 11
博文 23
码字总数 28190
×
奔跑的码农
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: