#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')
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)