遊戲利用一大小為n×n的表格(即表格有n行和n列),其中n為2至8間(包括2和8)的整數。 表格內每一單元格可由所在的行數和列數參照。 Q3 I 遊戲由二人對奕。 II 格數 遊戲利用一大小為n×n的表格(即表格有n行和n列),其中n為2至8間(包括2和8)的整數。 表格內每一單元格可由所在的行數和列數參照。 III 選擇 遊戲開始,電腦要求遊戲者輸入n後,便會建立一大小為n×n的表格。 表格內各單元格的值為介乎0至8間(包括0和8)的隨機整數。 例如,若玩者輸入的n值為3 ,則電腦會建立如下的3×3表格: IV 減一 對奕二人輪流選擇表格中的單元格。 當某人選擇了一單元格後,表格的內容會根據下列規則改變: 規則A :在任何情況下,已為0值的單元格,其值不會改變。 規則B :將被選取單元格的值減一。 規則C :將被選取單元格同一列的其他各單元格的值減一。row 規則D :將被選取單元格同一行的其他各單元格的值減一。column V 勝負 每次輪流選擇後,若符合以下三個條件中的任何一個,則該次玩者勝出,遊戲終結。 條件1 :任何一列的總和為0。 條件2 :任何一行的總和為0。 條件3 :任何一對角線的總和為0。 CS2000
例子 行C0 行C1 行C2 列R0 5 6 3 列R1 2 1 7 列R2 4 9 若玩者1 選擇了列R1、行C0的單元格, 則表格內各單元格的值將更新如下: 行C0 行C1 行C2 列R0 4 6 3 列R1 1 列R2 9 若玩者2 選擇了列R0、行C1的單元格, 則表格內各單元格的值將更新如下: 行C0 行C1 行C2 列R0 3 5 2 列R1 1 6 列R2 9 橫列row、 直行column 各減一 CS2000
#include <stdio.h> int square[8][8]; int turn, row_chosen, column_chosen, n, finish; // 1,2,3 1 2 完成 //(a) void init(){ int r,c; srand(time(NULL)); for(r=0; r<n; r++) for(c=0; c<n; c++) square[r][c] = rand()%9+1; } //(b) void getRowCol(){ printf("Please enter the 行row number: "); scanf("%d",&row_chosen); printf("Please enter the 列column number: "); scanf("%d",&column_chosen); } CS2000
printf("\nThe values of the cells in the table are >\n"); void show_square(){ int r,c; printf("\nThe values of the cells in the table are >\n"); for(r=0;r<n;r++){ for(c=0;c<n;c++) printf("%5d", square[r][c]); printf("\n"); } 行C0 行C1 行C2 列R0 4 6 3 列R1 1 列R2 9 1 //(d) void process(int row, int column){ int r,c; for(r=0; r<n; r++) if(square[r][column]>0) square[r][column]--; for(c=0; c<n; c++) if(square[row][c]>0 && c!=column) square[row][c]--; } 3 0,0 0,1 0,2 … 0,7 1,1 2,1 3,1 4,1 5,1 6,1 7,1 CS2000
for(c=0; c<n; c++) sum += square[r][c]; return sum; } 0,1,2 int sumRow (int r){ int c, sum=0; for(c=0; c<n; c++) sum += square[r][c]; return sum; } int sumColumn (int c){ int r, sum=0; for(r=0; r<n; r++) sum += square[r][c]; r=0 0,0 0,1 0,2 … 0,7 c=1 0,1 1,1 : 6,1 7,1 0,1,2 0,0 1,1 : 7,7 int sumDiagonal1(){ int pt, sum=0; for(pt=0; pt<n; pt++) sum += square[pt][pt]; return sum; } int sumDiagonal2(){ for(pt=0; pt<n; pt++) sum += square[pt][n-pt-1]; 0,7 1,6 : 6,1 7,0 CS2000
if(sumRow(r)==0) theEnd=1; for(c=0; c<n; c++) int endGame(){ int r, c, sum, theEnd=0; for(r=0; r<n; r++) if(sumRow(r)==0) theEnd=1; for(c=0; c<n; c++) if(sumColumn(c)==0) theEnd=1; if(sumDiagonal1()==0) theEnd=1; if(sumDiagonal2()==0) theEnd=1; return theEnd; } CS2000
printf("Enter the size of table: "); scanf("%d",&n); init(); main(){ printf("Enter the size of table: "); scanf("%d",&n); init(); printf("A %d X %d table is generated ",n,n); printf("and the values of the cell are >\n"); show_square(); turn=1; finish=0; printf("\nPlayer %d wins the game.\n", turn%2+1); } do{ turn++; printf("\nTurn > Player %d\n", turn%2+1); getRowCol(); process(row_chosen,column_chosen); show_square(); finish=endGame(); }while(!finish); CS2000