题型总结&比赛技巧
绘制正多边形类

int main(){p.c(10).size(10);for(int i = 1; i <= 4; i++){p.fd(100).rt(90);}return 0;}

int main(){p.c(13).size(10);for(int i = 1; i <= 8; i++){p.fd(80).rt(45);}return 0;}

int main(){p.size(10);for(int i = 1; i <= 18; i++){p.fd(40).rt(20);}return 0;}

int main(){for(int i = 1; i <= 5; i++){p.fd(100).lt(360/5);}return 0;}
思考
对于绘制多边形这类型的题目,是否可以使用“定义变量”
和“cin控制边数”来实现一个通用的程序代码?
认真思考后请尝试书写

int main(){int n ;cin >> n;for(int i = 1; i <= n; i++){p.fd(50).rt(360/n);}return 0;}
生活场景类

int main(){p.size(10);p.c(0).fd(120);p.up().fd(40);p.down().o(40);p.c(15).oo(33);p.c(1).oo(30);p.text("60",15);p.hide();}

int main(){p.c(13).oo(120);p.up();for(int i = 0;i < 12 ;i ++){p.fd(100).text(i,0).bk(100).rt(360/12);}}

int main(){p.picU(0);p.c(13).rr(200,200);p.rt(45).rr(200,200);p.c(1).oo(70);p.hide();}

int main(){p.picU(0);p.rt(45).rr(300,300,1);p.c(15).fd(100).rr(100,100).bk(100);p.rt(90).fd(100).rr(100,100).bk(100);p.rt(90).fd(100).rr(100,100).bk(100);p.rt(90).fd(100).rr(100,100).bk(100);p.rr(100,100,1);p.hide();}

创意类图形

//通过控制笔的粗细、交替的颜色变化,我们还可以绘制一顶小丑的帽子。int main(){p.text("小丑的帽子",0,30,0,0,300);//显示标题,小丑的帽子p.speed(1.5);//设置速度1.5较慢p.c(1).size(300).fd(23);p.c(12).size(270).fd(23);p.c(11).size(240).fd(23);p.c(13).size(210).fd(23);p.c(12).size(180).fd(23);p.c(14).size(150).fd(23);p.c(4).size(120).fd(23);p.c(2).size(90).fd(28);p.c(12).size(80).fd(3);p.hide();//隐藏笔头return 0;}


//利用up()和down()(抬笔和落笔命令)实现画笔位置的移动//请大家仔细观察,画笔的位置。//了解这辆彩色公交车是怎样画出来的吧!int main(){p.speed(10);//调整画笔速度,1-10,10是最快速度p.moveTo(-190,350).text("彩色公交车",7,48);p.moveTo(-100,300).text("利用up()和donw()让画笔自由移动位置画图",7,28);p.moveTo(0,-100);//抬笔,让画笔可以自由移动位置p.up();wait(2);p.rr(600,100,11);//紫色公交车车厢wait(1);//画笔等待1秒钟p.fd(58);p.rr(600,10,7);//蓝色公交车身线条wait(1);p.fd(20);p.rr(600,20,1);//红色长车身wait(1);p.fd(60).rt(90).fd(40).lt(90);p.rr(520,130,1);//红色车厢wait(1);p.bk(180).rt(90).fd(110);wait(1);p.down().size(1);//利用for循环画公共汽车的后轮p.c(0).size(12);for(int i = 0; i < 60; i++)p.fd(60).bk(60).rt(6);p.c(15);for(int i = 0; i < 60; i++)p.fd(35).bk(35).rt(6);p.size(12).c(0);for(int i = 0; i < 10; i++)p.fd(35).bk(35).rt(36);p.up();p.bk(300);wait(1);//利用for循环画公共汽车前轮p.down().c(0);for(int i = 0; i < 60; i++)p.fd(60).bk(60).rt(6);p.c(15);for(int i = 0; i < 60; i++)p.fd(35).bk(35).rt(6);p.c(0);for(int i = 0; i < 10; i++)p.fd(35).bk(35).rt(36);//使用抬笔命令 ,让画笔来到新的位置画图,画三个窗户p.up().bk(150).rt(90).bk(70).lt(90).bk(20);p.rr(40,100,13);//黄色车灯wait(1);p.fd(210).lt(90).fd(110);p.rt(90);p.rr(115,90,15);//蓝色窗户wait(1);p.fd(57+30+57);p.rr(115,90,9);//粉色窗户wait(1);p.fd(57+30+57);p.rr(115,90,5); //黄色窗户wait(1);p.hide();wait(10);return 0;}
方法一:逐点绘制
//小蘑菇的顶部是利用for循环实现的。仔细看一看它是怎样形成的?//小蘑菇的顶部,重复动作是什么?//一共重复了多少次?//相邻的重复动作之间转角是多少?int main(){p.speed(8);//调整画笔画图的速度(1-10,10最快);p.c(13);//设置画笔的颜色为黄色;p.lt(90);//调整画笔的方向;p.rr(800,800,8);//画面的背景是一个宽800,高800的灰色矩形;for(int i=0;i<180;i++) //重复180次p.fd(150).bk(150).rt(1);//前进、后退、转角;p.speed(4);//调整画笔的速度慢一点p.lt(90).bk(50).rr(140,100,14);//调整画笔方向和位置,画橘红色矩形;return 0;}
方法二:画弧线法
int main(){p.rr(800,800,8);//画面的背景是一个宽800,高800的灰色矩形;p.picU(0).up().lt(90);p.aa(150,180,1,13);p.rt(90).bk(50).rr(140,100,14);//调整画笔方向和位置,画橘红色矩形;return 0;}
方法一:逐点绘制
//利用三个for循环,进行了线条的旋转。//问题1:下面图形的重复动作是什么?//问题2:下面图形旋转点在哪里?int main(){p.speed(7);//调节画图的速度(1-10,10最快)p.c(0);//设置画笔为黑色for(int i=0;i<180;i++) //重复180次p.fd(110).bk(220).fd(110).rt(1);//前进、后退、前进、转角;//上面图形旋转点在哪里?p.c(15);//设置画笔为白色for(int i=0;i<90;i++) //重复90次p.fd(100).bk(200).fd(100).rt(1);//前进、后退、前进、转角;p.c(2);//设置画笔为蓝色for(int i=0;i<90;i++) //重复90次p.fd(100).bk(200).fd(100).rt(1); //前进、后退、前进、转角;return 0;}
方法二:画弧线法
int main(){p.picU(0);p.oo(320,0).oo(300,15);p.rt(90);for(int i=0;i<300;i++) {p.a(i,90,1,2);}p.rt(180);for(int i=0;i<300;i++) {p.a(i,90,1,2);}return 0;}

// 水滴 int main(){ p.c(12); for(int i=3;i<80;i++) p.bk(2).oo(i); p.hide(); return 0;
}
```cpp//橙子//结合叠加的同心圆,配合for循环,画出切割圆的线段int main(){p.text("画橙子",14,50,0,0,300);//写标题p.oo(200,13); //画最大的黄色圆wait(1); //让画笔等待一秒钟p.oo(180,15); //画橙皮的白色部分wait(1); //让画笔等待一秒钟p.oo(160,14); //画里面的果肉wait(1); //让画笔等待一秒钟p.c(15).size(10); //设置笔色为白色,笔宽10//使用for循环,画切割线for(int i = 0; i < 6; i ++)p.fd(160).bk(160).rt(60);p.hide(); //隐藏画笔return 0;}

// 画葫芦//结合抬笔命令,移动画笔到合适的位置,画出可爱的葫芦。int main(){p.text("画 葫 芦",7,59,0,-230,320);//显示标题p.up().bk(160); //抬笔,移动画笔到合适的位置p.oo(200,14).fd(170); //画最下面的圆,并向上移动到下一个圆的圆心p.oo(150,13).fd(130); //画中间的圆,并向上移动到下一个圆的圆心p.oo(90,5).fd(90); //画最上面的圆,并向前移动到顶部p.c(10).size(20).down().fd(80); //画葫芦柄p.hide(); //隐藏笔return 0;}

// 水滴int main(){p.c(11);for(int i=0;i<80;i++)p.fd(2).oo(i).rt(0.2);p.hide();return 0;}

// 旋转的太极图int main(){p.hide();int c1 = 15,c2=0;p.up().picU(0);while(1){p.speed(10);p.oo(202,c2) // 画黑底圆.aa(200,180,1,c1) // 把右侧填充为白色半圆.fd(100).oo(100,c1).oo(35,c2).bk(200).oo(100,c2).oo(35,c1).fd(100);p.speed(1).rt(2);wait(0.01);p.clsRec();}}
跳动的爱心:

void draw(int r){p.setAngle(-45);p.rr(r,r,1);p.aa(r/2,270,0,1);p.lt(90);p.aa(r/2,270,0,1);}int main(){p.picU(0).speed(10);int n = 1;while(1){p.clsRec();draw(n % 300);n += 10;wait(0.3);p.clsRec();wait(0.1);}return 0;}
动态时钟

int main(){ // 秒针长度:220 , 红色,每秒跳动一次p.hide().textU(0).speed(10);while(1){p.oo(300,5).size(20).o(310,0);p.up();for(int i=1;i<=12;i++) {p.rt(360.0/12);p.fd(250).text(i,0,60).bk(250);}p.moveTo(150,0).rr(60,60,0).rr(50,50,15);p.text(getDay(),0,30);p.moveTo(0,0).down().c(7);// 分针p.setAngle(360.0 / 60 * getMinute());p.size(8).fd(200).bk(200);// 时针p.setAngle(360.0 / 12 * getHour() + 30.0 / 60 * getMinute());p.size(12).fd(150).bk(150);// 秒针p.setAngle(360.0 / 60 * getSecond());p.c(1).size(8).fd(220).bk(250).fd(30).oo(10);wait(0.01);p.cls(); // 如果使用clsRec() 画表盘时要恢复为 0 度向上方向}return 0;}
旋转类图形
picU(1/0), 放图形跟随画笔旋转

int main(){p.hide().picU(0).rt(45);p.moveTo(-75,0).r(100,100,2);p.lineTo(75,0).r(100,100,2);}

// 画三个正方形叠加int main(){p.picU(0).c(1);p.r(100,100);p.rt(60).r(100,100);p.rt(60).r(100,100);p.hide();return 0;}

int main(){p.up().picU(0).hide();for(int i = 0; i < 4; i ++){p.r(200,30,11).rt(90).fd(100);}}
方法一:
int main(){p.up();p.ee(100,50,1);p.ee(50,100,1);p.oo(50,5);return 0;}
方法二: picU()
int main(){p.up();p.picU(0); // 设置图片方向p.ee(100,50,1);p.rt(90);p.ee(100,50,1);p.oo(50,5);return 0;}
中心放射类图形

int main(){for(int i= 0;i < 10;i++){p.c(i%10).fd(100).oo(20).bk(100).rt(360/10);}return 0;}

int main(){p.up();for(int i = 1; i <= 12;i++){p.rt(360/12).fd(100).o(20).text(i).bk(100);}return 0;}
动画类

int main(){p.hide();for(int i= 20; i> 0; i--){p.cls().ee(85,120,10).e(85,120,13);p.textSize(90).text(i,5);wait(1);}}
方法一:
int main(){p.hide();p.picU(0);for(int i = 1; i <= 20;i ++){p.cls().rt(18*i).ee(30,100,1).oo(10,0);wait(0.2);}}
方法二:
int main(){p.hide();p.picU(0);for(int i = 1; i <= 20;i ++){p.clsRec().rt(18).ee(30,100,1).oo(10,0);wait(0.2);}}
说明:clsRec是clearRectangular (清除矩形)的缩写,没有参数的clsRec()表示清整个屏幕,它与cls()不同,pen位置不会坐标回原点。如果picU(1);方向会随笔头。

int main(){p.hide().up().moveTo(-100,100).rt(135);for(int i = 1; i <= 10;i ++){p.clsRec().ee(15*i,10*i,14).fd(50);wait(0.2);}}
动画重点
动画类作品两个关键函数:clsRec(w,h) 和wait( )
循环中的变量控制

int main(){for(int i= 5;i <= 150;i=i+5){p.fd(i).rt(90);}return 0;}

int main(){for(int i= 1;i <= 32;i++){p.c((i+3)/4).fd(i*5).rt(90);}return 0;}

int main(){for(int i= 1;i <= 32;i++){p.c((i-1)%4+1).fd(i*5).rt(90);}return 0;}

int main(){p.hide().up().picU(0).rt(-105);for(int i = 3; i <=25; i += 2){p.fd(120).o(30,11).text(i,10).bk(120).rt(30);}}
