摘要

Git教程

https://www.bilibili.com/video/BV1HM411377j?p=1&vd_source=d84f08a0531e04d6d41c38180cce9fb5

我的博客,希望自己能够不要那么那么笨了。

image-20240529230134500

我记得,好像是vscode吧,,给你看个截图

是很久以前配置的,懒得改了

image-20240529230217348

有点没绷住,git clone 的时候不能开代理,不然就会出错

image-20240529232044779

太棒了,,过去的点滴积累没有白费,,太好了!!

image-20240529233931878

我换过桌面,D盘里面的桌面是DesktopNew。真正的Desktop在C盘。里面放着cs61b

image-20240529234714485

太棒了,本来是蒙的,没想到youyouyou蒙对了

image-20240529235312981

yes,离成功又近了一步

image-20240529235612781

太棒了,,成功辣,,把他们的代码骨架skeleton都搞下来了

image-20240529235815313

哈哈到这里出错了,,但是无所谓了。

image-20240530001235893

oracleopenjdk不行就换,但这也是之后的事情了,我已经进步太多了。

哈哈哈,绷不住了,,到最后我还是用的java8跑的,无所谓了,,后面再改吧。反正前面简单从内容用不到新语言的特性

修复测试乘成功了

image-20240530094937378

git提交应该是没出错的,但是他的自动评分系统报错,个人感觉是因jdk版本的原因。这个之后再改吧,已经是几乎成功了。

我突然其实是感觉课程不配套导致的,我的作业写的是24年的。

但是评测gradescope测评的是2021年从春季的课程

image-20240530111111533

靠了,,放出没看懂他们的话,,现在看懂了。

既然只有21spring开放的测评机,那一切都从21Spring 的版本为准吧。版本不重要,重要的是坚持做完。

搜了搜有没有CS61B的2024Spring的入学代码,完全找不到。网上都是2021Spring的博客和笔记,个人猜测是2021Spring的Gradescope开放的,所以大家都用这个学期的版本。那我也学这个学期的版本,与大部分人同步得了。

重新换任务我也等到6.1号之后了。

真别急,谁说最后还用不用的着你的程序代码呢,慢点开始。看了看电脑设置多个jdk麻烦死了。不想动了,不管这些了。

image-20240530111731459

上面都是2024SpringCS61B的Lab01的过程,我现在改成2021SpringCS61B了。

Week1✔

Lab 1 Setup: Setting Up Your Computer✔

hhhhhhhhhhhhh为什么我这里java HelloWorld成功了,但是之前不成功,难道真是的用户变量里面的CLASSPATH的alg4.jar导致的吗。

感觉用Windows Terminal也一样行,我试试

image-20240531172306320

果然是是的用户变量里面的CLASSPATH的alg4.jar导致的。奶奶的

那我的普林斯顿的那个之后放到后面做了。因为alg4的配置比我先做的更麻烦,我先歇一会。

image-20240531172454123

Lab 1: IntelliJ, Java, git✔

太棒了,这个也做完了。

而且自动评分器得了满分。太好了

有个小小的报错

1
Cannot resolve symbol 'String' 和 'System’

解决方法https://blog.csdn.net/wy_hhxx/article/details/121239112

个人感觉原因是,把别人的setting导入进来的时候,别人的jdk路径和自己的jdk路径不一样,所以会有这个报错。

果然好了,不报错了

这也解决了我的选择困难症,再也不用纠结用哪个color scheme,用加州大学伯克利分校的教授同款怎么样都是好。好好哈后

image-20240531201052203

HW 0: A Java Crash Course✔

讲的很细,和C++49讲的一样

中断并继续

有时,您可能会发现使用breakcontinue关键字很有用。该continue语句跳过循环当前迭代的其余部分,有效地直接跳转到增量条件。

增强的 For 循环

这一点和acwing讲的一样

Java 还支持使用“增强的 for 循环”对数组进行迭代。基本思想是,在很多情况下我们实际上根本不关心索引。在这种情况下,我们避免使用涉及冒号的特殊语法来创建索引变量。

例如,在下面的代码中,我们执行的操作与BreakDemo上面的完全相同。但是,在这种情况下,我们不创建索引i。相反,从开始到,只接受String s每个的标识一次。您可以通过此链接试用此代码。String``a``a[0]``a[a.length - 1]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class EnhancedForBreakDemo {
public static void main(String[] args) {
String[] a = {"cat", "dog", "laser horse", "ketchup", "horse", "horbse"};

for (String s : a) {
for (int j = 0; j < 3; j += 1) {
System.out.println(s);
if (s.contains("horse")) {
break;
}
}
}
}
}

Project 0: 2048✔

好难,要做吗

介绍

您可以在https://youtu.be/Xzihuj_JZBI找到该项目的高级概述。

但您的任务仅存在于四种方法中Model.java,并且仅限于四种方法。(感觉没那么难),其他的部分他都给我封装好 了。

游戏

在这个项目中,您将构建此游戏的核心逻辑。也就是说,我们已经整合了所有 GUI 代码、处理按键以及大量其他框架。您的工作是完成最重要和最有趣的部分。

具体来说,您将在文件中填写 4 种方法Model.java,这些方法控制用户按下某些键后发生的情况。

在第一次移动之前,应用程序会将包含 2 或 4 的方块添加到最初为空的棋盘上的随机方格中。2 或 4 的选择是随机的,选择 2 的概率为 75%,选择 4 的概率为 25%

以下是发生合并时的完整规则,如上图所示。

  1. 两块相同数值的牌合并为一块牌,其数字是初始数字的两倍。
  2. 合并后的图块不会在该倾斜度上再次合并。例如,如果我们有 [X, 2, 2, 4],其中 X 代表空白区域,我们将图块向左移动,最终结果应该是 [4, 4, X, X],而不是 [8, X, X, X]。这是因为最左边的 4 已经是合并的一部分,因此不应再次合并。
  3. 当运动方向上的三个相邻图块具有相同的编号时,运动方向上的前两个图块将合并,而后面的图块则不会合并。例如,如果我们有 [X, 2, 2, 2] 并将图块向左移动,则最终结果应该是 [4, 2, X, X],而不是 [2, 4, X, X]。

根据这些规则,如果在运动方向上有四个相邻的图块具有相同的编号,它们将形成两个合并的图块。例如,如果我们有 [4, 4, 4, 4],那么如果我们向左移动,我们最终会得到 [8, 8, X, X]。这是因为前两个图块将根据规则 3 合并,然后后面的两个图块将合并,但是由于规则 2,这些合并的图块(在我们的示例中为 8)不会在该倾斜方向上自行合并。您会在上面的动画 GIF 中找到上面列出的 3 条规则中的每一个的应用,因此请仔细观看几次以很好地理解这些规则。

注意:您的代码不会添加任何新图块!我们已经为您完成了这一部分。

您的代码需要更新分数

当当前玩家没有可用的移动(没有倾斜可以改变棋盘)或移动形成包含 2048 的方格时,游戏结束。您的代码将负责检测游戏何时结束。

作业理念与课程设计

当您进行该项目的第四个最终任务(编写方法tilt)时,其中一个挑战是找出这些方法和实例变量中的哪些是有用的。

Board

此类代表棋盘本身。它有三种方法供您使用:setViewingPerspectivetilemove。您也可以选择使用 进行实验getRandomNonNullTile

您只能编辑Model.java此作业中的文件。Gradescope只会采用您的Model.java文件并使用其他文件的框架版本,因此如果您对文件进行编辑Tile.java,Gradescope 将无法识别该文件。

你的任务

您在这个项目中要做的工作是修改和完成Model类,特别是emptySpaceExistsmaxTileExistsatLeastOneMoveExists方法 tilt。其他一切都已为您实现。我们建议按此顺序完成它们。前两个相对简单。第三个(atLeastOneMoveExists)更难,最后一种方法tilt可能相当困难。我们预计tilt您需要 3 到 10 个小时才能完成。前三种方法将处理游戏结束条件,最后一种方法tilt将在用户按下按键后修改棋盘。您可以阅读该方法的简短主体,checkGameOver以了解如何使用您的方法来检查游戏是否结束。

前面的视频和SLids和指南和现场问答都看完了。就差pro 0 了

纪念一下

image-20240601223621803

理解了,悟了。Tile t为null表示空格子,没有数字。所以为了引用空指针要先判断t != null,当然这也算一个小小的短路原则。

image-20240601225351001

一次性写对了,很开心

image-20240601230852419

贴上我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static boolean atLeastOneMoveExists(Board b) {
// TODO: Fill in this function.
if (emptySpaceExists(b)) return true;
int[] dj = new int[]{1, 0, -1, 0};
int[] di = new int[]{0, 1, 0, -1};
int len = b.size();
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
Tile t = b.tile(j, i);
for (int k = 0; k < 4; k++) {
int jNew = j + dj[k];
int iNew = i + di[k];
if (iNew >= 0 && iNew < len && jNew >= 0 && jNew < len) {
Tile tNew = b.tile(iNew, jNew);
if(t.value() == tNew.value()){
return true;
}
}

}
}
}

return false;
}

第四个函数

image-20240602075351166

贴上我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public boolean tilt(Side side) {
boolean changed;
changed = false;

// TODO: Modify this.board (and perhaps this.score) to account
// for the tilt to the Side SIDE. If the board changed, set the
// changed local variable to true.
board.setViewingPerspective(side);

for (int c = 0; c < board.size(); c++) {
for (int r = board.size() - 1; r >= 0; r--) {
Tile t1 = board.tile(c, r);
if (t1 != null) {
for (int r2 = r - 1; r2 >= 0; r2--) {
Tile t2 = board.tile(c, r2);
if (t2 != null) {
if (t2.value() == t1.value()) {
board.move(c, r, t2);
changed = true;
score += 2 * t1.value();
r = r2;
break;
} else {
break;
}
} else {
continue;
}

}
}

}
}
for (int c = 0; c < board.size(); c++) {
for (int r = board.size() - 1; r >= 0; r--) {
Tile t1 = board.tile(c, r);
if (t1 == null) {
for (int r2 = r - 1; r2 >= 0; r2--) {
Tile t2 = board.tile(c, r2);
if (t2 != null) {
board.move(c, r, t2);
changed = true;
break;
} else {
continue;
}

}
}

}
}
board.setViewingPerspective(Side.NORTH);
checkGameOver();
if (changed) {
setChanged();
}
return changed;
}

运行testModel.java也成功了。

image-20240602075532255

开心,终于完成任务 了

image-20240602080539030

Week2

DONE
Debugging (due 01/29)
[Project 0 due 1/29] DONE

现在把可能用到的网页放在这里

最主要的两个链接。

https://www.gradescope.com/courses/137626

https://sp21.datastructur.es/

参考作业

https://github.com/KANIKIG/cs61b-sp21/blob/main/proj0/game2048/Model.java