狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

如何用C語言編寫游戲

| 瀏覽次數(shù):

 如何用 C C 語言編寫游戲

 網(wǎng)絡(luò)游戲是常談的話題,是交互式娛樂的主力軍,是一種 高層次的綜合藝術(shù),更是一個(gè)民族的文化,世界觀的全新傳播方式 作為游戲玩家的我們,是不是想設(shè)計(jì)一個(gè)屬于自己的游戲呢?

 愛玩是人的天性,而 C 語言是我們計(jì)算機(jī)專業(yè)都要學(xué)習(xí)的一門基礎(chǔ)學(xué)科.一般來說,是比較枯燥的.那么,我們能不能通過編一些小

 游戲來提高它的趣味性呢?這樣學(xué)習(xí)程序設(shè)計(jì),就不會(huì)是一件艱苦

 ,枯燥的事,它變得象電腦游戲一樣充滿好奇,富有樂趣.這正是

 我要寫這文檔目的.

 1,

 總是從 Hello,world 開始

  學(xué)習(xí)編程的第一個(gè)程序,一般就是打印一個(gè)親切的詞語——"Hell

  o,world!".讓我們來看看這個(gè)最簡單的 C 程序:

  #incolude <stdio.h> /*把輸入輸出函數(shù)的頭文件包含進(jìn)來*/

  int main()

  {

  printf("Hello,

  world!");/*在屏幕上輸出字符串"Hello,world!"*/

  return 0;/*退出 main 函數(shù),并返回 0*/

  }

  下面我們發(fā)現(xiàn)幾個(gè)值得改進(jìn)的地方,1,程序的運(yùn)行結(jié)果一閃而過

  .2,每執(zhí)行這個(gè)程序一次都能看見上次運(yùn)行留下的字符.3,我們

  還希望屏幕輸出一個(gè)笑臉來歡迎我們.(大家不要小看了這個(gè)笑臉

  曾經(jīng)有人發(fā)貼專門問呢)讓我們來改進(jìn)一下這個(gè)程序吧!

  1,在 return 語句的前面加一句:getch ();,表示按任意鍵結(jié)

  束.2,在 printf 語句前用 clrscr 函數(shù)清屏,要使用這個(gè)函數(shù)和 get

  ch 函數(shù),需要在程序開頭再包含頭文件 conio.h.3,ASCII 碼也有

  許多非常好玩的字符,比如 ASCII 碼值為 2 的就是一個(gè)笑臉,我們可

  以用 printf("%c", 2)來輸出一個(gè)笑臉.

  現(xiàn)在我們把 Hello,world 程序改成一個(gè)更好看的 Hello,world 了.下

  面讓我們開始做游戲吧!

  2,

 心動(dòng)的開始,一個(gè)運(yùn)動(dòng)中的笑臉

  大家小時(shí)侯喜歡看動(dòng)畫片嗎?哈哈,我猜你們都喜歡吧!下面就讓

  我們來做一個(gè)小動(dòng)畫吧.在屏幕上顯示一個(gè)運(yùn)動(dòng)的小笑臉,而且當(dāng)

  它到達(dá)屏幕的邊緣時(shí)會(huì)自動(dòng)彈回來.

  先在程序定義一個(gè)在屏幕中運(yùn)動(dòng)的點(diǎn)的結(jié)構(gòu):

  struct move_point

  {

 int x, y;/*該點(diǎn)的位置,包括 x 坐標(biāo)和 y 坐標(biāo)*/

 int xv, yv;/*該點(diǎn)在 x 軸,y 軸的速度*/

  };

  運(yùn)動(dòng)的原理是,先擦去物體先前的軌跡,讓物體按其速度移動(dòng)一段

  距離,再畫出該物體.讓我們看到以下代碼:

  gotoxy(man.x, man.y);/*把光標(biāo)移到指定的坐標(biāo)*/

  printf(" ");/*輸出一個(gè)空格,把先前的字符擦去*/

  然后我們讓物體按其速度運(yùn)動(dòng):

  man.x += man.xv;/*水平方向按 x 軸的速度運(yùn)動(dòng)*/

  man.y += man.yv;/*垂直方向按 y 軸的速度運(yùn)動(dòng)*/

  運(yùn)動(dòng)后還要判斷物體是否出界,如果出了界,就令物體反彈,即讓

  它下一刻的速度等于現(xiàn)在的速度的相反數(shù).最后打印出這個(gè)笑臉:

  gotoxy(man.x, man.y);

  printf("%c\b", 2); /*輸出 ASCII 碼值為 2 的"笑臉"字符*/

  怎么樣?是不是很有趣呢?不過這個(gè)笑臉一直是自己運(yùn)動(dòng),能不能

  讓我們來控制它運(yùn)動(dòng)呢?答案是肯定的,讓我們繼續(xù)往下學(xué)吧!

  3,

 交互的實(shí)現(xiàn)——讓我們來控制笑臉運(yùn)動(dòng)

  這個(gè)程序的主要功能是接受按鍵,如果接收的是方向鍵,就讓笑臉

  順著方向移動(dòng),如果接收的是 ESC 鍵就退出程序,其他按鍵則忽略

  處理.接受按鍵我們用以下兩條語句:

  while (bioskey(1) == 0);/*等待按鍵*/

  key = bioskey(0);/*把接收的按鍵的鍵盤碼賦給變量 key*/

  然后用 switch 語句來判斷按鍵以及執(zhí)行相關(guān)操作,如下:

  switch (key) /*對(duì)變量 key 的值進(jìn)行判斷*/

  {

  case UP:

 /*如果按的是向上鍵*/

 … break; /*讓物體向上運(yùn)動(dòng),并退出 switch*/

  case DOWN: /*如果按的是向下鍵*/

 … break; /*讓物體向下運(yùn)動(dòng),并退出 switch*/

  case LEFT:

 /*向左鍵*/

 … break;;/*向左運(yùn)動(dòng)*/

  case RIGHT: /*向右鍵*/

 … break;/*向右運(yùn)動(dòng)*/

 贊

 6

 2004-9-9 19:26 回復(fù)

  c 閑人

 202 位粉絲

  2 樓

  default:

 break;/*其他按鍵則忽略處理*/

  }

  怎么樣,是不是有了玩游戲的感覺了?不過這個(gè)程序沒有什么目的

  ,也沒有什么判斷勝負(fù)的條件.下面我們就利用這個(gè)能控制它移動(dòng)

  的笑臉來做一個(gè)更有趣的游戲吧!

  4,

 在迷宮中探索

  小時(shí)侯,我常在一些小人書和雜志上看見一些迷宮的游戲,非常喜

  歡玩,還常到一些書上找迷宮玩呢.好的,現(xiàn)在我們用 C 語言來編

  個(gè)迷宮的游戲,重溫一下童年的樂趣.

  首先,我們定義一個(gè)二維數(shù)組 map,用它來保存迷宮的地圖,其中 m

  ap[x][y] == "#"表示在(x,y)坐標(biāo)上的點(diǎn)是墻壁.DrawMap 函數(shù)

  在屏幕上輸出迷宮的地圖和一些歡迎信息.

  在 main 函數(shù)里,我們定義了"小人"man 的坐標(biāo)和"目的地"des 的

  坐標(biāo).在游戲循環(huán)中,我們增加了一些用來判斷勝負(fù)的語句:

  if (man.x == des.x && man.y == des.y) /*如果人的坐標(biāo)等于目

  的地的坐標(biāo)*/

  {

 gotoxy(35, 3);

 printf("Ok! You win!"); /*輸出勝利信息*/

  ….

  }

  在判斷按鍵時(shí),如果玩家按的是方向鍵,我們還要先判斷前面是不

  是有"墻壁",如果有的話,就不能往前移動(dòng)了.好的,我們在判

  斷按鍵的 switch 語句的各個(gè)分支加上了判斷語句,如下:

  if (map[…][…] == "#") break;/*如果前面是墻壁,就不執(zhí)行

  下去*/

  哇噻!真棒,我們做出了一個(gè)完整的游戲了.當(dāng)然你還可以通過修

  改二維數(shù)組 map 來修改迷宮的地圖,讓它更有挑戰(zhàn)性.不過,我們

  要設(shè)計(jì)一個(gè)更好玩的游戲——

  5,

 聰明的搬運(yùn)工

  大家一定玩過"搬運(yùn)工"的游戲吧!這是在電腦和電子字典上較流

  行的益智游戲,讓我們動(dòng)手做一個(gè)屬于自己的"搬運(yùn)工"吧!

  程序依然用數(shù)組 map 來保存地圖,數(shù)組元素如果為空格則表示什么

  也沒有,"b"表示箱子,"#"表示墻壁,"*"表示目的地,"i

  "表示箱子在目的地.我們以后每推一下箱子,不但要改變屏幕的

  顯示,也要改變 map 相應(yīng)元素的值.

  游戲的主循環(huán)依然是接受按鍵.當(dāng)接收一個(gè)方向鍵,需要判斷小人

  前面一格的狀態(tài),如果是空地或目的地,則人物可以直接移動(dòng);如

  果是墻壁,則不可移動(dòng);如果是箱子或目的地上的箱子,則需要繼

  續(xù)判斷箱子前面一格的狀態(tài):如果前一格是空地或目的地,則人推

  箱子前進(jìn),否則不可移動(dòng).好的,我們在 switch 中增加了這些判斷

  語句.

  程序還有一個(gè)重要的功能就是判斷勝利.數(shù)組 Des 用來記錄全部目

  的地的坐標(biāo),我們每執(zhí)行一步操作后,程序就要通過 Des 數(shù)組判斷

  這些目的地上是否都有箱子了.

  真棒啊!我們可以做游戲了.而且是一個(gè)老少皆宜,趣味十足的游

  戲呢!當(dāng)然,我們可以通過修改 map 數(shù)組來制作不同的游戲地圖,

  我們還可以相互分享好的游戲地圖呢.

  尾聲:

  在 C++等高級(jí)語言還沒出來的時(shí)候,很多應(yīng)用程序也是 C 語言開發(fā)的

  .C 語言在與硬件聯(lián)系緊密的編程中,也占有重要地位.

  其實(shí)我覺得學(xué)習(xí)編程,可以通過一些小游戲,實(shí)用的例子來學(xué)習(xí).

  象學(xué)習(xí)音樂的人,不是要等到把全部樂理學(xué)完后才演奏一個(gè)完整的

  曲子.而是剛開始學(xué)時(shí)就有一些簡單的曲子讓你演奏,讓你立刻就

  有成就感,讓你很快就能賣弄出來在別人面前表現(xiàn)自己了.通過編

  游戲來學(xué)習(xí)編程,把學(xué)習(xí)變成游戲,不失為學(xué)習(xí)計(jì)算機(jī)的一種好方

  法.

  好了,編游戲就這么簡單,希望大家也嘗試用 C 語言或其他的語言

  來做幾個(gè)自己喜歡的小游戲.

 時(shí)間延遲函數(shù)

 函數(shù)名: delay

 功

 能: 將程序的執(zhí)行暫停一段時(shí)間(毫秒)

 用

 法: void delay(unsigned milliseconds);

  重畫屏幕區(qū)域的函數(shù)

 函數(shù)名:getimage

 功

 能:將指定區(qū)域的一個(gè)位圖存到主存中

 用

 法:void far getimage( int left, int top, int right, int bottom, void far *bitmap);

  函數(shù)名:putimage

 功

 能:在屏幕上輸出一個(gè)位圖

 用

 法:void far putimage( int x, int y, void far *bitmap, int op );

  圖像大小函數(shù)

 函數(shù)名: imagesize

 功

 能: 返回保存位圖像所需的字節(jié)數(shù)

 用

 法: unsigned far imagesize( int left, int top, int right, int bottom );

 異或模式函數(shù)

  函數(shù)名: setwritemode

 功

 能: 設(shè)置圖形方式下畫線的輸出模式

 用

 法: void far setwritemode(int mode);

  參數(shù) MODE 可以被設(shè)置位 COPY_PUT 或者 XOR_PUT 兩種模式。當(dāng)mode 被設(shè)置為 XOR_PUT,其后的圖形操作將都采用異或方式。此外之前提到的 putimage()函數(shù)也可以采用異或模式向屏幕復(fù)制圖像。

  檢測鍵盤輸入函數(shù)

 函數(shù)名: kbhit

 功

 能: 檢查當(dāng)前按下的鍵

 用

 法: int kbhit(void);

  鍵盤接口函數(shù)

 函數(shù)名: bioskey

 功

 能: 直接使用 BIOS 服務(wù)的鍵盤接口

 用

 法: int bioskey(int cmd);

  該函數(shù)通過 bois 中斷 0x16 執(zhí)行鍵盤操作,由參數(shù) cmd 來決定具體的操作。

 Cmd 具體操作

 0 讀取按鍵的 ascii 碼

 1 測試是否有按鍵 如果沒有按鍵 返回 0 如果按鍵為 ctrl+brk 返回-1 如果是其他按鍵 返回按鍵本身鍵值(直到此按鍵被取出后恢復(fù)0)

 2 返回 shift key 狀態(tài)

  以下是當(dāng) cmd 為 2 的時(shí)候,返回值的具體含義

 cmd 返回值 觸發(fā)特殊鍵

 0X01 Left ctrl

 0X02 Left alt

 0X04 Right ctrl

 0X08 Right alt

 0X10 Scroll lock

 0X20 Num lock

 0X40 Caps lock

 0X80 Sys rq

  bioskey()函數(shù)的優(yōu)點(diǎn)在于:

 1.和kbhit()函數(shù)一樣可以在不影響主程序運(yùn)行的情況下檢測是否有按鍵;

 2.可以方便地檢測普通鍵具體 ASCII 碼和掃描碼;

 3.可以方便地檢測功能鍵具體掃描碼;

 4.可以檢測特殊按鍵;

 5.只需要一個(gè)函數(shù)就能解決檢測按鍵和讀入按鍵的任務(wù)。

  聲音與延遲函數(shù)

 函數(shù)名: sound

 功

 能: 以指定頻率打開 PC 揚(yáng)聲器

 用

 法: void sound(unsigned frequency);

  函數(shù)名: nosound

 功

 能: 關(guān)閉 PC 揚(yáng)聲器

 用

 法: void nosound(void);

  函數(shù)名: delay

 功

 能: 將程序的執(zhí)行暫停一段時(shí)間(毫秒)

 用

 法: void delay(unsigned milliseconds);

  sound()函數(shù)用于讓 pc 喇叭發(fā)聲,nosound()函數(shù)用于使正在發(fā)聲的pc 喇叭靜音。要使程序中的發(fā)聲的具體方法,是調(diào)用 sound()函數(shù)并延遲一定時(shí)間,然后使用 nosound()函數(shù)靜音,具體語句實(shí)現(xiàn)方法如下:

 sound(100);

 delay(100);

 nosound();

  產(chǎn)生隨即數(shù)函數(shù)

 函數(shù)名: rand

 功

 能: 隨機(jī)數(shù)發(fā)生器

 用

 法: void rand(void);

  函數(shù)名: random

 功

 能: 隨機(jī)數(shù)發(fā)生器

 用

 法: int random(int num);

 初始化隨機(jī)數(shù)函數(shù)

 函數(shù)名: randomize

 功

 能: 初始化隨機(jī)數(shù)發(fā)生器

 用

 法: void randomize(void);

 in86()函數(shù)

 函數(shù)名: int86

 功

 能: 通用 8086 軟中斷接口

 用

 法: int int86( int intr_num, union REGS *inregs, union REGS *outregs );

  其中 intr_num 為軟中斷號(hào),函數(shù)通過 inregs 寄存器向中斷發(fā)出具體功能命令,函數(shù)將中斷調(diào)用結(jié)果返回寄存器 outregs。

 memset()函數(shù)

 函數(shù)名: memset

 功

 能: 設(shè)置 s 中的所有字節(jié)為 ch, s 數(shù)組的大小由 n 給定

 用

 法: void *memset(void *s, char ch, unsigned n);

 標(biāo)準(zhǔn) VGA 顯示模式表

 模式(16 進(jìn)制) 適配器 顯示類型 顏色 字符格式 屏幕大小 字符大小 緩沖區(qū)首址 屬性類型

 0/1 CGA 文本 16/16 40*25 320*200 8*8 B8000 彩色

 EGA 文本 16/64 40*25 320*350 8*14 B8000 彩色

  贊

 0

 2004-10-22 21:37 回復(fù)

  c 閑人

 202 位粉絲

  2 樓

 VGA 文本 16/256K 40*25 360*400 9*16 B8000 彩色

 CGA 文本 16/16 80*25 640*200 8*8 B8000 彩色

 2/3 EGA 文本 16/64 80*25 640*350 8*14 B8000 彩色

 VGA(3+) 文本 16/256K 80*25 720*400 9*16 B8000 彩色

 CGA 圖形 4/16 40*25 320*200 8*8 B8000 彩色

 4/5 EGA 圖形 4/64 40*25 320*200 8*8 B8000 彩色

 VGA 圖形 4/256K 40*25 320*200 8*8 B8000 彩色

 CGA 圖形 2/16 40*25 640*200 8*8 B8000 單色

 6 EGA 圖形 2/64 40*25 640*200 8*8 B8000 單色

 VGA 圖形 2/256K 40*25 640*200 8*8 B8000 單色

 7 MDA/EGA 文本 單色 80*25 720*350 9*14 B0000 單色

 VGA(7+) 文本 單色 80*25 720*400 9*16 B0000 單色

 D EGA 圖形 16/64 40*25 320*200 8*8 A0000 彩色

 VGA 圖形 16/256K 40*25 320*200 8*8 A0000 彩色

 E EGA 圖形 16/64 80*25 640*200 8*8 A0000 彩色

 VGA 圖形 16/256K 80*25 640*200 8*8 A0000 彩色

 F EGA/VGA 圖形 單色 80*25 640*350 8*14 A0000 單色

 10 EGA 圖形 16/64 80*25 640*350 8*14 A0000 彩色

 VGA 圖形 16/256K 80*25 640*350 8*14 A0000 彩色

 11 VGA 圖形 2/256K 80*30 640*480 8*16 A0000 彩色

 12 VGA 圖形 16/256K 80*30 640*480 8*16 A0000 彩色

 13 VGA 圖形 256/256K 40*25 320*200 8*8 A000 彩色

  常規(guī)內(nèi)存函數(shù)

 申 請 函 數(shù) :malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()

 函數(shù)名: malloc

 功

 能: 內(nèi)存分配函數(shù)

 用

 法: void *malloc(unsigned size);

 函數(shù)名: farmalloc

 功

 能: 從遠(yuǎn)堆中分配存儲(chǔ)塊

 用

 法: void far *farmalloc(unsigned long size);

 函數(shù)名: calloc

 功

 能: 分配主存儲(chǔ)器

 用

 法: void *calloc(size_t nelem, size_t elsize);

 函數(shù)名: farcalloc

 功

 能: 從遠(yuǎn)堆棧中申請空間

 用

 法: void far *farcalloc( unsigned long units, unsigned ling unitsz );

 函數(shù)名: realloc

 功

 能: 重新分配主存

 用

 法: void *realloc(void *ptr, unsigned newsize);

 函數(shù)名: farrealloc

 功

 能: 調(diào)整遠(yuǎn)堆中的分配塊

 用

 法: void far *farrealloc( void far *block, unsigned long newsize );

 使用函數(shù):memcpy(),memset(),memmove(),movedata()

 函數(shù)名: memcpy

  功

 能: 從源 source 中拷貝 n 個(gè)字節(jié)到目標(biāo) destin 中

  用

 法: void *memcpy(void *destin,void *source,unsigned n);

  函數(shù)名: memset

  功

 能: 設(shè)置 s 中的所有字節(jié)為 ch, s 數(shù)組的大小由 n 給定

  用

 法: void *memset(void *s, char ch, unsigned n);

 函數(shù)名: memmove

  功

 能: 移動(dòng)一塊字節(jié)

  用

 法: void *memmove(void *destin,void *source,unsigned n);

 函數(shù)名: movedata

  功

 能: 拷貝字節(jié)

  用

 法: void movedata(int segsrc, int offsrc, int segdest, int offdest, unsigned numbytes);

  釋放函數(shù):free(),farfree()

 函數(shù)名: free

  功

 能: 釋放已分配的塊

  用

 法: void free(void *ptr);

  函數(shù)名: farfree

  功

 能: 從遠(yuǎn)堆中釋放一塊

  用

 法: void farfree(void);

 指針操作函數(shù):MK_FP(),FP_OFF(),FP_SEG()

 函數(shù)名: MK_FP

 功

 能: 設(shè)置一個(gè)遠(yuǎn)指針

 用

 法: void far *MK_FP(unsigned seg, unsigned off);

 函數(shù)名: FP_OFF

 功

 能: 獲取遠(yuǎn)地址偏移量

 用

 法: unsigned FP_OFF(void far *farptr);

 函數(shù)名: FP_SEG

 功

 能: 獲取遠(yuǎn)地址段值

 用

 法: unsigned FP_SEG(void far *farptr);

  XMS 功能調(diào)用索引表:

 功能號(hào) 功能 版本

 功能 00H 功能 01H 功能 02H 功能 03H 功能 04H 功能 05H 功能 06H 功能 07H 功能 08H 功能 09H 功能 0AH 功能 0BH 功能 0CH 功能 0DH 功能 0EH 功能 0FH 功能 10H 功能 11H 取 XMS 版本號(hào) 請求高內(nèi)存區(qū)HMA 釋放高內(nèi)存區(qū)HMA 全程啟用A20 全程停用A20 局部啟用A20 局部停用 A20 查詢 A20 狀態(tài) 查詢自由擴(kuò)展內(nèi)存 分配擴(kuò)展內(nèi)存塊 釋放擴(kuò)展內(nèi)存塊 移動(dòng)擴(kuò)展內(nèi)存塊 鎖住擴(kuò)展內(nèi)存塊 擴(kuò)展內(nèi)存塊解鎖 取EMB 句柄信息 重新分配擴(kuò)展內(nèi)存塊 請求上位存儲(chǔ)塊 UMB 釋放上位存儲(chǔ)塊 UMB

 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范

 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范 V2.0 XMS 規(guī)范V2.0

  以下是一個(gè)用線和矩形繪制的簡單賽車

 #include <stdio.h>

 #include <graphics.h>

 void main(void){

  int gdriver=DETECT,gmode;

  initgraph(&gdriver,&gmode, "");

  setbkcolor(7);

  setwritemode(XOR_PUT);

  setcolor(BLUE);

  setlinestyle(SOLID_LINE,0,3);

  rectangle(280,350,320,390);

  rectangle(270,340,330,350);

  rectangle(290,320,310,340);

  rectangle(270,390,330,400);

  setcolor(5);

  line(290,350,290,390);

  line(300,300,300,320);

  line(300,350,300,390);

  line(310,350,310,390);

  line(285,300,315,300);

  getch();

  closegraph();

 }

 接下來我們試著繪制賽道,周圍的綠化樹木和簡單的集裝箱車

 代碼如下:

 #include <math.h>

 #include <conio.h>

 #include <stdio.h>

 #include <stdlib.h>

 #include <graphics.h>

 const

 int u = 26;

 int i = 2;

 int j = 3;

  void road(void)

 {

 int h;

 for(h=0;h<4;h++)

 line(150+h*100,0,150+h*100,472);

  for(h=0;h<3;h++)

 {

 setlinestyle(3,0,1);

 line(200+h*100,0,200+h*100,472);

 settextstyle(1,HORIZ_DIR,3);

 }

 }

  void tree(void)

 {

 int w;

 int poly[14];

  setcolor(10);

 setlinestyle(SOLID_LINE,0,3);

  for (w=-3;w<3;w=w+2)

 {

 line(85

 , -25+u*15+w*157 , 85

 , 35+u*15+w*157);

 line(95

 , -25+u*15+w*157 , 95

 , 35+u*15+w*157);

 line(105 , -25+u*15+w*157 , 105 , 35+u*15+w*157);

 line(115 , -25+u*15+w*157 , 115 , 35+u*15+w*157);

 line(75

 , -9+u*15+w*157

 , 75

 , 19+u*15+w*157);

 line(125 , -9+u*15+w*157

 , 125 , 19+u*15+w*157);

 }

  for (w=-2;w<3;w=w+2)

 {

 poly[0] = 530;

 poly[1] = u*15+w*157;

  poly[2] =515;

 poly[3] = 25+u*15+w*157;

  poly[4] =485;

 poly[5] =25+u*15+w*157 ;

  poly[6] =470;

 poly[7] =u*15+w*157 ;

  poly[8] =485;

 poly[9] =-25+u*15+w*157;

  poly[10] =515;

 poly[11] =-25+u*15+w*157 ;

  poly[12] = poly[0];

 poly[13] = poly[1];

  drawpoly(7,poly);

 }

 }

  void truck(void)

 {

 setcolor(2);

 setlinestyle(SOLID_LINE,0,3);

  rectangle(170+i*100,j*10,230+i*100,60+j*10);

 rectangle(160+i*100,70+j*10,240+i*100,260+j*10);

 line(180+i*100,70+j*10,180+i*100,260+j*10);

 line(200+i*100,70+j*10,200+i*100,260+j*10);

 line(220+i*100,70+j*10,220+i*100,260+j*10);

 }

  void car(void)

 {

 setcolor(BLUE);

 setlinestyle(SOLID_LINE,0,3);

  rectangle(280,350,320,390);

 rectangle(270,340,330,350);

 rectangle(290,320,310,340);

 rectangle(270,390,330,400);

  setcolor(5);

  line(290,350,290,390);

 line(300,300,300,320);

 line(300,350,300,390);

 line(310,350,310,390);

 line(285,300,315,300);

 }

  void main(void)

 {

 int gdriver = DETECT , gmode,w;

  initgraph(&gdriver, &gmode, "");

  setbkcolor(7);

 setcolor(WHITE);

 setwritemode(XOR_PUT);

  road();

 tree();

 truck();

 car();

  getch();

 closegraph();

 }

 用 c 做的簡單的坦克大戰(zhàn)小游戲(給初學(xué)者點(diǎn)動(dòng)力)

 c 閑人

 202 位粉絲

  1 樓

 #include <graphics.h>

 #include <stdlib.h>

 #include <dos.h>

 #include <conio.h>

 #include <bios.h>

 #define KEY_ESC 0x01

 #define KEY_SPACE 0x39

 #define KEY_UP 0x48

 #define KEY_LEFT 0x4b

 #define KEY_RIGHT 0x4d

 #define KEY_DOWN 0x50

 /*1 石頭,2 磚塊,3 水,5 老家,8 玩家,9 敵人*/

 int map[20][20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

  1,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,

  1,0,2,2,2,2,0,0,2,2,2,2,0,0,0,0,0,0,0,1,

  1,0,0,0,0,0,0,0,2,0,0,2,0,1,1,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,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,1,

  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,

  1,0,1,1,1,1,3,3,3,3,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,

  1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,

  1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,0,1,

  1,0,0,0,2,2,2,0,0,0,0,0,0,0,0,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,0,0,3,3,3,1,1,1,1,1,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,2,2,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,

  1,0,2,2,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,1,

  1,0,0,0,0,0,0,8,2,5,2,0,0,0,0,0,0,0,0,1,

  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

 struct f

 {

  int x;

  int y;

  int direction;

 };

 struct play

 {

  int x;/*行坐標(biāo)*/

  int y;/*列坐標(biāo)*/

  int direction;/*方向*/

  struct f fire[5];/*5 顆子彈*/

  int score;/*分?jǐn)?shù)*/

 }Playone;

 struct a

 {

  int x;

  int y;

  int color;

  int direction;

  int directiontwo;/*用來判斷走的路是否往返*/

  int fireplay;/*是否攻擊的變量,隨機(jī)生成*/

  struct f fire;

 }amy[5];/*敵人的結(jié)構(gòu)體,其實(shí)可以添加不同的顏色來表示不同種類的坦克*/

 char key_state[128],key_pressed[128];

 void Init();/*圖象驅(qū)動(dòng)開始*/

 void End();/*圖象驅(qū)動(dòng)結(jié)束*/

 void DrawMap();/*畫地圖*/

 void DrawWater(int x,int y);/*畫水*/

 void DrawBrick(int x,int y);/*畫磚*/

 void DrawTone(int x,int y);/*畫石頭*/

 void DrawHome(int x,int y);/*畫老家*/

 void DrawBlack(int x,int y);/*去除內(nèi)容*/

 void DrawPlay(int x,int y);/*畫玩家*/

 void DrawAmy(int x,int y,int i);/*畫敵人*/

 void Score();/*輸出分?jǐn)?shù)*/

 void GamePlay();/*玩游戲過程*/

 void GameOver();/*游戲失敗*/

 void TimeDelay(unsigned long microsec); /*延時(shí)函數(shù) 傳入微秒數(shù)*/

 int GetKey(int ScanCode);/*這里開始都是按鍵函數(shù)*/

 void interrupt far (*OldInt9Handler)();

 void far interrupt NewInt9();

 void InstallKeyboard();

 void ShutDownKeyboard();

 void main(void)

 {

  Init();

  DrawMap();

  GamePlay();

  End();

 }

 void TimeDelay(unsigned long microsec) /*延時(shí)函數(shù) 傳入微秒數(shù)

 */

 {

  union REGS r;

  r.h.ah=0x86;

  r.x.cx=microsec>>16;

  r.x.dx=microsec;

  int86(0x15,&r,&r);

 }

 void Init()/*圖象驅(qū)動(dòng)開始*/

 {int gd=DETECT,gm;

  initgraph(&gd,&gm,"d:\\tc\\tc");

  cleardevice();

  InstallKeyboard();

 }

 void End()/*圖象驅(qū)動(dòng)結(jié)束*/

 {

  ShutDownKeyboard();

  closegraph();

 }

 void DrawTone(int x,int y)/*畫石頭*/

 {

 setfillstyle(SOLID_FILL,7);

 bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);

  贊

 2

 2004-8-20 00:42 回復(fù)

  c 閑人

 202 位粉絲

  2 樓

 }

 void DrawWater(int x,int y)/*畫水*/

 {

  setfillstyle(SOLID_FILL,BLUE);

  bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);

 }

 void DrawBrick(int x,int y)/*畫磚*/

 {

 setfillstyle(SOLID_FILL,6);

 bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);

 setcolor(15);

 line(100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4);

 line(100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4);

 line(100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9);

 line(100+x*20+4,50+y*20-9,100+x*20+4,50+y*20+9);

 }

 void DrawHome(int x,int y)/*畫老家*/

 {

  setcolor(0);

  setfillstyle(SOLID_FILL,GREEN);

  fillellipse(100+x*20,50+y*20,9,9);

 }

 void DrawBlack(int x,int y)/*去除內(nèi)容*/

 {

  setcolor(0);

  setfillstyle(SOLID_FILL,0);

  bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);

 }

 void DrawPlay(int x,int y)/*畫玩家*/

 {

  setcolor(4);/*玩家為紅色*/

  circle(100+x*20,50+y*20,7);

  switch(Playone.direction)/*判斷玩家方向*/

  {

  case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/

  case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/

  case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/

  case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/

  }

 }

 void DrawAmy(int x,int y,int i)/*畫敵人*/

 {

  if(amy[i].color==12)

  setcolor(12);

  else if(amy[i].color==13)

  setcolor(13);

  else/*這里是判斷三種顏色的坦克*/

  setcolor(14);

  circle(100+x*20,50+y*20,7);

  switch(amy[i].direction)/*判斷玩家方向*/

  {

  case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/

  case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/

  case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/

  case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/

  }

 }

 void Score()/*輸出分?jǐn)?shù)*/

 {

  char s[10];

  Playone.score+=10;

  sprintf(s,"%d",Playone.score);

  setfillstyle(SOLID_FILL,0);

  bar(550,100,640,130);

  settextstyle(0,0,2);

  setcolor(YELLOW);

  outtextxy(550,115,s);

 }

 void DrawMap()/*畫地圖*/

 {int i,j,k;

  for(i=0;i<20;i++)

 {

 for(j=0;j<20;j++)

  if(map[i][j]==1)

 DrawTone(j,i);

  else if(map[i][j]==2)

 DrawBrick(j,i);

  else if(map[i][j]==3)

 DrawWater(j,i);

  else if(map[i][j]==5)

 DrawHome(j,i);

  else if(map[i][j]==8)

 {

 Playone.x=i;

 Playone.y=j;

 Playone.direction=1;

 DrawPlay(j,i);

 for(k=0;k<5;k++)

 Playone.fire[k].direction=-1;/*5顆子彈的方向都為-1,表示

 不存在*/

 }

  else if(map[i][j]==9)

  {

  amy[0].x=1;amy[0].y=1;amy[0].direction=amy[0].directiontwo=3;/*第一個(gè)敵人*/

  amy[0].color=12;

  DrawAmy(j,i,0);

  }

 }

  for(i=1;i<5;i++)/*敵人都沒出現(xiàn)*/

  amy[i].direction=amy[i].fire.direction=-1;

  outtextxy(210,450,"2003.10.1 milo_zy");

  settextstyle(0,0,2);/*首次輸出得分*/

  setcolor(9);

  outtextxy(525,80,"Score");

  setcolor(YELLOW);

  outtextxy(550,115,"0");

 }

 void far interrupt NewInt9(void)

 {

  unsigned char ScanCode,temp;

  ScanCode=inportb(0x60);

  temp=inportb(0x61);

  outportb(0x61,temp | 0x80);

  outportb(0x61,temp & 0x7f);

  if(ScanCode&0x80)

  {

 ScanCode&=0x7f;

 key_state[ScanCode]=0;

  }

 else

  {

 key_state[ScanCode]=1;

  2004-8-20 00:42 回復(fù)

  c 閑人

 202 位粉絲

  3 樓

 key_pressed[ScanCode]=1;

  }

  outportb(0x20,0x20);

 }

  void InstallKeyboard(void)

 {

  int i;

  for(i=0;i<128;i++)

  key_state[i]=key_pressed[i]=0;

  OldInt9Handler=getvect(9);

  /*中斷向量值*/

  setvect(9,NewInt9);

 /*中斷程序 NewInt9 地址存入指定的中斷向量表中 INT 09H*/

 }

  void ShutDownKeyboard(void)

 {

  setvect(9,OldInt9Handler);

 }

  int GetKey(int ScanCode)

 {

  int res;

  res=key_state[ScanCode]|key_pressed[ScanCode];

  key_pressed[ScanCode]=0;

  return res;

 }

 void GameOver()/*游戲失敗*/

 {

  setcolor(0);

  setfillstyle(SOLID_FILL,0);/*把老家給去除*/

  fillellipse(100+9*20,50+18*20,9,9);

  nosound();

  setcolor(RED);

 settextstyle(0,0,4);

  outtextxy(150,5,"GAME OVER");

  while(1)

  {

 if(GetKey(KEY_ESC))

 break;

  }

 }

 void GamePlay()/*玩游戲的過程*/

 {

  int i,j,lose=0;/*lose 是 1 的時(shí)候表示失敗*/

  int t=0;

  randomize();

  while(1)

  {

 for(i=0;i<5;i++)/*畫敵人的子彈*/

  {

 if(amy[i].fire.direction>0)

 putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,11);

  }

 for(i=0;i<=4;i++)/*畫玩家子彈*/

 {

 if(Playone.fire[i].direction>0)/*大于 0 表示玩家子彈存在*/

 putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,11);

 }

 TimeDelay(500000);/*關(guān)鍵的時(shí)間改動(dòng)*/

 for(i=0;i<5;i++)/*去敵人的子彈*/

  {

 if(amy[i].fire.direction>0)

 putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,0);

  }

 for(i=0;i<=4;i++)/*去玩家除子彈*/

  {

 if(Playone.fire[i].direction>0)

 putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,0);

 }

 for(i=0;i<=4;i++)/*玩家子彈位置的變化*/

  {

 if(Playone.fire[i].direction<0)

  continue;

 if(Playone.fire[i].direction==1)

  {Playone.fire[i].x--;Playone.fire[i].y=Playone.fire[i].y;}

 else if(Playone.fire[i].direction==2)

  {Playone.fire[i].y++;Playone.fire[i].y=Playone.fire[i].y;}

 else if(Playone.fire[i].direction==3)

  {Playone.fire[i].x++;Playone.fire[i].y=Playone.fire[i].y;}

 else if(Playone.fire[i].direction==4)

  {Playone.fire[i].y--;Playone.fire[i].y=Playone.fire[i].y;}

 /*打到石頭或者磚頭的情況下減少子彈*/

 if(map[Playone.fire[i].x][Playone.fire[i].y]==1)/* 打 到石頭*/

  Playone.fire[i].direction=-1;/*子彈消失*/

 if(map[Playone.fire[i].x][Playone.fire[i].y]==2)/* 打 到磚頭*/

  {

 Playone.fire[i].direction=-1;

 DrawBlack(Playone.fire[i].y,Playone.fire[i].x);/*磚頭打掉*/

 map[Playone.fire[i].x][Playone.fire[i].y]=0;/* 被 打 掉的地方變成可走的地方*/

  }

 if(map[Playone.fire[i].x][Playone.fire[i].y]==5)/* 自 己打到老家*/

  {lose=1;break;}

 for(j=0;j<5;j++)

  {

  if(amy[j].direction<0)/*不存在的不判斷*/

 continue;

  if(amy[j].x==Playone.fire[i].x&&amy[j].y==Playone.fire[i].y)/*打中敵人*/

  {

  Playone.fire[i].direction=-1;

  DrawBlack(Playone.fire[i].y,Playone.fire[i].x);

  map[Playone.fire[i].x][Playone.fire[i].y]=0;/*被打掉的地方變成可走的地方*/

  amy[j].fire.direction=amy[j].direction=-1;/*這個(gè)敵人消失*/

  Score();/*輸出得分*/

  }

 }

  }

 for(i=0;i<5;i++)/*敵人子彈位置的變化*/

  2004-8-20 00:42 回復(fù)

  c 閑人

 202 位粉絲

  4 樓

  {

 if(amy[i].direction<0||amy[i].fire.direction<0)

  continue;

 if(amy[i].fire.direction==1)

  {amy[i].fire.x--;amy[i].fire.y=amy[i].fire.y;}

 else if(amy[i].fire.direction==2)

  {amy[i].fire.y++;amy[i].fire.x=amy[i].fire.x;}

 else if(amy[i].fire.direction==3)

  {amy[i].fire.x++;amy[i].fire.y=amy[i].fire.y;}

 else if(amy[i].fire.direction==4)

  {amy[i].fire.y--;amy[i].fire.x=amy[i].fire.x;}

 /*打到石頭或者磚頭的情況下減少子彈*/

 if(map[amy[i].fire.x][amy[i].fire.y]==1)/*打到石頭*/

  amy[i].fire.direction=-1;/*子彈消失*/

 if(map[amy[i].fire.x][amy[i].fire.y]==2)/*打到磚頭*/

  {

 amy[i].fire.direction=-1;

 DrawBlack(amy[i].fire.y,amy[i].fire.x);/*磚頭打掉*/

 map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方變成可走的地方*/

  }

 if(map[amy[i].fire.x][amy[i].fire.y]==5)/*敵人打到老家*/

  {lose=1;break;}

 if(amy[i].fire.x==Playone.x&&amy[i].fire.y==Playone.y)/* 打中玩家*/

 {

  for(j=0;j<5;j++)

  Playone.fire[j].direction=-1;/*玩家子彈都消失*/

  amy[i].fire.direction=-1;

  DrawBlack(amy[i].fire.y,amy[i].fire.x);

  map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方變成可走的地方*/

  lose=1;break;/*好人被打掉后就失敗*/

 }

  }

 nosound();

 for(i=0;i<5;i++)/*敵人方向隨機(jī)的改變*/

 {

  if(amy[i].direction<0)

 continue;

  while(1)

  {

 amy[i].directiontwo=random(4)+1;

 if(amy[i].direction==1&&amy[i].directiontwo==3)

  continue;

 if(amy[i].direction==3&&amy[i].directiontwo==1)

  continue;

 if(amy[i].direction==2&&amy[i].directiontwo==4)

  continue;

 if(amy[i].direction==4&&amy[i].directiontwo==2)/*這里 4個(gè) if 是判斷有沒有往返走*/

  continue;

 if(amy[i].directiontwo==3&&(map[amy[i].x+1][amy[i].y]==3||map[amy[i].x+1][amy[i].y]==1||map[amy[i].x+1][amy[i].y]==2))

  continue;

 if(amy[i].directiontwo==1&&(map[amy[i].x-1][amy[i].y]==3||map[amy[i].x-1][amy[i].y]==1||map[amy[i].x-1][amy[i].y]==2))

  continue;

 if(amy[i].directiontwo==2&&(map[amy[i].x][amy[i].y+1]==3||m

 ap[amy[i].x][amy[i].y+1]==1||map[amy[i].x][amy[i].y+1]==2))

  continue;

 if(amy[i].directiontwo==4&&(map[amy[i].x][amy[i].y-1]==3||map[amy[i].x][amy[i].y-1]==1||map[amy[i].x][amy[i].y-1]==2))

  continue;/*以上 4 個(gè)是是否碰到了墻壁或者水什么的*/

 DrawBlack(amy[i].y,amy[i].x);/*把原來的地方擦掉*/

 amy[i].direction=amy[i].directiontwo;

 if(amy[i].direction==1)

 {amy[i].x--;amy[i].y=amy[i].y;}

 if(amy[i].direction==3)

 {amy[i].x++;amy[i].y=amy[i].y;}

 if(amy[i].direction==2)

 {amy[i].y++;amy[i].x=amy[i].x;}

 if(amy[i].direction==4)

 {amy[i].y--;amy[i].x=amy[i].x;}

 if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/

 lose=1;

 if(map[amy[i].x][amy[i].y]==5)/*敵人撞到老家*/

 lose=1;

 DrawAmy(amy[i].y,amy[i].x,i);/*畫敵人*/

 if(amy[i].fire.direction<0)

 amy[i].fireplay=random(4);

 if(amy[i].fireplay==1&&amy[i].fire.direction<0)/*發(fā)射*/

 {

  amy[i].fire.direction=amy[i].direction;/*子彈方向與敵人方向一致*/

  2004-8-20 00:42 回復(fù)

  c 閑人

 202 位粉絲

  5 樓

  amy[i].fire.x=amy[i].x;

  amy[i].fire.y=amy[i].y;

 }

 break;

  }

 }

 if(lose)/*因?yàn)槭《鲅h(huán)顯示失敗*/

  {GameOver();break;}

 if(GetKey(KEY_ESC))

  break;

 if(GetKey(KEY_UP))/*往上*/

  {

 if(Playone.direction==1&&map[Playone.x-1][Playone.y]!=1&&map[Playone.x-1][Playone.y]!=2)

 {

  if(map[Playone.x-1][Playone.y]==3)

 continue;

 DrawBlack(Playone.y,Playone.x);/*這個(gè) if 是移動(dòng),前提是方向與按下的到向一致*/

 Playone.x--;

 Playone.direction=1;

 DrawPlay(Playone.y,Playone.x);

 }

 else/*只調(diào)整炮頭方向*/

 {

  DrawBlack(Playone.y,Playone.x);

  Playone.direction=1;

  DrawPlay(Playone.y,Playone.x);

 }

  }

 else if(GetKey(KEY_DOWN))/*往下*/

  {

 if(Playone.direction==3&&map[Playone.x+1][Playone.y]!=1&&map[Playone.x+1][Playone.y]!=2)

 {

 if(map[Playone.x+1][Playone.y]==3)

 continue;

 DrawBlack(Playone.y,Playone.x);

 Playone.x++;

 Playone.direction=3;

 DrawPlay(Playone.y,Playone.x);

 }

 else

 {

  DrawBlack(Playone.y,Playone.x);

  Playone.direction=3;

  DrawPlay(Playone.y,Playone.x);

 }

  }

  if(GetKey(KEY_RIGHT))/*往右*/

  {

 if(Playone.direction==2&&map[Playone.x][Playone.y+1]!=1&&map[Playone.x][Playone.y+1]!=2)

 {

 if(map[Playone.x][Playone.y+1]==3)

 continue;

 DrawBlack(Playone.y,Playone.x);

 Playone.y++;

 Playone.direction=2;

 DrawPlay(Playone.y,Playone.x);

 }

 else

 {

  DrawBlack(Playone.y,Playone.x);

  Playone.direction=2;

  DrawPlay(Playone.y,Playone.x);

 }

  }

  if(GetKey(KEY_LEFT))/*往左*/

  {

 if(Playone.direction==4&&map[Playone.x][Playone.y-1]!=1&&ma

 p[Playone.x][Playone.y-1]!=2)

 {

 if(map[Playone.x][Playone.y-1]==3)

 continue;

 DrawBlack(Playone.y,Playone.x);

 Playone.y--;

 Playone.direction=4;

 DrawPlay(Playone.y,Playone.x);

 }

  else

 {

  DrawBlack(Playone.y,Playone.x);

  Playone.direction=4;

  DrawPlay(Playone.y,Playone.x);

 }

  }

 if(GetKey(KEY_SPACE))/*發(fā)射子彈*/

  {

 for(i=0;i<5;i++)/*用循環(huán)來找是否有子彈可以用*/

  if(Playone.fire[i].direction<0)

 {

  sound(300);

  Playone.fire[i].direction=Playone.direction;/*子彈方向與坦克方向一致*/

  Playone.fire[i].x=Playone.x;

  Playone.fire[i].y=Playone.y;

  break;/*找到后就跳出循環(huán)*/

 }

  }

  if(map[Playone.x][Playone.y]==5)/*玩家自己撞到老家*/

 lose=1;

  for(i=0;i<5;i++)/*判斷是否因自己控制撞到敵人*/

  {

  if(amy[i].direction<0)

 continue;

  if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/

 lose=1;

  }

  if(lose)/*因?yàn)槭《鲅h(huán)顯示失敗*/

  {GameOver();break;}

  t++;/*加到一定的程序就出現(xiàn)新的敵人*/

  if(t==30) /*到了增加敵人的時(shí)候*/

  {t=0;

 for(i=0;i<5;i++)

 if(amy[i].direction<0)

 {

  amy[i].direction=amy[i].directiontwo=3;

  amy[i].x=1;

  amy[i].y=random(3);/*方向隨機(jī)*/

  if(amy[i].y==0)

  amy[i].y=1;

  else if(amy[i].y==1)

  amy[i].y=9;

  else/*這里和上面的兩個(gè)判斷是判斷敵人的初始位置*/

  amy[i].y=18;

  amy[i].color=random(3)+12;/*顏色隨機(jī)*/

  DrawAmy(amy[i].y,amy[i].x,i);

  break;/*找到一個(gè)后就出循環(huán)*/

  }

 }

  }

 }

 #include "graphics.h"

 #include "stdlib.h"

 #include "dos.h"

 #include "bios.h"

 #define LEFT 0x4b00

 #define RIGHT 0x4d00

 #define DOWN 0x5000

 #define UP 0x4800

 #define ESC 0x011b

 #define ENTER 0x1c0d

 /*2 墻壁,1 可以移動(dòng)地方,3 自己,4 敵人*/

 int a[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,

  2,1,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2,

  2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2,

  2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2,

  2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,

  2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2,

  2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,

  2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2,

  2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2,

  2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2,

  2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,

  2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2,

  2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2,

  2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,

 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*數(shù)組就是地圖*/

 struct play /*游戲中人物的結(jié)構(gòu)體*/

 {

  int x;

  int y;

 };

 struct play you,them[5];

 int sum=0;/*統(tǒng)計(jì)吃的豆子個(gè)數(shù),吃滿 50 顆就算勝利*/

 int xx[5][2];/*判斷敵人方向用的結(jié)構(gòu)體*/

 int false=0;

 void TimeDelay(unsigned long microsec) /*延時(shí)函數(shù) 傳入微秒數(shù)*/

 {

  union REGS r;

  r.h.ah=0x86;

  r.x.cx=microsec>>16;

  r.x.dx=microsec;

  int86(0x15,&r,&r);

 }

 drawblackdou(int x,int y)/*吃豆子的函數(shù)*/

 {

  setcolor(0);

  circle(100+y*20,100+x*20,3);

  sum++;/*吃到豆子后就加一*/

  a[x][y]=1;/*吃到后這里就成為普通平地*/

 }

 begain()/*開始函數(shù)*/

 {int i,j;

  sleep(1);

  for(i=0;i<15;i++)

 for(j=0;j<20;j++)

  if(a[i...

推薦訪問: 如何用 編寫 語言

【如何用C語言編寫游戲】相關(guān)推薦

工作總結(jié)最新推薦

NEW