A. 教你如何使用C語言編寫簡單小游戲
愛玩是人的天性,而C語言是我們計算機專業都要學習的一門基礎 學科.一般來說,是比較枯燥的.那麼,我們能不能通過編一些小游戲來提高它的趣味性呢?這樣學習程序設計,就不會是一件艱苦 ,枯燥的事,它變得象電腦游戲一樣充滿好奇,富有樂趣. 1, 總是從Hello,world開始 學習編程的第一個程序,一般就是列印一個親切的詞語——"Hell o,world!".讓我們來看看這個最簡單的C程序:#incolude /*把輸入輸出函數的頭文件包含進來*/int main(){printf("Hello, world!");/*在屏幕上輸出字元串"Hello,world!"*/return 0;/*退出main函數,並返回0*/} 下面我們發現幾個值得改進的地方,1,程序的運行結果一閃而過 .2,每執行這個程序一次都能看見上次運行留下的字元.3,我們 還希望屏幕輸出一個笑臉來歡迎我們. 讓我們來改進一下這個程序吧!1,在return語句的前面加一句:getch ();,表示按任意鍵結束.2,在printf語句前用clrscr函數清屏,要使用這個函數和getch函數,需要在程序開頭再包含頭文件conio.h.3,ASCII碼也有 許多非常好玩的字元,比如ASCII碼值為2的就是一個笑臉,我們可 以用printf("%c", 2)來輸出一個笑臉. 現在我們把Hello,world程序改成一個更好看的Hello,world了.下面讓我們開始做游戲吧! 2, 心動的開始,一個運動中的笑臉 大家小時侯喜歡看動畫片嗎?哈哈,我猜你們都喜歡吧!下面就讓我們來做一個小動畫吧.在屏幕上顯示一個運動的小笑臉,而且當它到達屏幕的邊緣時會自動彈回來.先在程序定義一個在屏幕中運動的點的結構:struct move_point{ int x, y;/*該點的位置,包括x坐標和y坐標*/ int xv, yv;/*該點在x軸,y軸的速度*/};運動的原理是,先擦去物體先前的軌跡,讓物體按其速度移動一段距離,再畫出該物體.讓我們看到以下代碼:gotoxy(man.x, man.y);/*把游標移到指定的坐標*/printf(" ");/*輸出一個空格,把先前的字元擦去*/然後我們讓物體按其速度運動:man.x += man.xv;/*水平方向按x軸的速度運動*/man.y += man.yv;/*垂直方向按y軸的速度運動*/運動後還要判斷物體是否出界,如果出了界,就令物體反彈,即讓 它下一刻的速度等於現在的速度的相反數.最後列印出這個笑臉:gotoxy(man.x, man.y);printf("%c\b", 2); /*輸出ASCII碼值為2的"笑臉"字元*/怎麼樣?是不是很有趣呢?不過這個笑臉一直是自己運動,能不能 讓我們來控制它運動呢? 不過這個程序沒有什麼目的,也沒有什麼判斷勝負的條件.下面我們就利用這個能控制它移動的笑臉來做一個更有趣的游戲吧! 4, 在迷宮中探索 小時侯,我常在一些小人書和雜志上看見一些迷宮的游戲,非常喜歡玩,還常到一些書上找迷宮玩呢.好的,現在我們用C語言來編個迷宮的游戲,重溫一下童年的樂趣. 首先,我們定義一個二維數組map,用它來保存迷宮的地圖,其中map[x][y] == '#'表示在(x,y)坐標上的點是牆壁.DrawMap函數在屏幕上輸出迷宮的地圖和一些歡迎信息.在main函數里,我們定義了"小人"man的坐標和"目的地"des的 坐標.在游戲循環中,我們增加了一些用來判斷勝負的語句:if (man.x == des.x && man.y == des.y) /*如果人的坐標等於目的地的坐標*/{ gotoxy(35, 3); printf("Ok! You win!"); /*輸出勝利信息*/….}在判斷按鍵時,如果玩家按的是方向鍵,我們還要先判斷前面是不是有"牆壁",如果有的話,就不能往前移動了.好的,我們在判斷按鍵的switch語句的各個分支加上了判斷語句,如下:if (map[…][…] == '#') break;/*如果前面是牆壁,就不執行下去*/哇噻!真棒,我們做出了一個完整的游戲了.當然你還可以通過修改二維數組map來修改迷宮的地圖,讓它更有挑戰性.不過,我們要設計一個更好玩的游戲—— 5, 聰明的搬運工 大家一定玩過"搬運工"的游戲吧!這是在電腦和電子字典上較流行的益智游戲,讓我們動手做一個屬於自己的"搬運工"吧!程序依然用數組map來保存地圖,數組元素如果為空格則表示什麼也沒有,'b'表示箱子,'#'表示牆壁,'*'表示目的地,'i'表示箱子在目的地.我們以後每推一下箱子,不但要改變屏幕的顯示,也要改變map相應元素的值.游戲的主循環依然是接受按鍵.當接收一個方向鍵,需要判斷小人前面一格的狀態,如果是空地或目的地,則人物可以直接移動;如果是牆壁,則不可移動;如果是箱子或目的地上的箱子,則需要繼續判斷箱子前面一格的狀態:如果前一格是空地或目的地,則人推箱子前進,否則不可移動.好的,我們在switch中增加了這些判斷語句.程序還有一個重要的功能就是判斷勝利.數組Des用來記錄全部目的地的坐標,我們每執行一步操作後,程序就要通過Des數組判斷這些目的地上是否都有箱子了.真棒啊!我們可以做游戲了.而且是一個老少皆宜,趣味十足的游戲呢!當然,我們可以通過修改map數組來製作不同的游戲地圖,我們還可以相互分享好的游戲地圖呢. 尾聲: 在C++等高級語言還沒出來的時候,很多應用程序也是C語言開發的.C語言在與硬體聯系緊密的編程中,也佔有重要地位.其實我覺得學習編程,可以通過一些小游戲,實用的例子來學習.象學習音樂的人,不是要等到把全部樂理學完後才演奏一個完整的曲子.而是剛開始學時就有一些簡單的曲子讓你演奏,讓你立刻就有成就感,讓你很快就能賣弄出來在別人面前表現自己了.通過編游戲來學習編程,把學習變成游戲,不失為學習計算機的一種好方法. 好了,編游戲就這么簡單,希望大家也嘗試用C語言或其他的語言來做幾個自己喜歡的小游戲.
B. c語言小游戲代碼
「貪吃蛇」C代碼,在dev C++試驗通過(用4個方向鍵控制)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#define W 78 //游戲框的寬,x軸
#define H 26 //游戲框的高,y軸
int dir=3; //方向變數,初值3表示向「左」
int Flag=0; //吃了食物的標志(1是0否)
int score=0; //玩家得分
struct food{ int x; //食物的x坐標
int y; //食物的y坐標
}fod; //結構體fod有2個成員
struct snake{ int len; //蛇身長
int speed; //移動速度
int x[100]; //蛇身某節x坐標
int y[100]; //蛇身某節y坐標
}snk; //結構體snk有4個成員
void gtxy( int x,int y) //控制游標移動的函數
{ COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void gtxy( int x,int y); //以下聲明要用到的幾個自編函數
void csh( ); //初始化界面
void keymove( ); //按鍵操作移動蛇
void putFod( ); //投放食物
int Over( ); //游戲結束(1是0否)
void Color(int a); //設定顯示顏色的函數
int main( ) //主函數
{ csh( );
while(1)
{ Sleep(snk.speed);
keymove( );
putFod( );
if(Over( ))
{ system(「cls」);
gtxy(W/2+1,H/2); printf(「游戲結束!T__T」);
gtxy(W/2+1,H/2+2); printf(「玩家總分:%d分」,score);
getch( );
break;
}
}
return 0;
}
void csh( ) //初始化界面
{ int i;
gtxy(0,0);
CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下兩行是隱藏游標的設置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
for(i=0;i<=W;i=i+2) //橫坐標要為偶數,因為這個要列印的字元佔2個位置
{Color(2); //設定列印顏色為綠色
gtxy(i,0); printf("■"); //列印上邊框
gtxy(i,H); printf("■"); //列印下邊框
}
for(i=1;i<H;i++)
{ gtxy(0,i); printf("■"); //列印左邊框
gtxy(W,i); printf("■"); //列印右邊框
}
while(1)
{ srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
fod.x=rand()%(W-4)+2; //隨機函數rand( )產生一個從0到比」(W-4)」小1的數再加2
fod.y=rand()%(H-2)+1; //隨機函數rand( )產生一個從0到比」(H-2)」小1的數再加1
if (fod.x%2==0) break; //fod.x是食物的橫坐標,要是2的倍數(為偶數)
}
Color(12); //設定列印顏色為淡紅
gtxy(fod.x,fod.y); printf("●"); //到食物坐標處列印初試食物
snk.len=3; //蛇身長初值為3節
snk.speed=350; //刷新蛇的時間,即移動速度初值為350毫秒
snk.x[0]=W/2+1; //蛇頭橫坐標要為偶數(因為W/2=39)
snk.y[0]=H/2; //蛇頭縱坐標
Color(9); //設定列印顏色為淡藍
gtxy(snk.x[0], snk.y[0]); printf("■"); //列印蛇頭
for(i=1;i<snk.len;i++)
{ snk.x[i]=snk.x[i-1]+2; snk.y[i]=snk.y[i-1];
gtxy(snk.x[i],snk.y[i]); printf("■"); //列印蛇身
}
Color(7, 0); //恢復默認的白字黑底
return;
}
void keymove( ) //按鍵操作移動蛇
{ int key;
if( kbhit( ) ) //如有按鍵輸入才執行下面操作
{ key=getch( );
if (key==224) //值為224表示按下了方向鍵,下面要再次獲取鍵值
{ key=getch( );
if(key==72&&dir!=2)dir=1; //72表示按下了向上方向鍵
if(key==80&&dir!=1)dir=2; //80為向下
if(key==75&&dir!=4)dir=3; //75為向左
if(key==77&&dir!=3)dir=4; //77為向右
}
if (key==32)
{ while(1) if((key=getch( ))==32) break; } //32為空格鍵,這兒用來暫停
}
if (Flag==0) //如沒吃食物,才執行下面操作擦掉蛇尾
{ gtxy(snk.x[snk.len-1],snk.y[snk.len-1]); printf(" "); }
int i;
for (i = snk.len - 1; i > 0; i--) //從蛇尾起每節存儲前一節坐標值(蛇頭除外)
{ snk.x[i]=snk.x[i-1]; snk.y[i]=snk.y[i-1]; }
switch (dir) //判斷蛇頭該往哪個方向移動,並獲取最新坐標值
{ case 1: snk.y[0]--; break; //dir=1要向上移動
case 2: snk.y[0]++; break; //dir=2要向下移動
case 3: snk.x[0]-=2; break; //dir=3要向左移動
case 4: snk.x[0]+=2; break; //dir=4要向右移動
}
Color(9);
gtxy(snk.x[0], snk.y[0]); printf("■"); //列印蛇頭
if (snk.x[0] == fod.x && snk.y[0] == fod.y) //如吃到食物則執行以下操作
{ printf("7"); snk.len++; score += 100; snk.speed -= 5; Flag = 1; } //7是響鈴
else Flag = 0; //沒吃到食物Flag的值為0
if(snk.speed<150) snk.speed= snk.speed+5; //作弊碼,不讓速度無限加快
}
void putFod( ) //投放食物
{ if (Flag == 1) //如吃到食物才執行以下操作,生成另一個食物
{ while (1)
{ int i,n= 1;
srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
fod.x = rand( ) % (W - 4) + 2; //產生在游戲框范圍內的一個x坐標值
fod.y = rand( ) % (H - 2) + 1; //產生在游戲框范圍內的一個y坐標值
for (i = 0; i < snk.len; i++) //隨機生成的食物不能在蛇的身體上
{ if (fod.x == snk.x[i] &&fod.y == snk.y[i]) { n= 0; break;} }
if (n && fod.x % 2 == 0) break; //n不為0且橫坐標為偶數,則食物坐標取值成功
}
Color(12); //設定字元為紅色
gtxy(fod.x, fod.y); printf("●"); //游標到取得的坐標處列印食物
}
return;
}
int Over( ) //判斷游戲是否結束的函數
{ int i;
Color(7);
gtxy(2,H+1); printf(「暫停鍵:space.」); //以下列印一些其它信息
gtxy(2,H+2); printf(「游戲得分:%d」,score);
if (snk.x[0] == 0 || snk.x[0] == W) return 1; //蛇頭觸碰左右邊界
if (snk.y[0] == 0 || snk.y[0] == H) return 1; //蛇頭觸碰上下邊界
for (i = 1; i < snk.len; i++)
{ if (snk.x[0] == snk.x[i] && snk.y[0] == snk.y[i]) return 1; } //蛇頭觸碰自身
return 0; //沒碰到邊界及自身時就返回0
}
void Color(int a) //設定顏色的函數
{ SetConsoleTextAttribute(GetStdHandle( STD_OUTPUT_HANDLE ),a ); }
C. 用C語言編寫的小游戲代碼是什麼
/*也不知道你是什麼級別的,我是一個新手,剛接觸編程語言,以下是我自己變得一個小程序,在所有c語言的編譯器(vc++6.0、turbo????)上都能運行,你還可以進一步改進。這是一個類似貪吃蛇的小游戲。祝你好運*/x0dx0a/*貪吃蛇*/x0dx0a#include
D. 用C語言編寫的小游戲代碼是什麼
「猜數字小游戲」,每個數字後按空格,最後按回車確認
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int a[4],b[4];
int count=0; //計算猜測次數
void csh( ); //初始化
void start( ); //開始游戲
int main( )
{ csh( );
start( );
}
void csh( ) //初始化
{ printf(" 猜 數 字 小 游 戲 ");
printf(「 猜四個數字,如數字與順序都正確記為A,數字正確位置不對記為B. 」);
}
void start( ) //開始游戲
{int m,n; //m是完全猜對的個數,n是順序不對的個數
while(1)
{srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
while(1) { for(int i=0;i<4;i++) a[i]=rand( )%10; //rand( )函數每次隨機產生一個0-9的數
if( (a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0])&&
(a[2]!=a[1]&&a[2]!=a[0])&&a[1]!=a[0] ) break; } //4個隨機數各自不相等
printf(" 請依次輸入4個一位整數: ");
while(1)
{for(int i=0;i<4;i++) scanf(「%d」,&b[i]);
printf(" 你輸入的是:%d %d %d %d ",b[0],b[1],b[2],b[3]);
m=0;n=0;
for(int i=0;i<4;i++)
{for(int j=0;j<4;j++)
{ if(b[i]==a[j]&&i==j)m=m+1; if(b[i]==a[j]&&i!=j)n=n+1; }
}
count=count+1;
printf(" %dA %dB 你試了%d次 ",m,n,count);
if(m==4)break;
if(count==8){ count=0; break; }
}
printf(" ");
if(m==4)printf(" 你猜對了(^-^)! 就是:%d %d %d %d ",a[0],a[1],a[2],a[3]);
else printf(" 你輸了(T-T)!哈哈!應該是:%d %d %d %d ",a[0],a[1],a[2],a[3]);
int z;
printf(" (要繼續嗎?1或0) ");
scanf(「%d」,&z);
if(z==0) break;
}
}
E. 用C語言編寫的小游戲代碼是什麼
"掃雷"小游戲C代碼
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循環變數*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*標記*/
int m,n,lei; /*計數*/
int u,v; /*輸入*/
int hang,lie,ge,mo; /*自定義變數*/
srand((int)time(NULL)); /*啟動隨機數發生器*/
leb1: /*選擇模式*/
printf("
請選擇模式:
1.標准 2.自定義
");
scanf("%d",&mo);
if(mo==2) /*若選擇自定義模式賀迅,要輸李拍前入三個參數*/
{do
{t=0; printf("請輸入
行數 列數 雷的個數
");
scanf("%d%d%d",&hang,&lie,&ge);
if(hang<2){printf("行數太少
"); t=1;}
if(hang>100){printf("行數太多
");t=1;}
if(lie<2){printf("列數太少
");t=1;}
if(lie>100){printf("列數太多
");t=1;}
if(ge<1){printf("至少要有哪清一個雷
");t=1;}
if(ge>=(hang*lie)){printf("雷太多了
");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否則就是選擇了標准模式(默認參數)*/
for(i=1;i<=ge;i=i+1) /*確定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;j<i;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i<=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j<=lie+1;j=j+1) {a[i][j]='1'; b[i][j]='1'; c[i][j]='0';} }
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1) {a[i][j]='+';} }
for(i=1;i<=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]='#';}
for(i=1;i<=hang;i=i+1) /*計算b中數字*/
{for(j=1;j<=lie;j=j+1)
{m=48;
if(c[i-1][j-1]=='#')m=m+1; if(c[i][j-1]=='#')m=m+1;
if(c[i-1][j]=='#')m=m+1; if(c[i+1][j+1]=='#')m=m+1;
if(c[i][j+1]=='#')m=m+1; if(c[i+1][j]=='#')m=m+1;
if(c[i+1][j-1]=='#')m=m+1; if(c[i-1][j+1]=='#')m=m+1;
b[i][j]=m;
}
}
for(i=1;i<=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]='#';}
lei=ge; /*以下是游戲設計*/
do
{leb2: /*輸出*/
system("cls");printf("
");
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei);
printf("
|");
for(j=1;j<=lie;j=j+1){printf("---|");}
printf("
");
}
scanf("%d%c%d",&u,&w,&v); /*輸入*/
u=u+1,v=v+1;
if(w!='#'&&a[u][v]=='@')
goto leb2;
if(w=='#')
{if(a[u][v]=='+'){a[u][v]='@'; lei=lei-1;}
else if(a[u][v]=='@'){a[u][v]='?'; lei=lei+1;}
else if(a[u][v]=='?'){a[u][v]='+';}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打開0區*/
t=0;
if(a[u][v]=='0')
{for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=1;j<=lie;j=j+1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1; if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]=='0')s=1; if(a[i-1][j+1]=='0')s=1;
if(a[i-1][j]=='0')s=1; if(a[i+1][j-1]=='0')s=1;
if(a[i+1][j+1]=='0')s=1;if(a[i+1][j]=='0')s=1;
if(a[i][j-1]=='0')s=1; if(a[i][j+1]=='0')s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i<=hang;i=i+1) /*檢測0區*/
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')
{if(a[i-1][j-1]=='+'||a[i-1][j-1]=='@'||a[i-1][j-1]=='?')t=1;
if(a[i-1][j+1]=='+'||a[i-1][j+1]=='@'||a[i-1][j+1]=='?')t=1;
if(a[i+1][j-1]=='+'||a[i+1][j-1]=='@'||a[i+1][j-1]=='?')t=1;
if(a[i+1][j+1]=='+'||a[i+1][j+1]=='@'||a[i+1][j+1]=='?')t=1;
if(a[i+1][j]=='+'||a[i+1][j]=='@'||a[i+1][j]=='?')t=1;
if(a[i][j+1]=='+'||a[i][j+1]=='@'||a[i][j+1]=='?')t=1;
if(a[i][j-1]=='+'||a[i][j-1]=='@'||a[i][j-1]=='?')t=1;
if(a[i-1][j]=='+'||a[i-1][j]=='@'||a[i-1][j]=='?')t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*檢查結束*/
for(i=1;i<=hang;i=i+1)
{for(j=1;j<=lie;j=j+1)
{if(a[i][j]!='+'&&a[i][j]!='@'&&a[i][j]!='?')n=n+1;}
}
}
while(a[u][v]!='#'&&n!=(hang*lie-ge));
for(i=1;i<=ge;i=i+1) /*游戲結束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]='#'; }
printf(" ");
for(i=1;i<=lie;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c ",w);
}
printf("
|");
for(i=1;i<=lie;i=i+1){printf("---|");}
printf("
");
for(i=1;i<=hang;i=i+1)
{w=(i-1)/10+48; printf("%c",w);
w=(i-1)%10+48; printf("%c |",w);
for(j=1;j<=lie;j=j+1)
{if(a[i][j]=='0')printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩餘雷個數");
if(i==3)printf(" %d",lei); printf("
|");
for(j=1;j<=lie;j=j+1) {printf("---|");}
printf("
");
}
if(n==(hang*lie-ge)) printf("你成功了!
");
else printf(" 游戲結束!
");
printf(" 重玩請輸入1
");
t=0;
scanf("%d",&t);
if(t==1)goto leb1;
}
/*註:在DEV c++上運行通過。行號和列號都從0開始,比如要確定第0行第9列不是「雷」,就在0和9中間加入一個字母,可以輸入【0a9】三個字元再按回車鍵。3行7列不是雷,則輸入【3a7】回車;第8行第5列是雷,就輸入【8#5】回車,9行0列是雷則輸入【9#0】並回車*/
F. 怎樣用C語言編寫一個小游戲
「貪吃蛇」C代碼:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <Windows.h>
#define W 78 //游戲框的寬,x軸
#define H 26 //游戲框的高,y軸
int dir=3; //方向變數,初值3表示向「左」
int Flag=0; //吃了食物的標志(1是0否)
int score=0; //玩家得分
struct food{ int x; //食物的x坐標
int y; //食物的y坐標
}fod; //結構體fod有2個成員
struct snake{ int len; //身長
int speed; //速度
int x[100];
int y[100];
}snk; //結構體snk有4個成員
void gtxy( int x,int y) //控制游標移動的函數
{ COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void gtxy( int x,int y); //以下聲明要用到的幾個自編函數
void csh( ); //初始化界面
void keymove( ); //按鍵操作移動蛇
void putFod( ); //投放食物
int Over( ); //游戲結束(1是0否)
void setColor(unsigned short p, unsigned short q); //設定顯示顏色
int main( ) //主函數
{ csh( );
while(1)
{ Sleep(snk.speed);
keymove( );
putFod( );
if(Over( ))
{system(「cls」);
gtxy(W/2+1,H/2); printf(「游戲結束!T__T」);
gtxy(W/2+1,H/2+2); printf(「玩家總分:%d分」,score);
getch( );
break;
}
}
return 0;
}
void csh( ) //初始化界面
{ int i;
gtxy(0,0);
CONSOLE_CURSOR_INFO cursor_info={1,0}; //以下兩行是隱藏游標的設置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
for(i=0;i<=W;i=i+2) //橫坐標要為偶數,因為這個要列印的字元佔2個位置
{ setColor(2, 0); //設定列印顏色為綠字黑底
gtxy(i,0); printf("■"); //列印上邊框
gtxy(i,H); printf("■"); //列印下邊框
}
for(i=1;i<H;i++)
{ gtxy(0,i); printf("■"); //列印左邊框
gtxy(W,i); printf("■"); //列印右邊框
}
while(1)
{ srand((unsigned)time(NULL)); //初始化隨機數發生器srand( )
fod.x=rand()%(W-4)+2; //隨機函數rand( )產生一個從0到比」(W-4)」小1的數再加2
fod.y=rand()%(H-2)+1; //隨機函數rand( )產生一個從0到比」(H-2)」小1的數再加1
if (fod.x%2==0) break; //fod.x是食物的橫坐標,要是2的倍數(為偶數)
}
setColor(12, 0); //設定列印顏色為淡紅字黑底
gtxy(fod.x,fod.y); printf("●"); //到食物坐標處列印初試食物
snk.len=3; //蛇身長
snk.speed=350; //刷新蛇的時間,即是移動速度
snk.x[0]=W/2+1; //蛇頭橫坐標要為偶數(因為W/2=39)
snk.y[0]=H/2; //蛇頭縱坐標
setColor(9, 0); //設定列印顏色為淡藍字黑底
gtxy(snk.x[0], snk.y[0]); printf("■"); //列印蛇頭
for(i=1;i<snk.len;i++)
{ snk.x[i]=snk.x[i-1]+2; snk.y[i]=snk.y[i-1];
gtxy(snk.x[i],snk.y[i]); printf("■"); //列印蛇身
}
setColor(7, 0); //恢復默認的白字黑底
return;
}
void keymove( ) //按鍵操作移動蛇
{ int key;
if( kbhit( ) ) //如有按鍵輸入才執行下面操作
{ key=getch( );
if (key==224) //值為224表示按下了方向鍵,下面要再次獲取鍵值
{ key=getch( );
if(key==72&&dir!=2)dir=1; //72表示按下了向上方向鍵
if(key==80&&dir!=1)dir=2; //80為向下
if(key==75&&dir!=4)dir=3; //75為向左
if(key==77&&dir!=3)dir=4; //77為向右
}
if (key==32)
{ while(1) if((key=getch( ))==32) break; } //32為空格鍵,這兒用來暫停
}
if (Flag==0) //如沒吃食物,才執行下面操作擦掉蛇尾
{ gtxy(snk.x[snk.len-1],snk.y[snk.len-1]); printf(" "); }
int i;
for (i = snk.len - 1; i > 0; i--) //從蛇尾起每節存儲前一節坐標值(蛇頭除外)
{ snk.x[i]=snk.x[i-1]; snk.y[i]=snk.y[i-1]; }
switch (dir) //判斷蛇頭該往哪個方向移動,並獲取最新坐標值
{ case 1: snk.y[0]--; break; //dir=1要向上移動
case 2: snk.y[0]++; break; //dir=2要向下移動
case 3: snk.x[0]-=2; break; //dir=3要向左移動
case 4: snk.x[0]+=2; break; //dir=4要向右移動
}
setColor(9, 0);
gtxy(snk.x[0], snk.y[0]); printf("■"); //列印蛇頭
if (snk.x[0] == fod.x && snk.y[0] == fod.y) //如吃到食物則執行以下操作
{ printf("