C语言编程模拟下雨by张田浩
- 格式:docx
- 大小:27.62 KB
- 文档页数:9
下雨了编程题以下是一个简单的编程题,要求编写一个程序模拟下雨的过程:1. 创建一个二维数组,表示一个空的场地,例如5x5的二维数组表示一个5行5列的场地;2. 随机选择场地中的一个位置作为起始点,并标记为下雨的位置;3. 在每个时间步长中,下雨的位置会向下移动一格(如果下一格没有超出场地范围);4. 模拟过程直到下雨的位置到达场地的底部;5. 输出模拟过程中场地的状态。
下面是一个Python的实现示例:```pythonimport randomdef simulate_rain(width, height):# 创建场地field = [[' ' for _ in range(width)] for _ in range(height)]# 随机选择起始点start_col = random.randint(0, width - 1)field[0][start_col] = '*'# 模拟下雨过程row = 0while row < height - 1:if start_col > 0 and field[row + 1][start_col - 1] != '*':start_col -=1elif start_col < width - 1 and field[row + 1][start_col + 1] != '*':start_col += 1else:start_col += 0row += 1field[row][start_col] = '*'# 输出场地状态for row in field:print(' '.join(row))# 测试simulate_rain(5, 5)```这个程序会创建一个5x5的场地,并模拟下雨的过程。
每次下雨的位置会向下移动一格,并随机选择左右方向前进。
02、C语⾔--⿊客帝国(数字⾬)数字⾬效果在⿊客帝国电影场景中,曾出现⼤量的数字⾬特效。
在现实的⽣活中,⾬往往给⼈⼀种清新的感觉,⽽⾬后的感觉则是新⽣。
也许,电影中所表达的意思便是对⾃我的启迪乃⾄新⽣的过程。
代码如下所⽰:#include <stdio.h>#include <graphics.h>// 窗⼝的宽和⾼#define WIDTH 960#define HEIGHT 640#define STR_SIZE 25 // 数字⾬数组最⼤存储#define STR_NUM 128 // 数字⾬的串数#define STR_WIDTH 15 // 字符串宽度// ⾬的结构struct Rain {int x;int y;int speed; // 下降速度char str[STR_SIZE]; // 数字⾬数组}rain[STR_NUM];char CreateCh() {char temp = 0;int flag = rand() % 3;if (flag == 0) {temp = rand() % 26 + 'a';} else if (flag == 1) {temp = rand() % 26 + 'A';} else {temp = rand() % 10 + '0';}return temp;}void GameInit() {// 初始化基础数据for (size_t i = 0; i < STR_NUM; i++) {rain[i].x = i * STR_WIDTH;rain[i].y = rand() % HEIGHT;rain[i].speed = (rand() % 5) + 5;}// 初始化字符串for (size_t i = 0; i < STR_NUM; i++) {for (size_t j = 0; j < STR_SIZE; j++) {rain[i].str[j] = CreateCh();if (rain[i].y > HEIGHT) {rain[i].y = 0;}}}}void GameDraw() {cleardevice();for (size_t i = 0; i < STR_NUM; i++) {for (size_t j = 0; j < STR_SIZE; j++) {outtextxy(rain[i].x, rain[i].y - STR_WIDTH * j, rain[i].str[j]);settextcolor(RGB(0, 255 - (13 * j), 0));}}}void GamePlay() {for (size_t i = 0; i < STR_NUM; i++) {rain[i].y += rain[i].speed;if (rain[i].y - STR_SIZE * STR_WIDTH > WIDTH) {rain[i].y = 0;}}}void ChangeCh() {for (size_t i = 0; i < STR_NUM; i++) {rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh(); }}int main() {initgraph(WIDTH, HEIGHT);srand(GetTickCount());DWORD t1, t2;t1 = t2 = GetTickCount();GameInit();while (true) {BeginBatchDraw();GameDraw();ChangeCh();if (t2 - t1 > 20) { // 使游戏下落延时GamePlay();t1 = t2;}t2 = GetTickCount();EndBatchDraw();// Sleep(20); // 使整个程序延时}getchar();closegraph();return 0;}。
c语言流星雨课程设计一、教学目标本课程的目标是让学生掌握C语言的基本语法和编程技巧,能够独立完成简单的C语言程序设计。
具体分为以下三个部分:1.知识目标:使学生了解C语言的基本语法、数据类型、运算符、控制结构、函数等基本概念,理解程序设计的基本原理和方法。
2.技能目标:培养学生具备使用C语言进行程序设计的能力,能够熟练使用C语言编写和调试程序,掌握基本的编程技巧和算法。
3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情,提高学生独立思考和解决问题的能力,培养学生的创新精神和团队合作意识。
二、教学内容教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构、函数等基本概念,以及基本的编程技巧和算法。
具体安排如下:1.第一章:C语言概述,介绍C语言的基本概念、特点和应用领域,学习C语言的编译环境和基本操作。
2.第二章:数据类型和运算符,学习C语言的数据类型、常量和变量,掌握各种运算符的用法和优先级。
3.第三章:控制结构,学习C语言的条件语句、循环语句和跳转语句,掌握程序的控制流程。
4.第四章:函数,学习C语言的函数定义、声明和调用,掌握函数的参数传递和返回值。
5.第五章:编程技巧和算法,学习C语言的常用编程技巧和基本算法,能够独立完成简单的程序设计。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师讲解C语言的基本概念、语法和编程技巧,引导学生掌握课程内容。
2.案例分析法:分析典型的C语言程序案例,让学生了解编程的实际应用,提高学生的编程能力。
3.实验法:上机实验,让学生动手编写和调试C语言程序,培养学生的实际编程能力。
4.讨论法:学生进行小组讨论,分享学习心得和编程经验,提高学生的团队合作意识。
四、教学资源1.教材:《C语言程序设计》,选用国内外知名出版社出版的教材,保证课程内容的科学性和系统性。
2.参考书:推荐学生阅读一些经典的C语言编程书籍,丰富学生的知识体系。
数字雨代码数字雨代码是一种程序设计中常见的视觉效果,其中在屏幕上以流淌的数字雨的形式显示出代码片段。
这种效果常常被用在电影和电视剧中,用来表现黑客入侵、计算机技术等场景。
数字雨代码的显示形式多样,有时呈现为绿色的数字雨,有时则是白色或其他颜色。
代码实现数字雨代码的实现其实并不复杂,主要是通过在屏幕上按行显示字符并让其不断向下移动来模拟流淌的雨滴效果。
在以下简单的代码片段中展示了一个基本的数字雨代码:import osimport randomimport timeWIDTH, HEIGHT = os.get_terminal_size()speed =0.1drops = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c ', 'd', 'e', 'f', ' ', '\']def digital_rain():columns = []for _ in range(WIDTH):columns.append('')while True:for i in range(WIDTH):if random.random() >0.90or len(columns[i]) > HEIGHT:columns[i] = columns[i][:-1]columns[i] = drops[random.randint(0, len(drops)-1)] + colum ns[i]os.system('cls'if =='nt'else'clear')for line in columns:print(line)time.sleep(speed)digital_rain()这段代码用Python语言实现了一个简单的数字雨效果,每次按行生成随机字符并向下滚动,模拟出数字雨的效果。
win10系统怎么利⽤cmd命令制作数字⾬⼩程序?cmd命令制作的数字⾬,可以不断刷新数字,科技感⼗⾜。
该怎么制作这个效果呢?今天我们就来看看在win10系统下实现这个功能的教程。
1、新建⼀个空⽩TXT⽂本⽂档,双击打开。
2、输⼊以下代码:@echo offcolor 0a:startecho 1 2 3 4 5 g 5 6 7 g t 2 1 3 4 5 6 7 4 3 2 3 5 5 6 7 8 1 2 3 4 5 6 7 8 9 g 3 5 7ping localhost -n 1 > nullecho 1 4 5 6 7 8 9 4 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 1 3 4 5 6 7ping localhost -n 1 > nullecho 0 9 8 7 g 6 5 6 7 8 6 7 8 6 5 4 5 6 5 6 7 8 9 0 6 5 4 3 2 1 3 5 6 7 8 9 0 8 9 3ping localhost -n 1 > nullecho 1 2 3 4 5 g 5 6 7 g t 2 1 3 4 5 6 7 4 3 2 3 5 5 6 7 5 6 7 8 4 3 2 1 2 3 4 5 6 7ping localhost -n 1 > nullgoto start3、按下Ctrl+S,保存⽂档后关闭。
4、选中⽂档,按下F2重命名⽂档,将TXT后缀,修改为BAT。
5、双击运⾏修改完毕的BAT⽂件。
6、系统弹出CMD命令窗⼝,在窗⼝中,会不停出现数字⾬。
总结:1、新建空⽩⽂本⽂档,在⽂档中输⼊数字⾬命令代码。
2、按下Ctrl+S,保存⽂档,关闭⽂本⽂档。
3、选中⽂本⽂档,按下F2重命名,将⽂件后缀修改为BAT。
4、运⾏BAT⽂件,数字⾬效果出现。
以上就是cmd命令制作数字⾬⼩程序的教程,希望⼤家喜欢,请继续关注。
C语⾔实现数字⾬效果本⽂实例为⼤家分享了C语⾔实现数字⾬效果展⽰的具体代码,供⼤家参考,具体内容如下#include <windows.h>#include <windowsx.h>#define ID_TIMER 1#define STRMAXLEN 25 //⼀个显⽰列的最⼤长度#define STRMINLEN 8 //⼀个显⽰列的最⼩长度LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////typedef struct tagCharChain //整个当作屏幕的⼀个显⽰列,这是个双向列表{struct tagCharChain *prev; //链表的前个元素TCHAR ch; //⼀个显⽰列中的⼀个字符struct tagCharChain *next; //链表的后个元素}CharChain, *pCharChain;typedef struct tagCharColumn{CharChain *head, *current, *point;int x, y, iStrLen; //显⽰列的开始显⽰的x,y坐标,iStrLen是这个列的长度int iStopTimes, iMustStopTimes; //已经停滞的次数和必须停滞的次数,必须停滞的次数是随机的}CharColumn, *pCharColumn;int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("matrix") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ; // class stylewndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if(!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("此程序必须运⾏在NT下!"), szAppName, MB_ICONERROR) ;return 0;}hwnd = CreateWindow (szAppName, NULL,WS_DLGFRAME | WS_THICKFRAME | WS_POPUP, // windows style0, 0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),NULL, NULL, hInstance,NULL) ;ShowWindow (hwnd, SW_SHOWMAXIMIZED) ; //最⼤化显⽰ show windowsUpdateWindow (hwnd) ;ShowCursor(FALSE); //隐藏⿏标光标srand ((int) GetCurrentTime ()) ; //初始化随机数发⽣器while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}ShowCursor(TRUE); //显⽰⿏标光标return msg.wParam ;}TCHAR randomChar() //随机字符产⽣函数{return (TCHAR)(rand()%(126-33)+33); //33到126之间}int init(CharColumn *cc, int cyScreen, int x) //初始化{int j;cc->iStrLen = rand()%(STRMAXLEN-STRMINLEN) + STRMINLEN; //显⽰列的长度cc->x = x+3 ; //显⽰列的开始显⽰的x坐标cc->y =rand()%3?rand()%cyScreen:0; //显⽰列的开始显⽰的y坐标cc->iMustStopTimes = rand()%6 ;cc->iStopTimes = 0 ;cc->head = cc->current =(pCharChain)calloc(cc->iStrLen, sizeof(CharChain)); //⽣成显⽰列for(j=0; j<cc->iStrLen-1; j++){cc->current->prev = cc->point; //cc->point⼀个显⽰列的前个元素cc->current->ch = '\0';cc->current->next = cc->current+1; //cc->current+1⼀个显⽰列的后个元素cc->point = cc->current++; //cc->point = cc->current; cc->current++;}cc->current->prev = cc->point; //最后⼀个节点cc->current->ch = '\0';cc->current->next = cc->head;cc->head->prev = cc->current; //头节点的前⼀个为此链的最后⼀个元素cc->current = cc->point = cc->head; //free掉申请的内存要⽤current当参数cc->head->ch = randomChar(); // 对链表头的元素填充return 0;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {HDC hdc ;//ctn ⽤来确定⼀个显⽰链是否向下前进,如果等待次数超过必须等待的次数,ctn就代表要向下前进int i, j, temp, ctn; //j为⼀个显⽰链中除链表头外的在屏幕上显⽰的y坐标,temp绿⾊过度到⿊⾊之⽤static HDC hdcMem;HFONT hFont;static HBITMAP hBitmap;static int cxScreen, cyScreen; //屏幕的宽度⾼度.static int iFontWidth=10, iFontHeight=15, iColumnCount; //字体的宽度⾼度, 列数static CharColumn *ccChain;switch (message){case WM_CREATE:cxScreen = GetSystemMetrics(SM_CXSCREEN) ; //屏幕宽度cyScreen = GetSystemMetrics(SM_CYSCREEN) ;SetTimer (hwnd, ID_TIMER, 10, NULL) ;hdc = GetDC(hwnd);hdcMem = CreateCompatibleDC(hdc);hBitmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen);SelectObject(hdcMem, hBitmap);ReleaseDC(hwnd, hdc);//创建字体hFont = CreateFont(iFontHeight, iFontWidth-5, 0, 0, FW_BOLD, 0, 0, 0,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DRAFT_QUALITY, FIXED_PITCH | FF_SWISS, TEXT("Fixedsys"));SelectObject(hdcMem, hFont);DeleteObject (hFont) ;SetBkMode(hdcMem, TRANSPARENT); //设置背景模式为透明iColumnCount = cxScreen/(iFontWidth*3/2); //屏幕所显⽰字母⾬的列数ccChain = (pCharColumn)calloc(iColumnCount, sizeof(CharColumn));for(i=0; i<iColumnCount; i++){init(ccChain+i, cyScreen, (iFontWidth*3/2)*i);}return 0 ;case WM_TIMER:hdc = GetDC(hwnd);PatBlt (hdcMem, 0, 0, cxScreen, cyScreen, BLACKNESS) ; //将内存设备映像刷成⿊⾊for(i=0; i<iColumnCount; i++){ctn = (ccChain+i)->iStopTimes++ > (ccChain+i)->iMustStopTimes;//(ccChain+i)->point = (ccChain+i)->head; //point⽤于遍历整个显⽰列//第⼀个字符显⽰为⽩⾊SetTextColor(hdcMem, RGB(255, 255, 255));TextOut(hdcMem, (ccChain+i)->x, (ccChain+i)->y, &((ccChain+i)->point->ch), 1);j = (ccChain+i)->y;(ccChain+i)->point = (ccChain+i)->point->next;//遍历整个显⽰列,将这个显⽰列⾥的字符从下往上显⽰temp = 0 ; //temp绿⾊过度到⿊⾊之⽤while((ccChain+i)->point != (ccChain+i)->head && (ccChain+i)->point->ch){SetTextColor(hdcMem, RGB(0, 255-(255*(temp++)/(ccChain+i)->iStrLen), 0));TextOut(hdcMem, (ccChain+i)->x, j-=iFontHeight, &((ccChain+i)->point->ch), 1);(ccChain+i)->point = (ccChain+i)->point->next;}if(ctn)(ccChain+i)->iStopTimes = 0 ;else continue;(ccChain+i)->y += iFontHeight; //下次开始显⽰的y坐标为当前的y坐标加上⼀个字符的⾼度//如果开始显⽰的y坐标减去整个显⽰列的长度超过了屏幕的⾼度if( (ccChain+i)->y-(ccChain+i)->iStrLen*iFontHeight > cyScreen){free( (ccChain+i)->current );init(ccChain+i, cyScreen, (iFontWidth*3/2)*i);}//链表的头为此链表的前个元素,因为下次开始显⽰的时候就相当与在整个显⽰列的开头添加个元素,然后在开始往上显⽰ (ccChain+i)->head = (ccChain+i)->head->prev;(ccChain+i)->head->ch = randomChar();}BitBlt(hdc, 0, 0, cxScreen, cyScreen, hdcMem, 0, 0, SRCCOPY);ReleaseDC(hwnd, hdc);return 0;case WM_RBUTTONDOWN:KillTimer (hwnd, ID_TIMER) ;return 0;case WM_RBUTTONUP:SetTimer (hwnd, ID_TIMER, 10, NULL) ;return 0;//处理善后⼯作case WM_KEYDOWN:case WM_LBUTTONDOWN:case WM_DESTROY:KillTimer (hwnd, ID_TIMER) ;DeleteObject(hBitmap);DeleteDC(hdcMem);for(i=0; i<iColumnCount; i++){free( (ccChain+i)->current );}free(ccChain);PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
实验名称:下雨报警器实验目的:设计并制作一个下雨报警器,实现对雨水的实时监测和报警。
实验器材:1. 传感器:土壤湿度传感器、温度传感器、湿度传感器2. 控制器:Arduino开发板3. 执行器:蜂鸣器4. 连接线、电源、电阻等辅助材料实验步骤:一、传感器连接1. 将土壤湿度传感器、温度传感器、湿度传感器分别连接到Arduino开发板的A0、A1、A2引脚。
2. 将蜂鸣器连接到Arduino开发板的D7引脚。
二、编程1. 在Arduino IDE中编写程序,实现以下功能:a. 读取传感器数据;b. 判断是否下雨;c. 如果下雨,则蜂鸣器发出报警声。
2. 程序如下:```cppconst int soilMoisturePin = A0; // 土壤湿度传感器连接到A0引脚const int tempPin = A1; // 温度传感器连接到A1引脚const int humidityPin = A2; // 湿度传感器连接到A2引脚const int buzzerPin = D7; // 蜂鸣器连接到D7引脚void setup() {pinMode(buzzerPin, OUTPUT); // 设置蜂鸣器引脚为输出模式Serial.begin(9600); // 初始化串口通信}void loop() {int soilMoisture = analogRead(soilMoisturePin); // 读取土壤湿度传感器数据int temp = analogRead(tempPin); // 读取温度传感器数据int humidity = analogRead(humidityPin); // 读取湿度传感器数据// 判断是否下雨if (soilMoisture < 500 && humidity < 500) {digitalWrite(buzzerPin, HIGH); // 开启蜂鸣器报警Serial.println("下雨报警!");} else {digitalWrite(buzzerPin, LOW); // 关闭蜂鸣器报警Serial.println("无雨!");}delay(1000); // 延时1秒}```三、实验结果与分析1. 实验结果:当土壤湿度传感器和湿度传感器同时低于500时,蜂鸣器发出报警声,提示用户下雨。
程序设计实习报告题目:模拟下雨学院:计算机与通信工程学院专业:计算机科学与技术班级:计算1402姓名:张田浩学号:1407010220一、需求分析1、本程序要求模拟下雨过程,要有雨点落下并有雨点落地时的水圈效果2、雨滴在屏幕出现的位置是随机的,雨圈的位置要和雨线对应,并且雨圈的大小要是随机的来增强效果3、雨要一直下,不受程序员控制二、总体设计1.利用easyx把TC下的"graphics.h"函数导入到了VC6.0中来实现绘图功能,并且调用”initgraphics”函数初始化图形模式600*480 ,2.雨滴和雨圈可以看作两个结构体,而且雨圈的结构体可以嵌套咋雨滴的结构体中3.程序主要分为五大模块(1)主函数void main( )(2)雨点产生模块struct drop *creatDrop(void),void recreatDrop(struct drop *p),void creatRain(void)(3)雨点下落模块void updateRainLineData(struct rainDrop *p),void drawRainLine(structrainDrop *p),void clearRainLine(struct rainDrop *p),voidrainDropDown(struct rainDrop *p)(4)水纹生成模块void updateRainCircleData(struct rainDrop *p),void drawRainCircle(structrainDrop *p),void clearRainCircle(struct rainDrop *p)(5)控制模块void rain(void),void clearAll(void)我的任务:负责雨点产生和下落模块及最后的调试,编写实习报告。
三、详细设计1.雨圈的结构体struct rainCircle 雨点落下造成的水圈{int x; 雨圈的圆心坐标int y;int r; 水圈的半径int curR; 中间过程水圈的半径int rainCircleStep; 水圈每次扩张的增量};2.雨线的结构体struct rainDrop{int startX; 雨点开始的X值int startY; 雨点开始的Y值int endY; 雨点结束的Y值int curX; 雨点降落中的X值int curY; 雨点降落中的Y值int rainLineStep; 雨线每次的增量int rainLineLength; 雨线的长度int status; 表示下落过程是否完成struct rainCircle water; 嵌套的雨圈结构体struct rainDrop *next; 用于创建动态链表的指针};3.动态链表的创建和释放struct rainDrop *head;struct rainDrop *p1,*p2;int i;p1=p2=creatDrop();head=p1;for(i=0;i<n;i++){p2=creatDrop();p1->next=p2;p1=p2;}在creatDrop函数中用malloc()动态分配内存4.雨线和雨圈的绘制与清除Setcolor()设定颜色,line()画线。
烟花雨代码c语言对于C语言初学者来说,烟花雨可能是一个比较有趣的项目。
下面是一个简单的烟花雨代码:```#include <stdio.h>#include <graphics.h>#include <conio.h>#include <time.h>#include <stdlib.h>int main(){int gd = DETECT, gm, i, j, c, r, x, y, k;initgraph(&gd, &gm, '');while(!kbhit()){srand(time(NULL));c = rand()%15 + 1; // 随机颜色r = rand()%150 + 50; // 随机半径x = rand()%620 + 50; // 随机横坐标y = rand()%380 + 50; // 随机纵坐标setcolor(c);circle(x, y, r);for(i=0; i<20; i++){k = rand()%20 + 1; // 随机距离setcolor(BLACK);circle(x, y, r+i);for(j=1; j<=k; j++){setcolor(c);circle(x, y, r+i);}}setcolor(BLACK);circle(x, y, r+i);}closegraph();return 0;}```这个程序使用了graphics.h和conio.h库,因此你需要在编译器中设置这些库的路径。
如果你使用的是Dev-C++编译器,可以通过在“Tools”菜单下选择“Compiler Options”并在“Directories”选项卡下添加库的路径来实现。
这个程序使用了一个无限循环,在每次循环中,程序会随机生成一个颜色、半径、横坐标和纵坐标,然后在屏幕上画一个圆形。
程序设计实习报告题目:模拟下雨学院:计算机与通信工程学院专业:计算机科学与技术班级:计算1402姓名:***学号:**********一、需求分析1、本程序要求模拟下雨过程,要有雨点落下并有雨点落地时的水圈效果2、雨滴在屏幕出现的位置是随机的,雨圈的位置要和雨线对应,并且雨圈的大小要是随机的来增强效果3、雨要一直下,不受程序员控制二、总体设计1.利用easyx把TC下的"graphics.h"函数导入到了VC6.0中来实现绘图功能,并且调用”initgraphics”函数初始化图形模式600*480 ,2.雨滴和雨圈可以看作两个结构体,而且雨圈的结构体可以嵌套咋雨滴的结构体中3.程序主要分为五大模块(1)主函数void main( )(2)雨点产生模块struct drop *creatDrop(void),void recreatDrop(struct drop *p),void creatRain(void)(3)雨点下落模块void updateRainLineData(struct rainDrop *p),void drawRainLine(structrainDrop *p),void clearRainLine(struct rainDrop *p),voidrainDropDown(struct rainDrop *p)(4)水纹生成模块void updateRainCircleData(struct rainDrop *p),void drawRainCircle(structrainDrop *p),void clearRainCircle(struct rainDrop *p)(5)控制模块void rain(void),void clearAll(void)我的任务:负责雨点产生和下落模块及最后的调试,编写实习报告。
三、详细设计1.雨圈的结构体struct rainCircle 雨点落下造成的水圈{int x; 雨圈的圆心坐标int y;int r; 水圈的半径int curR; 中间过程水圈的半径int rainCircleStep; 水圈每次扩张的增量};2.雨线的结构体struct rainDrop{int startX; 雨点开始的X值int startY; 雨点开始的Y值int endY; 雨点结束的Y值int curX; 雨点降落中的X值int curY; 雨点降落中的Y值int rainLineStep; 雨线每次的增量int rainLineLength; 雨线的长度int status; 表示下落过程是否完成struct rainCircle water; 嵌套的雨圈结构体struct rainDrop *next; 用于创建动态链表的指针};3.动态链表的创建和释放struct rainDrop *head;struct rainDrop *p1,*p2;int i;p1=p2=creatDrop();head=p1;for(i=0;i<n;i++){p2=creatDrop();p1->next=p2;p1=p2;}在creatDrop函数中用malloc()动态分配内存4.雨线和雨圈的绘制与清除Setcolor()设定颜色,line()画线。
出现时用白色画,让其消失就在原位置画一条黑线。
5.三个if-else判断的核心函数(1)整个下雨的控制过程rain(){创建rainDrop类的指针p让它指向头指针;While(键盘没有输入){if(p指到表尾) p指向头指针;else{If(status==0) 控制下雨;else 控制形成雨圈;}延时;指针指向指向下一个;}(2)控制下雨rainDropDown(){If(当前的雨线的y坐标大于等于终点坐标){擦除上一条雨线;Status=0;}else{擦除上一条雨线;更新雨线坐标;画新雨线;}}(3)画雨圈思路和画雨线一样6.随机的实现使用”time.h”下的”rand”函数进行随机,对雨点雨圈的初始坐标,雨圈的半径,雨圈的扩张速度,延时时间进行随机。
7.主函数实现过程(1)配置屏幕(2)创建链表(3)模拟下雨过程(4)下雨结束,清除链表8.使用的几个关键库函数initgraphics();kbhit();Sleep();四、编码源代码如下:#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <windows.h>#include <graphics.h>struct rainDrop *head;void initgraphics(void){int gmode,gdriver;gdriver=DETECT;initgraph(&gdriver,&gmode,"");}int n = 100; //雨的数目struct rainCircle //雨点落下造成的水圈{int x;int y;int r;int curR;int rainCircleStep; //水圈的顺序};struct rainDrop{int startX; //雨点开始的X值int startY; //雨点开始的Y值int endY; //雨点结束的Y值int curX; //雨点降落中的X值int curY; //雨点降落中的Y值int rainColor; //雨点的颜色int rainLineStep; //雨线的顺序int rainLineLength; //雨线的长度int status;struct rainCircle water;struct rainDrop *next;};struct rainDrop *creatDrop(void){struct rainDrop *p;p=(struct rainDrop *)malloc(sizeof(struct rainDrop)); //动态分配内存p->startX=rand()%640;p->startY=rand()%430;p->endY=430+rand()%50;p->curX=p->startX;p->curY=p->startY;p->rainLineStep=8;p->rainLineLength=10;p->status=0;p->water.x=p->startX;p->water.y=p->endY;p->water.r=rand()%40;p->water.curR=rand()%2;p->water.rainCircleStep=rand()%2+1;p->next=NULL;return(p);}void recreatDrop(struct rainDrop *p){p->startX=rand()%640;p->startY=rand()%430;p->endY=430+rand()%50;p->curX=p->startX;p->curY=p->startY;p->rainLineStep=8;p->rainLineLength=10;p->status=0;p->water.x=p->startX;p->water.y=p->endY;p->water.r=rand()%40;p->water.curR=rand()%2;p->water.rainCircleStep=rand()%2+1;}void creatRain(void) //创建链表{struct rainDrop *p1,*p2;int i;p1=p2=creatDrop();head=p1;for(i=0;i<n;i++){p2=creatDrop();p1->next=p2;p1=p2;}}void updateRainLineData(struct rainDrop *p) //控制起始雨点的Y值{p->curY+=p->rainLineStep;p->startY=p->curY-p->rainLineLength;}void drawRainLine(struct rainDrop *p) //画雨线{setcolor(WHITE);line(p->startX,p->startY,p->curX,p->curY);}void clearRainLine(struct rainDrop *p) //以黑色表示雨线消失{setcolor(BLACK);line(p->startX,p->startY,p->curX,p->curY);}void updateRainCircleData(struct rainDrop *p) //控制水圈的大小{p->water.curR+=p->water.rainCircleStep;}void drawRainCircle(struct rainDrop *p) //画雨降落后的水圈{setcolor(WHITE);circle(p->water.x,p->water.y,p->water.curR);}void clearRainCircle(struct rainDrop *p) //以黑色表示水圈消失{setcolor(BLACK);circle(p->water.x,p->water.y,p->water.curR);}void rainDropDown(struct rainDrop *p) //控制雨的路径{if(p->curY>=p->endY){clearRainLine(p);p->status=1;}else{clearRainLine(p);updateRainLineData(p);drawRainLine(p);}}void fallToWater(struct rainDrop *p) //控制雨圈雨点的衔接{if(p->water.curR>=p->water.r){clearRainCircle(p);recreatDrop(p);}else{clearRainCircle(p);updateRainCircleData(p);drawRainCircle(p);}}void rain() //控制全程雨的开始到结束{struct rainDrop *p;p=head;while(!kbhit()){if(p==NULL)p=head;else{if(p->status==0)rainDropDown(p);elsefallToWater(p);}Sleep((rand()%2+1)/10.0);p=p->next;}}void clearAll(void) //画图结束,释放空间{struct rainDrop *p,*pf;p=head;while(p!=NULL){pf=p;p=p->next;free(pf);}closegraph();}void main(){initgraphics();creatRain();rain();clearAll();}五.综合测试1、在主程序中添加以下代码:printf("Input rainDrop Number:"); /*输入雨点的数目*/scanf("%d",&n);printf("Input down speed:"); /*输入雨点的速度*/scanf("%d",&v);并定义n,v为全局变量,经过不断调试,最终确定了合适的雨点数目和雨点速度。