题型总结&比赛技巧

绘制正多边形类

Goc挑战赛集训 - 图1

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

Goc挑战赛集训 - 图2

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

Goc挑战赛集训 - 图3

  1. int main()
  2. {
  3. p.size(10);
  4. for(int i = 1; i <= 18; i++){
  5. p.fd(40).rt(20);
  6. }
  7. return 0;
  8. }

Goc挑战赛集训 - 图4

  1. int main()
  2. {
  3. for(int i = 1; i <= 5; i++){
  4. p.fd(100).lt(360/5);
  5. }
  6. return 0;
  7. }

思考

对于绘制多边形这类型的题目,是否可以使用“定义变量” 和“cin控制边数”来实现一个通用的程序代码?
认真思考后请尝试书写 Goc挑战赛集训 - 图5

  1. int main()
  2. {
  3. int n ;
  4. cin >> n;
  5. for(int i = 1; i <= n; i++){
  6. p.fd(50).rt(360/n);
  7. }
  8. return 0;
  9. }

生活场景类

Goc挑战赛集训 - 图6

  1. int main()
  2. {
  3. p.size(10);
  4. p.c(0).fd(120);
  5. p.up().fd(40);
  6. p.down().o(40);
  7. p.c(15).oo(33);
  8. p.c(1).oo(30);
  9. p.text("60",15);
  10. p.hide();
  11. }

Goc挑战赛集训 - 图7

  1. int main()
  2. {
  3. p.c(13).oo(120);
  4. p.up();
  5. for(int i = 0;i < 12 ;i ++){
  6. p.fd(100).text(i,0).bk(100).rt(360/12);
  7. }
  8. }

Goc挑战赛集训 - 图8

  1. int main()
  2. {
  3. p.picU(0);
  4. p.c(13).rr(200,200);
  5. p.rt(45).rr(200,200);
  6. p.c(1).oo(70);
  7. p.hide();
  8. }

Goc挑战赛集训 - 图9

  1. int main()
  2. {
  3. p.picU(0);
  4. p.rt(45).rr(300,300,1);
  5. p.c(15).fd(100).rr(100,100).bk(100);
  6. p.rt(90).fd(100).rr(100,100).bk(100);
  7. p.rt(90).fd(100).rr(100,100).bk(100);
  8. p.rt(90).fd(100).rr(100,100).bk(100);
  9. p.rr(100,100,1);
  10. p.hide();
  11. }

Goc挑战赛集训 - 图10

创意类图形

Goc挑战赛集训 - 图11 Goc挑战赛集训 - 图12

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

Goc挑战赛集训 - 图13

Goc挑战赛集训 - 图14

  1. //利用up()和down()(抬笔和落笔命令)实现画笔位置的移动
  2. //请大家仔细观察,画笔的位置。
  3. //了解这辆彩色公交车是怎样画出来的吧!
  4. int main(){
  5. p.speed(10);//调整画笔速度,1-10,10是最快速度
  6. p.moveTo(-190,350).text("彩色公交车",7,48);
  7. p.moveTo(-100,300).text("利用up()和donw()让画笔自由移动位置画图",7,28);
  8. p.moveTo(0,-100);
  9. //抬笔,让画笔可以自由移动位置
  10. p.up();
  11. wait(2);
  12. p.rr(600,100,11);//紫色公交车车厢
  13. wait(1);//画笔等待1秒钟
  14. p.fd(58);
  15. p.rr(600,10,7);//蓝色公交车身线条
  16. wait(1);
  17. p.fd(20);
  18. p.rr(600,20,1);//红色长车身
  19. wait(1);
  20. p.fd(60).rt(90).fd(40).lt(90);
  21. p.rr(520,130,1);//红色车厢
  22. wait(1);
  23. p.bk(180).rt(90).fd(110);
  24. wait(1);
  25. p.down().size(1);
  26. //利用for循环画公共汽车的后轮
  27. p.c(0).size(12);
  28. for(int i = 0; i < 60; i++)
  29. p.fd(60).bk(60).rt(6);
  30. p.c(15);
  31. for(int i = 0; i < 60; i++)
  32. p.fd(35).bk(35).rt(6);
  33. p.size(12).c(0);
  34. for(int i = 0; i < 10; i++)
  35. p.fd(35).bk(35).rt(36);
  36. p.up();
  37. p.bk(300);
  38. wait(1);
  39. //利用for循环画公共汽车前轮
  40. p.down().c(0);
  41. for(int i = 0; i < 60; i++)
  42. p.fd(60).bk(60).rt(6);
  43. p.c(15);
  44. for(int i = 0; i < 60; i++)
  45. p.fd(35).bk(35).rt(6);
  46. p.c(0);
  47. for(int i = 0; i < 10; i++)
  48. p.fd(35).bk(35).rt(36);
  49. //使用抬笔命令 ,让画笔来到新的位置画图,画三个窗户
  50. p.up().bk(150).rt(90).bk(70).lt(90).bk(20);
  51. p.rr(40,100,13);//黄色车灯
  52. wait(1);
  53. p.fd(210).lt(90).fd(110);
  54. p.rt(90);
  55. p.rr(115,90,15);//蓝色窗户
  56. wait(1);
  57. p.fd(57+30+57);
  58. p.rr(115,90,9);//粉色窗户
  59. wait(1);
  60. p.fd(57+30+57);
  61. p.rr(115,90,5); //黄色窗户
  62. wait(1);
  63. p.hide();
  64. wait(10);
  65. return 0;
  66. }

Goc挑战赛集训 - 图15 方法一:逐点绘制

  1. //小蘑菇的顶部是利用for循环实现的。仔细看一看它是怎样形成的?
  2. //小蘑菇的顶部,重复动作是什么?
  3. //一共重复了多少次?
  4. //相邻的重复动作之间转角是多少?
  5. int main(){
  6. p.speed(8);//调整画笔画图的速度(1-10,10最快);
  7. p.c(13);//设置画笔的颜色为黄色;
  8. p.lt(90);//调整画笔的方向;
  9. p.rr(800,800,8);//画面的背景是一个宽800,高800的灰色矩形;
  10. for(int i=0;i<180;i++) //重复180次
  11. p.fd(150).bk(150).rt(1);//前进、后退、转角;
  12. p.speed(4);//调整画笔的速度慢一点
  13. p.lt(90).bk(50).rr(140,100,14);//调整画笔方向和位置,画橘红色矩形;
  14. return 0;
  15. }

方法二:画弧线法

  1. int main(){
  2. p.rr(800,800,8);//画面的背景是一个宽800,高800的灰色矩形;
  3. p.picU(0).up().lt(90);
  4. p.aa(150,180,1,13);
  5. p.rt(90).bk(50).rr(140,100,14);//调整画笔方向和位置,画橘红色矩形;
  6. return 0;
  7. }

Goc挑战赛集训 - 图16 方法一:逐点绘制

  1. //利用三个for循环,进行了线条的旋转。
  2. //问题1:下面图形的重复动作是什么?
  3. //问题2:下面图形旋转点在哪里?
  4. int main(){
  5. p.speed(7);//调节画图的速度(1-10,10最快)
  6. p.c(0);//设置画笔为黑色
  7. for(int i=0;i<180;i++) //重复180次
  8. p.fd(110).bk(220).fd(110).rt(1);//前进、后退、前进、转角;
  9. //上面图形旋转点在哪里?
  10. p.c(15);//设置画笔为白色
  11. for(int i=0;i<90;i++) //重复90次
  12. p.fd(100).bk(200).fd(100).rt(1);//前进、后退、前进、转角;
  13. p.c(2);//设置画笔为蓝色
  14. for(int i=0;i<90;i++) //重复90次
  15. p.fd(100).bk(200).fd(100).rt(1); //前进、后退、前进、转角;
  16. return 0;
  17. }

方法二:画弧线法

  1. int main()
  2. {
  3. p.picU(0);
  4. p.oo(320,0).oo(300,15);
  5. p.rt(90);
  6. for(int i=0;i<300;i++) {
  7. p.a(i,90,1,2);
  8. }
  9. p.rt(180);
  10. for(int i=0;i<300;i++) {
  11. p.a(i,90,1,2);
  12. }
  13. return 0;
  14. }
  1. ![](/projects/goc/202401/17ab2ec83e478c56.png)

// 水滴 int main(){ p.c(12); for(int i=3;i<80;i++) p.bk(2).oo(i); p.hide(); return 0;

}

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

Goc挑战赛集训 - 图17

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

Goc挑战赛集训 - 图18

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

Goc挑战赛集训 - 图19

  1. // 旋转的太极图
  2. int main()
  3. {
  4. p.hide();
  5. int c1 = 15,c2=0;
  6. p.up().picU(0);
  7. while(1){
  8. p.speed(10);
  9. p.oo(202,c2) // 画黑底圆
  10. .aa(200,180,1,c1) // 把右侧填充为白色半圆
  11. .fd(100).oo(100,c1)
  12. .oo(35,c2)
  13. .bk(200).oo(100,c2)
  14. .oo(35,c1)
  15. .fd(100);
  16. p.speed(1).rt(2);
  17. wait(0.01);
  18. p.clsRec();
  19. }
  20. }

跳动的爱心:

Goc挑战赛集训 - 图20

  1. void draw(int r){
  2. p.setAngle(-45);
  3. p.rr(r,r,1);
  4. p.aa(r/2,270,0,1);
  5. p.lt(90);
  6. p.aa(r/2,270,0,1);
  7. }
  8. int main()
  9. {
  10. p.picU(0).speed(10);
  11. int n = 1;
  12. while(1){
  13. p.clsRec();
  14. draw(n % 300);
  15. n += 10;
  16. wait(0.3);
  17. p.clsRec();
  18. wait(0.1);
  19. }
  20. return 0;
  21. }

动态时钟

Goc挑战赛集训 - 图21

  1. int main()
  2. { // 秒针长度:220 , 红色,每秒跳动一次
  3. p.hide().textU(0).speed(10);
  4. while(1){
  5. p.oo(300,5).size(20).o(310,0);
  6. p.up();
  7. for(int i=1;i<=12;i++) {
  8. p.rt(360.0/12);
  9. p.fd(250).text(i,0,60).bk(250);
  10. }
  11. p.moveTo(150,0).rr(60,60,0).rr(50,50,15);
  12. p.text(getDay(),0,30);
  13. p.moveTo(0,0).down().c(7);
  14. // 分针
  15. p.setAngle(360.0 / 60 * getMinute());
  16. p.size(8).fd(200).bk(200);
  17. // 时针
  18. p.setAngle(360.0 / 12 * getHour() + 30.0 / 60 * getMinute());
  19. p.size(12).fd(150).bk(150);
  20. // 秒针
  21. p.setAngle(360.0 / 60 * getSecond());
  22. p.c(1).size(8).fd(220).bk(250).fd(30).oo(10);
  23. wait(0.01);
  24. p.cls(); // 如果使用clsRec() 画表盘时要恢复为 0 度向上方向
  25. }
  26. return 0;
  27. }

旋转类图形

picU(1/0), 放图形跟随画笔旋转

Goc挑战赛集训 - 图22

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

Goc挑战赛集训 - 图23

  1. // 画三个正方形叠加
  2. int main()
  3. {
  4. p.picU(0).c(1);
  5. p.r(100,100);
  6. p.rt(60).r(100,100);
  7. p.rt(60).r(100,100);
  8. p.hide();
  9. return 0;
  10. }

Goc挑战赛集训 - 图24

  1. int main()
  2. {
  3. p.up().picU(0).hide();
  4. for(int i = 0; i < 4; i ++){
  5. p.r(200,30,11).rt(90).fd(100);
  6. }
  7. }

Goc挑战赛集训 - 图25 方法一:

  1. int main()
  2. {
  3. p.up();
  4. p.ee(100,50,1);
  5. p.ee(50,100,1);
  6. p.oo(50,5);
  7. return 0;
  8. }

方法二: picU()

  1. int main()
  2. {
  3. p.up();
  4. p.picU(0); // 设置图片方向
  5. p.ee(100,50,1);
  6. p.rt(90);
  7. p.ee(100,50,1);
  8. p.oo(50,5);
  9. return 0;
  10. }

中心放射类图形

Goc挑战赛集训 - 图26

  1. int main()
  2. {
  3. for(int i= 0;i < 10;i++){
  4. p.c(i%10).fd(100).oo(20).bk(100).rt(360/10);
  5. }
  6. return 0;
  7. }

Goc挑战赛集训 - 图27

  1. int main()
  2. {
  3. p.up();
  4. for(int i = 1; i <= 12;i++){
  5. p.rt(360/12).fd(100).o(20).text(i).bk(100);
  6. }
  7. return 0;
  8. }

动画类

Goc挑战赛集训 - 图28

  1. int main()
  2. {
  3. p.hide();
  4. for(int i= 20; i> 0; i--){
  5. p.cls().ee(85,120,10).e(85,120,13);
  6. p.textSize(90).text(i,5);
  7. wait(1);
  8. }
  9. }

Goc挑战赛集训 - 图29 方法一:

  1. int main()
  2. {
  3. p.hide();
  4. p.picU(0);
  5. for(int i = 1; i <= 20;i ++){
  6. p.cls().rt(18*i).ee(30,100,1).oo(10,0);
  7. wait(0.2);
  8. }
  9. }

方法二:

  1. int main()
  2. {
  3. p.hide();
  4. p.picU(0);
  5. for(int i = 1; i <= 20;i ++){
  6. p.clsRec().rt(18).ee(30,100,1).oo(10,0);
  7. wait(0.2);
  8. }
  9. }

说明:clsRec是clearRectangular (清除矩形)的缩写,没有参数的clsRec()表示清整个屏幕,它与cls()不同,pen位置不会坐标回原点。如果picU(1);方向会随笔头。

Goc挑战赛集训 - 图30

  1. int main()
  2. {
  3. p.hide().up().moveTo(-100,100).rt(135);
  4. for(int i = 1; i <= 10;i ++){
  5. p.clsRec().ee(15*i,10*i,14).fd(50);
  6. wait(0.2);
  7. }
  8. }

动画重点

动画类作品两个关键函数:clsRec(w,h) 和wait( )

循环中的变量控制

Goc挑战赛集训 - 图31

  1. int main()
  2. {
  3. for(int i= 5;i <= 150;i=i+5){
  4. p.fd(i).rt(90);
  5. }
  6. return 0;
  7. }

Goc挑战赛集训 - 图32

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

Goc挑战赛集训 - 图33

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

Goc挑战赛集训 - 图34

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