使用C语言编写小游戏的方法是什么?

Python020

使用C语言编写小游戏的方法是什么?,第1张

//声明

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#include<conio.h>

#include<windows.h>

#define SIZE 4

static int score=0

void putn(int n[][SIZE])

void getn(int n[][SIZE])

int isempty(int n[][SIZE])

int isfull(int n[][SIZE])

void math(int n[][SIZE],char c)

void tow(int n[][SIZE])

void toa(int n[][SIZE])

void tos(int n[][SIZE])

void tod(int n[][SIZE])

//主函数

int main()

{

int i,j

int n[SIZE][SIZE]

char c=' '

for(i=0i<SIZEi++)

{

for(j=0j<SIZEj++)

{

n[i][j]=0

}

}

printf( "***********************\n"

" 2048(%dX%d) \n"

" control:W/A/S/D \n"

"press any key to begin \n"

"***********************\n",SIZE,SIZE)

getch()

system("cls")

//n[0][1]=2048

//n[0][3]=2048

while(1)

{

if(isempty(n))

getn(n)

putn(n)

if(!isempty(n)&&isfull(n))

break

sleep(200)

c=getch()

while(c!='w'&&c!='a'&&c!='s'&&c!='d')

c=getch()

math(n,c)

system("cls")

}

printf(" Game Over!\n",score)

return 0

}

//函数

void putn(int n[][SIZE])

{

int i,j

for(i=0i<SIZEi++)

{

for(j=0j<SIZEj++)

printf("| ")

printf("|\n")

for(j=0j<SIZEj++)

{

if(n[i][j]==0)

printf("| ")

else

printf("|%4d ",n[i][j])

}

printf("|\n")

for(j=0j<SIZEj++)

printf("|_____")

printf("|\n")

}

printf("score: %d",score)

}

void getn(int n[][SIZE])

{

int a,b

a=rand()%SIZE

b=rand()%SIZE

while(n[a][b]!=0)

{

a=rand()%SIZE

b=rand()%SIZE

}

n[a][b]=2

}

int isempty(int n[][SIZE])

{

int i,j,count=0

for(i=0i<SIZEi++)

for(j=0j<SIZEj++)

if(n[i][j]==0)

count++

return count

}

int isfull(int n[][SIZE])

{

int i,j,count=0

for(i=0i<SIZEi++)

{

for(j=1j<SIZE-1j++)

{

if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])

count++

}

}

for(j=0j<SIZEj++)

{

for(i=1i<SIZE-1i++)

{

if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])

count++

}

}

return count>0?0:1

}

void math(int n[][SIZE],char c)

{

switch(c)

{

case 'w':tow(n)break

case 'a':toa(n)break

case 's':tos(n)break

case 'd':tod(n)break

default :

}

}

void tow(int n[][SIZE])

{

int i,j,a

int m[SIZE]

for(a=0a<SIZEa++)

m[a]=0

for(j=0j<SIZEj++)

{

for(a=0a<SIZEa++)

{

for(i=0i<SIZE-1i++)

{

if(n[i][j]==0)

{

n[i][j]=n[i+1][j]

n[i+1][j]=0

}

}

}

}

for(j=0j<SIZEj++)

{

for(a=0,i=0i<SIZEi++)

{

if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)

{

m[a++]=n[i][j]

n[i][j]=0

}

else if(n[i][j]==n[i+1][j])

{

m[a++]=n[i][j]+n[i+1][j]

score+=m[a-1]

n[i][j]=0,n[i+1][j]=0

}

}

for(i=0i<SIZEi++)

{

n[i][j]=m[i]

m[i]=0

}

}

}

void toa(int n[][SIZE])

{

int i,j,a

int m[SIZE]

for(a=0a<SIZEa++)

m[a]=0

for(i=0i<SIZEi++)

{

for(a=0a<SIZEa++)

{

for(j=0j<SIZE-1j++)

{

if(n[i][j]==0)

{

n[i][j]=n[i][j+1]

n[i][j+1]=0

}

}

}

}

for(i=0i<SIZEi++)

{

for(a=0,j=0j<SIZEj++)

{

if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)

{

m[a++]=n[i][j]

n[i][j]=0

}

else if(n[i][j]==n[i][j+1])

{

m[a++]=n[i][j]+n[i][j+1]

score+=m[a-1]

n[i][j]=0,n[i][j+1]=0

}

}

for(j=0j<SIZEj++)

{

n[i][j]=m[j]

m[j]=0

}

}

}

void tos(int n[][SIZE])

{

int i,j,a

int m[SIZE]

for(a=0a<SIZEa++)

m[a]=0

for(j=SIZE-1j>=0j--)

{

for(a=SIZE-1a>=0a--)

{

for(i=SIZE-1i>0i--)

{

if(n[i][j]==0)

{

n[i][j]=n[i-1][j]

n[i-1][j]=0

}

}

}

}

for(j=SIZE-1j>=0j--)

{

for(a=SIZE-1,i=SIZE-1i>=0i--)

{

if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)

{

m[a--]=n[i][j]

n[i][j]=0

}

else if(n[i][j]==n[i-1][j])

{

m[a--]=n[i][j]+n[i-1][j]

score+=m[a+1]

n[i][j]=0,n[i-1][j]=0

}

}

for(i=SIZE-1i>=0i--)

{

n[i][j]=m[i]

m[i]=0

}

}

}

void tod(int n[][SIZE])

{

int i,j,a

int m[SIZE]

for(a=0a<SIZEa++)

m[a]=0

for(i=SIZE-1i>=0i--)

{

for(a=SIZE-1a>=0a--)

{

for(j=SIZE-1j>0j--)

{

if(n[i][j]==0)

{

n[i][j]=n[i][j-1]

n[i][j-1]=0

}

}

}

}

for(i=SIZE-1i>=0i--)

{

for(a=SIZE-1,j=SIZE-1j>=0j--)

{

if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)

{

m[a--]=n[i][j]

n[i][j]=0

}

else if(n[i][j]==n[i][j-1])

{

m[a--]=n[i][j]+n[i][j-1]

score+=m[a+1]

n[i][j]=0,n[i][j-1]=0

}

}

for(j=SIZE-1j>=0j--)

{

n[i][j]=m[j]

m[j]=0

}

}

}

需要注意的是:

srand((unsigned) time(0)rand()是固定形式,不要更改任何一个字符!

如果不能编译,请把sleep(200)注释掉,如果提示不能找到system("cls")请把system("cls")更换为clrscr()。

c语言中没有类,只有结构,也可以像类一样编写,用结构,但其成员都是公开访问的,C++才有真正的类。

下落的小鸟

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<time.h>

#include<Windows.h>

int Grade = 1, Score = 0, Max_blank = 9, Distance = 18

struct Birds{int xint y} //定义一种Birds数据类型(含3个成员)

Birds *Bird = (Birds*)malloc(sizeof(Birds)) //定义Birds类型 指针变量Bird并赋初值

struct Bg{int x, yint l_blankBg *priBg *next}  //定义一种Bg数据类型(含5个成员)

Bg *Bg1 = (Bg*)malloc(sizeof(Bg))  //定义Bg类型 指针变量Bg1并赋初值

void Position(int x, int y)  //光标定位函数(用于指定位置输出)

{COORD pos = { x - 1, y - 1 }

HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE)

SetConsoleCursorPosition(Out, pos)

}

void Csh( )  //初始化界面

{

printf("══════════════════════════════════════\n")

printf(" ■■ ■■ C语言版 Flappy Bird \n")

printf(" ■■ ■■\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■ 瞎搞人:yyposs原创\n")

printf(" ■■ ■■ 瞎搞日期:2014.2\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■ 改编:鸣蝉百2021.7\n")

printf(" ■■ ■■ 操作:按向上方向键让小鸟起飞\n")

printf(" ■■\n")

printf(" ■■\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■\n")

printf(" ■■ ■■ DEVc++运行通过\n")

printf("══════════════════════════════════════\n")

printf("  按键继续…")

getch( )

system("cls")

}

void PrFK( )  //输出方框(游戏范围区)

{int i

Position(1, 1)printf("╔")  Position(79, 1)printf("╗")

Position(1, 24)printf("╚")  Position(79, 24)printf("╝")

for (i = 3i <= 78i += 2){Position(i, 1)printf("═")Position(i, 24)printf("═")}

for(i=2i<=23i++)

{ Position(1,i)printf("║")if(i<11)printf("0%d",i-1)else printf("%d",i-1)

Position(79,i)printf("║")

}

Position(4, 25)printf("小鸟即将出现,请准备按键起飞… ")

getch( )

Position(4, 25)printf("                                  ")

}

void CreatBg( )  //创建障碍物坐标(便于打印输出)

{Bg *Bg2 = (Bg*)malloc(sizeof(Bg))

Bg1->x = 90Bg1->y = 8  //确定障碍物的一对基本坐标(此时值是在游戏框之外)

Bg2->x = Bg1->x + DistanceBg2->y = 9  //下一障碍物的基本坐标x、y

Bg1->l_blank = Max_blank - Grade  //障碍物上下两部分之间的空白距离l_blank

Bg2->l_blank = Max_blank - Grade

Bg1->next = Bg2Bg1->pri = Bg2

Bg2->next = Bg1Bg2->pri = Bg1

}

void InsertBg(Bg *p)  //随机改变障碍物的y坐标,让空白通道有上下变化

{int temp

Bg *Bgs = (Bg*)malloc(sizeof(Bg))

Bgs->x = p->pri->x + Distance

Bgs->l_blank = Max_blank - Grade

srand((int)time(0)) //启动随机数发生器

temp = rand( ) //产生一个随机数并赋值给temp

if (temp % 2 == 0)

{if ((temp % 4 + p->pri->y + Max_blank - Grade)<21)

Bgs->y = p->pri->y + temp % 4

else Bgs->y = p->pri->y

}

else

{if ((p->pri->y - temp % 4)>2)Bgs->y = p->pri->y - temp % 4

else Bgs->y = p->pri->y

}

Bgs->pri = p->priBgs->next = p

p->pri->next = Bgsp->pri = Bgs

}

void CreatBird( )  //建立小鸟的坐标(初始打印输出小鸟的位置)

{Bird->x = 41Bird->y = 10}

int CheckYN(Bg *q)  //判断游戏结束与否(值为0是要结束,为1没有要结束)

{Bg *p = qint i = 0

while (++i <= 5)

{if (Bird->y>23)return 0

if (Bird->x == p->x&&Bird->y <= p->y)return 0

if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) &&Bird->y == p->y)return 0

if (Bird->x == p->x&&Bird->y>p->y + p->l_blank)return 0

if ((Bird->x == p->x || Bird->x == p->x + 1 || Bird->x == p->x + 2) &&Bird->y == p->y + p->l_blank)

return 0

p = p->next

}

return 1

}

void Check_Bg(Bg *q)  //核查开头的障碍物坐标是否在游戏区内

{Bg *p = qint i = 0, temp

while (++i <= 5)

{if (p->x>-4)p = p->next

else

{srand((int)time(0)) temp = rand()

if (temp % 2 == 0)

{if ((temp % 4 + p->y + Max_blank - Grade)<21)p->y = p->y + temp % 4

else p->y = p->yp->x = p->pri->x + Distance

p->l_blank = Max_blank - Grade

}

else

{if ((p->y - temp % 4)>2)p->y = p->y - temp % 4

else p->y = p->yp->x = p->pri->x + Distance

p->l_blank = Max_blank - Grade

}

}

}

}

void Prt_Bg(Bg *q)  //打印输出障碍物(依据其x、y坐标进行相应输出)

{Bg *p = qint i = 0, k, j

while (++i <= 5)

{if (p->x>0 &&p->x <= 78)

{for (k = 2k<p->yk++){Position(p->x + 1, k)printf("■")printf("■")printf(" ")}

Position(p->x, p->y)

printf("■")printf("■")printf("■")printf(" ")

Position(p->x, p->y + p->l_blank)

printf("■")printf("■")printf("■")printf(" ")

k = k + p->l_blank + 1

for (kk <= 23k++){Position(p->x + 1, k)printf("■")printf("■")printf(" ")}

}

p = p->next

if (p->x == 0)

{for (j = 2j<p->yj++){Position(p->x + 1, j)printf(" ")printf(" ")}

Position(p->x + 1, p->y)

printf(" ")printf(" ")printf(" ")

Position(p->x + 1, p->y + Max_blank - Grade)

printf(" ")printf(" ")printf(" ")

j = j + Max_blank - Grade + 1

for (jj <= 22j++){Position(p->x + 1, j)printf(" ")printf(" ")}

}

}

}

void PrtBird( )  //打印输出小鸟

{Position(Bird->x, Bird->y - 1)printf(" ")

Position(Bird->x, Bird->y)printf("Ю")

Position(38, 2)printf("Score:%d", Score)

}

void Loop_Bg(Bg *q)  //障碍物x坐标左移,并记录成绩

{Bg *p = qint i = 0

while (++i <= 5)

{p->x = p->x - 1p = p->next

if (Bird->x == p->x)

{Score += 1

if (Score % 4 == 0 &&Grade<4)Grade++

}

}

}

int main( )

{int i = 0int t

while (1)

{

Csh( )PrFK( )CreatBg( )

InsertBg(Bg1)InsertBg(Bg1)InsertBg(Bg1)

CreatBird( )

while (1)

{if (!CheckYN(Bg1))break

Check_Bg(Bg1)Prt_Bg(Bg1)

PrtBird( )Loop_Bg(Bg1)

Bird->y = Bird->y + 1

if (GetAsyncKeyState(VK_UP))  //按下了向上方向键

{Position(Bird->x, Bird->y - 1)printf(" ")

Bird->y = Bird->y - 4

}

Sleep(200)  //程序延时200毫秒(数值大小决定游戏速度快慢)

i = 0

}

Position(6, 25)

printf("游戏结束!  请输入:0.退出  1.重玩")

scanf("%d",&t)

if (t==0)break

system("cls")Score = 0

}

return 0

}