admin管理员组文章数量:1621658
五子棋案例
1.完成棋盘的基本布局
需要利用到二维数组的知识,二维数组的命名,初始化,赋值输出等;
2.对五子棋的各个功能进行设计
需要利用for,while循环等循环控制语句的知识,还有方法的设计,组合
3.设计过程(主要为判断某一方胜利的方法设计)
五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
两种思路:
1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
下列为方法一的具体实现:
方法如下
public class QiDemo {
static char[] num = {'⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐', '⒑', '⒒', '⒓', '⒔', '⒕', '⒖'};
static char black = '★';
static char white = '☆';
static char line = '十';
char[][] a = new char[15][15];//设计15*15的棋盘;
boolean flag = true;
public void Init() {//棋盘初始化;
for (int i = 0; i < 14; i++) {
for (int j = 0; j < 14; j++) {
a[i][j] = line;
}
}
for (int i = 0; i < 15; i++) {
a[i][14] = num[i];
a[14][i] = num[i];
}
}
public void Myprint() {//棋盘打印
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
public boolean Out(char a[][], int x, int y) {//是否能落子的基本判断(是否已经有棋子在该位置,或超出棋盘限制)
if (x >= 0 && x < 15 && y >= 0 && y <= 15 && a[x][y] == '十')
return true;
else {
return false;
}
}
/*判断某一方胜利的基本算法思路
五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
两种思路:
1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
下列为方法一的具体实现:
*/
public void BWin(char [][]a) {//判断黑棋胜利的基本算法
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
int hang = 0, lie = 0, xie = 0;
for (int k = 0; k < 5; k++) {//五子棋的基本规则(五子成线)
if (a[i][j + k] == black) hang++;
if (a[i + k][j] == black) lie++;
if (a[i + k][j + k] == black) xie++;
}
if (hang == 5 || lie == 5 || xie == 5) {//利用计数器来简化代码
flag = false;
System.out.println("黑棋赢了");
}
}
}
}
public void WWin(char [][]a) {//判断白棋胜利的基本算法
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
int hang = 0, lie = 0, xie = 0;
for (int k = 0; k < 5; k++) {
if (a[i][j + k] == white) hang++;
if (a[i + k][j] == white) lie++;
if (a[i + k][j + k] == white) xie++;
}
if (hang == 5 || lie == 5 || xie == 5) {
flag = false;
System.out.println("白棋赢了");
}
}
}
}
public void W(char [][]a,int x,int y) {//在指定位置落子黑棋
a[x][y]=white;
}
public void B(char [][]a,int x,int y) {//在指定位置落子白棋
a[x][y]=black;
}
}
主函数如下
import java.util.Scanner;
public class Qi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
QiDemo q = new QiDemo();//创建对象;
q.Init();//初始化棋盘;
q.Myprint();//打印初始化的棋盘;
while (q.flag) {//(以某一方胜利)控制是否继续进行;
int x, y;
System.out.println("黑子下");
if (q.flag) {
while (true) {
x = sc.nextInt();
y = sc.nextInt();
if (q.Out(q.a, x, y)) {//判断该位置(x,y)是否可以落子(是否已经有棋子在该位置,或超出棋盘限制)
q.B(q.a, x, y);
q.Myprint();
q.BWin(q.a);
break;
} else {
System.out.println("输入错误重新输入");
continue;
}
}
}
if (q.flag) {//重复
while (true) {
System.out.println("白子下");
x = sc.nextInt();
y = sc.nextInt();
if (q.Out(q.a, x, y)) {
q.W(q.a, x, y);
q.Myprint();
q.WWin(q.a);
break;
} else {
System.out.println("输入错误重新输入");
continue;
}
}
}
}
}
}
版权声明:本文标题:五子棋案例 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728850480a1176613.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论