题型总结&比赛技巧
绘制正多边形类
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;
}
![](/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;
}
![](/projects/goc/202401/17ab2cbe771a7e70.png)
```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);
}
}