#include <iostream>
using namespace std;
#include <ctime>
#include <cstdlib>
int cchuquan()
{
int t;
srand(time(0)); //seed
t = rand() % 3+ 1; // random number 1-3
if(t==1)
{
cout<<"电脑出的为剪刀!"<<endl;
}
else if(t==2)
{
cout<<"电脑出的为石头!"<<endl;
}
else
{
cout<<"电脑出的为布!"<<endl;
}
return t;
}
int iswin(int n,int m)
{
if(n==m)
{
return 0;
}
else if(n==1&&m==2)
{
return -1;
}
else if(n==1&&m==3)
{
return 1;
}
else if(n==2&&m==1)
{
return 1;
}
else if(n==2&&m==3)
{
return -1;
}
else if(n==3&&m==1)
{
return -1;
}
else
{
return 1;
}
}
int main()
{
const int jiandao=1;
const int shitou=2;
const int bu=3;
cout<<"请输入你要选择的局数(必须为奇数且大于1):";
int n;
cin>>n;
int win=0,shu=0;
for(int i=0;i<n;++i)
{
cout<<"请出拳: 1:为剪刀;2:为石头;3:为布"<<endl;
int flag;
cin>>flag;
if(flag==1)
{
cout<<"你出的为剪刀!"<<endl;
}
else if(flag==2)
{
cout<<"你出的为石头!"<<endl;
}
else
{
cout<<"你出的为布!"<<endl;
}
int cf=cchuquan();
if(iswin(flag,cf)==1)
{
++win;
}
else if(iswin(flag,cf)==-1)
{
++shu;
}
}
if(win-shu>0)
{
cout<<"恭喜你获胜!"<<endl;
}
else
{
cout<<"非常遗憾!你失败了!"<<endl;
}
return 0;
}
c++写的 呵呵 你可以参考
我这有许多C的小游戏。给你一个基础的简单的汉诺塔程序。你看看:
这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数
所得的结果的步骤都会多一倍。如果你有耐心等待结果的话除外。汉诺塔是在欧洲
流行的一种游戏,有a,b,c三个竿。a竿上有若干个由大到小的圆盘,大的在下面,
小的在上面,b,c都是空杆,请你把a杆上的圆盘都倒到别的杆上,或b或c,在倒盘
的过程中不可以大的压小的,实例程序如下:
#include <stdioh>
int i=0;
main()
{
unsigned n;
printf("Please enter the number of discs: ");
scanf("%d",&n);
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b');
printf("\t Total: %d\n",i);
getch();
}
movedisc(n,fromneedle,toneedle,usingneedle)
unsigned n;
char fromneedle,toneedle,usingneedle;
{
if(n>0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
i++;
switch(fromneedle)
{
case 'a':switch(toneedle)
{
case 'b':printf("\t[%d]:\t%2d------>%2d\n",i,n,n);
break;
case 'c':printf("\t[%d]:\t%2d------------->%2d\n",i,n,n);
break;
}
break;
case 'b':switch(toneedle)
{
case 'a':printf("\t[%d]:\t%2d<----------%2d\n",i,n,n);
break;
case 'c':printf("\t[%d]:\t\t%2d------>%2d\n",i,n,n);
break;
}
break;
case 'c':switch(toneedle)
{
case 'a':printf("\t[%d]:\t%2d<--------------%2d\n",i,n,n);
break;
case 'b':printf("\t[%d]:\t\t%2d<--------%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
}
}
用c语言编写一个五子棋吧,不怎么难,给你程序,自己参考一下
/334 源程序/
#include "graphicsh" /图形系统头文件/
#define LEFT 0x4b00 /光标左键值/
#define RIGHT 0x4d00 /光标右键值/
#define DOWN 0x5000 /光标下键值/
#define UP 0x4800 /光标上键值/
#define ESC 0x011b / ESC键值/
#define ENTER 0x1c0d / 回车键值/
int a[8][8]={0},key,score1,score2;/具体分数以及按键与存放棋子的变量/
char playone[3],playtwo[3];/两个人的得分转换成字符串输出/
void playtoplay(void);/人人对战函数/
void DrawQp(void);/画棋盘函数/
void SetPlayColor(int x);/设置棋子第一次的颜色/
void MoveColor(int x,int y);/恢复原来棋盘状态/
int QpChange(int x,int y,int z);/判断棋盘的变化/
void DoScore(void);/处理分数/
void PrintScore(int n);/输出成绩/
void playWin(void);/输出胜利者信息/
/主函数/
void main(void)
{
int gd=DETECT,gr;
initgraph(&gd,&gr,"c:\\tc"); /初始化图形系统/
DrawQp();/画棋盘/
playtoplay();/人人对战/
getch();
closegraph();/关闭图形系统/
}
void DrawQp()/画棋盘/
{
int i,j;
score1=score2=0;/棋手一开始得分都为0/
setbkcolor(BLUE);
for(i=100;i<=420;i+=40)
{
line(100,i,420,i);/画水平线/
line(i,100,i,420); /画垂直线/
}
setcolor(0);/取消圆周围的一圈东西/
setfillstyle(SOLID_FILL,15);/白色实体填充模式/
fillellipse(500,200,15,15); /在显示得分的位置画棋/
setfillstyle(SOLID_FILL,8); /黑色实体填充模式/
fillellipse(500,300,15,15);
a[3][3]=a[4][4]=1;/初始两个黑棋/
a[3][4]=a[4][3]=2;/初始两个白棋/
setfillstyle(SOLID_FILL,WHITE);
fillellipse(120+340,120+340,15,15);
fillellipse(120+440,120+440,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(120+340,120+440,15,15);
fillellipse(120+440,120+340,15,15);
score1=score2=2; /有棋后改变分数/
DoScore();/输出开始分数/
}
void playtoplay()/人人对战/
{
int x,y,t=1,i,j,cc=0;
while(1)/换棋手走棋/
{
x=120,y=80;/每次棋子一开始出来的坐标,x为行坐标,y为列坐标/
while(1) /具体一个棋手走棋的过程/
{
PrintScore(1);/输出棋手1的成绩/
PrintScore(2);/输出棋手2的成绩/
SetPlayColor(t);/t变量是用来判断棋手所执棋子的颜色/
fillellipse(x,y,15,15);
key=bioskey(0);/接收按键/
if(key==ESC)/跳出游戏/
break;
else
if(key==ENTER)/如果按键确定就可以跳出循环/
{
if(y!=80&&a[(x-120)/40][(y-120)/40]!=1
&&a[(x-120)/40][(y-120)/40]!=2)/如果落子位置没有棋子/
{
if(t%2==1)/如果是棋手1移动/
a[(x-120)/40][(y-120)/40]=1;
else/否则棋手2移动/
a[(x-120)/40][(y-120)/40]=2;
if(!QpChange(x,y,t))/落子后判断棋盘的变化/
{
a[(x-120)/40][(y-120)/40]=0;/恢复空格状态/
cc++;/开始统计尝试次数/
if(cc>=64-score1-score2) /如果尝试超过空格数则停步/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;/如果按键无效/
}
DoScore();/分数的改变/
break;/棋盘变化了,则轮对方走棋/
}
else/已经有棋子就继续按键/
continue;
}
else /四个方向按键的判断/
if(key==LEFT&&x>120)/左方向键/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x-=40;
fillellipse(x,y,15,15);
}
else
if(key==RIGHT&&x<400&&y>80)/右方向键/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)/上方向键/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(key==DOWN&&y<400)/下方向键/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y+=40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)/结束游戏/
break;
if((score1+score2)==64||score1==0||score2==0)/格子已经占满或一方棋子为0判断胜负/
{
playWin();/输出最后结果/
break;
}
t=t%2+1; /一方走后,改变棋子颜色即轮对方走/
cc=0; /计数值恢复为0/
} /endwhile/
}
void SetPlayColor(int t)/设置棋子颜色/
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);/白色/
else
setfillstyle(SOLID_FILL,8);/灰色/
}
void MoveColor(int x,int y)/走了一步后恢复原来格子的状态/
{
if(y<100)/如果是从起点出发就恢复蓝色/
setfillstyle(SOLID_FILL,BLUE);
else/其他情况如果是1就恢复白色棋子,2恢复黑色棋子,或恢复蓝色棋盘/
switch(a[(x-120)/40][(y-120)/40])
{
case 1:
setfillstyle(SOLID_FILL,15);break; /白色/
case 2:
setfillstyle(SOLID_FILL,8);break; /黑色/
default:
setfillstyle(SOLID_FILL,BLUE); /蓝色/
}
}
int QpChange(int x,int y,int t)/判断棋盘的变化/
{
int i,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40; /计算数组元素的行下标/
j=(y-120)/40; /计算数组元素的列下标/
SetPlayColor(t);/设置棋子变化的颜色/
/开始往8个方向判断变化/
if(j<6)/往右边/
{
for(k=j+1;k<8;k++)
if(a[i][k]==a[i][j]||a[i][k]==0)/遇到自己的棋子或空格结束/
break;
if(a[i][k]!=0&&k<8)
{
for(kk=j+1;kk<k&&k<8;kk++)/判断右边/
{
a[i][kk]=a[i][j]; /改变棋子颜色/
fillellipse(120+i40,120+kk40,15,15);
}
if(kk!=j+1) /条件成立则有棋子改变过颜色/
yes=1;
}
}
if(j>1)/判断左边/
{
for(k=j-1;k>=0;k--)
if(a[i][k]==a[i][j]||!a[i][k])
break;
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1;kk>k&&k>=0;kk--)
{
a[i][kk]=a[i][j];
fillellipse(120+i40,120+kk40,15,15);
}
if(kk!=j-1)
yes=1;
}
}
if(i<6)/判断下边/
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k<8)
{
for(kk=i+1;kk<k&&k<8;kk++)
{
a[kk][j]=a[i][j];
fillellipse(120+kk40,120+j40,15,15);
}
if(kk!=i+1)
yes=1;
}
}
if(i>1)/判断上边/
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk40,120+j40,15,15);
}
if(kk!=i-1)
yes=1;
}
}
if(i>1&&j<6)/右上/
{
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii40,120+jj40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j>1)/左下/
{
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii40,120+jj40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
if(i>1&&j>1)/左上/
{
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii40,120+jj40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j<6)/ 右下/
{
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii40,120+jj40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
return yes;/返回是否改变过棋子颜色的标记/
}
void DoScore()/处理分数/
{
int i,j;
score1=score2=0;/重新开始计分数/
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(a[i][j]==1)/分别统计两个人的分数/
score1++;
else
if(a[i][j]==2)
score2++;
}
void PrintScore(int playnum)/输出成绩/
{
if(playnum==1)/清除以前的成绩/
{
setfillstyle(SOLID_FILL,BLUE);
bar(550,100,640,400);
}
setcolor(RED);
settextstyle(0,0,4);/设置文本输出样式/
if(playnum==1)/判断输出哪个棋手的分,在不同的位置输出/
{
sprintf(playone,"%d",score1);
outtextxy(550,200,playone);
}
else
{
sprintf(playtwo,"%d",score2);
outtextxy(550,300,playtwo);
}
setcolor(0);
}
void playWin()/输出最后的胜利者结果/
{
settextstyle(0,0,4);
setcolor(12);
if(score2>score1)/开始判断最后的结果/
outtextxy(100,50,"black win!");
else
if(score2<score1)
outtextxy(100,50,"white win!");
else
outtextxy(60,50,"you all win!");
}
// Calcu24cpp : Defines the entry point for the console application
//
/
6-6
24点游戏
/
#include "conioh"
#include "stdlibh"
#include "timeh"
#include "mathh"
#include "stringh"/
从一副扑克牌中,任取4张。
2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按 1 计算
要求通过加减乘除四则运算得到数字 24。
本程序可以随机抽取纸牌,并用试探法求解。
/void GivePuzzle(char buf)
{
char card[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'}; for(int i=0; i<4; i++){
buf[i] = card[rand() % 13];
}
}
void shuffle(char buf)
{
for(int i=0; i<5; i++){
int k = rand() % 4;
char t = buf[k];
buf[k] = buf[0];
buf[0] = t;
}
}
int GetCardValue(int c)
{
if(c=='T') return 10;
if(c>='0' && c<='9') return c - '0';
return 1;
}
char GetOper(int n)
{
switch(n)
{
case 0:
return '+';
case 1:
return '-';
case 2:
return '';
case 3:
return '/';
} return ' ';
}double MyCalcu(double op1, double op2, int oper)
{
switch(oper)
{
case 0:
return op1 + op2;
case 1:
return op1 - op2;
case 2:
return op1 op2;
case 3:
if(fabs(op2)>00001)
return op1 / op2;
else
return 100000;
} return 0;
}
void MakeAnswer(char answer, int type, char question, int oper)
{
char p[4][3];
for(int i=0; i<4; i++)
{
if( question[i] == 'T' )
strcpy(p[i], "10");
else
sprintf(p[i], "%c", question[i]);
}
switch(type)
{
case 0:
sprintf(answer, "%s %c (%s %c (%s %c %s))",
p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);
break;
case 1:
sprintf(answer, "%s %c ((%s %c %s) %c %s)",
p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);
break;
case 2:
sprintf(answer, "(%s %c %s) %c (%s %c %s)",
p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);
break;
case 3:
sprintf(answer, "((%s %c %s) %c %s) %c %s",
p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);
break;
case 4:
sprintf(answer, "(%s %c (%s %c %s)) %c %s",
p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);
break;
}
}
bool TestResolve(char question, int oper, char answer)
{
// 等待考生完成
int type[5]={0,1,2,3,4};//计算类型
double p[4];
double sum=0;
//
for(int i=0; i<4; i++) //循环取得点数
{
p[i]=GetCardValue(int(question[i]));
} for(i=0;i<5;i++)
{
MakeAnswer(answer,type[i],question,oper); //获取可能的答案
switch(type[i])
{
case 0:
sum=MyCalcu(p[0],MyCalcu( p[1],MyCalcu(p[2], p[3], oper[2]),oper[1]),oper[0]); //A(B(cD))
break;
case 1:
sum=MyCalcu(p[0],MyCalcu(MyCalcu(p[1], p[2], oper[1]),p[3],oper[2]),oper[0]); //A((BC)D)
break;
case 2:
sum=MyCalcu(MyCalcu(p[0], p[1], oper[0]),MyCalcu(p[2], p[3], oper[2]),oper[1]); // (AB)(CD)
break;
case 3:
sum=MyCalcu(MyCalcu(MyCalcu(p[0], p[1], oper[0]),p[2],oper[1]),p[3],oper[2]); //((AB)C)D
break;
case 4:
sum=MyCalcu(MyCalcu(p[0],MyCalcu(p[1], p[2], oper[1]),oper[0]),p[3],oper[2]); //(A(BC))D
break;
}
if(sum==24) return true;
}
return false;
}
/
采用随机试探法:就是通过随机数字产生 加减乘除的 组合,通过大量的测试来命中的解法
提示:
1 需要考虑用括号控制计算次序的问题 比如:( 10 - 4 ) ( 3 + A ), 实际上计算次序的数目是有限的:
A(B(cD))
A((BC)D)
(AB)(CD)
((AB)C)D
(A(BC))D
2 需要考虑计算结果为分数的情况:( 3 + (3 / 7) ) 7
3 题目中牌的位置可以任意交换
/
bool TryResolve(char question, char answer)
{
int oper[3]; // 存储运算符,0:加法 1:减法 2:乘法 3:除法
for(int i=0; i<1000 1000; i++)
{
// 打乱纸牌顺序
shuffle(question);
// 随机产生运算符
for(int j=0; j<3; j++)
oper[j] = rand() % 4; if( TestResolve(question, oper, answer) ) return true;
} return false;
}
int main(int argc, char argv[])
{
// 初始化随机种子
srand( (unsigned)time( NULL ) ); char buf1[4]; // 题目
char buf2[30]; // 解答
printf("\n");
printf("计算24\n");
printf("A J Q K 均按1计算,其它按牌点计算\n");
printf("目标是:通过四则运算组合出结果:24\n");
printf("\n\n");
for(;;)
{
GivePuzzle(buf1); // 出题
printf("题目:");
for(int j=0; j<4; j++){
if( buf1[j] == 'T' )
printf("10 ");
else
printf("%c ", buf1[j]);
} printf("\n按任意键参考答案\n");
getch(); if( TryResolve(buf1, buf2) ) // 解题
printf("参考:%s\n", buf2);
else
printf("可能是无解\n"); printf("按任意键出下一题目,x 键退出\n");
if( getch() == 'x' ) break;
} return 0;
}
“猜数字小游戏”,每个数字后按空格,最后按回车确认
#include<stdioh>
#include<stdlibh>
#include<timeh>
int a[4],b[4];
int count=0; //计算猜测次数
void csh( ); //初始化
void start( ); //开始游戏
int main( )
{ csh( );
start( );
}
void csh( ) //初始化
{ printf("\n\n 猜 数 字 小 游 戏\n\n");
printf(“ 猜四个数字,如数字与顺序都正确记为A,数字正确位置不对记为B\n”);
}
void start( ) //开始游戏
{int m,n; //m是完全猜对的个数,n是顺序不对的个数
while(1)
{srand((unsigned)time(NULL)); //初始化随机数发生器srand( )
while(1) { for(int i=0;i<4;i++) a[i]=rand( )%10; //rand( )函数每次随机产生一个0-9的数
if( (a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0])&&
(a[2]!=a[1]&&a[2]!=a[0])&&a[1]!=a[0] ) break; } //4个随机数各自不相等
printf(" 请依次输入4个一位整数:\n\n ");
while(1)
{for(int i=0;i<4;i++) scanf(“%d”,&b[i]);
printf(" 你输入的是:%d %d %d %d ",b[0],b[1],b[2],b[3]);
m=0;n=0;
for(int i=0;i<4;i++)
{for(int j=0;j<4;j++)
{ if(b[i]==a[j]&&i==j)m=m+1; if(b[i]==a[j]&&i!=j)n=n+1; }
}
count=count+1;
printf(" %dA %dB 你试了%d次\n ",m,n,count);
if(m==4)break;
if(count==8){ count=0; break; }
}
printf("\n");
if(m==4)printf(" 你猜对了(^-^)! 就是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
else printf(" 你输了(T-T)!哈哈!应该是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
int z;
printf(" (要继续吗?1或0)\n ");
scanf(“%d”,&z);
if(z==0) break;
}
}
以上就是关于C语言编程:剪刀石头布的小游戏全部的内容,包括:C语言编程:剪刀石头布的小游戏、用C语言编一个小游戏,注明编码,(简单易懂的游戏,不要复杂)、用C语言编写小游戏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)