解决这类问题的思考方法:用循环控制输出行数,分析每行输出的符号个数与循环变量取值的对应关系,在每行还有前导空格个数需要考虑,每行的内容再用一个循环控制,循环次数采用前面总结出的关系公式,最后别忘了每行要输出一个换行。如此,程序设计步骤如下:
-总共输出5行:for ( i=0;i<5;i++ ),变量i的取值为:0,1,2,3,4
-每行星号前面没有前导空格,不处理
-每行输出星号个数:5,4,3,2,1,这个用i来算就是:5-i,for ( j=0;j<5-i;j++ )
那么程序就是:
int i,j;
for ( i=0;i<5;i++ ) //每一次循环实现输出一行
{
for ( j=0;j<5-i,j++ ) //每执行一次循环输出一个星号,循环次数就是星号个数
printf("");
printf("\n");
}
你的第一个问题容易解决。
第二个问题涉及到动画技术,所以比较麻烦,这里没有使用擦除技术,所以看起来就是吞噬者。
procedure TForm1Button1Click(Sender: TObject);
var
x: Integer;
y,a: Double;
ax,r:Integer;
ay,aa:Double;
begin
CanvasPenWidth:=1;
CanvasBrushColor := clBlack;
CanvasMoveTo(0,Trunc((selfClientHeight)/2));
for x := 10 to selfClientWidth-10 do begin
a := (x/selfClientWidth) 2 Pi;
y := Sin(a);
y := 10+(1-y)(selfClientHeight-20)/2;
CanvasLineTo(Trunc(x), Trunc(y));
end;
CanvasBrushColor := clRed;
for x := 10 to selfClientWidth-10 do begin
a := (x/selfClientWidth) 2 Pi;
y := Sin(a);
y := 10+(1-y)(selfClientHeight-20)/2;
CanvasBrushStyle := bsSolid;
r:=50;
SelfCanvasEllipse(Trunc(x)-r,Trunc(y)-r,Trunc(x)+r,Trunc(y)+r);
r:=10;
SelfCanvasEllipse(Trunc(x)-r,Trunc(y)-r,Trunc(x)+r,Trunc(y)+r);
r:=50;
for ax := x to x+r do begin
aa := (ax/selfClientWidth) 2 Pi;
ay := Sin(aa);
ay := 10+(1-ay)(selfClientHeight-20)/2;
CanvasPixels[Trunc(ax),Trunc(ay)]:= clBlack;
end;
Sleep(10);
ApplicationProcessMessages;
end;
end;
C做图形很不好使,效果也次。建议用turbo c , 它有个graphich 头文件 ,声明了很多图形函数,可以直接用,具体用法查资料慢慢看吧。 我给你一个例程吧(用turbo c 编译) :
#include <graphicsh>
#include <stdlibh>
#include <dosh>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define N 200
int i,key;
int score=0;/得分/
int gamespeed=50000;/游戏速度自己调整/
struct Food
{
int x;/食物的横坐标/
int y;/食物的纵坐标/
int yes;/判断是否要出现食物的变量/
}food;/食物的结构体/
struct Snake
{
int x[N];
int y[N];
int node;/蛇的节数/
int direction;/蛇移动方向/
int life;/ 蛇的生命,0活着,1死亡/
}snake;
void Init(void);/图形驱动/
void Close(void);/图形结束/
void DrawK(void);/开始画面/
void GameOver(void);/结束游戏/
void GamePlay(void);/玩游戏具体过程/
void PrScore(void);/输出成绩/
/主函数/
void main(void)
{
Init();/图形驱动/
DrawK();/开始画面/
GamePlay();/玩游戏具体过程/
Close();/图形结束/
}
/图形驱动/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void DrawK(void)
{
/setbkcolor(LIGHTGREEN);/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/设置线型/
for(i=50;i<=600;i+=10)/画围墙/
{
rectangle(i,40,i+10,49); /上边/
rectangle(i,451,i+10,460);/下边/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /左边/
rectangle(601,i,610,i+10);/右边/
}
}
/玩游戏具体过程/
void GamePlay(void)
{
randomize();/随机数发生器/
foodyes=1;/1表示需要出现新食物,0表示已经存在食物/
snakelife=0;/活着/
snakedirection=1;/方向往右/
snakex[0]=100;snakey[0]=100;/蛇头/
snakex[1]=110;snakey[1]=100;
snakenode=2;/节数/
PrScore();/输出得分/
while(1)/可以重复玩游戏,压ESC键结束/
{
while(!kbhit())/在没有按键的情况下,蛇自己移动身体/
{
if(foodyes==1)/需要出现新食物/
{
foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0)/食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到/
foodx++;
while(foody%10!=0)
foody++;
foodyes=0;/画面上有食物了/
}
if(foodyes==0)/画面上有食物了就要显示/
{
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
for(i=snakenode-1;i>0;i--)/蛇的每个环节往前移动,也就是贪吃蛇的关键算法/
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/
switch(snakedirection)
{
case 1:snakex[0]+=10;break;
case 2: snakex[0]-=10;break;
case 3: snakey[0]-=10;break;
case 4: snakey[0]+=10;break;
}
for(i=3;i<snakenode;i++)/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来/
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{
GameOver();/显示失败/
snakelife=1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||
snakey[0]>455)/蛇是否撞到墙壁/
{
GameOver();/本次游戏结束/
snakelife=1; /蛇死/
}
if(snakelife==1)/以上两种判断以后,如果蛇死就跳出内循环,重新开始/
break;
if(snakex[0]==foodx&&snakey[0]==foody)/吃到食物以后/
{
setcolor(0);/把画面上的食物东西去掉/
rectangle(foodx,foody,foodx+10,foody-10);
snakex[snakenode]=-20;snakey[snakenode]=-20;
/新的一节先放在看不见的位置,下次循环就取前一节的位置/
snakenode++;/蛇的身体长一节/
foodyes=1;/画面上需要出现新的食物/
score+=10;
PrScore();/输出新得分/
}
setcolor(4);/画出蛇/
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,
snakey[i]-10);
delay(gamespeed);
setcolor(0);/用黑色去除蛇的的最后一节/
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]-10);
} /endwhile(!kbhit)/
if(snakelife==1)/如果蛇死就跳出循环/
break;
key=bioskey(0);/接收按键/
if(key==ESC)/按ESC键退出/
break;
else
if(key==UP&&snakedirection!=4)
/判断是否往相反的方向移动/
snakedirection=3;
else
if(key==RIGHT&&snakedirection!=2)
snakedirection=1;
else
if(key==LEFT&&snakedirection!=1)
snakedirection=2;
else
if(key==DOWN&&snakedirection!=3)
snakedirection=4;
}/endwhile(1)/
}
/游戏结束/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/输出成绩/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/图形结束/
void Close(void)
{
getch();
closegraph();
}
1 抽象形状类
package com;
//抽象的形状类
public abstract class Shape{
}
2 显示接口
package com;
//接口
public interface IDisplay{
void display(); //显示图形的基本信息
double getArea(); //计算面积
double getGirth(); //计算周长
}
3 三角形类
package comtri;
import com;
//三角形类
public class Triangle extends Shape implements IDisplay{
protected double a;
protected double b;
protected double c;
public Triangle(double a, double b, double c){
thisa = a;
thisb = b;
thisc = c;
}
@Override
public double getArea() {
double s = (a + b + c) / 2;
return Mathsqrt(s(s-a)(s-b)(s-c));
}
@Override
public double getGirth() {
return thisa + thisb + thisc;
}
@Override
public void display() {
Systemoutprintln("三角形");
Systemoutprintln("边长:" + a + ", " + b + ", " + c);
}
}
4 矩形类
package comrec;
import com;
//矩形类
public class Rectangle extends Shape implements IDisplay {
protected double width;
protected double height;
public Rectangle(double width, double height){
thiswidth = width;
thisheight = height;
}
@Override
public double getArea() {
return thiswidth thisheight;
}
@Override
public double getGirth() {
return 2 ( thiswidth + thisheight);
}
@Override
public void display() {
Systemoutprintln("矩形");
Systemoutprintln("宽:" + thiswidth + ", 高:" + thisheight);
}
}
5 圆类
package comcir;
import com;
//圆类
public class Circle extends Shape implements IDisplay {
protected double radius;
public Circle(double radius){
thisradius = radius;
}
@Override
public double getArea() {
return MathPI thisradius thisradius;
}
@Override
public double getGirth() {
return 2 MathPI thisradius;
}
@Override
public void display() {
Systemoutprintln("圆");
Systemoutprintln("半径:" + thisradius);
}
}
6 正多边形类
package commul;
import com;
//正多边形类
public class MulSide extends Shape implements IDisplay {
protected double side; //边长
protected int n; //边数
public MulSide(double side, int n){
thisside = side;
thisn = n;
}
@Override
public double getArea() {
return n side side Mathtan((n-2) MathPI / (2 n)) / 4;
}
@Override
public double getGirth() {
return thisside thisn;
}
@Override
public void display() {
Systemoutprintln("正多边形");
Systemoutprintln("连长:" + thisside + ", 边数:" + thisn);
}
}
7 主类(测试类)
package com;
import javautilScanner;
import comcirCircle;
import commulMulSide;
import comrecRectangle;
import comtriTriangle;
public class Test22 {
public static void main(String[] args) {
Scanner scan = new Scanner(Systemin);
double a, b, c;
double width, height;
double radius;
double side;
int n;
IDisplay s;
Systemoutprintln("请输入三角形的基本信息");
Systemoutprint("边长1:");
a = scannextDouble();
Systemoutprint("边长2:");
b = scannextDouble();
Systemoutprint("边长3:");
c = scannextDouble();
s = new Triangle(a, b, c);
sdisplay();
Systemoutprintln("三角形的面积:" + sgetArea());
Systemoutprintln("三角形的周长:" + sgetGirth());
Systemoutprintln("请输入矩形的基本信息");
Systemoutprint("宽:");
width = scannextDouble();
Systemoutprint("高:");
height = scannextDouble();
s = new Rectangle(width, height);
sdisplay();
Systemoutprintln("矩形的面积:" + sgetArea());
Systemoutprintln("矩的周长:" + sgetGirth());
Systemoutprintln("请输入圆的基本信息");
Systemoutprint("半径:");
radius = scannextDouble();
s = new Circle(radius);
sdisplay();
Systemoutprintln("圆的面积:" + sgetArea());
Systemoutprintln("圆的周长:" + sgetGirth());
Systemoutprintln("请输入正多边形的基本信息");
Systemoutprint("边长:");
side = scannextDouble();
Systemoutprint("边数:");
n = scannextInt();
s = new MulSide(side, n);
sdisplay();
Systemoutprintln("正多边形的面积:" + sgetArea());
Systemoutprintln("正多边形的周长:" + sgetGirth());
}
}
运行测试:
请输入三角形的基本信息
边长1:3
边长2:4
边长3:5
三角形
边长:30, 40, 50
三角形的面积:60
三角形的周长:120
请输入矩形的基本信息
宽:3
高:4
矩形
宽:30, 高:40
矩形的面积:120
矩的周长:140
请输入圆的基本信息
半径:2
圆
半径:20
圆的面积:12566370614359172
圆的周长:12566370614359172
请输入正多边形的基本信息
边长:2
边数:6
正多边形
连长:20, 边数:6
正多边形的面积:1039230484541326
正多边形的周长:120
以上就是关于C语言编写程序输出一下图形(程序用循环实现)全部的内容,包括:C语言编写程序输出一下图形(程序用循环实现)、简单图形程序,用delphi编写、如何用C语言编写有图形动画类的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)