#include "graphics.h"

彭澤網站制作公司哪家好,找創新互聯建站!從網頁設計、網站建設、微信開發、APP開發、響應式網站設計等網站項目制作,到程序開發,運營維護。創新互聯建站于2013年成立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯建站。
#include "stdlib.h"
#include "stdio.h"
#include "fcntl.h"
#include "dos.h"
union REGS r;
struct MOUSE{
int getit;
int x1;
int y1;
int x2;
int y2;
}ms;
void MSB(float,float,float,float,int,int,int,int,int);
void mouse_drop(struct MOUSE *in);
/*定義鼠標拖動的函數,通過鼠標的按下、放開來選定一個矩形區域*/
int data_processor(struct MOUSE m,float *x0,float *x1,float *y0,float *y1);
/*將鼠標選定的區域轉化成MSB集的區域*/
void mouse_IQR(int *num,int *bx,int *cx,int *dx)
{/*調用鼠標的中斷,在這里定義函數讓下面一些函數調用,以減少編程的重復,
在這里,通過int86函數(在dos.h里)調用中斷,鼠標的中斷號為:33h */
r.x.ax=*num;
r.x.bx=*bx;
r.x.cx=*cx;
r.x.dx=*dx;
int86(0x33,r,r);
*bx=r.x.bx;
*cx=r.x.cx;
*dx=r.x.dx;
*num=r.x.ax;
}
int init_mouse()
{
/*初試化鼠標,查詢鼠標驅動有沒有安裝,功能號為 0 */
int num=0;
mouse_IQR(num,num,num,num);
if(num!=-1)
return 1;
else return 0;
}
void mouse_show();
void mouse_position(int *x,int *y)
{/*鼠標在屏幕中所處的位置*/
int button=0,num=3;
mouse_show();
mouse_IQR(num,button,x,y);
}
void mouse_hide()
{/*隱藏鼠標光標*/
int num=2;
mouse_IQR(num,num,num,num);
}
void mouse_show()
{/*顯示鼠標光標*/
int num=1;
mouse_IQR(num,num,num,num);
}
int mouse_click(int k)
{/*查詢鼠標是使用左鍵(返回1)還是右鍵(返回2)*/
int bx=0,num=3;
mouse_IQR(num,bx,num,num);
return(bxk);
}
void waiton(int buttom)
{/*等待鼠標動作*/
if(buttom==1)
while(mouse_click(1));
if(buttom==2)
while(mouse_click(2));
}
int mousexy(int x1,int y1,int x2,int y2)
{/*查詢鼠標是否在區域內*/
int x,y;
mouse_position(x,y);
if(xx1xy1yL||m-1e10) break;
x=xx;
y=yy;
}
color=n%16;
putpixel(x1+i,y1+j,color);
}
}
}
void mouse_drop(struct MOUSE *in)
{
char out[20];
int x,y;
int oldx,oldy;
struct MOUSE r;
r=*in;
setwritemode(1);
setlinestyle(USERBIT_LINE,0x7777,1);
setcolor(15);
if(r.getit==1)
{
mouse_hide();
rectangle(r.x1,r.y1,r.x2,r.y2);
mouse_show();
}
mouse_position(x,y);
r.x1=x;
r.y1=y;
oldx=x;
oldy=y;
r.getit=1;
mouse_hide();
rectangle(x,y,x,y);
mouse_show();
while(mouse_click(1)) {mouse_position(x,y);
if(oldx!=x || oldy!=y){
mouse_hide();
rectangle(r.x1,r.y1,x,y);
rectangle(r.x1,r.y1,oldx,oldy);
mouse_show();
oldx=x;
oldy=y;
}
if(mouse_click(2)){
r.getit=0;
mouse_hide();
rectangle(r.x1,r.y1,oldx,oldy);
mouse_show();
waiton(2);
break;}
}
if(r.getit==1){
r.x2=x;
r.y2=y;
if(x==r.x1 r.y1==y)
r.getit=0;
else
r.getit=1;
}
setlinestyle(SOLID_LINE,0,1);
*in=r;
waiton(1);
setwritemode(0);
setmouse(0,0,getmaxx(),getmaxy());
}
int data_processor(struct MOUSE m,float *x0,
float *x1,float *y0,float *y1)
{
float d1,l1,d2,l2,d,l;
float xx0,xx1,yy0,yy1,x,y;
d1=*x1-*x0;
l1=*y1-*y0;
d2=637;
l2=477;
xx0=m.x1;
xx1=m.x2;
yy0=m.y1;
yy1=m.y2;
if(xx0==xx1 || yy0==yy1) return(0);
if(xx0xx1)
{x=xx0;
xx0=xx1;
xx1=x;
}
if(yy0yy1)
{x=yy0;
yy0=yy1;
yy1=x;
}
d=1;
l=1;
x=*x0;
y=*y0;
*x0=x+(xx0-d)*d1/d2;
*x1=x+(xx1-d)*d1/d2;
*y0=y+(yy0-l)*l1/l2;
*y1=y+(yy1-l)*l1/l2;
if(*x0==*x1 || *y0==*y1)
return(0);
else
return(1);
}
不懂再問!
幾個問題,需要注意:
1.
char?temp=fgetc(fp);
這個只對了一個字符,后面的char指針 ch, 指向的是一個字符,而不是一個字符串,因此不能比較;而且此時文件的位置指向的最尾處,字符temp;里面啥都沒有(或者說是一個結尾符)
2. 字符串的比較:
if(ch=="create?schema;")
有問題,除了上面說的此時ch的內容肯定不會和create scheme;相同,c語言的字符比較一般是:
if(strcmp(ch,"create?schema;"))
因為字符串的比較,長度和結尾是一個大問題,因此為了安全甚至用strncmp
3. 其他一些問題, 文件讀取完畢后,應該fclose;字符串比較的大小問題是否要考慮? 用戶輸入的保護(用戶不小心亂輸入過長的字符串等。。)
4. 針對1~3, 簡單的修改了一下,確保你的運行,其余的自己酌情考慮吧。。。
#include?string.h
...
void?choose()
{
FILE?*?fp;
fp=fopen("creat_schema.txt","r+");
int?i=0;
char?c;
do
{
c=getchar();
putc(c,fp);
}
while?(c!=';');
rewind(fp);
/*
char?temp=fgetc(fp);
char?*?ch=temp;
*/
char?temp[100];
fgets(temp,?100,?fp);
char?*ch?=?temp;
fclose(fp);
/*
if(ch=="create?schema;")?????create_schema();
else?if(ch=="create?table;")?????create_table();
else?if(ch=="drop?schema;")????drop_schema();
else?if(ch=="drop?table;")????drop_table();
else?if(ch=="alter?table;")????alter_table();
*/
if(strcmp(ch,"create?schema;"))?????create_schema();
else?if(strcmp(ch,"create?table;"))?????create_table();
else?if(strcmp(ch,"drop?schema;"))????drop_schema();
else?if(strcmp(ch,"drop?table;"))????drop_table();
else?if(strcmp(ch,"alter?table;"))????alter_table();
else
{
printf("ch?=?%s\n",?ch);
printf("error!\n");
exit(0);
}????
}
#include?stdio.h
/*?入參一:需要做處理的全字串?
*?入參二:需要刪除的字串
*?返回值:經過處理后的字串?
*?要求是指針處理?如果可以使用strlen和memcpy等會更容易理解
*/
char?*myf_delsubstr(char?*str_all,?char?*str_drop)
{?
char?*all?=?str_all;???//臨時指針?指向全字串
char?*drop?=?str_drop;?//臨時指針?指向待刪除字串
char?*tmp?=?NULL;??????//臨時指針?后面處理字串時使用
static?char?out[1024]?=?{0};?//靜態字串?作為返回值
char?*u?=?out;?????????//臨時指針?指向返回的字串
int?drop_len?=?0;??????//待刪除字串的長度
//獲取待刪除字串的長度
while?('\0'?!=?*drop)
{
drop++;
drop_len++;
}
//在獲取長度時drop這個指針的指向已被改變?重新賦值
drop?=?str_drop;
/*?雙層嵌套循環
*?第一層循環遍歷全字串直到找到可能存在待刪除的字串停止
*?第二層循環遍歷待刪除字串?并與當前的全字串對比?一旦發現完整匹配?越過(刪除)該字串
*/
while?('\0'?!=?*all)//直到全字串結尾
{
if?(*all?==?*drop)//發現第一個和待刪除字串的第一個字符相等?準備進入二層循環排除或證明懷疑
{
tmp?=?all;//臨時指針指向當前匹配的字串的首部
while?('\0'?!=?*drop)//直到待刪除字段結尾
{
tmp++;//每次循環臨時全字串和drop字串要往后偏移一位
drop++;//每次循環臨時全字串和drop字串要往后偏移一位
if?(*tmp?!=?*drop)//一旦發現其中一個字符不相等?排除懷疑
{
break;
}
}
if?('\0'?!=?*drop)//如果還未檢查到字串尾就出來了肯定是排除了懷疑
{
*u?=?*all;//既然排除懷疑那就把當前字符賦值到帶返回的字串out中
u++;//賦值后要往后偏移
drop?=?str_drop;
}
else//證實了懷疑
{
all?+=?drop_len;//全字串越過待刪除的字段長度
drop?=?str_drop;//指針的指向已被改變?重新賦值
continue;//全字串中可能不止出現一次待刪除的字串?繼續全字串的檢查
}
}
else
{
*u?=?*all;//既然不是待刪除字符那就把當前字符賦值到帶返回的字串out中
u++;//賦值后要往后偏移
}
all++;//既然是循環整個全字串檢查?檢查完一個字符后指針要往后偏移一位
}
return?out;//u只是指向out這個字串的臨時指針?我們返回的還是out本體
}
int?main(int?argc,?char?*argv[])
{
char?aa[1024]?=?{0};
char?bb[512]?=?{0};
printf("輸入一個字串:\n");
scanf("%s",?aa);
printf("輸入需要刪除的字串:\n");
scanf("%s",?bb);
char?*kk?=?myf_delsubstr(aa,?bb);
printf("處理后的字串:\n%s\n",?kk);
return?0;
}
輸入一個字串:
我覺得你是不可能愛上我的因為我是一個男孩子
輸入需要刪除的字串:
我
處理后的字串:
覺得你是不可能愛上的因為是一個男孩子
C語言實例教程:俄羅斯方塊的編寫
/*
先寫原理:
本次的俄羅斯方塊代碼出其的簡單,比我去年寫的四十幾K要小得多
實際上核心代碼只有3-4K,而且很容易理解,適合有一點C語言基礎并對此
有興趣的人.
這前面只粗略講解核心算法:
這里把游戲的關鍵設計放在三個盒子和一個坐標上:
大盒子:一個兩維數組,記錄著方塊點陣的開與關(把游戲的舞臺想像
成一個點陣),在下面也把這個東西稱為地圖
兩個5*5小盒子:兩維數組,一個盛放著正在下落的方塊,一個盛放在
下一個下落的方塊(即next),當然這兩個也必須想像成一個點陣:如長條
的點陣為:
00000
00100
00100
00100
00100
現在你只要有這么一個概念:一個不斷定時下落的小盒子從大盒子頂
部下降到底部,之后再將next盒子放在下落盒子,再進行下一輪的下落...
中間的控制等尚不要太著急.
現在面臨著一個問題:
下落的盒子和地圖之間要怎么聯系起來?
一個好的方法是再定義一個坐標:x,y,保存著小盒子左上角在地圖上對應
的下標(位置),即當x = 0, y = 0時,小盒子處于地圖的左上部.如此,當
小盒子需要移動時,即只須要改變x,y的值.
現在說說旋轉.
小盒子保存著當前下落形狀的點陣,那么旋轉就只須要將這個點陣旋
轉90度:例如:
00000 00000
00100 00000
00100 - 01111
00100 00000
00100 00000
這一點實現起來還是不太難的.
判斷碰撞
通常這種情況只須要在有移動小盒或旋轉盒子時發生:也即點陣非空
是互斥的,當小盒要向下移(x++)時,如果小盒里的點陣與地圖上的點陣(非
空的地方)重疊,則不能下移,(卡住了),旋轉則轉換后的形狀與地圖有沖
突則要放棄旋轉.
到了這里,你應該有一個大概的了解了,至于怎樣在屏幕上畫出來,這
個是比較簡單的,下面的代碼會慢慢與你解釋.
*/
/*
平臺:DOS+TC2.0
*/
#include stdio.h
#include stdlib.h
#include bios.h /*這里須要讀取系統運行時間來作為定時器*/
#include graphics.h /*很不幸,TC2的簡單圖形,讓我放棄了用*/
#include conio.h /*win32+openGL來講解.*/
#define MAX_X 14 /*可見最大X*/
#define MAX_Y 21 /*可見最大Y*/
/*我們定義了最大的可見X和Y,那么即還有不
可見的部分,事實上地圖(大盒子)里的左右
兩側和底部各兩行都被1填充,這樣大大簡化
出界的判斷,事實上,在本例中沒有這樣的
代碼,因為旁邊有一圈1阻止小盒子越出大
盒子的按制范圍
*/
#define MAX_C 7 /*最大種類,這個無須解釋*/
#define KEY_UP 'w' /*定義上下左右按按鍵*/
#define KEY_DOWN 's'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define KEY_ESC 27 /*退出*/
typedef int BOOL;
#define FALSE 0
#define TRUE 1 /*這幾個TC中沒有...自己定義一下吧:)*/
/*時鐘結構*/
typedef struct { /*時鐘結構*/
BOOL enabled; /*時鐘是否開啟*/
unsigned int intervel; /*定時間隔*/
unsigned int lasttime; /*這個屬于內部使用變量*/
} Timer;
/*
*現在進入了編程的初質階段
*在開始處我會寫出所有的函數原形,以及它們的作用
*main函數在程序的最后,你可以在這里看到整個游戲的組織架構
*很好,它只有幾十行,并且非常容易理解,當然,還是先看一下函數原形
*及解釋
*/
/******************************************************\
* 函數原形及說明 *
\******************************************************/
/*以下三個函數可以參照Timer結構體.在函數聲明后面*/
int GetTickCount(); /*返回電腦或操作系統運行逝去的時間*/
/*在win32環境下已包含在windows.h里邊,返回的是4byte*/
/*在DOS(本代碼)環境下,要自己編寫,使用到BIOS.h內容*/
int setTimer(Timer *t, unsigned int intv, BOOL en);
/*設置時鐘t,參數分別為時鐘指針,時間間隔,是否活動*/
/*時間間隔,win32下為毫秒,DOS下為1/18秒(有點低)*/
BOOL testTimer(Timer *t); /*測試時鐘t是否到達定時時間*/
/*如下面這段代碼:*/
/*
setTimer(t, 1, 1); 設置1個單位的間隔
while(1) {
if(testTimer(t)) printf("Active!\n");
}
將會定時(1個單位)在屏幕上打印Active!
一般來說testTimer必須放在循環中反復執行,激活時返回1
*/
void render(void); /*唯一的繪圖函數*/
/*注意,此函數重畫整個地圖,根據地圖中的點陣,以及根據
小盒在地圖的中坐標在恰當位置畫出小盒子*/
/*DOS的圖形當然是很低的,但,全屏繪圖在這里還是過得去
的,我用的是雙緩沖,交換繪圖,這樣感覺好點*/
void initMap(void); /*初始化地圖(大盒子)*/
/*之前提到過在這個兩維數組中有一圈為1的東西來阻止
小盒子出界,這就是生成這一圈的函數*/
void newGame(); /*新建一個游戲*/
/*這個函數初始化一幾個時鐘和建造第一個下落的小盒子*/
/*當然建造完后要生成一個個的預覽*/
void rotateBox(int box1[5][5], int box2[5][5]);
/*核心函數成員,把box1逆時針旋轉90度,并保存到box2中*/
void rebuidNext();
/*核心函數成員,生成下一個方塊*/
int drop();
/*核心函數成員,將下落的盒子向下移(實際上增加下落盒
子的Y值而已,當然要判斷是否與地圖點陣重疊*/
/*與地圖重疊,無法完成下落操作,返回0*/
void putBox();
/*在這之上,下落的盒子與地圖之前是獨立的兩個兩維數*/
/*當下落失敗后,小盒子要回到頂端再次重新執行下落,這*/
/*時原來的盒子內容當然就要變成地圖上的內容了,putBox
就是將下落盒子的內容根據XY寫到地圖上*/
void clear();
/*這個函數在下落失敗并putBox后執行,掃描整個地圖*/
/*清除掉滿行的點陣,具體細節在函數內講*/
int move(int dir);
/*左右移動下落盒子,dir指出向左還是向右,這個與drop
是一樣的*/
int test(int mx, int my, int box[5][5]);
/*這個比較重點,判斷box在mx,my為坐標上,與地圖上的
非空點陣是否有重疊.很通用的一個函數*/
int rotate();
/*旋轉下落的盒子,當然如果轉了之后與地圖有沖突,會
取消轉動,返回0,但返回的值好像沒什么用~*/
int newfall();
/*創建下落元素,把"下一個"預覽的內容復制到下落盒子*/
/*并將下落的盒子移動到地圖頂部,當然這個過程,如果頂
部有沖突,會返回0,這時說明已經滿了...gameOver*/
int main();
/*終于到了最后的主函數,在這里可以看到整個游戲的架*/
/*構,包括游戲主循環,鍵盤處理等...*/
/******************************************************\
* 變量區 *
\******************************************************/
/*在上面的說明中,可能會有一些蒙,因為可能對所用到的實際變量沒
*有了解
*/
int map[MAX_Y+4][MAX_X+4]; /*地圖\大盒子...MAX_X,Y是可見面積*/
/*我已說過需要在外面布兩圈"衛兵"*/
int curbox[5][5]; /*當前下落的盒子*/
int curx, cury; /*保存著當前活動盒子在地圖上的位置*/
int nextbox[5][5]; /*保存著下一個形狀的盒子*/
/*以上就是這么幾個盒子和坐標了*/
/*這里列出了標準七種俄羅斯方塊圖形點陣,用到時它們會被復制到相*/
/*應的盒子...:)*/
int box[MAX_C][5][5] = { /*MAX_C(7)種預定義的盒子*/
{
{0,0,0,0,0},
{0,0,0,0,0},
{1,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,1,0},
{0,1,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
}
};
/******************************************************\
* 時鐘 *
\******************************************************/
/*時鐘部分也非常理解的,一個用到設置時鐘,一個用來測試時鐘激活態*/
Timer tDown; /*正常下落定時時鐘intervel會比較大*/
Timer tFast; /*按KEY_DOWN時使用的快速下落*/
int speed = 13; /*控制下落時間間隔*/
#define FAST_INTV 1 /*快時鐘的間隔*/
int GetTickCount() { /*讀取BIOS時鐘*/
int ret;
ret = peek(0x0,0x46e); /*實際上讀取了內存0:046e處的內容*/
ret = 8; /*這個地方是$%#$^$%^*/
ret += peek(0x0,0x46c); /*太多新的東西了,找點書看一看吧*/
return (ret);
}
int setTimer(Timer *t, unsigned int intv, BOOL en) {
t - enabled = en; /*設置一個時鐘羅*/
t - intervel = intv;
t - lasttime = GetTickCount(); /*lasttime記錄的是上一個*/
/*tickcount返回的東西*/
/*這樣當再一次測試時間時新的tickcount產生了
它來減去上一次的tickcount就得出了一個時間
間隔,這個就可以和intervel比較從而得出是否
激活了
*/
return 0;
}
BOOL testTimer(Timer *t) { /*在上面6行的地方解釋了:)*/
unsigned int tmp, dt;
if (!(t - enabled)) return FALSE;
tmp = GetTickCount();
dt = tmp - (t - lasttime);
if(dt = t - intervel) {
t - lasttime = tmp;
return TRUE;
}
return FALSE;
}
/******************************************************\
* 渲染部分 *
\******************************************************/
/*提供render更新整個屏幕*/
/*關于這個函數,要說的東西還是比較多,為了追求漂亮和編譯*/
/*時的靈活性,這個函數被寫得頗為冗長...*/
/*現在寫一下本游戲圖形的東西...使用TC2的Graphics我也不
太樂意,畢竟它本身已過時,但鑒于實在簡單實用,它用來教學
再合適不過,這也是教學總是用TC的原因,老師們不喜歡讓學
生問一些讓他們掌握起來也困難的東西...*/
/*這里我使用了VGAMED模式,而不是 VGAHI,因為VGAMED有兩個
頁(可以想像成緩沖),這樣可以用來做到不閃動畫.即:在后臺
頁繪制圖形,完成后再顯示出來.
這里用到了兩個函數:
setactivepage(1 | 0) 參數只能是1或0,選擇繪圖頁,例如選
擇了1后,以后所有的繪圖動作將畫到頁1上.
setvisualpage(1 | 0) 這個叫做選擇可見頁,即選擇在屏幕上
顯示頁面1還是0
*/
void render(void) {
int x, y;
static int cPage = 0; /*當前頁,換頁用*/
#define STARTX 50 /*定義幾個常量*/
#define STARTY 0
#define LEN 18
setactivepage(cPage=(cPage == 0?1:0)); /*選擇頁*/
cleardevice(); /*清屏*/
setcolor(15);
rectangle( STARTX + LEN * 2 - 2,
STARTY + LEN * 3 - 2,
STARTX + LEN * (MAX_X - 2) + 2,
STARTY + LEN * (MAX_Y - 2) + 2);
/*用白色畫一個外框*/
setfillstyle(SOLID_FILL, 5);
for(y = 3; y MAX_Y - 2; y++) { /*畫地圖 */
for(x = 2; x MAX_X - 2; x++) {
if(map[y][x]) {
rectangle( x * LEN + STARTX,
y * LEN + STARTY,
x * LEN + STARTX + LEN,
y * LEN + STARTY + LEN);
bar( x * LEN + STARTX + 1,
y * LEN + STARTY + 1,
x * LEN + STARTX + LEN - 2,
y * LEN + STARTY + LEN - 2);
}
}
}
/*繪圖操作就不要作太復雜的介紹了,這只寫作用*/
/*以上段,根據地圖上的點陣情況將地圖反映到屏幕上*/
當前題目:c語言drop函數 dropout函數
本文地址:http://www.yijiale78.com/article4/dodcooe.html
成都網站建設公司_創新互聯,為您提供軟件開發、企業建站、建站公司、移動網站建設、網站內鏈、商城網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯