當前位置:首頁 » 編程語言 » c語言課程設計游戲

c語言課程設計游戲

發布時間: 2022-04-21 16:32:33

c語言程序設計課程設計撲克牌游戲,怎麼做

#include<conio.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int jisuan(int);
int comptotal;
char s1[]="A234567890JQK";
//char s2[4][5]={"紅桃","黑桃","草花","方塊"};
char s2[4]={3,4,5,6};
int poke[52];
int ch;
int win=0;
int computer[5],user[5];
int usertotal;
int users;
int k;
int main()
{ void xipai(int poke[]);
void ai();
int i,j;
////////////////////////////////////////////////////////上面是變數和聲明
printf("\n這是簡單的廿一點游戲:\n");
for(i=0;i<52;i++)
{
if(i%13==0)putchar('\n');
poke[i]=i;
printf("%c%c%c ",s2[i/13],s1[i%13]=='0'?'1':' ',s1[i%13]);
}
putchar('\n');

/////////////////////////////////////////////////////////主代碼
k=0;
xipai(poke);
while(ch!=27)
{ comptotal=0;
usertotal=0;
if(k>=42)
{
printf("\n剩餘牌數不足十張,重新洗牌");
xipai(poke);
k=0;
}

printf("\n\n\n\n\n\n\n\n新局開始:\n");
printf("現在共有牌%2d張\n",52-k);
if(win==0)
{
computer[0]=k++;
user[0]=k++;
printf("\n電腦做莊,要牌:");
ai();
}
else
{
printf("\n玩家做莊,要牌:\n\t回車要牌\n\t空格過牌");
user[0]=k++;
computer[0]=k++;
}

printf("\n玩家開始要牌:\n");
usertotal=jisuan(poke[user[0]]);
printf("%c%c%c 共%2d點\t",s2[poke[user[0]]/13],s1[poke[user[0]]%13]=='0'?'1':' ',s1[poke[user[0]]%13],usertotal);
users=0;
ch=1;
while(ch!=32&&users<4)
{
ch=getch();
switch(ch)
{
case 27:
goto end;
break;
case 32:
break;
case 13:
user[++users]=k;
usertotal+=jisuan(poke[user[users]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d點\t",s2[poke[k]/13],s1[poke[k]%13]=='0'?'1':' ',s1[poke[k]%13],usertotal);

k++;
if(usertotal>=21)ch=32;
break;
default:
break;
}
}
if(win==1)
{
printf("\n電腦開始要牌:\n");
ai();
}
printf("\n\n\n玩家的點數是%2d",usertotal);
printf("\n電腦的點數是%2d",comptotal);
printf("\n\n本局結算:");
if(comptotal>21&&usertotal<=21)
{
printf("\n\n電腦爆牌了");
win=1;
printf("\n恭喜,你贏了");
}

if(usertotal>21&&comptotal<=21)
{
printf("\n\n你爆牌了");
printf("\n下次小心點");
win=0;
}
if(usertotal>21&&comptotal>21)
{
printf("\n\n你們兩個,怎麼都這么不小心啊,都撐死了還要嗎");
}
if(usertotal<=21&&comptotal<=21)
{
if(usertotal>comptotal)
{
win=1;
printf("\n\n不錯,你贏了");
}
else if(usertotal<comptotal)
{
win=0;
printf("\n\n撐死膽大的,餓死膽小的,沒膽子,輸了吧");
}
else
printf("\n\n平了,算你走運");
}
getch();
}
end:
return 0;
}
void xipai(int poke[])
{
int y,tmp,i,j;
for(j=0;j<7;j++)
for(i=0;i<52;i++)
{
srand(time(0));
y=rand()%10;
tmp=poke[i];
poke[i]=poke[(y*i*i)%52];
poke[(y*i*i)%52]=tmp;
}

}
///////////////////////////////////////////////子函數
void ai()
{
int i;
comptotal=jisuan(poke[computer[0]]);
printf("\n%c%c%c 共%2d點\t",s2[poke[computer[0]]/13],s1[poke[computer[0]]%13]=='0'?'1':' ',s1[poke[computer[0]]%13],comptotal);
for(i=0;i<4;i++)
{
if(comptotal<17)
{
computer[i+1]=k++;
comptotal+=jisuan(poke[computer[i+1]]);
printf("\b\b\b\b\b\b\b\b\b%c%c%c 共%2d點\t",s2[poke[computer[i+1]]/13],s1[poke[computer[i+1]]%13]=='0'?'1':' ',s1[poke[computer[i+1]]%13],comptotal);
}
}
}

int jisuan(int i)
{int dian;
switch(i%13)
{
case 0:
case 10:
case 11:
case 12:
dian=1;
break;
default:
dian=i%13+1;
}
return dian;
}

Ⅱ C語言程序設計課程設計掃地雷游戲,怎麼做

#include <stdlib.h>
#include <time.h>
#include <conio.h>
/************************************************************************/
/* 地圖狀態約定 */
/* 0 : 周圍9個格子都沒有雷 */
/* 1~8: 周圍9個格子有1~8個雷 */
/* -1 : 有雷的格子 */
/* -2 : 被翻開的有雷的格子 */
/* -3 : 地圖邊界 */
/************************************************************************/
int Map[12][12]={0}; /* 當前在玩的雷圖 */
int MapShow[12][12]={0}; /* 當前用戶選擇過的地方,即「已翻開」的格子 */
int nSpaceLeft = 100; /* 剩餘的空白數,如果為0,則任務成功! */
int lastX,lastY; /* 失敗時,記錄挖到雷的位置 */

int AllMaps[5][12][12]={0}; /* 供用戶選擇的五張雷圖 */
/* 顯示雷區(每次用戶操作之後都要重新顯示) */
void DrawMap();
/* 初始化雷區 */
void InitMap();
/* 游戲開始時,載入用戶選擇的一幅雷圖 */
void LoadMap(int index);
/* 玩掃雷游戲 */
int Play();
/* 繪制主菜單 */
void DrawMainMenu();
/* 顯示結果 */
void ShowResult(int result);
/* 主函數 */
int main(int argc, char* argv[])
{
char ch;
int result;
srand(time(NULL)); /* 按當前時間初始化隨機數,這樣每次啟動的時候,雷的位置的不一樣 */
InitMap(); /* 初始化5張雷圖,供用戶選擇 */
while(1) /* 用while循環,保證只有在用戶選擇退出時,才退出遊戲 */
{
DrawMainMenu(); /* 繪制主菜單 */
flushall(); /* 清空所有輸入輸出緩沖區,主要是清空輸入緩沖區,防止前面的輸入對getch()的干擾 */
ch = getch(); /* 讀取輸入 */
switch(ch)
{
case '1': /* 用戶選擇1 */
printf("\n\t請輸入雷圖編號(1-5):");
while (1) /* 循環輸入,如果輸入錯誤就一直要求輸入 */
{
flushall();
ch = getch(); /* 讀取用戶輸入的雷圖編號 */
if (ch >= '1' && ch <= '5') /* 只有在1-5之間有效 */
{
LoadMap(ch-'1'); /* ch -'1',將用戶輸入轉換為雷圖下標(下標從0開始,所以是-'1')*/
break; /* 如果輸入正確,就退出循環輸入 */
}
else
{
/* 輸入錯誤,則提示重新輸入 */
printf("\n\t輸入無效!請重新輸入雷圖編號(1-5):");
flushall();
}
}
result = Play(); /* 開始玩掃雷游戲 */
ShowResult(result); /* 顯示游戲結果 */
break;
case '2': /* 用戶選擇2 */
exit(0); /* 直接退出 */
break;
default: /* 無效輸入 */
/* 不做任何操作,重新顯示主菜單 */
break;
}
}
return 0;
}
void LoadMap(int index)
{
int i,j;
nSpaceLeft = 90;
for(i=0;i<12;i++)
for(j=0;j<12;j++)
{
Map[i][j] = AllMaps[index][i][j]; /* 將5張雷圖中的下標為index的那一張載入到Map數組 */
MapShow[i][j] = 0; /* 重新開始游戲,所以所有格子都是「未翻開」狀態 */
}
}
void InitMap()
{
int i,j,k;
int m,n;
/* 要初始化5張地圖 */
for(k=0;k<5;k++)
{
/* 初始化地圖的邊界 */
for(i=0;i<12;i++)
{
/* 下標為0和11的位置都是「邊界」,這些位置不屬於雷區,僅在程序內部使用 */
AllMaps[k][0][i] = -3;
AllMaps[k][11][i] = -3;
AllMaps[k][i][0] = -3;
AllMaps[k][i][11] = -3;
}
/* 先初始化10個雷的位置 */
for(i=0;i<10;i++)
{
m = rand()%10 + 1; /* 隨機選一個X坐標 */
n = rand()%10 + 1; /* 隨機選一個Y坐標 */
if(AllMaps[k][m][n] == 0) /* 如果隨機產生的位置之前沒有被安排放置雷 */
{
AllMaps[k][m][n] = -1; /* 放置一個雷 */
}
else /* 隨機產生的位置在之前已經放置了雷了 */
{
i--; /* 這個位置無效,重新產生一個 */
}
}
/* 計算每個格子周圍雷的個數 */
for(i=1; i<11; i++)
for(j=1; j<11;j++)
{
if(AllMaps[k][i][j] != -1)
{
AllMaps[k][i][j] = 0;
/* 周圍的8個位置,有一個雷就加一 */
/************************************************************************/
/* 坐標[i][j]周圍的8個坐標位置: */
/* [i-1][j-1] [i-1][j] [i-1][j+1] */
/* [i][j-1] [i][j] [i][j+1] */
/* [i+1][j-1] [i+1][j] [i+1][j+1] */
/************************************************************************/
if(AllMaps[k][i-1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j+1] == -1)
AllMaps[k][i][j]++;
}
}
}
}
void DrawMap()
{
int i,j;
system("cls"); /* 清屏 */
/* 繪制坐標和邊框 */
printf("\n\n\n");
printf("\t Y ");
for(i=1; i<11; i++) printf("%-02d",i-1);
printf("\n\tX |###################|\n");
/* 每一行按規則繪制雷區 */
for(i=1; i<11; i++)
{
printf("\t%-02d|",i-1); /* 顯示X坐標 */
for(j=1; j<11; j++)
{
if(MapShow[i][j]) /* 如果該位置被用戶「挖開」了,就照實顯示 */
{
if (Map[i][j] >= 0) /* 非雷,顯示周圍雷的個數 */
{
printf("%d|",Map[i][j]);
}
/*else if(Map[i][j] == 0)
{
printf("0|");
}*/
else if (Map[i][j] == -1) /* 雷,顯示* */
{
printf("*|");
}
else if (Map[i][j] == -2) /* 用戶挖到的雷,顯示@ */
{
printf("@|");
}
else /* 其他情況(目前不會出現,方便以後擴展) */
{
printf(" |");
}
}
else /* 如果該位置沒有被用戶「挖開」,則顯示空格 */
{
printf(" |");
}
}
printf("\n");
}
printf("\t |###################|\n");
}
void DrawMainMenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t|###################|\n");
printf("\t| 請選擇! |\n");
printf("\t| 1. 開始掃雷 |\n");
printf("\t| 2. 退出 |\n");
printf("\t|###################|\n");
}
int Play()
{
char chX,chY; /* 用戶輸入 */
int X,Y; /* 用戶輸入轉換為整數下標 */
int i,j;
while (1)
{
DrawMap(); /* 重新繪制雷區圖 */
/* 輸入X坐標 */
printf("\n\t請輸入X:");
flushall();
while(1)
{
chX = getch();
if (chX >= '0' && chX <= '9')
{
X = chX - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入X:");
flushall();
}
}
/* 輸入Y坐標 */
printf("\n\t請輸入Y:");
flushall();
while(1)
{
chY = getch();
if (chY >= '0' && chY <= '9')
{
Y = chY - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入Y:");
flushall();
}
}
if(MapShow[X][Y] == 0) /* 輸入的是未翻開的位置 */
{
MapShow[X][Y] = 1; /* 將該位置標記為「已翻開」 */
if(Map[X][Y] == -1) /* 如果挖到的是雷 */
{
Map[X][Y] = -2; /* 標記為-2,表示這是被用戶挖到的雷 */
for(i=1;i<11;i++)
for(j=1;j<11;j++)
MapShow[i][j]=1; /* 游戲結束,自動將所有位置「翻開」 */
/* 記錄用戶挖到雷的位置坐標 */
lastX = X-1;
lastY = Y-1;
return 0; /* 游戲失敗! */
}
else /* 如果挖到的不是雷 */
{
nSpaceLeft--; /* 剩餘空白數減一 */
if(nSpaceLeft==0) /* 剩餘空白數為0,則表示游戲成功 */
{
return 1; /* 游戲勝利! */
}
}
}
else /* 輸入的是已翻開的位置 */
{
printf("\n\t你輸入的位置是[%d,%d]\n\t這個位置已經翻開!請重新輸入!\n\t按任意鍵繼續...\n",X-1,Y-1);
flushall();
getch();
}
}
}
void ShowResult( int result )
{
DrawMap();
if(result == 1) /* 游戲成功 */
{
printf("\n\t恭喜!您完成的掃雷任務!\n\t按任意鍵繼續...");
flushall();
getch();
}
else /* 游戲失敗 */
{
printf("\n\t哈哈!您在位置[%d,%d]挖到雷了,任務失敗!\n\t按任意鍵繼續...",lastX, lastY);
flushall();
getch();
}
}

Ⅲ 如何用C語言製作游戲

你可以先去【繪學霸】網站找「游戲設計/游戲製作」板塊的【免費】視頻教程-【點擊進入】完整入門到精通視頻教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=307&zdhhr-11y04r-1818074554951406228

想要系統的學習可以考慮報一個網路直播課,推薦CGWANG的網路課。老師講得細,上完還可以回看,還有同類型錄播課可以免費學(贈送終身VIP)。

自製能力相對較弱的話,建議還是去好點的培訓機構,實力和規模在國內排名前幾的大機構,推薦行業龍頭:王氏教育。
王氏教育全國直營校區面授課程試聽【復制後面鏈接在瀏覽器也可打開】: www.huixueba.com.cn/school/3dmodel?type=2&zdhhr-11y04r-1818074554951406228

在「游戲設計/游戲製作」領域的培訓機構里,【王氏教育】是國內的老大,且沒有加盟分校,都是總部直營的連鎖校區。跟很多其它同類型大機構不一樣的是:王氏教育每個校區都是實體面授,老師是手把手教,而且有專門的班主任從早盯到晚,爆肝式的學習模式,提升會很快,特別適合基礎差的學生。

大家可以先把【繪學霸】APP下載到自己手機,方便碎片時間學習——繪學霸APP下載: www.huixueba.com.cn/Scripts/download.html

Ⅳ c語言課程設計死亡游戲

josephus.c
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define ERROR -1

typedef int ElemType; //聲明元素類型
typedef struct Node
{
ElemType data;
struct Node * next;
} Node;
typedef struct Node *LinkList;

int InitializeList(LinkList);
int TraverseList(LinkList L);

/*使用循環鏈表,求解約瑟夫問題*/
int main(int argc,char *argv[])
{
printf("********Main*********************************\n");

Node L;
L.next=&L;
InitializeList(&L); //初始化循環鏈表
TraverseList(&L); //求解約瑟夫問題
exit(0);
}

int InitializeList(LinkList L)
{
LinkList p,current;
current=L;
int i;
for(i=0;i<41;i++) //初始化41個結點
{
p=(LinkList)malloc(sizeof(Node));
p->data=i+1;
p->next=L;
current->next=p;
current=p;
}
}

int TraverseList(LinkList L)
{
LinkList p=L,tmp;
int i=1;
while(p->next!=p) //自己指向了自己,說明循環鏈表除了空的頭結點外,就只剩一個結點了。
{
if(i%3==0) //數到3,這個人就要被咔嚓掉了
{
printf("%d,",p->next->data);
tmp=p->next;
p->next=p->next->next;
free(tmp);
}
else
{
p=p->next;
}
i++;
if(p->next==L) //循環鏈表的頭,是個空節點,所以要跳過它。
{
p->next=L->next;
}
}
printf("%d,\n",p->data); //把最後一個結點的值輸出,即最後一個倖存者
free(p);
return TRUE;
}

Ⅳ C語言課程設計

//我以前的作業

游戲說明
1.開始游戲
1)系統隨機產生一位不重復的N位數字。N的大小與等級有關。
初級:N=3 中級:N=4 高級:N=5
2)游戲者輸入所猜的不重復數字,並按回車提交。提交的數據
數應與N的大小一致,當數據位數大於N時,只取前N位。
3)系統將提交的數與它自動產生的數進行比較,輸出結果「*A*B」形式。其中A代表數字正確相應位置也正確,B代表數字正確但位置不正確。如:1A3B表示游戲者有1個數字的位置正確且數值也正確,除此以外,游戲者還猜對了3個數字,但位置不對,即游戲者已經猜出4位數據,但有3個數據位置不對!
4)游戲者有限定次數的猜測機會,在規定次數內完成,則游戲成功,否則,游戲失敗。其中,猜測次數與等級有關:
初級:10次 中級:9次 高級:8次。
5)按完成游戲所用的時間和次數計算游戲者所得分數,游戲等級越高,猜測所用的次數越少,得分越高!若游戲者得分比系統已經保存的分數的高,將提示要求輸入游戲者信息,並且保存在最佳排行之中。
2.等級設置
6)游戲者可以自行設置游戲等級:初級,中級和高級。
3.最佳排行
在最佳排行中,游戲者可以查看當前游戲的最佳排行。
4.游戲說明
在游戲說明中,游戲者可以查看游戲規則。

三.總體設計
本課程設計對模塊設計的要求如下:
(1)要求使用多文件方式實現設計;
(2)要求在各個文件內實現結構化設計;
(3)每個模塊作為一個單獨的C文件,每個文件內的函數如表所示,表中給出了各個函數的功能說明。
(4)宏和數據結構等放在頭文件中,並使用條件編譯
(1)文件及函數組成
源文件 函數名或其他成分 功能
record.h
ASK 宏定義
結構聲明 結構聲明
庫函數及函數原型聲明
game_ control.c Game_rank 設置游戲等級
Game_explain 輸出遊戲說明
game_ register.c Tiptop_record 記錄最高分
Tiptop_output 輸出最佳排行
game.c Game_main 開始游戲中心
Build_number 獲取系統隨機數字
Game_in_out 獲取游戲者數據和輸出結果
Time_command 時間控制
Game_result 游戲結果處理輸出
record.c main 主函數
Menu_select 選擇菜單
manage_menu 處理菜單

(2)函數設計
1.頭部文件
文件名稱:record.h
功 能:聲明函數原型,包含文件及自定義宏和數據結構。
要 求:報告是否能正常打開文件執行操作。
2. 設置游戲等級函數
函數原型:void Game_rank(void)
功 能:可由游戲者自行設置游戲等級
參 數:void
返 回 值:void
要 求:如果游戲者沒有進行等級設定,則默認初級進行游戲。
3. 輸出遊戲說明函數
函數原型:void Game_ explain()
功 能:輸出遊戲規則說明
參 數:void
返 回 值:void
要 求:說明游戲相應的按鍵,保證游戲者按照說明。
4. 記錄最高分函數:
函數原型:void Tiptop_register(int)
功 能:把從Get_player函數得到的游戲者信息和游戲的積分信息一同保存到指定路徑的Tiptop_register.dat文件中
參 數:int S;S為游戲積分
返 回 值:void
要 求:要求把Tiptop1.txt(初級最高分) Tiptop2.txt(中級最高分) Tiptop3.txt(高
級最高分)原來有的信息替換為現在的信息,並且只有積分大於原有信息的第
十名,才會被以替換的方式記錄;並且是降序的方式排列的。
5. 輸出最佳排行函數:
函數原型:void Tiptop_out()
功 能:輸出最佳排行信息
參 數:void
返 回 值:void
要 求:沒有信息的時候輸出提示,有信息時按降序排列輸出全部信息。
6. 開始游戲中心函數
函數原型:void Game_main()
功 能:調用Time_ control 、Build_number等函數,進行游戲的整體控制
參 數:void
返 回 值:void
要 求:注意函數的完整性,保證游戲順利進行,注意沒有設置等級時候,默認C=1!
7. 獲取系統隨機數字函數
函數原型:int *Build_number()
功 能:系統調用<time.h>文件,利用srand((unsigned) time(&)產生1個N位隨機數字,供游戲者猜測
參 數:void
返 回 值:int 8=*i:指向產生的隨機數字構成的數組的指針
要 求:產生的數字是隨機的,並且是不重復的,總共產生N(依據游戲等級而定)位數字,組成數組[初級為3個數字]。
8. 獲取游戲者游戲數據和輸出遊戲進程結果函數
函數原型:void Course_in_out()
功 能:把游戲者猜的數據讀入內存,並且分析得出結果,並輸出結果
參 數:void
返 回 值:void
要 求:用A或B的代碼表示本次的結果,其中A表示數值對位置也對,B表示數值對,但位置錯了!每次得到游戲者的猜測數據都要分析得出結果並輸出結果,以便游戲者的下一次猜測。
9. 時間控制函數
函數原型:int Time_ control()
功 能:利用<dos.h>和<time.h>文件,得到玩游戲的總時間,計算游戲積分。
參 數:void
返 回 值:int Time:游戲前後的時間差異
要 求:得到的時間是以秒為單位,數據是整型數據。
10. 游戲結果處理輸出函數
函數原型:void Game_result(int m )
功 能:計算,得出最後游戲積分
參 數:int m:整個游戲的時間
返 回 值:void
要 求:按照游戲等級,設置不同的游戲積分方式。
11. 主函數:
函數原型:void main()
功 能:調用各個子函數,實現整體程序的運行
參 數:void
返 回 值: void
要 求:控制整個游戲的順利進行。
12. 選擇菜單函數:
函數原型:void Menu_select()
功 能:得到Handle_menu的返回值,由一個switch語句選擇開始,等級,最佳排行,游戲說明,結束等菜單操作。
參 數:void
返 回 值:void
要 求:由Handle_menu得到數據可循環得到,直到得到數字5時,選擇退出菜單,方可退出遊戲,否則一直循環程序!
13. 處理菜單函數:
函數原型:int Handle_menu()
功 能:輸出菜單選擇提示,並由cin語句實現游戲者的輸入,輸入選擇相應菜單對應的菜單序號,並把相應的值傳給Menu_select函數
參 數:void
返 回 值:int n:選擇相應菜單的菜單序號
要 求:輸入的值不是相應的菜單的序號時返回0值,否則返回遊戲者的輸入值,以選擇相應菜單。

四.程序代碼
1. record.h
#include"time.h"
#include<dos.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//結構體
#define MAXSIZE 20
typedef long int ElemType; //定義結構體tiptop,存放游戲者的最高分等信息
typedef struct tiptop
{
ElemType data;
char name[MAXSIZE];
char grade[MAXSIZE];
int year;
int month;
int day;
char week[MAXSIZE];
int hour;
int minute;
int second;
}tiptop;
//全局變數
int C; //C為等級設置變數
//函數聲明
void Menu_select(); //選擇菜單函數
int manage_menu(); //處理菜單函數
void Tiptop_record(int); //記錄最高分函數
void Tiptop_output(); //輸出最佳排行函數
void Game_rank(); //設置游戲等級函數
void Game_explain(); //輸出遊戲說明函數
void Game_main(); //開始游戲中心函數
int *Build_number(); //獲取系統隨機數字函數
void Game_in_out(); //獲取游戲數據和輸出遊戲進程結果函數
int Time_command(); //時間控制函數
void Game_result(int); //游戲結果處理輸出函數

2. game_ control.c
#include"record.h"
//**********************
// 設置游戲等級函數
//**********************
void Game_rank()
{
FILE *fp;
printf("\t******************************\n");
printf("\t************1:初級************\n");
printf("\t************2:中級************\n");
printf("\t************3:高級************\n");
printf("\t******************************\n");
printf("\t請選擇游戲等級:\t");
loop:
scanf("%d",&C);
if(C<1||C>3)
{
printf("\t輸入有誤!請重新輸入:\t");
goto loop;
}
if((fp=fopen("C.txt","w"))==NULL)
{
printf("打開C.txt文件失敗!");
exit(1);
}
fwrite(&C,sizeof(int),1,fp);
fclose(fp);
if(C==1)
printf("\t等級設置為初級!\n");
if(C==2)
printf("\t等級設置為中級!\n");
if(C==3)
printf("\t等級設置為高級!\n");
printf("\n");

}
//****************
//輸出遊戲說明函數
//****************
void Game_explain()
{
printf("游戲說明:\n");
printf("\t**********************************************************\n");
printf("\t**********************************************************\n");
printf("\t①:游戲開始,系統隨機產生一位不重復的N位數字。N的大小與等級\n");
printf("\t有關:\n");
printf("\t初級:N=3\t中級:N=4\t高級:N=5\t\n");
printf("\t②:游戲者輸入所猜的不重復數字,並按回車提交。\n");
printf("\t提交的數據位數應與N的大小一致,當數據位數大於N時,只取前N位;\n");
printf("\t③:系統將提交的數與它自動產生的數進行比較,輸出結果\n");
printf("\t「*A*B」形式。其中A代表數字正確相應位置也正確,B代\n");
printf("\t表數字正確但位置不正確。如:1A3B表示游戲者有1個數字的位置\n");
printf("\t正確且數值也正確,除此以外,游戲者還猜對了3個數字,但位置不\n");
printf("\t對,即游戲者已經猜出4位數據,但有3個數據位置不對!\n");
printf("\t④:游戲者有限定次數的猜測機會,在規定次數內完成,\n");
printf("\t則游戲成功。否則,游戲失敗。其中,猜測次\n");
printf("\t數與等級有關:\n");
printf("\t初級:10次\t中級:9次\t高級:8次。\t\n");
printf("\t⑤:按完成游戲所用的時間和次數計算游戲者所得分數,\n");
printf("\t游戲等級越高,猜測所用的次數越少,得分越高!\n");
printf("\t若游戲者得分比系統已經保存的分數的高,將提示要求\n");
printf("\t輸入游戲者信息,並且保存在最佳排行之中。\n");
printf("\t⑥:游戲者可以自行設置等級!\n");
printf("\t**********************************************************\n");
printf("\t**********************************************************\n");
printf("\n");
}
3. game_ register.c
#include"record.h"
//**************
//記錄最高分函數
//**************
void Tiptop_record(int S)
{
FILE *fp;
tiptop n;
char *week[]={"星期天","星期一","星期二","星期三","星期四","星期五",
"星期六"};
time_t timep;
struct tm *t;
printf("\t恭喜您!\n");
printf("\t您獲得本游戲的最高分!\n");
//獲取名字
printf("\t請輸入您的姓名:");
printf("\t");
scanf("%s",n.name);
//獲取時間
time(&timep);
t=gmtime(&timep);
t->tm_year=1900+t->tm_year;
t->tm_mon=1+t->tm_mon;
t->tm_hour=8+t->tm_hour;
n.year=t->tm_year;
n.month=t->tm_mon;
n.day=t->tm_mday;
strcpy(n.week,week[t->tm_wday]);
n.hour=t->tm_hour;
n.minute=t->tm_min;
n.second=t->tm_sec;
//獲取等級
if(C==1)
strcpy(n.grade,"初級");
if(C==2)
strcpy(n.grade,"中級");
if(C==3)
strcpy(n.grade,"高級");
//獲取分數
n.data=S;
if(C==1)
{
if((fp=fopen("tiptop1.txt","w"))==NULL)
{
printf("\t打開tiptop1.txt文件失敗!");
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==2)
{
if((fp=fopen("tiptop2.txt","w"))==NULL)
{
printf("\t打開tiptop2.txt文件失敗!");
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==3)
{
if((fp=fopen("tiptop3.txt","w"))==NULL)
{
printf("\t打開tiptop3.txt文件失敗!");
exit(1);
}
fwrite(&n,sizeof(struct tiptop),1,fp);
fclose(fp);
}
}
//****************
//輸出最佳排行函數
//****************
void Tiptop_output()
{
int i;
FILE *fp;
tiptop p,q,r;
if((fp=fopen("tiptop1.txt","r"))==NULL)
{
printf("還沒有最佳排行!");
exit(1);
}
fread(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen("tiptop2.txt","r"))==NULL)
{
printf("還沒有最佳排行!");
exit(1);
}
fread(&q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen("tiptop3.txt","r"))==NULL)
{
printf("還沒有最佳排行!");
exit(1);
}
fread(&r,sizeof(struct tiptop),1,fp);
fclose(fp);
if(p.data==0&&q.data==0&&r.data==0)
{
printf("\t暫無最高分信息!");
printf("\n");
printf("\t是否直接進入游戲?刷新最佳排行信息?\n");
printf("\t1:是\t2:否\n");
printf("\t");
i=0;
scanf("%d",&i);
if(i==1)
{
printf("\t請設置游戲等級: \n");
Game_rank();
Game_main();
}
else
Menu_select();
}
else
{
printf("\t最佳排行:\n");
printf("\t等級\t姓名\t分數\t游戲時間\n");
if(p.data!=0)
{
printf("\t%s\t%s\t%d\t",p.grade,p.name,p.data);
printf("%d—%d—%d\t",p.year,p.month,p.day);
printf("%s\t%d:%d:%d\n",p.week,p.hour,p.minute,p.second);
}
if(q.data!=0)
{
printf("\t%s\t%s\t%d\t",q.grade,q.name,q.data);
printf("%d—%d—%d\t",q.year,q.month,q.day);
printf("%s\t%d:%d:%d\n",q.week,q.hour,q.minute,q.second);
}
if(r.data!=0)
{
printf("\t%s\t%s\t%d\t",r.grade,r.name,r.data);
printf("%d—%d—%d\t",r.year,r.month,r.day);
printf("%s\t%d:%d:%d\n",r.week,r.hour,r.minute,r.second);
}
if(p.data==0)
printf("\t初級暫無最高分信息!\n");
if(q.data==0)
printf("\t中級暫無最高分信息!\n");
if(r.data==0)
printf("\t高級暫無最高分信息!\n");

//重置最佳排行榜
if(p.data!=0&&q.data!=0&&r.data!=0)
{
printf("\t是否重置最佳排行?\n");
printf("\t1:是\t2:否\t");
i=0;
scanf("%d",&i);
if(i==1)
{
p.data=0;
q.data=0;
r.data=0;
if((fp=fopen("tiptop1.txt","w"))==NULL)
{
printf("打開tiptop1.txt文件失敗!");
exit(1);
}
fwrite(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen("tiptop2.txt","w"))==NULL)
{
printf("打開tiptop2.txt文件失敗!");
exit(1);
}
fwrite(&q,sizeof(struct tiptop),1,fp);
fclose(fp);
if((fp=fopen("tiptop3.txt","w"))==NULL)
{
printf("打開tiptop3.txt文件失敗!");
exit(1);
}
fwrite(&r,sizeof(struct tiptop),1,fp);
fclose(fp);
}
}
}
}

4.game.c
#include"record.h"

//全局變數
int *c1; //產生的數保存在指針c中
int A,B; // AB均為游戲重要參數
int N; //NUM為需要猜測的數據個數
int TIME; //TIME為猜數字共有的次數
long int S; //S為游戲積分
//****************
//開始游戲中心函數
//****************
void Game_main()
{
FILE *fp;
int time;
if((fp=fopen("C.txt","r"))==NULL)
{
printf("打開C.txt文件失敗!");
printf("\n");
exit(1);
}
fread(&C,sizeof(int),1,fp);
N=C+2;
TIME=11-C;
if(C==1)
{
printf("\t游戲等級為:初級!\n");
}
if(C==2)
{
printf("\t游戲等級為:中級!\n");
}
if(C==3)
{
printf("\t游戲等級為:高級!\n");
}
printf("\t需要猜測的數字位數數為:%d,共有%d次猜測機會!",N,TIME);
printf("\n");
time=Time_command();
Game_result(time);
}
//********************
//獲取系統隨機數字函數
//********************
int *Build_number()
{
int i,j,m;
time_t t;
c1=(int *)malloc(N*sizeof(int));
if(c1==NULL)
{
printf("分配內存錯誤!\n");
printf("\n");
exit(1);
}
srand((unsigned) time(&t));
for(i=0;i<N;i++)
{
m=rand()%10; //產生一個數字
if(i==0)
*c1=m;
else
{
for(j=0;j<i;j++)
{
if(m==*(c1+j)//若原有數據之中已經有了與m相同的數字,則重新產生數字
{
i--;
break;
}
*(c1+i)=m;
}
}
}
printf("\t系統產生的數據為:");
for(i=0;i<N;i++)
printf("*");
printf("\n");
printf("\t您可以開始游戲! 計時開始...\n");
printf("\t不能有重復的數字!\n");
printf("\t數字中間用空格隔開\n");
return c1;
}
//****************************************
//獲取游戲者游戲數據和輸出遊戲進程結果函數
//****************************************
void Game_in_out()
{
int i,j,m;
int n; //游戲者猜測的數字
int a[5]; //游戲者猜測的數據構成的數組
int c[5];
int *p;
p=Build_number();
for(i=0;i<N;i++)
{
c[i]=*(p+i);
}
for(m=0;m<TIME;m++)
{
if(m==(TIME-1))
{
printf("\t**請注意:**\n");
printf("\t**僅剩下一次機會了!**\n");
printf("\t**努力!加油!**\n");
}
printf("\t請輸入第%d次猜測的數字:\t",m+1);
for(j=0;j<N;j++)
{
scanf("%d",&n);
a[j]=n;
}
A=0;
B=0;
for(i=0;i<N;i++)
{
if(a[i]==c[i])
A++;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(a[i]==c[j]&&i!=j)
B++;
}
}
printf("\t您本次猜測的結果為:\t");
printf("%d A %d B",A,B);
printf("\n");
//游戲成功控制退出猜測程序
if(A==N)
{
m=TIME;
}
}

//TIME改變,記錄游戲總次數的數據
TIME=i;
free(c1);
}
//************
//時間控制函數
//************
int Time_command()
{
int a; //游戲時間
time_t first, second;
first=time(NULL); //獲取系統時間
Game_in_out();
second=time(NULL); //再次獲取系統時間
a=(int)difftime(second,first);
return a;
}
//********************
//游戲結果處理輸出函數
//********************
void Game_result(int m)
{
FILE *fp;
tiptop p;
time_t t;
int S;
int n;
int i=0;
int minute,second;
if(A!=N)
{
S=0;
printf("\tGame over!\n");
printf("\t您本次游戲的積分為:\t%d",S);
printf("\t繼續努力!\n");
printf("\t是否繼續游戲?\n");
printf("\t1:是\t\t\t2:否");
printf("\n");
scanf("%d",&i);
if(i==1)
Game_main();
else
Menu_select();
}
else
{
printf("\t恭喜您游戲成功!");
printf("\n");
minute=m/60;
second=m%60;
printf("\t您本次游戲所用時間為:");
printf("%d分鍾%d秒\n",minute,second);
printf("\n");

//積分
if(C==1)
{
n=11-TIME;
S=n*n*n*10-m;
}
if(C==2)
{
n=10-TIME;
S=n*n*n*n*10-m;
}
if(C==3)
{
n=9-TIME;
S=n*n*n*n*n*10-m;
}
if(S<10)
{
srand((unsigned) time(&t));
S=rand()%100;
}
printf("\t您本次游戲的積分為:\t%d",S);
printf("\n");
}
//判斷是否符合最高分條件
if(C==1)
{
if((fp=fopen("tiptop1.txt","r"))==NULL)
{
printf("打開tiptop1.txt文件失敗!");
printf("\n");
exit(1);
}
fread(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==2)
{
if((fp=fopen("tiptop2.txt","r"))==NULL)
{
printf("打開tiptop2.txt文件失敗!");
printf("\n");
exit(1);
}
fread(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(C==3)
{
if((fp=fopen("tiptop3.txt","r"))==NULL)
{
printf("打開tiptop3.txt文件失敗!");
printf("\n");
exit(1);
}
fread(&p,sizeof(struct tiptop),1,fp);
fclose(fp);
}
if(S>=(p.data))
Tiptop_record(S);
//提示跳轉
if(C==1)
{
printf("\t您本次游戲等級是初級,是否要進入中級?\n");
printf("\t1:是\t\t\t2:否");
printf("\n\t");
i=0;
scanf("%d",&i);
if(i==1)
{
C=2;
if((fp=fopen("C.txt","w"))==NULL)
{
printf("打開C.txt文件失敗!");
exit(1);
}
fwrite(&C,sizeof(int),1,fp);
fclose(fp);
Game_main();
}
else
Menu_select();
}
if(C==2)
{
printf("\t您本次是中級游戲,是否要進入高級游戲呢?\n");
printf("\t1:是\t\t\t2:否");
printf("\n\t");
i=0;
scanf("%d",&i);
if(i==1)
{
C=3;
if((fp=fopen("C.txt","w"))==NULL)
{
printf("打開C.txt文件失敗!");
exit(1);
}
fwrite(&C,sizeof(int),1,fp);
fclose(fp);
Game_main();
}
else
Menu_select();
}
}

5.record.c
#include"record.h"
//******
//主函數
//******
void main()
{
printf("\n");
printf("********************************************\n");
printf("********************************************\n");
printf(" 歡迎進入猜數字游戲 \n");
printf("\n");
printf("\t設計者: \n");
printf("********************************************\n");
printf("********************************************\n");
printf("\n");
Menu_select();
}
//************
//選擇菜單函數
//************
void Menu_select()
{
while(1)
{
switch(manage_menu())
{
case 0:
printf("輸入有誤,請重新輸入!\n");
break;
case 1:
Game_main();
break;
case 2:
Game_rank();
break;
case 3:
Tiptop_output();
break;
case 4:
Game_explain();
break;
case 5:
printf("\n");
printf("\n");
printf("*************** ** ** **** ** ** ** ** *** \n");
printf("*************** ** ** ** ** **** ** ** ** ***** \n");
printf(" ** ** ** ** ** ** ** ** ** ** ******* \n");
printf(" ** ** ** ** ** ** ** ** ** ** ******* \n");
printf(" ** *********** ************* ** ** ** **** ***** \n");
printf(" ** *********** ************* ** ** ** **** ***** \n");
printf(" ** ** ** ** ** ** ** ** ** ** ***** \n");
printf(" ** ** ** ** ** ** ** ** ** ** *** \n");
printf(" ** ** ** ** ** ** **** ** ** *** \n");
printf(" ** ** ** ** ** ** ** ** ** *** \n");
printf("\n");
printf("Goodbye!\n");
exit(1);
}
}
}
//************
//處理菜單函數
//************
int manage_menu()
{
int n;
printf("\t**************************\n");
printf("\t**\t1:開始游戲\t**\n");
printf("\t**\t2:等級設置\t**\n");
printf("\t**\t3:最佳排行\t**\n");
printf("\t**\t4:游戲說明\t**\n");
printf("\t**\t5:退出遊戲\t**\n");
printf("\t**************************\n");
printf("\t請輸入相應序號選擇相應菜單:");
printf("\t");
scanf("%d",&n);
printf("\n");
if(n<1||n>5)
n=0;
return n;
}

Ⅵ C語言課程設計:中國古代民間游戲

如果是先報完的人贏的話,根據那個數的大小,是三的倍數,則後出手的人贏,否則先出手的人贏

Ⅶ C語言編程 課程設計 數學游戲

我先編一編哦,代碼寫好了我會放在我的網路空間的文章里邊的,到時候你到那裡去找吧
你最好也自己編一編吧,編程這東西是越編越會的,不編永遠也不會的,加油啦!

Ⅷ C語言課程設計,貪吃蛇應該怎麼做

2.1程序功能介紹

貪吃蛇游戲是一個經典小游戲,一條蛇在封閉圍牆里,圍牆里隨機出現一個食物,通過按鍵盤四個游標鍵控制蛇向上下左右四個方向移動,蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記10分,接著又出現食物,等待蛇來吃,如果蛇在移動中撞到牆或身體交叉蛇頭撞倒自己身體游戲結束。

2.2程序整體設計說明

一個游戲要有開始部分,運行部分,結束部分(實際上開始部分與運行部分是一體的)。

2.2.1設計思路

這個程序的關鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示。移動時必須從蛇頭開始,所以蛇不能向相反方向移動,也就是蛇尾不能改作蛇頭。如果不按任何鍵,蛇自行在當前方向上前移,當游戲者按了有效的方向鍵後,蛇頭朝著指定的方向移動,一步移動一節身體,所以當按了有效的方向鍵後,先確定蛇頭的位置,然後蛇身體隨著蛇頭移動,圖形的實現是從蛇頭的新位置開始畫出蛇,這時由於沒有慶平的原因,原來蛇的位置和新蛇的位置差一個單位,所以看起來社會多一節身體,所以將蛇的最後一節用背景色覆蓋。食物的出現和消失也是畫矩形塊和覆蓋矩形塊

2.2.2數據結構設計及用法說明

開始部分:

游戲是運行在圖形模式下的,所以第一步一定是初始化圖形模式,接著要有開始的界面,就像書有封面一樣,我設置了一個游戲的標題畫面,除了游戲標題畫面我還設置了一個歡迎畫面。標題畫面以後,還要為游戲的運行部分作初始化,包括繪制游戲運行時的背景,對游戲某些重 要變數的初始化。

運行部分:

作為游戲的核心部分,這里包括的函數比較多,也就是模塊比較多,首先讓我模擬一下貪吃蛇的游戲模式:某個世界上突然出現一條蛇,它很短,它的運動神經異常,它沒法停止自己的多動症在它的世界裡就只有食物,它很餓,也很貪吃;同樣在不明原因的情況下,食物從天而降,可惜的是沒有落到嘴邊;飢餓的主人公,不管它有沒有毒,也不問食物的來歷,徑直向食物爬去;它吃到食物啦,它超出想像的同化能力讓食物很快的成為自己身體的一部分,它的身子變長啦。當它吃到第一顆食物時,上帝有給它第二顆,於是它吃了第二顆,於是又變長了,於是又有第三顆……它的身子是一直的加長,它不管自己過長身體的麻煩——轉身不便,繼續吃下去,現在它是直接把巴張大,好讓食物有個綠色通道。但是在某天的下午,它咬到了自己,它才想起自己是一條毒蛇,於是暈死過去(不是毒死);又或者它往食物沖鋒的時候,它失去控制,撞到了牆上。

第一輪循環:第一步,出現食物;第二步,蛇不停運動;第三步,檢查蛇是撞到自己或牆壁;由第四步起游戲有兩條支線(A、B):

A :第四步,蛇沒有碰到自己或牆壁,蛇繼續前進,繪制蛇的動作;第五步,判斷蛇是否吃到食物,如果蛇吃到食物,身子變長,原來的食物消失;第六步,讓玩家輸入控制指令,讓蛇在下一輪循環的第二步改變運動方向;第七步,第二輪循環的第一步,重復第一輪的步驟;

B:第四步,蛇碰到自己或牆壁,終止游戲。

結束部分:

游戲結束時,顯示「GAME OVER」,已經是約定俗成的規律了,我的游戲也不例外。除了游戲結束畫面外,我還設置了一個游戲退出畫面,「善始善終」嘛。

有了上述的大致劃分,我把整個程序劃分成(13+2)個模塊(其實就是函數)

2.2.3程序結構(流程圖)

圖2.1流程圖

依據所需要處理的任務要求,規劃輸入數據和輸出結果,決定存放數據的數據結構。

C語言中數據結構集中體現在數據類型上,因此在進行C語言程序設計時,應統籌規劃程序中所使用的變數,數組,指針等,以及它們的類型等。這點是很重要的,如果在此期間選擇不合適的變數或者數組,將來修改就十分困難。

現在分析一下貪吃蛇游戲中的元素,繼而得出與它們對應的在程序中的描述:

蛇:

基本描述:長度,顏色,位置。

對應數據與數據類型:長度—雖然可以用坐標表示,但是這樣的話,運算量將很大,所以換算成較大的單位—節數,以固定長度的每節描述;坐標--整型;顏色--整型; 位置--X,Y坐標。

增加的描述:蛇運動的方向,蛇的生命。

對應數據與數據類型:這些描述是為了與程序的按鍵的輸入部分與判斷游戲結束部分相聯系而設的。方向只有四個方向:上下左右。可以設置與之對應的四個整型數:3、4、2、1。生命就只有兩種情況:死或生,對應0或1。

食物:

基本描述:顏色,位置。

對應數據與數據類型:由於顏色設成固定的,所以不再討論。位置—X、Y坐標。

增加的描述:食物的存在。

對應數據與數據類型:這是為了避免重復出現食物而設置的,與繪制食物的函數有聯系。只有兩個值:0或1(沒有食物或有食物)

其他的元素:牆,由於它在顯示上是作為背景而存在的,所以並沒有什麼說明實際的牆壁就是四條直線組成的邊框,由坐標描述。

還需要的變數:鍵盤鍵入的鍵值(作為全局變數,整型);經常要使用的循環變數;自定義的填充圖案;說明文字的字元數組;游戲的記分;游戲的速度(蛇的速度)。

圖2.2蛇的不停運動的關鍵演算法的流程圖

2.2.4各模塊的功能及程序說明

主要模塊的實現思路和演算法的流程圖說明:

關鍵所在——蛇不停移動的Snakemove():

蛇的不停移動,就是蛇的下一節取代前一節的位置,在計算機中就是蛇下一節的位置坐標變成前一節的位置坐標。在上文中,已定義蛇的位置坐標為數組類型,一組坐標對應一節的位置,假設有i+1節,由0到i節,第i節的坐標取第i-1節的坐標,第i-1節的坐標取第i-2節的坐標……直到第1節取第0節的坐標。而第0節的坐標,即蛇頭的坐標要往某個方向變化,變化量為蛇每節的長度。蛇的這種坐標輪換需要循環語句使其繼續下去。

2.2.5程序結果

運行程序得到如下初始界面圖:

圖2.3程序結果圖

用一個小矩形表示蛇的一節身體,身體每長一節,增加一個矩形塊,蛇頭用兩節表示:

圖2.4程序結果圖

蛇沒有碰到自己或牆壁,蛇繼續前進:

圖2.5程序結果圖

游戲結束時,顯示「GAME OVER」

圖2.6程序結果圖

2.3程序源代碼及注釋

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戲速度自己調整*/

struct Food{

int x;/*食物的橫坐標*/

int y;/*食物的縱坐標*/

int yes;/*判斷是否要出現食物的變數*/

}food;/*食物的結構體*/

struct Snake{

int x[N];

int y[N];

int node;/*蛇的節數*/

int direction;/*蛇移動方向*/

int life;/* 蛇的生命,0活著,1死亡*/

}snake;

void Init(void);/*圖形驅動*/

void Close(void);/*圖形結束*/

void DrawK(void);/*開始畫面*/

void GameOver(void);/*結束游戲*/

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

void PrScore(void);/*輸出成績*/

/*主函數*/

void main(void){

Init();/*圖形驅動*/

DrawK();/*開始畫面*/

GamePlay();/*玩游戲具體過程*/

Close();/*圖形結束*/}

/*圖形驅動*/

void Init(void){

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(&gd,&gm,"c:\program files\winyes\tc20h\bgi");

cleardevice();}

/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/

void DrawK(void){

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/

for(i=50;i<=600;i+=10)/*畫圍牆*/ {

rectangle(i,40,i+10,49); /*上邊*/

rectangle(i,451,i+10,460);/*下邊*/ }

for(i=40;i<=450;i+=10) {

rectangle(50,i,59,i+10); /*左邊*/

rectangle(601,i,610,i+10);/*右邊*/ }}

/*玩游戲具體過程*/

void GamePlay(void){

randomize();/*隨機數發生器*/

food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/

snake.life=0;/*活著*/

snake.direction=1;/*方嚮往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇頭*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*節數*/

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

while(1)/*可以重復玩游戲,壓ESC鍵結束*/ {

while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/ {

if(food.yes==1)/*需要出現新食物*/ {

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*畫面上有食物了*/ }

if(food.yes==0)/*畫面上有食物了就要顯示*/ {

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10); }

for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/ {

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1]; }

/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/

switch(snake.direction) {

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break; }

for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/ {

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) {

GameOver();/*顯示失敗*/

snake.life=1;

break; } }

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到牆壁*/ {

GameOver();/*本次游戲結束*/

snake.life=1; /*蛇死*/ }

if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/ {

setcolor(0);/*把畫面上的食物東西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/

snake.node++;/*蛇的身體長一節*/

food.yes=1;/*畫面上需要出現新的食物*/

score+=10;

PrScore();/*輸出新得分*/ }

setcolor(4);/*畫出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最後一節*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); } /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循環*/

break;

key=bioskey(0);/*接收按鍵*/

if(key==ESC)/*按ESC鍵退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判斷是否往相反的方向移動*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/}

/*游戲結束*/

void GameOver(void){

cleardevice();

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();}

/*輸出成績*/

void PrScore(void){

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);}

/*圖形結束*/

void Close(void){

getch();

closegraph();

}

Ⅸ C語言簡易課程設計貪吃蛇

#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戲速度自己調整*/
struct Food
{
int x;/*食物的橫坐標*/
int y;/*食物的縱坐標*/
int yes;/*判斷是否要出現食物的變數*/
}food;/*食物的結構體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節數*/
int direction;/*蛇移動方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅動*/
void Close(void);/*圖形結束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績*/
/*主函數*/
void main(void)
{
Init();/*圖形驅動*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結束*/
}
/*圖形驅動*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*開始畫面,左上角坐標為(50,40),右下角坐標為(610,460)的圍牆*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設置線型*/
for(i=50;i<=600;i+=10)/*畫圍牆*/
{
rectangle(i,40,i+10,49); /*上邊*/
rectangle(i,451,i+10,460);/*下邊*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/
}
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機數發生器*/
food.yes=1;/*1表示需要出現新食物,0表示已經存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方嚮往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節數*/
PrScore();/*輸出得分*/
while(1)/*可以重復玩游戲,壓ESC鍵結束*/
{
while(!kbhit())/*在沒有按鍵的情況下,蛇自己移動身體*/
{
if(food.yes==1)/*需要出現新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機出現後必須讓食物能夠在整格內,這樣才可以讓蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/
}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每個環節往前移動,也就是貪吃蛇的關鍵演算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個方向,通過這個判斷來移動蛇頭*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*從蛇的第四節開始判斷是否撞到自己了,因為蛇頭為兩節,第三節不可能拐過來*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到牆壁*/
{
GameOver();/*本次游戲結束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上兩種判斷以後,如果蛇死就跳出內循環,重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以後*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節先放在看不見的位置,下次循環就取前一節的位置*/
snake.node++;/*蛇的身體長一節*/
food.yes=1;/*畫面上需要出現新的食物*/
score+=10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最後一節*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環*/
break;
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*按ESC鍵退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戲結束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*圖形結束*/
void Close(void)
{
getch();
closegraph();
}

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:335
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:942
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:739
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:802
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:510
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:371