java语言,c语言,五子棋的实现(键盘输入坐标)。

实现思路:

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

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

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

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

abcdefghij

假如这是棋盘的第一行。我们用四个个值 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;
} 

实践周学习记录。

转载于:https://my.oschina.net/wang520/blog/675459

题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个玩家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,玩家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同玩家所下的棋子,“o”代表A玩家,“*”代表B玩家。玩家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求玩家继续输入。 当出现同一玩家五子连成一线时,无论是行、列或是对角线的五子连线,都表示玩家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示玩家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A玩家,“*”代表B玩家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个玩家下棋。 3. 玩家交替下棋 玩家能在棋盘上下棋,玩家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前玩家输入落子坐标 b.能判断用户输入的坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 玩家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次玩家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值