实现思路:
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;
}
实践周学习记录。