文档章节

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

奔跑的码农
 奔跑的码农
发布于 2016/05/15 21:40
字数 1514
阅读 434
收藏 8

实现思路:

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;
} 

实践周学习记录。

© 著作权归作者所有

共有 人打赏支持
奔跑的码农

奔跑的码农

粉丝 14
博文 30
码字总数 36548
作品 0
海淀
程序员
私信 提问
My java——JVM(java 虚拟机)一

JVM是Java Virtual Machine(Java虚拟机)的缩写。一般我们在学习java中会用到很多缩写名称,如JRE、JDK、SDK、JAVA SE、JAVA EE、JAVA ME、JAVA FX、还有j2se、j2ee、javaee5,我勒个去!多...

tngou
2013/03/13
0
2
为啥java程序员总有那么多不理性的。。。

我自认为说话,算公允的。要说喷语言,c语言,某个dsp汇编。我喷的算最多的,无非这里喷的少些,因为c语言我最了解。说点java不该做的,或者不合适的,就有无理性的java程序员和我乱扯。貌似...

中山野鬼
2013/08/22
1K
39
JNI之C语言简单回顾

一.C语言基本数据类型: c语言中 char, int, float, double, signed, unsigned, long, short and void // java 中的8大本数据类型和他们的长度 // byte 1 char 2 short 2 int 4 long 8 double......

长平狐
2012/09/03
63
0
《数据结构与算法系列》合集整理

《数据结构与算法系列》合集整理 整理来自博客园skywang12345,以下摘自作者介绍: “最近抽空整理了"数据结构和算法"的相关文章。在整理过程中,对于每种数据结构和算法分别给出"C"、"C++"...

kaixin_code
12/01
0
0
文字转图片

输入平台:cmd,窗口式都行 输入方式:键盘输入 编号注意:因为后续过程中会删除生成的图片,所以不要yymmrr格式。正确格式:000 额外注意:每次运行可重新编号。每个图片都是单一汉字,不是...

yuchu100
2017/01/07
2
0

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
5
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
20
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部