练习:天生棋局

有两个函数原型的题目可任意实现一个
1.传入一个 n 在堆空间中产生 n*n 方格的棋盘
int ** createBoard(int n);
int createBoard1(int ***p,int n);
2.N 颗棋子随机落在棋盘上<需要防止落在同一位置>
int initBoard(int **p,int n);
3.打印棋盘
int printBoard(int **p,int n);
如果有两颗棋子落同一行或者同一列 输出好棋,否则 输出 不是好棋。
将棋局中的棋子打印出来 空位用 O 有旗子的用 X 表示
4.销毁棋盘
int destroyBoard(int **p,int n);
int destroyBoard1(int ***p,int n);

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 int **createBoard(int n);//生成棋盘
  5 void printBoard(int **board, int n);//打印棋盘
  6 int initBoard(int **board, int n);//落子
  7 int isGood(int **board, int n);//判断是否好棋
  8 int destroyBoard(int **board, int n);//销毁棋盘
  9 int main(void)
 10 {
 11     int **board=0;
 12     int n=6;
 13     board=createBoard(n);
 14     printBoard(board, n);
 15     printf("--------------------\n");
 16     initBoard(board, n);
 17     printBoard(board, n);
 18  
 19     if(isGood(board, n))
 20         printf("very good\n");
 21     else
 22         printf("so low\n");
 23     printf("--------------------\n");
 24     destroyBoard(board, n);
 25     printf("the board was destroyed\n");
 26     return 0;
 27 }
 28 //创建棋盘
 29 int **createBoard(int n)
 30 {
 31     int **board=(int **)malloc(sizeof(int *)*n);
 32     int i=0,j=0;
 33     for(i=0;i<n;i++)
 34         board[i]=(int *)malloc(sizeof(int)*n);
 35     for(i=0;i<n;i++)
 36         for(j=0;j<n;j++)
 37             board[i][j]=0;
 38     return board;
 39 }
 40 //打印棋盘
 41 void printBoard(int **board, int n)
 42 {
 43     int i=0,j=0;
 44     for(i=0;i<n;i++)
 45     {
 46         for(j=0;j<n;j++)
 47             printf("%4d",board[i][j]);
 48         printf("\n");
 49     }
 50 }
 51 //随机落子
 52 int initBoard(int **board, int n)
 53 {
 54     int row=0,line=0;
 55     srand(time(NULL));
 56  
 57     int i=0;
 58     while(i<n)
 59     {
 60         row=rand()%n;
 61         line=rand()%n;
 62  
 63         if(board[row][line]==0)//若此处无子,则在此处落子
 64         {
 65             board[row][line]=1;
 66             i++;
 67         }
 68     }
 69     return i;
 70 }
 71 //判断是否有棋子在同行或者同列
 72 int isGood(int **board, int n)
 73 {
 74     /*
 75         将有子的坐标的横坐标还有纵坐标分别存入两个数组,最后再判断两个数组中有相同元素则是好棋
 76     */
 77     int *row=(int *)calloc(n,sizeof(int));
 78     int *line=(int *)calloc(n,sizeof(int));
 79     int i=0,j=0;
 80     int k=0;
 81     for(i=0;i<n;i++)
 82         for(j=0;j<n;j++)
 83         {
 84             if(board[i][j]==1){
 85                 row[k]=i;
 86                 line[k]=j;
 87                 k++;
 88             }
 89         }
 90     int flag=0;
 91     for(i=0;i<k-1;i++)
 92         for(j=i+1;j<k;j++)
 93         {
 94             if(row[i]==row[j]||line[i]==line[j]){
 95                 flag=1;
 96                 return flag;
 97             }
 98         }
 99     return flag;
100 }
101 //销毁棋盘
102 int destroyBoard(int **board, int n)
103 {
104     int i=0;
105     for(i=0;i<n;i++)
106     {
107         free(board[i]);
108     }
109     free(board);
110     return 0;
111 }

 

posted @ 2015-09-04 20:40  luo__jialin  阅读(338)  评论(0编辑  收藏  举报