cs106s是斯坦福一门叫做编程方法学的课的编号。这门课面向初学编程者,使用的语言是java。课程资源网上都有,我决定把附带的作业自己动手做一下贴在这里。有错漏不足之处欢迎读者指正。
Assignment 1
problem #1
这是个简单的移动Karel的问题。问题很简单,就是移动Karel到方框外的“报纸”处,捡起,然后回到原地。代码如下:
import stanford.karel.*;
public class CollectNewspaperKarel extends SuperKarel {
public void run(){
move();
move();
turnRight();
move();
turnLeft();
move();
pickBeeper();
turnLeft();
turnLeft();
move();
move();
move();
turnRight();
move();
}
}
problem #2
这个问题也很简单,就是要求Karel能够使得图中每隔4列的列中都填满beeper(已经有的地方不可重复),起始位置是(1,1)。
import stanford.karel.*;
public class StoneMasonKarel extends SuperKarel {
public void run(){
repair();
comeback();
while (frontIsClear()){
for(int i=0;i<4;i++){
move();
}
repair();
comeback();
}
}
private void repair(){
turnLeft();
while (frontIsClear()){
if (noBeepersPresent()){
putBeeper();
}
move();
}
if (noBeepersPresent()){
putBeeper();
}
}
private void comeback(){
turnLeft();
turnLeft();
while (frontIsClear()){
move();
}
turnLeft();
}
}
problem #3
第三个题要求Karel在任意给定的矩形地图里间隔放置beeper,我的思路是:
首先建立几个private方法:放置奇数号码行,放置偶数号码行,返回该行第一格,进入下一行。其中前两者的区别在于beeper的位置错开了。
程序结构如下:
放置奇数号码行
返回
判定是否继续(用while循环),循环操作:进入下一行,放置偶数号码行,返回,判定是否继续(用if),进入下一行,放置奇数号码行,返回
具体代码如下:
import stanford.karel.*;
public class CheckerboardKarel extends SuperKarel {
public void run(){
creatSingleColumn();
back();
while(rightIsClear()){
goNext();
creatEvenColumn();
back();
if(rightIsClear()){
goNext();
creatSingleColumn();
back();
}
}
}
private void creatSingleColumn(){
putBeeper();
while(frontIsClear()){
move();
if (frontIsClear()){
move();
putBeeper();
}
}
}
private void creatEvenColumn(){
while(frontIsClear()){
move();
putBeeper();
if (frontIsClear()){
move();
}
}
}
private void back(){
turnLeft();
turnLeft();
while(frontIsClear()){
move();
}
}
private void goNext(){
turnRight();
move();
turnRight();
}
}
problem #4
这个问题要求karel能够到达一行(长度任意)的中点并在其上放置一枚beeper。注意程序结束时要求其余地方不能有beeper存在。
这个题有些难度,因为除了给定的几个指令,你不能使用其他任何东西 。(比如设置一个变量作为计数器)。昨晚遇到此题时毫无思路,没想到一觉起来马上意识到可以利用自己所在格子的beeper数来标示。
方法如下:先放置一枚。走过去时,先把当前格子的beeper都搬运到下一格,并额外放置一个beeper。回来时,也这样搬运,不同的是到达下一格后不放置,而是取走两个beeper。
代码如下:
import stanford.karel.*;
public class MidpointFindingKarel extends SuperKarel {
public void run(){
putBeeper();
while(frontIsClear()){
if(beepersPresent()){
pickBeeper();
move();
putBeeper();
back();
if(noBeepersPresent()){
move();
putBeeper();
}
}
}
turnLeft();
turnLeft();
while(beepersPresent()){
pickBeeper();
move();
putBeeper();
back();
if(noBeepersPresent()){
move();
pickBeeper();
if(beepersPresent()){
pickBeeper();
}
}
}
back();
putBeeper();
}
private void back(){
turnLeft();
turnLeft();
move();
turnRight();
turnRight();
}
}