(游戏:四子连 )四子连是一个两个人玩的棋盘游戏,在游戏中,玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中:

        这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前,你能先做到。程序提示两个玩家交替的下红子Red或黄子Yellow。当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏状态(赢、平局还是继续),下面是一个运行示例:

。。。

。。。

。。。

-----此题源自《java语言程序设计》习题8.20

目录

对象分析:

胜出条件:四子连珠

Java(最终代码):

C++(第1版,有点乱):


对象分析:

属性:棋盘:Graph、top——二维字符(串)组模拟栈组;

棋子:C(颜色)——奇偶交替变换

棋盘剩余空格:empty——用于判断平局

方法:下棋:input()——修改二维组

判断输赢:judge()——判断胜出

显示棋盘:show()——展示棋盘

胜出条件:四子连珠

代码思路:每次下棋之后都要进行判断,是否有人胜出,怎么判断呢?可以在下棋之后,以此棋为中心,向四个方向(水平,垂直,两条对角线:通过坐标的加减)判断是否出现了四子连珠(注意边界,易出现bug),具体实现,请看代码。

当然也可以在整个棋盘搜索,代码容易写,但降低了效率。

注意:边界要判断仔细

双向检测连珠,有可能你最后一次是下3个棋子中间胜出

Java(最终代码):

java作业,可参考,别抄.

judge(递归实现):单向探测求和,(也可双向,但效率没提高多少,且可读性不高)

import java.util.Scanner;
public class JavaGame {
int row,column; //行列
char Graph[][]; //二维棋盘
int top[]; //模拟栈尾指针
String C[]={"red","yellow"}; //棋子颜色
int empty; //棋盘剩余空格
public JavaGame(int r,int c){ //初始化棋盘数据
empty=r*c;
row=r;column=c;
Graph=new char[r][c];
top=new int[c];
for(int i=0;i<c;i++) //初始化数组栈
top[i]=-1;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
Graph[i][j]=' ';
}
public void show(){ //展示棋盘
for(int i=row-1;i>=0;i--){
System.out.print("|");
for(int j=0;j<column;j++)
System.out.print(Graph[i][j]+"|");
System.out.println();
}
}
public int Input(int y,int key){ //下棋
if(y>=column||y<0||top[y]==row-1){
System.out.println("out of range");
return 1;
}
Graph[++top[y]][y]=C[key%2].toUpperCase().charAt(0);
empty--;
return 0;
}
public int judge(int x,int y) { //判断是否有人胜出
if (search(Graph[x][y], x, y, 1, 0) + search(Graph[x][y], x, y, -1, 0) == 3|| //水平探测
search(Graph[x][y], x, y, 1, 1) + search(Graph[x][y], x, y, -1, -1) == 3|| //对角探测
search(Graph[x][y], x, y, 0, 1) + search(Graph[x][y], x, y, 0, -1) == 3|| //垂直探测
search(Graph[x][y], x, y, 1, -1) + search(Graph[x][y], x, y, -1, 1) == 3) //对角探测
return 1;
return 0; //未有人获胜
}
public int search(char k, int a, int b, int z, int f) { //单向探测函数
a += z; b += f;
if (b >= column || a >= row || a < 0 || b < 0||Graph[a][b] != k)
return 0;
return search(k, a , b , z, f)+1;
}
public static void main(String[] args) {
JavaGame My=new JavaGame(6,7);
Scanner input=new Scanner(System.in);
int tmp,key;
My.show();
for(int i=0;;){
System.out.print("Drop a "+My.C[i%2]+" disk at column(0-6) : ");
tmp=input.nextInt();
if(My.Input(tmp,i)!=0) //出错后 执行下一循环(i没有++)
continue;
My.show();
if(My.judge(My.top[tmp],tmp)==1){ //判断是否有人胜出
System.out.println("The "+My.C[i%2]+" player won");
break;
}
if(My.empty==0){ //平局
System.out.println("Chess draw");
break;
}
i++;
}
}
}

C++(第1版,有点乱):

judge:非递归(java也可用):双向探测

#include<iostream>
#include<string>
using namespace std;
class Chess {
public:
Chess(); //初始化成员数据
void show(); //显示棋盘
int input(int y,int key); //下棋
int judge(int y); //判断结果
string C[2] = { "red","yellow" };
private:
string Graph[6][7];
int top[7]; //模拟栈
};
Chess::Chess(){
memset(top, -1, sizeof(top)); //数组top初始化为-1
for (int i = 0; i < 6; i++) { //初始化Graph
for (int j = 0; j < 7; j++) {
Graph[i][j] = " ";
}
}
}
void Chess::show(){
for (int i = 5; i >= 0; i--) {
cout << "|";
for (int j = 0; j < 7; j++)
cout << Graph[i][j] << "|";
cout << endl;
}
}
int Chess::input(int y,int key) {
if (y > 6 || y < 0){ //越界检测
cout << "y is out of range[0,6]" << endl;
return 1;
}
if (top[y] == 5) {
cout << "x is out of range" << endl;
return 1;
}
Graph[++top[y]][y] = toupper(C[key % 2][0]); //赋值操作
return 0;
}
int Chess::judge(int y) { int kx[4] = { 0, 1, 1, 1 }, //八个方向(4个正方向,另外4个负方向取反)
ky[4] = { 1, 1, 0,-1 };
int a, b, count = 0;
int x = top[y];
for (int i = 0; i < 4; i++) { //八个方向检测
a = x; //数据初始化
b = y;
count = 0;
for (int j = 0; j < 3; j++) { //检测四个正方向
a += kx[i];
b += ky[i];
if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测
break;
if (Graph[a][b] == Graph[x][y] )
count++;
}
a = x;
b = y;
for (int j = 0; j < 3; j++) { //检测四个负方向
a -= kx[i];
b -= ky[i];
if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测
break;
if (Graph[a][b] == Graph[x][y]) //逻辑判断
count++;
}
if (count == 3) //四子相连,此人胜出
return 1;
}
for (int i = 0; i < 7; i++) { //只要有一列未满,返回0
if (top[i] != 5)
return 0;
}
return -1; //全满,返回-1(平局)
}
int main() {
Chess myChess;
myChess.show();
int tmp,key;
for (int i = 0;;) { //i奇偶决定颜色
cout << "Drop a "<< myChess.C[i % 2] <<" disk at column(0-6): ";
cin >> tmp;
if (myChess.input(tmp, i)) //bug检测
continue;
system("cls"); //清屏
myChess.show();
key = myChess.judge(tmp); //key判断输赢,平局
if (key==1) {
cout << "The " << myChess.C[i % 2] << " player won" << endl;
break;
}
else if (key == -1) {
cout << "Chess draw" << endl;
break;
}
i++;
}
return 0;
}

JAVA 8.20 游戏:四子连(Java&C++)的更多相关文章

  1. JAVA笔记整理(四),JAVA中的封装

    什么是封装 所谓的封装就是把数据项和方法作为一个独立的整体隐藏在对象的内部,具体的实施细节不对外提现,仅仅保留有限的外部接口,封装外的用户只能通过接口来进行操作.就好比开启一台电脑需要进行很多个步骤, ...

  2. Java学习笔记(四)——google java编程风格指南(上)

    [前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...

  3. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  4. java web 学习 --第四天(Java三级考试)

    第三天的学习内容:http://www.cnblogs.com/tobecrazy/p/3453041.html jsp内置对象 out out 属性类型:JspWriter 作用域:page 作用: ...

  5. java环境变量配置四种方法

    原文:java环境变量配置四种方法 Java编程首要工作就是安装JDK(Java Development Kit).一通“NEXT”点完安装后就是最重要的环境变量设置了.也许有人会问为什么要设置环境变 ...

  6. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java 8.9 游戏:井字游戏(C++&Java)

    思路框架同8.20 : C++: #include<iostream> #include<string> using namespace std; class Chess { ...

  8. 20155205 《Java程序设计》实验四 Android程序设计

    20155205 <Java程序设计>实验四 Android程序设计 一.实验内容及步骤 (一) Android Stuidio的安装测试 参考<Java和Android开发学习指南 ...

  9. 【JAVA EE企业级开发四步走完全攻略】

    本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...

随机推荐

  1. C++ AfxBeginThread的介绍/基本用法

    AfxBeginThread    用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一 ...

  2. HttpWatch Professional Edition 7.2.13下载含( license.lic )

    下载地址: http://download.httpwatch.com/httpwatchpro.exe httpwatch.lic     # program.     #     # You ca ...

  3. RMI 、RPC和SOAP

  4. 判断素数(翁凯男神MOOC)

    从2到x-1测试是否可以整除 int isPrime(int x); int main(int argc, char **argv) { int x; scanf("%d",&am ...

  5. NFS 网络文件系统制作

    1. 构建根文件系统主要是建立相关的文件目录,以及各目录下相关的配置文件.管理工具等. 2. 首先创建文件目录. mkdir rootfs cd rootfs mkdir bin dev etc li ...

  6. 移植ok6410 LCD驱动

    1.本次移植过程选择 linux-2.6.28 lcd驱动为参考移植到 linux-2.6.34 ok6410 开发板上. 2.移植过程 主要以给内核增加驱动的思想,在/driver/video/ 下 ...

  7. C 中的typedef应用

    1. typedef  声明的新的类型名在变量名的位置出现. example: typedef unsigned int UINT 则 unsigned int a; 相当于 UINT A; 2. t ...

  8. Spring Boot 邮件配置

    ######################################################## spring boot mail tls ###################### ...

  9. Ambient Light

    [Ambient Light] Ambient light is light that is present all around the scene and doesn’t come from an ...

  10. 大数据入门到精通3-SPARK RDD filter 以及 filter 函数

    一.如何处理RDD的filter 1. 把第一行的行头去掉 scala> val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigat ...