谁帮我用C语言几个小游戏?要有源程序和论文的最好,谢谢啊!

谁帮我用C语言几个小游戏?要有源程序和论文的最好,谢谢啊!,第1张

/*贪吃蛇*/

#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=50i<=600i+=10)/*画围墙*/

{

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

rectangle(i,451,i+10,460)/粗侍*下边*/

}

for(i=40i<=450i+=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]=100snake.y[0]=100/*蛇头*/

snake.x[1]=110snake.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-1i>0i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

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]+=10break

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

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

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

}

for(i=3i<snake.nodei++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/

{

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]=-20snake.y[snake.node]=-20

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++/*蛇的身体长一节*/

food.yes=1/*画面上需要出现新的食物*/

score+=10

PrScore()/*输出新得分*/

}

setcolor(4)/*画出蛇*/

for(i=0i<snake.nodei++)

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()

}

/*///////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

/*拼图*/

#include <stdio.h>

#include <stdlib.h> /*使用其中的int random(int a):

产生一个在0到a-1之间的整数

和 randomize():复位随机发生器*/

#include <conio.h> /*使用其中的gotoxy(int x,int y):

把光标移动到屏幕的x(1~80),y(1~25/50)处*/

/*和clrscr():清屏*/

int num[]={1,2,3,4,5,6,7,8,0} /*方块的数字*/

main(){

char key=0 /*键盘码*/

int pos /*九格中,空格的位置*/

clrscr() /*清屏*/

randomize() /*初始化随机发生器*/

newGame()

for(){

key=getch() /*获得键盘输入*/

if(key==0) continue

pos=GetTheNull() /*得到空格*/

switch(key){/*测试按键*/

case 72:/*按下*/

if(pos<=5) change(pos,pos+3)

break

case 80:/*按上*/

if(pos>=3) change(pos,pos-3)

break

case 77:/*按左*/

if(pos%3!=0) change(pos,pos-1)

break

case 75:/*按右*/

if(pos%3!=2) change(pos,pos+1)

break

case 110:/*按下‘n’新建游戏*/

newGame()

}

update() /*更新*/

if(isSuccess()){/*看是否游戏成功*/

gotoxy(26,10) /*成功了,输出一个写有Well done!的外框*/

printf("\332\304\304\304\304\304\304\304\304\304\304\304\304\267")

gotoxy(26,11)

printf("\263\272")

gotoxy(26,12)

printf("\263 Well Done! \272")

gotoxy(26,13)

printf("\263\272")

gotoxy(26,14)

printf("\324\315\315\315\315\315\315\315\315\315\315\315\315\274\n")

getch()

newGame() /*新游戏*/

}

if(key==27) break /*退出*/

}

clrscr() /*清屏*/

}

newGame(){/*新建游戏,实际上就是把有数字的八个方格打散,

这种效果的实现就是随机的两两交换,而怎么不与空的那个交换呢?

这涉及有没有解的问题

不管怎么样,九格游戏最后的结果只有两个:

123 | 123

456 | 456

78 | 87(证明从略)

而要两两交换而始终有解的话,(从原序列开始)必须:相邻交换的次数为偶

但我们用一种更有效的方法:

每一个总与其下第二个交换.

第7,8个与0,1交换,只要交换次数多,仍可获得相同的效果.

而这些的前提是其中的0不能与其第奇数个作奇数次交换.

为了省事,不处理0...

其中产道理,请自己思考

*/

int i,a,b

for(i=0i<8i++) num[i]=i+1

num[8]=0 /*将数组复原*/

for(i=0i<300i++){

a=random(8) /*产生随机数*/

b=(a+2)%8 /*得到下第二个的数组下标*/

change(a,b) /*交换*/

}

update()

}

update(){/*在屏幕上画出整个九格图像,关于定位的问题自己分析*/

int i,j

for(i=0i<=2i++){

gotoxy(24,8+i*3)

for(j=0j<=2j++){

if (num[j+i*3]!=0)

printf("\332\304\304\304\304\267")

else

printf(" ")

}

gotoxy(24,9+i*3)

for(j=0j<=2j++){

if (num[j+i*3]!=0)

printf("\263 %d \272",num[j+i*3])

else

printf(" ")

}

gotoxy(24,10+i*3)

for(j=0j<=2j++){

if (num[j+i*3]!=0)

printf("\324\315\315\315\315\274")

else

printf(" ")

}

printf("\n")

}

}

int isSuccess(){/*判断是否游戏*/

int i,ret=1

for(i=0i<8i++)

ret=ret&&(num[i]==(i+1))

return ret

}

int GetTheNull(){/*获得空格的位置*/

int i

for(i=0i<=8i++){

if (num[i]==0)

return i

}

}

change(int a,int b){/*交换num[a],num[b]*/

int temp

temp=num[a]

num[a]=num[b]

num[b]=temp

}

C++编态缓数写 猜数字小游戏

#include <iostream.h>

#include <ctime>

#include <cstdlib>

void main(){

cout<<"猜数字游戏正式开始,请把握机会!"<<endl

int x,y

char z

do{

int i=1

srand(time(0))

y=rand()%1000

cout<<endl<<"系统已经随机生成0到999内的一个整数;"<<endl

cout<<"您总共有10次猜数字机会。"<<endl<<"猜数开始,请输入您要猜的数字:"

cin>>x

for(i=1i<=10i++){

if(x>y){if(i==10){cout<<"您猜的数字高了,您已经没有机会。"<<endl<<endlcontinue}

else cout<<"您猜的数字高了,"<<"您还剩下"<<10-i<<"次机会。"<<endl<<endl<<"猜数继续,请输入您要猜的数帆首字:"

cin>>xcontinue}

else if(x<y){if(i==10){cout<<"您猜的数字低了,您已经没有机会了。"<<endl<<endlcontinue}

else cout<<"您猜的数字低了,"<<"您还剩下"<<10-i<哪猜<"次机会。"<<endl<<endl<<"猜数继续,请输入您要猜的数字:"

cin>>xcontinue}

else cout<<"恭喜您猜对了,您最后的分数为"<<11-i<<"分!"<<endl<<endlbreak}

if(i>10){

cout<<"真可惜,一次都没猜对,请重新开始!"<<endl

cout<<"按Y重新开始,按任意键结束本游戏:"

cin>>z}

else{

cout<<"本关已结束,进入下一关!"<<endl

cout<<"按Y进入下一关,按任意键结束本游戏:"

cin>>z}}while(z=='Y'||z=='y')

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12500521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存