【DINO爱编程】几何_用菱形填充正六边形问题
【数学原理】Tiling a Hexagon with Diamonds
图形程序的下载地址:Tiling a Hexagon with Diamonds.zip
【Python代码】:Tiling a Hexagon with Diamonds(python).zip
1989 年的《美国数学月刊》(American Mathematical Monthly)上有一个貌似非常困难的数学问题:下图是由一个个小三角形组成的正六边形棋盘,现在请你用右边的三种(仅朝向不同的)菱形把整个棋盘全部摆满(图中只摆了其中一部分),证明当你摆满整个棋盘后,你所使用的每种菱形数量一定相同。
文章末尾提供了一个非常帅的“证明”。把每种菱形涂上一种颜色,整个图形瞬间有了立体感,看上去就成了一个个立方体在墙角堆叠起来的样子。三种菱形分别是从左侧、右侧、上方观察整个立体图形能够看到的面,它们的数目显然应该相等。
为了证明这个原理,通过Pascal进行编程生成不同的菱形布置情况,通过不同的颜色展示,你会发现这个二维铺砖问题变成了一个三维模型生成的问题,而这些模型非常像城市规划或建筑师布置塔楼与裙房方案的试算。还有一个特点就是生成的三维模型不存在上部大而下部小的情况,都是稳定的长方体布置。一个从二维问题变成三维布置的“升维”。
生成填满菱形的正六边形的编程关键在于格子的二维化,我采用二维坐标记录这些三角形格子,有纵横坐标,三种不同填充对应三种相邻关系(奇偶行情况不同),如图所示。
这个问题及其鬼斧神工般的“证明”流传甚广,深受数学家们的喜爱。《最迷人的数学趣题——一位数学名家精彩的趣题珍集》(Mathematical Puzzles: A Connoisseur's Collection)一书的封皮上就赫然印着这个经典图形。在数学中,类似的流氓证明数不胜数,不过上面这个可能算是最经典的了。以下附上动画与相关的图案。
【DINO爱编程】几何系列_派生的多边形
【数学原理】derived polygon
图形程序的下载地址:derived_polygon.rar
伐里农的平行四边形是通过连接任意四边形每条边的中点而派生出来的。
这个定理同样可以延伸到其它多边形上。
你可以随意地画出一个不规则的多边形,将这个多边形每条边的中点连在一起,就会派生出一个中点多边形。
让人惊讶的是,如果你继续按照这样的方式去做,那么派生出来的多边形就会变得接近正多边形,它们的每条边在长度上也越来越接近。更让人惊讶的是,同样的多边形按不同的比例去分割每条边(比例为派生derived ratio),最终派生出来的多边形也是相似的。
我举个例子,左图是一个很像三角形的四边形,经过几次迭代以后就可以得到红色的平行四边形
右图是一个各边长度相差很大的六边形,经过几次迭代后就变成了一个斜切的六边形
为了测试这个东西,我编写了一个图形小程序用来验证并绘图,界面如图所示。
大家可以绘制不同的多边形去测试,图右是一个计算各边线长度的统计,可以看出是否两两边是相等的。
如上图,经过20次迭代后,各边长度相差很少是一个正多边形了。
derived polygon 派生的多边形 其实就是一个斜切的多边形
以六边形为例,两对边是相等的六边形。四边形就是平行四边形。
其中 Node Number是多边形的节点数,Iteration是迭代数量, derived ratio的新点在线上的比例。
最后,这个现象有没有数学高手可以给出一个漂亮的证明,证明出为什么会出现这个现象呢。
【DINO爱编程】编写一个FlappyBird的游戏
【编程工具】采用delphi进行编程
【资源网站】https://opengameart.org/
【游戏介绍】https://en.wikipedia.org/wiki/Flappy_Bird
游戏的设计理念
1. FlappyBird 是一只小鸟,要通过飞行穿过一系列的水管
2.点击屏幕或点空格键,小鸟向小飞一下
3.穿过一个水管得一分。如果撞到水管就会GameOver
【技术要点】
(1) 声音的播放方式。
procedure PlaySoundFile(FileName: string);
begin
if FileExists(FileName)
then PlaySound(pchar(FileName), 0, SND_ASYNC or SND_FILENAME);
{ Flags are:
SND_SYNC =0 = Start playing, and wait for the sound to finish
SND_ASYNC =1 = Start playing, and don't wait to return
SND_LOOP =8 = Keep looping the sound until another sound is played }
end;
2. 对象之间的碰撞的分析与判断,如下图所示
if (((bird.x+20>pile[i].x)and(bird.x+20<pile[i].x+pile[i].w))
or ((bird.x-20>pile[i].x)and(bird.x-20<pile[i].x+pile[i].w)))
and (((bird.y-15>0) and (bird.y-15<pile[i].up))
or ((bird.y+15>pile[i].down-15) and (bird.y+15<image1.height)) ) then
begin
collision:=true;
end;
3.按空格键对游戏的响应。
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key=#32 THEN
begin
end;
end;
【FlappyBird的源代码】点击下载此文件:FlappyBirdexe.zip
【FlappyBird游戏的EXE文件】点击下载此文件:FlappyBird.zip
delphi 常用按键对照表
【DINO爱编程】编写一个扫雷 Mine Sweeper 小游戏
【编程工具】采用delphi进行编程
游戏原理:(应该很多人会玩的,不用太多的介绍)
(1)点击鼠标左键扫描,如果碰到雷,全部雷爆炸,GAME OVER
(2)如果没有碰到雷,显示数字,数字代表9个格子内的炸弹数量
(3)可以标旗子,代表雷的位置,把全部雷标出就可以完成任务
【技术要点】
(1)BRCC32的方法,把文件放入程序的资源区
具体的方法如下:
创建一个MYRC.RC的文本文件,写下一段代码后,运行BRCC32.EXE就可以了
BMP1 Bitmap bmp1.bmp
BMP2 Bitmap bmp2.bmp
BMP3 Bitmap bmp3.bmp
WAV1 Wave k1.wav
WAV2 Wave k2.wav
WAV3 Wave k3.wav
(2)通过读取资源文件得到图片BITMAP与声音音效的文件
具体的方法如下(播放音效与LOAD入图片):
BMP1.LoadFromResourceName(HInstance,'BMP1');
PlaySound('WAV1', 0, SND_RESOURCE);
(3)在开发游戏的过程中,应用到FloodFill的功能(图形学)
代码如下,也就是区域填充的功能,用到一点点的递归
PROCEDURE TFORM1.FILL(I,J:INTEGER);
BEGIN
IF (I<>0) AND (I<>SIZE+1) AND (J<>0) AND (J<>SIZE+1) THEN
BEGIN
IF (GRID[I,J].BOMB=0) AND (GRID[I,J].COVER=0)
AND (GRID[I,J].NUMBER<2) THEN
BEGIN
GRID[I,J].COVER:=1;
FILL(I,J+1);
FILL(I,J-1);
FILL(I+1,J);
FILL(I-1,J);
END;
IF (GRID[I,J].NUMBER>=2) THEN
BEGIN
GRID[I,J].COVER:=1;
END;
END;
END;
【小游戏的源代码】点击下载此文件:source code.rar
【小游戏的EXE文件】点击下载此文件:mine sweeper.rar
[Dino爱编程]如何绘制Lissajous曲线的动画演示
小程序下载:点击下载此文件: 绘图小程序Lissajous.exe
以上是 Lissajous 曲线的动画。大家看一看,像不像一个网壳结构。
一条数学公式生成一个斜交网格 Lissajous 曲线 ,数学的优雅。
介绍以下一个著名的斜交网格结构,也是出于WSP公司之手 HEARST TOWER
【Dino爱编程】系列有时候会分享一些美妙的数学曲线,有时侯一些数学曲线可以直接展示数学之美,以下的就是一个最好的例子,之前讲过乘法圆曲线(这里是链接:http://dinochen.com/article.asp?id=277)。以上编程的灵感来源于国内一个数学知名博主的博客 matrix67.com, 这里面有丰富的数学内容,大家有兴趣可以去逛逛。
Lissajous曲线,双叫做示波器曲线,可以通过示波器进行生成的。如下图所示。
曲线上点坐标 px py,它的参数方程 x = sin(m · t), y = sin(n · t) ,其中,m与n是定量参数。
通过随着 t 值 的增加,平面上将会画出一系列漂亮的曲线。法国物理学家 Jules Antoine Lissajous
曾在 1857 年研究过这类曲线,因此人们把它叫做 Lissajous 曲线。
matrix67.com在他的博客上绘制了曲线, http://www.matrix67.com/blog/archives/6947
那么参考matrix67的方法,我通过lazarus编程绘制现 m = 13, n = 18 时的 Lissajous 曲线
动画如下图所示。程序界面如下图所示。
以下是主要的源代码:由于曲线需要动画显示,所以采用了 timer功能。
procedure TForm1.tmr1Timer(Sender: TObject);
var di:double;
begin
di:=200;
px:=di*sin(m*tt);
py:=di*sin(n*tt);
form1.draw_image;
tt:=tt+dt;
end;
procedure tform1.draw_image;
begin
img1.Canvas.Pen.Color:=RGB(51,155,223);
img1.Canvas.Pen.Width:=2;
ax:=Round(img1.Width/2+px);
ay:=Round(img1.Height/2-py);
img1.Canvas.Pen.Mode:=pmNot;
img1.Canvas.Ellipse(oldx-5,oldy-5,oldx+5,oldy+5);
if (oldx<>0) and (oldy<>0) then
begin
img1.Canvas.Pen.Mode:=pmcopy;
img1.Canvas.MoveTo(oldx,oldy);
img1.Canvas.LineTo(ax,ay);
end;
img1.Canvas.Pen.Mode:=pmNot;
img1.Canvas.Ellipse(ax-5,ay-5,ax+5,ay+5);
oldx:=ax;
oldy:=ay;
end;
以上代码非常有用,有一张动态曲线的展示,如滞回曲线,振动曲线等一般都是这么编程显示出来的。
以上是【Dino爱编程】的纯技术分享。
[Dino爱编程]如何生成一个纯文本的二维码
小程序下载:点击下载此文件: QR-CODE TO ASCII .EXE
以前的学习论坛(特别是编程的学习网站)基本上是都是基于纯文字(ASCII)的讨论,不能贴图片,更不能贴视频,连超链接也是不允许的,这些东西以前叫多媒体,对于码农来说,纯文字的交流的论坛现在还是非常重要的(黑客与破解论坛),纯文字显得更加高大上(你看OPENSEES就明白了)。然后我发现,其实现在我们可以通过一些技术,把内容通过二维码进行网址转导的,图片呀,视频呀。所以我想了一个主意,就是开发一个把图片的二维码转化成纯文字(ASCII)的二维码,这样可以在纯文字的论坛上像雷锋一样留下一段二维码,深藏功与名,让大家扫一下,得到一些意想不到的东西。顺带也介绍一下二维码是通过网页去生成的。
首先,你可以使用现在网上很多的二维码生成在线网站进行二维码的生成。
比如说有这样的网站:草料二维码:https://cli.im/
例子说我把网址可以生成二维码如下图所示。这是一个图片的格式。现在我采用自编小程序把这个图像
的二维码变成纯文字形态的二维码。程序采用 编写,操作如下:
(1)导入图片文件【OPEN IMAGE FILE】
(2)确定格子的数量,不同的容错率与信息的大小会影响这个二维码区格的大小,通过红线测试就可以知道区格的数量了
以本例来说,区格最终确定的尺雨是29X29
(3)程序的原理就是读取每个区格(红色)的中心点的颜色,如果颜色是黑色,则区格的值为1否则为0.
通过上述操作,整个区格的数据就变成一个01矩阵的数据,然后通过文本的形式显示出来
(4)文本生成:通过行列式的文本显示整个二维码,采用“一”代表0,采用“国”代表1,最终的显示如图所示。
这个小程序的编写,主要介绍一下从图片数据变成矩阵数据,最后变成文本数据的方法。
【DINO爱编程】六边形手表问题编程搞定
【腾讯视频】https://v.qq.com/x/page/c0812be3ri7.html
节选于《500个逻辑游戏》书上170页
问题的描述:
要解决这个令人难以置信的法拉比奥手表比赛,你要做的就是将六边形手表面上从1到12
这几个数字重新排列,使每个边上的3个数字相加的结果等于22。如果解答出来的人不止
一个,那么法拉比奥史弟将宣布“结束营业大减价”
【求解程序的源代码】点击下载此文件:Watch_problem.rar

【小记】懂编程的人一定知道数学其实是很美的,数学就是一门艺术,自然的艺术,特别是图形学与可视化就可以表述出来。
以九九乘法表为例,是很枯燥的,但是一但把乘法用圆与直线表述出来,就可以形成美丽的自然图案。




以下是视频教程:

【STEM】DINOMAKER创客教程 之 【创意编程系列】是用来分享编程的乐趣,也是成为创客必备的技能。
以下是编程得到的乘法圆的动态图
主要的源代码
=====================================================================
PROCEDURE TFORM1.DRAW_LINES;
VAR DIV1:INTEGER;
NUM2:INTEGER;
AX,AY:INTEGER;
BX,BY:INTEGER;
CX,CY:INTEGER;
I:INTEGER;
R:INTEGER;
BEGIN
CX:=IMAGE1.Width DIV 2;
CY:=IMAGE1.Height DIV 2;
R:=180;
DIV1:=STRTOINT(EDIT1.Text);
NUM2:=STRTOINT(EDIT2.Text);
IMAGE1.Canvas.Pen.Color:=CLWHITE;
IMAGE1.Canvas.Brush.Color:=CLWHITE;
FOR I:=0 TO DIV1 DO
BEGIN
AX:=ROUND(CX+R*COS(DEGTORAD(360/DIV1*I)));
AY:=ROUND(CY+R*SIN(DEGTORAD(360/DIV1*I)));
BX:=ROUND(CX+R*COS(DEGTORAD(360/DIV1*I*NUM2)));
BY:=ROUND(CY+R*SIN(DEGTORAD(360/DIV1*I*NUM2)));
//
IMAGE1.Canvas.MoveTo(AX,AY);
IMAGE1.Canvas.LineTo(BX,BY);
END;
END;
=====================================================================



=================================================================

这是2018年2月第一周的每周挑战,现在才把它整理出来,本集挑战的内容是游戏编程,本章内容非常适用于小学生的STEAM教学,主要讲述一个风迷全球的小游戏是怎么编的。这个游戏就是内置于NOKIA手机的贪吃蛇小游戏。

本次游戏编程只讲述最简单的原理,没有用到优化的算法,速度有点慢。
编程所采用的编程语言还是采用DELPHI,大家可以根据原理采用其它语言如C#进行编制。
那么我们就开始吧。



第一步,设计程序界面,如下图所示:

界面的介绍:
(1)中间区是绘图区,实时绘制蛇SNAKE与苹果的位置
(2)右边有两个钟,一个用来实时显示画面,一个用来实时判断蛇的状态,行走,吃东西,撞尾等。
(3)菜单只有一个功能,开始游戏与重新开始游戏
(4)分数显示的LABEL用来实时显示分数
(5)如果游戏结束GAME OVER的label会显示出来
就是这么简单。
第二步:指定贪吃蛇与苹果的变量
TYPE TSNAKE=RECORD
PX,PY:INTEGER;
SX,SY:INTEGER;
DIR:INTEGER;
END;
这么简单的游戏采用TYPE RECORD就可以了。PX,PY是蛇的坐标,而SX,SY可以理解成向X方向与Y方向行走的速度。
DIR就行走的方向,也就是上下左右。这个记录RECORD是很简单的。
蛇要吃的苹果,也就是不断换位置出现的点,它的变量可以设计成如下:
TYPE TFOOD=RECORD
PX,PY:INTEGER;
END;
PX,PY代表苹果的坐标
第二步:设计全局变量
var
Form1: TForm1;
SNAKE:TSNAKE; // 代表蛇头
SCL:INTEGER; // 每一个格子的w像素寸
FOOD:TFOOD; // 代表苹果
TAIL:ARRAY[0..100]OF TSNAKE; //代表蛇的身体,最多蛇可以有100节身子
NTAIL:INTEGER; //身子节的总数量
SCORE:INTEGER; //总得分
第三步:点击上下左右后蛇头的反应设计
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
IF (KEY=VK_LEFT) AND (SNAKE.DIR<>2) THEN
SNAKE.DIR:=1;
IF (KEY=VK_RIGHT) AND (SNAKE.DIR<>1) THEN
SNAKE.DIR:=2;
IF (KEY=VK_UP) AND (SNAKE.DIR<>4) THEN
SNAKE.DIR:=3;
IF (KEY=VK_DOWN) AND (SNAKE.DIR<>3) THEN
SNAKE.DIR:=4;
end;
这一段代码非常好理解了,键盘按下“上”,蛇往上走,但是要注意的是,如果蛇当前就向下走的,按下往“上键 ”,蛇是不能掉头走的。
第四步:最关键的一步,也就是时钟2的进程,每时每刻判断及更新蛇、蛇身与苹果的状态。以下就是全部的代码片:
procedure TForm1.Timer2Timer(Sender: TObject);
VAR I:INTEGER;
CR:BOOL;
begin
CR:=FALSE;
这个变量是判断蛇尾是不是撞到蛇头
FOR I:=1 TO NTAIL-1 DO
BEGIN
IF (TAIL[I].PX=SNAKE.PX) AND (TAIL[I].PY=SNAKE.PY) THEN
BEGIN
CR:=TRUE;
BREAK;
END;
END;
这个代表:如果蛇头的位置与蛇身的任何一个位置相同,代表撞了,CR变成TRUE
IF CR THEN
BEGIN
TIMER2.Enabled:=FALSE;
LABEL3.Visible:=TRUE;
END;
这个代表:CR变成TRUE,代表撞尾了,时钟2停止,GAMEOVER的文字显示出来
FOR I:=NTAIL-1 DOWNTO 1 DO
BEGIN
TAIL[I+1]:=TAIL[I];
END;
这个代表:正常运行时,每个时刻,蛇头前进一步,它的每一格身子的位置等于这个格的前一格的位置,
也就是递推每一格的位置,动态看起来,就好像蛇在移动
TAIL[1].PX:=SNAKE.PX;
TAIL[1].PY:=SNAKE.PY;
这个代表:最后,每一格的蛇身的位置就会等于蛇头的位置
IF SNAKE.DIR=2 THEN
BEGIN
SNAKE.SX:=1;
SNAKE.SY:=0;
END;
IF SNAKE.DIR=1 THEN
BEGIN
SNAKE.SX:=-1;
SNAKE.SY:=0;
END;
IF SNAKE.DIR=4 THEN
BEGIN
SNAKE.SX:=0;
SNAKE.SY:=1;
END;
IF SNAKE.DIR=3 THEN
BEGIN
SNAKE.SX:=0;
SNAKE.SY:=-1;
END;
这个代表:蛇不同的运动方向,蛇两个坐标的运动速度,例如,如果蛇向左运动
它的X方向的速度是(-1),而它的Y方向的速度就是(0)
SNAKE.PX:=SNAKE.PX+SNAKE.SX;
SNAKE.PY:=SNAKE.PY+SNAKE.SY;
这个代表:蛇有了两个方向的速度,更新的蛇头位置就是:新坐标=旧坐标+移动速度
IF SNAKE.PX>20 THEN SNAKE.PX:=0;
IF SNAKE.PY>20 THEN SNAKE.PY:=0;
IF SNAKE.PX<0 THEN SNAKE.PX:=20;
IF SNAKE.PY<0 THEN SNAKE.PY:=20;
这个代表:由于游戏的空间只有20个格子,如果蛇向右走到尽头,就会晚时空隧道一样从最左边出来
这也是原始的SNAKE游戏的设置,当然你也可以设计边界
IF (SNAKE.PX=FOOD.PX) AND (SNAKE.PY=FOOD.PY) THEN
BEGIN
ADD_TAIL;
RANDOMIZE;
FOOD.PX:=ROUND(1+RANDOM*18);
FOOD.PY:=ROUND(1+RANDOM*18);
END;
这个代表:蛇的空间位置与苹果的空间位置重合了,代表吃到苹果,那么蛇就会增加尾巴,同时
苹果会在20X20的空间随机出现。
end;
第五步:时钟一的进程,实时绘制蛇与苹果的情况
(如果上述前四步全部编好了,只有数据在计算,图形没有显示,
编好了这一步,游戏最重要图形就会显示出来)
procedure TForm1.mer(Sender: TObject);
begin
DRAW_BK;
DRAW_SNAKE;
DRAW_FOOD;
LABEL1.Caption:=FORMAT('SCORE = %D',[SCORE]);
end;
这个代表:绘制白色的背景,绘制蛇,绘制苹果,最后更新分数
第六步:绘制运态图形的子过程,如绘制蛇与苹果,代码如下:
PROCEDURE TFORM1.DRAW_SNAKE;
VAR AX,AY:INTEGER;
BX,BY:INTEGER;
I:INTEGER;
BEGIN
AX:=SNAKE.PX*SCL-10;
AY:=SNAKE.PY*SCL-10;
BX:=SNAKE.PX*SCL+10;
BY:=SNAKE.PY*SCL+10;
IMAGE1.Canvas.Brush.Color:=CLRED;
IMAGE1.Canvas.Rectangle(AX,AY,BX,BY);
这个代表:采用矩形绘制出蛇头,颜色为红色
//
FOR I:=1 TO NTAIL DO
BEGIN
AX:=TAIL[I].PX*SCL-10;
AY:=TAIL[I].PY*SCL-10;
BX:=TAIL[I].PX*SCL+10;
BY:=TAIL[I].PY*SCL+10;
IMAGE1.Canvas.Brush.Color:=CLYELLOW;
IMAGE1.Canvas.Rectangle(AX,AY,BX,BY);
END;
这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组
这个代表:采用矩形绘制出蛇头,颜色为红色这个代表:采用矩形绘制出蛇头,颜色为红色END;
PROCEDURE TFORM1.DRAW_FOOD;
VAR AX,AY:INTEGER;
BX,BY:INTEGER;
BEGIN
AX:=FOOD.PX*SCL-10;
AY:=FOOD.PY*SCL-10;
BX:=FOOD.PX*SCL+10;
BY:=FOOD.PY*SCL+10;
IMAGE1.Canvas.Brush.Color:=CLBLUE;
IMAGE1.Canvas.Ellipse(AX,AY,BX,BY);
END;
这个代表:这个太简单了就是绘制苹果,一个圆形的蓝色的苹果。
这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组
这是一个很简单的二维游戏,它总结了大部分简单的二维游戏的编制方法,可以拿来做入门的教材
这也是很多程序常用的东西 (除了游戏的玩法研究以外)
(1)绘制实时动态
(2)不断的判定主角(蛇头)与配角(苹果)的关系
(3)更新主角的情况(生死,分数,尾巴或装备)
(4)随机出现的敌人(本游戏是苹果)
等等(想到再补充)
以下是程序的游戏EXE文件,供大家学习使用。



程序参考内容,原代码与原理,如PDF所示。


以下是我最终编出来的小游戏的EXE文件

2018年给自已小目标,每周独立完成一个项目,可以是设计,可以是编程,可以是做给EMMA的玩具。在这个过程中学习及总结学过的知识点。这些知识点终会回归结构工程的工作当中,我也不知道为什么。
一开始学习编程 (应该是高中时期)主要的目的就是学习开发一些小游戏,那时侯觉得可以当职业的,高中时就开始学C++与Delphi (现在DELPHI 很少人用与很少人学了)。那时侯有一句话“真正的程序员有C++,聪明的程序员用DELPHI”。
这个也就是我学习DELPHI的初心,掌握了50多个写小程序的技巧,其实就可以写一些小型软件了。ETE,ETP,还有更多的结构工程小程序都来源于当初学习了一些DELPHI,然后高考结束后的那一个暑假,我还写了一个井字过三关的小游戏。以前从来没有想过之前学习的DELPHI小编程会对结构工程 的设计工作与研究工作有这么多的帮助。因此,我从来不抗拒学习新东西,比如绘画,三维绘图3DSMAX,动画制作,平面设计,三维打印等。这个小学西的学习好像对我的结构工程 工作帮助不大,但过来这几年发现有巨大的帮助。2018年刚开始,下定一个目标,每周完成一个小项目, 学习及总结东西,看上去与专业挂勾不大的东西,充满了未知数。
以下是2018年第一周的项目挑战,是编程挑战,写一个DELPHI小游戏,战舰BATTLE SHIP小游戏。
这是非常好的参考编程资料

程序参考内容,原代码与原理,如PDF所示。


这是一个经典的美国桌面小游戏。比赛规则如下:

(1)设置你自已的战舰的分布,不给敌方看到,先布置2个单元的小型舰,再布置3个单元的中型舰。
(2)布置后比赛开始,先由用户开始,打击对方上网格上的点(8x8的网格)
(3)由于你不知道对方的战舰的位置,因此打击后只会显示打击位置的状态,HIT代表打中了,SPLASH代表打不中
(4)最终比赛的结果是谁先击中对方最多的舰船,谁就胜出。
以下是我最终编出来的小游戏的EXE文件。

【知识点回顾】
(1)采用PHOTOSHOP进行游戏界观的设计,包括小按钮
(2)采用DELPHI进行整个游戏的编程
(3)在timer计时器,设计简单的人工智能实现人机对打。目前我写的人工智能还是比较笨的。
(4)DELPHI没有加入第三方的绘图,采用原生的CANVAS功能即可实现大部分功能。
(5)人机交互操作优化,这个概念可以用于很多设计软件。
PHOTOSHOP的界面设计

程序开始,按顺序布置2只2个单元的船只,然后布置2只3个单元的船只,按序点击,可横可竖

游戏开始,点击FIGHT,开始后互相黑暗打击,最终谁先全部打击完对方,就胜出了。


【第1步】自行开发简单算法的迷宫生成程序EXE,用于生成迷宫。






这个算法我称为“坦克大战算法”,算法真的好像在做坦克大战。程序界面如下图所示。
可以生成简单的迷宫,也可以生成复杂的迷宫

还有以下的是复杂一点的迷宫(幸好我没有密集恐惧症)

【第2步】由于程序采用delphi开发,可以很好地与AUTOCAD进行交流,因此,马上就可以生
成AUTOCAD文件,用AUTOCAD打开迷宫,如下图所示。

【第3步】接下来就是三维的操作,采用3DSMAX可以进行制作(有点大材小用)。在3DSMAX采用拉伸,
即可生成立面的墙体与底板。完成后如下图所示。

【第4步】最后,生成STL文件,在3D打印机进行3D打印,打印过程如下图所示,没有特别的设置,最重要的就是墙厚不要设太厚

【第5步】最后的成果如下图所示:

[编程]Javascript学习区
最近在看一本书:王树和的《数学演义》,这本书是《好玩的数学》系列的一本,看了以后发现数学其实真的很好玩,看了这本书以后有一种相逢恨晚的感觉。中国的小学、中学直至大学都用应试教育的方法把数学教给学生,乏味枯燥,如小学的奥数,其目的是增加学生学习数学的兴趣,在中国变成了把学生训练成解题机器。《数学演义》中介绍了数学家的一些趣事,包括中国古代的数学故事,在看书的过程中,我通过编程做一些数学试验,体会其中的趣味,这本书值得推荐给觉得数学枯燥的人读一读,非常有启发性。
摘录书中第28回“投针求π数理不凡,随机画弦悖论真刁”
1777年,薄丰提出“投针求π”的方法,开蒙特卡罗与几何概率的先河。今长度为l的匀质细针随机地掷于画了等距平行线族的平面上,相邻两平行线相距为a,a>l,求针与平行线相交的概率是多少。这里所谓随机是指针中心的落点与针方向都是等概率的,中心落点与针方向无关。设x为针中点到平行线的距离,则 。设θ是针与平行线的夹角,则
。由图1知仅当
时,针与平行线相交,即针的中心x与交角组成方位二数组(θ,x)属于图1所示的阴影区,针与平行线相交,于是所求概率
1901年,意大利青年数学家拉泽里尼投针3408次,他用压线的频率代替p,即p=m/3408,求得π=3.141592。以下是我编制的概率数值试验程序,投针1000次,求得π=3.17143。好玩好玩。
有一个多星期这么久没有写博客了,太久了,有点对不起关心该博客的朋友了。最近忙CSA的研究工作所以没多少时间上来。上次跟研一的同学分享课程学习经验的时候,回想起数值分析的课程,现在的数值分析课程好像已经没有布置编程题了,我觉得这样很不妥当,数值分析就是用来编程用的,同理,现在的土木系的研究生教育越来越不重视编程了。以前,电脑还没有普及,很多研究生要写一些结构分析的FORTRAN程序来做论文,现在的研究生很少自编程序来做论文,过分的依赖SAP2000,ANSYS,ABAUQS这些有限元软件了,这样有个不好的地方就是大家似乎重视电脑操作而忽略了有限元的很多原理,同样我国的有限元软件就不会太大的发展了。
数值分析的课程我觉得很重要,对有限元来说,线性方程组求解可用于求静力问题,特征值求解用于求振型,积分与插值用于等参元等等。各个有限元层次都需要数值分析的基础。
我与大家分享一下华南理工大学研一的实验题,并列出我采用Delphi编出来的一些小程序答案,欢迎大家下载!!Download:研究生课程实验题文件
第三题:插值与拟合
1. (龙格现象的发生、防止和插值效果的比较)对区间[-5,5]作等距划分: ,对下列函数y=x/(1+x^4)分别按给定方案进行插值,计算其在各划分小区间中点上的值,并给出插值函数的图形。
方案I: 分别取 作Lagrange插值;
方案II: 分别取 作分段线性插值。
第五题:数值积分
1.文学家要确定一颗小行星绕太阳运行的轨道,他在轨道平面内建立以太阳为原点的直角坐标系,在两坐标轴上取天文测量单位(一天文单位为地球到太阳的平均距离:9300万里)在五个不同的时间对小行星作了五次观察,测得轨道上五个点的坐标数据如下表所示:
P1 P2 P3 P4 P5
x坐标 5.764 6.286 6.759 7.168 7.408
y坐标 0.648 1.202 1.823 2.526 7.408
由开普勒第一定律知,小行星轨道为一椭圆,椭圆的一般方程可表示为:
现需要建立椭圆的方程以供研究。
(1)分别将五个点的数据代入砣圆一般方程中,写出五个待定系数满足的等式,整理后写出线性方程组AX = b。
(2)用MATLAB求低价方程组的指令A / b求出待定系数 。
(3)卫星轨道是一个椭圆,其周长的计算公式是
式中,a是椭圆的半长轴, 是地球中心与轨道中心(椭圆中心)的距离,
。其中h为近地点距离,H为远地点距离,R = 6371(km)为地球半径。
有一颗人造卫星近地点距离h = 439 (km),远地点距离H = 2384(km)。试分别按下列方案计算卫星轨道的周长,误差限取为 。
(方案I ) 复化Simpson法; (方案II ) Romberg算法。
我的解答:
今天师弟给了我一道计算机图形学的题目,是他们计算机辅助设计课程的小作业,今天我用半个小时搞定了它。其实,这个题目有点意思,练习中可以体现出几个考点:自循环算法(简单的分形),可视化编程,AUTOCAD控制,编制dxf文档。我在这题目上加了一个动画控制,通过调整角度值可以看到分形图形的变化。
原题目是:用FORTRAN编写一个程序生成图示图形的DXF文件。要求在运行的过程中提示输入最大正方形的边长,正方形的个数,相邻两正方形的夹角。
最后,我采用的是Delphi来编写,通过时间控件可以实现动画显示,颜色淅变,甚至可控制AUTOCAD出图,但是在算例中我只是让程序输出DXF文件就行了,偷懒一下!!