贪吃蛇
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
char m;
int x,y,fx,fy,ta,blength=2;//为了方便,数组第0个元素不要了,直接从1开始
//length>=1必须的
int sbody_move;
struct sbody
{
int bx;
int by;
}sbody[1801];
int ou(int n)
{
if(n%2==1) n=n+1;
return n;
}
void map()
{
//地图20*60 活动空间18*58
printf("by Wang Baotong on 2016.11.13\nYour body length=%d,goal=20\n",blength);
int i,a,b,pr=0;
for (i=1;i<=60;i++) //第一行全为“- ”
printf("-");
printf("\n");
for(i=1;i<=18;i++)//中间18行
{
printf("|");
for(a=1;a<=58;a++)//具体打印某个值
{
if(i==y && a==x) pr=1; //蛇头
if(i==fy && a==fx) pr=1; //产生食物
else
{
for(b=1;b<=blength;b++)
{
if(sbody[b].bx==a && sbody[b].by==i)
{
pr=1;
break;
}
}
}
if(pr==0) printf(" ");
if(pr==1) printf("*");
pr=0;
}
printf("|");
printf("\n");
}
for (i=1;i<=60;i++) //最后一行全为“- ”
printf("-");
printf("\n");
}
void move()
{
sbody[sbody_move].bx=x;//摆动身体
sbody[sbody_move].by=y;
sbody_move-=1;
if(sbody_move<=0)
sbody_move=blength;
switch(m)//蛇头坐标改变
{
case 's':y+=1;break;
case 'a':x-=2;break;
case 'd':x+=2;break;
case 'w':y-=1;
}
}
void s_introducer()//游戏初始化...
{
printf("by_Wang Baotong on 2016.11.13\nasdw控制移动方向,请切换成英文输入法,身体长度达到20胜利\n");
system("pause");
m='d';
x=10;
y=10;
sbody[1].by=10;
sbody[1].bx=8;
sbody[2].by=9;
sbody[2].bx=8;
sbody_move=blength;
char ta;
}
void food()
{
int data,guess,ran,i;
srand((unsigned)time(NULL));
ran=rand();
f: //每个坐标必须为偶数
fy=ou(rand()%(17)+1); //data (1,17) x58 y18
fx=ou(rand()%(57)+1); //(1,57)
if(x==fx && y==fy) goto f; //food不能在头上
for(i=1;i<=blength;i++)//food不能再身体上
{
if(sbody[i].bx==fx && sbody[i].by==fy)
{
goto f;
}
}
}
main()
{
system("mode con cols=65 lines=25");
s_introducer();//游戏初始化 打酱油的无伤大雅的开局介绍和进入游戏。
int win=0,de=1,i,gameover=0,fe=0;
for(;gameover==0;) //主程序 =====================
{
move();
if(x>58 || x<1 || y>18 || y<1)//判断游戏是否结束 活动空间x58 y18 /判断是否撞墙
break;
for(i=1;i<=blength;i++)//判断是否咬到自己
{
if(sbody[i].bx==x && sbody[i].by==y)
{
gameover=1;
break;
}
}
if(gameover==1) break;
system("cls");
if(kbhit())
{
ta=m;
m=getch();//判断按下某键 asdw作为控制
if(m=='a' && ta=='d') m=ta;
if(m=='d' && ta=='a') m=ta;
if(m=='w' && ta=='s') m=ta;
if(m=='s' && ta=='w') m=ta;
de=0;
}
if(x==fx && y==fy)
{
blength+=1;
fe=0;
}
if(blength>=20)
{
win=1;
break;
}
map();
if(fe==0)
{
food();//如果食物不存在,产生食物。
fe=1;
}
if(de==1)
Sleep(80);
if(de==0)
de=1;
}
if(win==0) printf("=========Gameover.You fail!=========\n");
if(win==1) printf("=========Gameover.You win!=========\n");
system("pause");
}
纸牌
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<windows.h>
char ku[16]="34567890JQKA2XD";//种类集合,共15种牌,相对大小按照顺序 大小王不可以挂
char fone[55]="34567890JQKA2XD34567890JQKA234567890JQKA234567890JQKA2";//一副牌 54张
char deskpuk[4];
int player,renyi,deskpamount;//1为玩家 0为AI
struct sbody
{
char puk[27];//等整理完毕pukexc后就没用了
int sum;
int kusum[16];
int pass;
}pla[2];
int findpuknumb(char n)//寻找种类n在ku[]中的相对大小(序号从0开始)n=p时返回-1//***finished
{
if(n=='p') return -1;//pass最小
int i=-1;
while(ku[++i]!=n);
return i;
}
void fenpuk()//***finished
{
int ran=0,i,a;
//for(a=0;a<54;a++) printf("%c",fone[a]);
for(i=0;i<54;i++)//分54张牌 每人27张
{
if(pla[ran].sum==27)
{
pla[!ran].puk[pla[!ran].sum++]=fone[i];
//printf("sum=%d,i=%d,ch=%c\n",pla[!ran].sum,i,fone[i]);
continue;
}
ran=rand()%2;//产生随机数01
if(ran) pla[1].puk[pla[1].sum++]=fone[i];
else pla[0].puk[pla[0].sum++]=fone[i];
}}
void pukexc()//基于扑克库ku[]进行扑克归类排序。 //***finished
{
int n=0,num,i;
char p;
while(n<=1)//两个玩家运行两次
{
for(i=0;i<27;i++)
{
p=pla[n].puk[i];num=findpuknumb(p);
pla[n].kusum[num]++;
}
n++;
}
}
int fablepuk(int x,int min,int sum,char *p)//查找玩家x手里:大于等于min且数量大于等于sum的牌,返回扑克数目
{ //第三个变量为用于存放 所有该类型的牌 的数组指针 且成员数应大于等于4 如果扑克牌不存在不作改变数组
int i,a; //***本函数不改变玩家手中牌的种类和数目 ,只提供搜索服务***
for(i=min;i<15;i++)
{
if(pla[x].kusum[i]==0 || pla[x].kusum[i]<sum)//不符合函数要求
continue;
for(a=0;a<pla[x].kusum[i];a++)
p[a]=ku[i];
return pla[x].kusum[i];
}
return 0;
}
void echo(int n)
{
int i,a;
system("cls");
printf("跑得快——初级,by wbt 2016.11.23\n");
printf("大管小,王不能挂,不能连出不能带,不憋三\n0为10,X为小王(xiao),D为大王(da)\n");
//打印AI的部分
printf("=========================================\n");
printf("[玩家]\\=====帅气AI=====/:(%d) \n\n ",pla[0].sum);
if((n==1 || pla[0].pass==1) && pla[1].sum!=0)//且的意思是 游戏没有结束
{
printf("→");
if(pla[0].pass==0)
{
for(i=0;i<deskpamount;i++)
printf("%c",deskpuk[i]);
}
if(pla[0].pass==1)
printf("pass");
printf("←");
}
printf("\n\n\n");
if(pla[0].sum==0 && n!=-2) printf("\n---------------You lose!!----------------");
if(n==-2) printf("--------------准备好了吗---------------");
if(pla[1].sum==0 && n!=-2) printf("\n---------------You win!!----------------");
printf("\n\n\n");
//玩家部分
if(n==2 || pla[1].pass==1)
{
printf(" →");
if(pla[1].pass==0)
{
for(i=0;i<deskpamount;i++)//只有玩家出牌才会刷
printf("%c",deskpuk[i]);
}
if(pla[1].pass==1)
printf("pass");
printf("←");
}
printf("\n[玩家]\\===高贵程序猿===/:(%d)\n",pla[1].sum);
for(i=0;i<15;i++)//按照降序输出玩家剩余的牌.
{
a=0;
while(++a<=pla[1].kusum[i])
printf("%c",ku[i]);
printf(" ");
}
printf("\n\n=========================================\n");
}
void introduction()
{
//变量初始化
pla[0].sum=0;
pla[1].sum=0;
player=rand()%2;
int i;
for(i=0;i<27;i++)
{ pla[0].puk[i]='.';
pla[1].puk[i]='.';
pla[0].kusum[i]=0;
pla[1].kusum[i]=0;
}
renyi=1;
deskpamount=0;
echo(-2);
system("pause");
}
int aiuppuk() //***finished
{
int puknumb=-1,i,amount=0,sum,min;
char puk[4];
if(renyi==1)
{
sum=0;
min=0;
}
else
{
sum=deskpamount;
min=findpuknumb(deskpuk[0])+1;
}
amount=fablepuk(0,min,sum,puk);
i=-1;
//内存出牌!
if(amount<deskpamount && renyi==0) //数目不足且不能任意出牌
{
renyi=1;
pla[0].pass=1;
echo(-1);
pla[0].pass=0;
return 0;
}
else //数目足够或者能任意出牌
{
if(renyi==0) amount=deskpamount;
renyi=0;
}
while(++i<amount)
{
deskpuk[i]=puk[i];
}
//减少手中牌
pla[0].sum-=amount;
pla[0].kusum[findpuknumb(deskpuk[0])]-=amount;
deskpamount=amount;
echo(1);
return 1;
}
char dx(char n)//***finished
{
if(n>='a' && n<='z')
n-='a'-'A';
return n;
}
int plauppuk()//------------
{
int i,a,x,t,t1,length,numb,pass;
char input[100];//无奈之举 出此下策
printf("\n");
do //所有的continue;前面都要加一句x=1;
{
x=0;
printf("请输入你要出的牌,输入pass过牌:");
gets(input);
if(input[0]=='\0')//任意==1时,判断机制会有bug,允许玩家输入空牌,这一句避免这个bug
{
x=1;
continue;
}
for(i=0;i<4;i++)
input[i]=dx(input[i]);
length=strlen(input);
if(length>4)
{
printf("\n输入错误!!!\n");//不能超过4个
x=1;
continue;
}
numb=findpuknumb(input[0]);
pass=input[0]=='P' && input[1]=='A' && input[2]=='S'&& input[3]=='S';
if(pass==1 && renyi==1)
{
printf("不能过牌\n");
x=1;
continue;
}
if(pass==1 && renyi==0)//玩家pass
{
renyi=1;
pla[1].pass=1;
echo(-1);
pla[1].pass=0;
Sleep(1000);
return 0;
}
if(length!=deskpamount && renyi==0 && pass==0)//判断错误输入, //数目是否匹配
{
printf("请选择%d张牌!\n",deskpamount);
x=1;
continue;
}
t=0;
x=0;
for(i=1;i<length;i++)//几张牌的组合是否符合规则
{
if(input[i]==input[0])
{
t++;
break;
}
if(t<length-1&&i==length-1)
{
x=1;
printf("您选择的牌不符合游戏规则\n");
break;
}
}
if(x) continue;
if(pass==0)
{
for(i=0;i<length;i++)//是否存在于种类库ku
{
t=0;
for(a=0;a<15;a++)
{
if(input[i]==ku[a])
{
t++;
break;
}
}
if(t==0)//不合格
{
printf("您输入的扑克不正确\n");
x++;
break;
}
}
}
if(x) continue;
if(numb<=findpuknumb(deskpuk[0]) && renyi==0)//大小是否合适
{
printf("您的牌太小\n");
x=1;
continue;
}
if(length>pla[1].kusum[numb])
{
printf("您的牌数目不足\n");
x=1;
continue;
}
break;
}
while(x);//0为合格1不合格
// printf("\n*6*%d\n",player);//player为1
//内存出牌
i=-1;
while(++i<4)
deskpuk[i]=input[i];
//strcpy(deskpuk,input);//可能是数据溢出导致player被冲掉
renyi=0;
deskpamount=length;
echo(2);
//减少手中牌
pla[1].sum-=length;
pla[1].kusum[numb]-=length;
Sleep(1000);
}
//(策略系统——太难了待定吧。)
main()
{
int a;
while(1)
{
srand((unsigned)time(NULL));
introduction();//介绍和初始化
fenpuk();//分牌
pukexc();//扑克排序归类
echo(-1);
while(1) //出牌管理系统
{
if(pla[0].sum==0||pla[1].sum==0) break;
if(player==1)
{
plauppuk();//玩家
}
else aiuppuk();
player=!player;
}
echo(0);
system("pause");
}
}