當前位置:編程學習大全網 - 編程語言 - 求幾C語言個小遊戲代碼,簡單的,要註釋、、謝謝了、

求幾C語言個小遊戲代碼,簡單的,要註釋、、謝謝了、

// Calcu24.cpp : Defines the entry point for the console application.

//

/*

6-6

24點遊戲

*/

#include "conio.h"

#include "stdlib.h"

#include "time.h"

#include "math.h"

#include "string.h"/*

從壹副撲克牌中,任取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)>0.0001)

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*(c*D))

break;

case 1:

sum=MyCalcu(p[0],MyCalcu(MyCalcu(p[1], p[2], oper[1]),p[3],oper[2]),oper[0]); //A*((B*C)*D)

break;

case 2:

sum=MyCalcu(MyCalcu(p[0], p[1], oper[0]),MyCalcu(p[2], p[3], oper[2]),oper[1]); // (A*B)*(C*D)

break;

case 3:

sum=MyCalcu(MyCalcu(MyCalcu(p[0], p[1], oper[0]),p[2],oper[1]),p[3],oper[2]); //((A*B)*C)*D

break;

case 4:

sum=MyCalcu(MyCalcu(p[0],MyCalcu(p[1], p[2], oper[1]),oper[0]),p[3],oper[2]); //(A*(B*C))*D

break;

}

if(sum==24) return true;

}

return false;

}

/*

采用隨機試探法:就是通過隨機數字產生 加減乘除的 組合,通過大量的測試來命中的解法

提示:

1. 需要考慮用括號控制計算次序的問題 比如:( 10 - 4 ) * ( 3 + A ), 實際上計算次序的數目是有限的:

A*(B*(c*D))

A*((B*C)*D)

(A*B)*(C*D)

((A*B)*C)*D

(A*(B*C))*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;

}

  • 上一篇:教學格言摘錄
  • 下一篇:Js問題,請說明。代碼有問題嗎?
  • copyright 2024編程學習大全網