一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 726|回复: 7
收起左侧

[CS61B_Spring 2015] PROJECT 0 - CHECKERS

[复制链接] |试试Instant~ |关注本帖
karte_polo 发表于 2015-6-30 23:21:53 | 显示全部楼层 |阅读模式

[其他]CS61B DATA STRUCTURES #4 - 2015-06-01@UC BERKLEY

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
RT~本次项目是让大家做一个跳棋游戏

评分

1

查看全部评分

 楼主| karte_polo 发表于 2015-6-30 23:25:12 | 显示全部楼层
Piece.java


public class Piece {
        private boolean isFire,hascaptured,isKing;
        private int x,y;
        private Board Board;
        String type;
       
        public Piece(boolean isFire,Board b,int x, int y,String type){
                this.isFire = isFire;
                this.Board = b;
                this.x = x;
                this.y = y;
                this.type = type;
                hascaptured = false;
        }
        public boolean isFire(){
                return isFire;
        }
        public int side(){
                if (isFire){
                        return 0;
                }return 1;
        }
        public boolean isKing(){
                return isKing;
        }
       
        public boolean isbomb(){
                if (type=="bomb") return true;
                else return false;
        }
        public boolean isShield(){
                if (type=="shield") return true;
                else return false;
        }
        public void move(int x, int y) {
                Piece tmp,c;
                int interx = (x+this.x)/2;
                int intery = (y+this.y)/2;
                if (Math.abs(this.x-x)==1){
                        interx = this.x;
                        intery = this.y;
                }
                c = Board.PieceAt(interx,intery);
                if (c==null) return;
                if (c.side()!=side()){
                   Board.remove(interx,intery);
                   hascaptured = true;
                   if (isbomb()){
                           for (int i =x-1;i<x+2;i++){
                                   for (int j =y-1;j<y+2;j++){
                                           tmp = Board.PieceAt(i, j);
                                           if (tmp!=null && tmp.side()==c.side() && !tmp.isShield()){
                                                   Board.remove(i,j);
                                           }
                                   }
                           }   
                   }
                }
                   Board.remove(this.x,this.y);
                        this.x = x;
                        this.y = y;
                        if ((side()==0 && y==7) || (side()==1 && y==0)){
                                isKing = true;
                        }
        }
        public boolean hasCaptured(){
                return hascaptured;
        }
        public void doneCapturing(){
                hascaptured = false;
        }


        public static void main(String[] args) {
                // TODO Auto-generated method stub

        }

}

Board.java



public class Board {
        private Piece pieces[][];
        private int Fires,Waters;
        private String[] sides = {"-fire","-water"};
        private Piece selection;
        private int selectedx,selectedy;
        private boolean notmoved;
        private boolean Fire_turn;
       
   
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                int x,y;
                Board b = new Board(false);
        while(b.winner()==null){
                if (StdDrawPlus.isNPressed()) b = new Board(false);
            b.drawBoard();
            b.drawCheckers(false);
                if (StdDrawPlus.mousePressed()) {
                x = (int)StdDrawPlus.mouseX();
                y = (int)StdDrawPlus.mouseY();
                if (b.canSelect(x,y)) b.select(x,y);
                System.out.println("Fires: "+b.Fires +" Waters: "+b.Waters);
                }
            if (b.canEndTurn()){
                     if(StdDrawPlus.isSpacePressed()) b.endTurn();
            }
            StdDrawPlus.show(10);
        }
        System.out.println(b.winner()+" wins!");
        }
        public Board(boolean shouldBeEmpty){
        StdDrawPlus.setXscale(0, 8);
        StdDrawPlus.setYscale(0, 8);
        notmoved  = true;
        selection = null;
        Fire_turn = true;
            pieces = new Piece[8][8];
            selectedx = selectedy =999;
            Fires = Waters = 12;
                if (shouldBeEmpty){
                        return;
                }
            drawBoard();
            drawCheckers(true);
    }
        private void drawBoard(){
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                    if (selectedx==i && selectedy==j) StdDrawPlus.setPenColor(StdDrawPlus.WHITE);
                    else if ((i + j) % 2 == 0) StdDrawPlus.setPenColor(StdDrawPlus.GRAY);
                else                  StdDrawPlus.setPenColor(StdDrawPlus.RED);
                StdDrawPlus.filledSquare(i + .5, j + .5, .5);
            }
        }
        }
    private void drawCheckers(boolean start) {
                int side,tmp;
                String type;
                Piece p;
                for (int j = 0; j < 8; j++) {
                for (int i = 0; i < 8; i++) {
                    if(start){
                        side = j /4;
                        if (j>3){
                                tmp = 7-j;
                        }else{
                                tmp = j;
                        }
                    if ((i + j) % 2 == 0) {
                            if (tmp==0){
                                    type = "pawn";
                            }else if(tmp==1){
                                    type = "shield";
                            }else if (tmp ==2){
                                    type = "bomb";
                            }else{
                                    type = "";
                            }
                            if (type!=""){
                            pieces[i][j] = new Piece(side==0,this,i,j,type);
                            }
                            }
                    }
                    p = pieces[i][j];
                if (p!=null)  place(pieces[i][j],i,j);
            }
            }

    }
        public Piece PieceAt(int x,int y){
                if (x<0 || x>7 || y<0 || y>8){
                        return null;
                }
                return pieces[x][y];
        }
        public void place(Piece p, int x, int y){
                // this method moves Piece p to position x,y, overriding any piece that is placed at x,y;
                // p must exist
                        if (PieceAt(x,y)==null){
                        if (selection!=null){
                                p.move(x, y);
                        }
                        pieces[x][y] = p;
                        if (p.isFire()){
                                Fires++;
                        }else{
                                Waters++;
                        }
                        }
                        drawPiece(p,x,y);
        }
        private void drawPiece(Piece p,int x,int y){
                String path;
                if (p!=null){
                path = "img/"+p.type+sides[p.side()];
                if (p.isKing()){
                        path = path+"-crowned";
                }
            StdDrawPlus.picture(x+ .5, y + .5,path+".png",1,1);
                }
        }
        public Piece remove(int x,int y){
                Piece p = PieceAt(x,y);
                if (p!=null){
                        if (p.isFire()){
                                Fires--;
                        }else{
                                Waters--;
                        }
                        pieces[x][y] = null;
            if ((x + y) % 2 == 0) {
                    StdDrawPlus.setPenColor(StdDrawPlus.GRAY);
            }else{
                    StdDrawPlus.setPenColor(StdDrawPlus.RED);
            }
            StdDrawPlus.filledSquare(x + .5, y + .5, .5);
                }
                return p;
        }
        private static int modifier(Piece p){
                if (!p.isKing()){
                        return 1-2*p.side();
                }else{
                        return 0;
                }
        }
        private boolean readytocapture(int x,int y){
                Piece p = pieces[x][y];
                Piece tmp;
                int modifier = modifier(p);
                int[][] candidates = {{x+1,y+modifier},{x-1,y+modifier}};
                if (modifier ==0) candidates = new int[][] {{x+1,y+1},{x-1,y+1},{x-1,y-1},{x-1,y-1}};
                for (int[] c : candidates){
                        tmp = PieceAt(c[0],c[1]);
                        if (tmp!=null){
                        if (PieceAt(c[0],c[1]).side()!=p.side()){
                                return true;
                        }
                        }
                }
                return false;
        }
        private boolean validmove(int xi,int yi,int xf,int yf){
                Piece p = PieceAt(xi,yi);
                int diffx,diffy;
                diffx = xf-xi;
                diffy = yf-yi;
                if (diffy*modifier(p)>=0 && Math.abs(diffx)==Math.abs(diffy) && Math.abs(diffy)<=2){
                        if (PieceAt(diffx/2+xi,diffy/2+yi)!=null) return true;
                        }
                return false;
        }
        public void select(int x, int y){
                Piece p = PieceAt(x,y);
                if (p==null){
                place(selection, x, y);
                notmoved = false;
                }
                updateselect(x,y);
        }
        private void updateselect(int x,int y){
                selection = pieces[x][y];
                selectedx = x;
                selectedy = y;
        }
        public boolean canSelect(int x, int y){
                boolean condition1,condition2;
                Piece p = PieceAt(x,y);
                        if (p!=null && !p.equals(selection)){
                                if (p.isFire()==Fire_turn){
                                return selection==null || notmoved;
                                }
                        }else{
                                if (selection!=null){
                                        condition1 = notmoved && validmove(selectedx,selectedy,x,y);
                                        condition2 = selection.hasCaptured() && validmove(selectedx,selectedy,x,y) && selection.type =="pawn" && readytocapture(selectedx,selectedy);
                                        return condition1 || condition2;
                                }
                        }
                return false;
        }
        public boolean canEndTurn(){
                if (selection!=null){
                        return !notmoved || selection.hasCaptured();
                }
                return false;
        }
        public void endTurn(){
                Fire_turn = !Fire_turn;
                selection.doneCapturing();
                selection = null;
            selectedx = selectedy =999;
                notmoved = true;
        }
        public String winner(){
                String message;
                if (Fires> 0 && Waters>0){
                        return null;
                }
                if (Fires==0){
                        message = "Water";
                }else if (Waters==0){
                        message = "Fire";
                }else{
                        message = "No one";
                }
                return message;
        }

}

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

ilyak 发表于 2015-7-4 21:28:22 | 显示全部楼层
本帖最后由 ilyak 于 2015-7-4 21:44 编辑

这个快要写哭了QWQ

对一下的几个method有一些问题:表示放下,capture:
board class里的place 和 remove, Piece class里的 move,有什么区别么?


表示结束一轮:
board class里end turn和piece class里donecapture。不都应该是表达这轮结束这样么?

求助QWQ
回复 支持 反对

使用道具 举报

 楼主| karte_polo 发表于 2015-7-4 23:27:57 | 显示全部楼层
ilyak 发表于 2015-7-4 21:28
这个快要写哭了QWQ

对一下的几个method有一些问题:表示放下,capture:

这个作业非常的不友好!我觉得很多METHOD的设计灰常失败,而且描述写的又不清楚很容易把人搞晕@_@

先依照我的思路来试着来解答一下几个问题:
1.按照项目的要求,Piece class里的move, 应该只需要负责棋子们移动后的对周边棋子的行为(比方说BOMB CAPTURE 后的 AOE效果啦,以及到达对方底线后升级为KING的情况),这些功能有部分需要用到BOARD里的REMOVE功能;而BOARD里的PLACE 和REMOVE,主要是负责BOARD上面的画棋子(初始化棋盘以及后续更新时)和消除棋子的操作,是直接针对BOARD对象的。
2.CAPTURE了之后并不一定能END TURN哦(详情请再仔细阅读一下规则),Piece class里的donecapture 只是为了更新该棋子的CAPTURE状态,如果棋子是NORMAL并且处于可以继续CAPTURE位置的时候,是可以继续行动的。

最后我想说:加油吧同学,PROJ里还有个测试可以让你确认一下自己的某些METHOD是否有问题。先把棋盘画出来,再把最难搞的能否移动的情况理清楚,你就离成功不远啦~
回复 支持 反对

使用道具 举报

想念英雄 发表于 2016-1-3 12:49:42 | 显示全部楼层
谢谢分享,我把proj0写完了~
回复 支持 反对

使用道具 举报

想念英雄 发表于 2016-1-3 12:50:16 | 显示全部楼层
楼主写了proj1吗?
回复 支持 反对

使用道具 举报

HNAKXR 发表于 2016-2-6 19:11:53 | 显示全部楼层
这个project很多东西都没讲清楚,还得先玩一下提供的完成的游戏来确定对规则的理解。有些API设计得不好,搞得经常要把所有位置遍历一遍。

proj0_1.png
proj0_2.png
proj0_3.jpeg

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-6 11:03

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表