与2252309合作结对编程
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int score=0;
int add(int a,int b)
{
int c=a+b;
if(c<1000) return c;
else return -1;
}
int substract(int a,int b)
{
int c=a-b;
if(c>=0&&c<=1000) return c;
else return -1;
}
int multify(int a,int b)
{
int c=a*b;
if(c<1000) return c;
else return -1;
}
int divide(int a,int b)
{
int c=a/b;
if(a%b==0&&b!=0) return c;
else return -1;
}
int rand_num()
{
int num;
srand((unsigned)time(NULL) + (unsigned)rand());//初始化随机数种子
num=rand()%100;//生成一百以内的随机数
return num;
}
void menu()
{
printf("四则混合运算游戏\n");
printf("目前您的积分是%d\n",score);
printf("1、进行游戏 2、退出游戏\n");
printf("请选择:");
}
void menu_()
{
printf("----------------\n");
printf("1、加法(+)\n");
printf("2、减法(-)\n");
printf("3、乘法(*)\n");
printf("4、除法(/)\n");
printf("请选择两个运算符:");
}
void play()
{
int i,j;
int oper[2];//运算符
int num[5];//运算数字
int answer;//答案
menu_();
scanf("%d %d",&oper[0],&oper[1]);
if((oper[0]<=2&&oper[1]<=2)||(oper[0]>=3&&oper[1]>=3)){
//同一级别运算
j=0;
for(i=0;i<=2;i=i+2){
if(i==0) num[i]=rand_num();
num[i+1]=rand_num();
switch(oper[j++])
{
case 1:num[i+2]=add(num[i],num[i+1]);break;
case 2:num[i+2]=substract(num[i],num[i+1]);break;
case 3:num[i+2]=multify(num[i],num[i+1]);break;
case 4:num[i+2]=divide(num[i],num[i+1]);break;
}
if(num[i+2]<0||num[i+2]>100) {
//重置
i=i-2;
j=j-1;
}
}
}
else{
//不同一级别运算
//先乘除,后加减
int temp,flag=0;
if(oper[0]<=2&&oper[1]>=3){
temp=oper[1];oper[1]=oper[0];oper[0]=temp;
flag=1;
}
j=0;
for(i=0;i<=2;i=i+2){
if(i==0) num[i]=rand_num();
num[i+1]=rand_num();
switch(oper[j++])
{
case 1:num[i+2]=add(num[i],num[i+1]);break;
case 2:{
if(flag==1&&i==2) num[i+2]=substract(num[i+1],num[i]);
else num[i+2]=substract(num[i],num[i+1]);
break;
}
case 3:num[i+2]=multify(num[i],num[i+1]);break;
case 4:num[i+2]=divide(num[i],num[i+1]);break;
}
if(num[i+2]<0||num[i+2]>100) {
//重置
i=i-2;
j=j-1;
}
}
if(flag==1){
temp=oper[1];oper[1]=oper[0];oper[0]=temp;//交换运算符
temp=num[3];num[3]=num[1];num[1]=num[0];num[0]=temp;//交换数字
}
}
char OPER[2];
for(i=0;i<=1;i++){
switch(oper[i])
{
case 1:OPER[i]='+';break;
case 2:OPER[i]='-';break;
case 3:OPER[i]='*';break;
case 4:OPER[i]='/';break;
}
}
printf("请计算:%d %c %d %c %d =",num[0],OPER[0],num[1],OPER[1],num[3]);
scanf("%d",&answer);
if(answer==num[4]){
score++;
printf("回答正确,您当前积分为:%d\n",score);
}
else{
if(score==0) score++;
score--;
printf("回答错误,正确答案为%d,您当前积分为:%d\n",num[4],score);
}
system("pause");
system("cls");
}
int main()
{
int X;
while(1)
{
menu();
scanf("%d",&X);
switch(X){
case 1:play();break;
case 2:printf("您已成功退出游戏\n");
return 0;
}
system("cls");
}
}
2. 运行结果
- 初始界面
- 同级运算
- 不同级运算
- 计算错误
- 退出游戏
- 实验体会
在具体编程中要注意细节,如积分不可以是负数,故当积分为0时不会减1;在不同级别的运算中要注意运算顺序,要秉持先乘除后加减的原则;除数不能为零这一数学原则问题;还有考虑到小学计算难度,本游戏中的运算都是大于0且小于100的自然数运算等等。
结对编程的好处就在于此,一个人专心编程的同时另一个人就更能注意到这些细节处的问题。由于每个人的思考方式都有所差异,所以对于同一问题就有不同的解决方式,我们可以在比较之后选择更适用于实际情况的方式。同时结对编程也是个实时性的过程,边编写边检查边边反馈边交流,这能大大提升编程效率。不用为了一些常识性的语法小错误而寻找困惑,也不用担心在大致框架上出错,对于两个人的结对编程来说这是能保证的基本优势。结对编程还能参考学习别人的编程方式,对锻炼我们的代码风格和代码阅读能力有极大的好处。