C语言关于可视化界面问题


#include <stdio.h>
#include <stdlib.h>
 
int count = 0;//用于计数,共有几种摆法。
int judge(int row,int col,int (*chess)[8])    //同一列、同一行、同一斜线上有1便是危险地带
{
    int i,j;
    for(i=0;i<8;i++)//判断列 
    {
        if(chess[i][col]==1)
            return 0;
    }
    for(i=0;row-i>=0&&col-i>=0;i++)//判断左上 
    {
        if(chess[row-i][col-i]==1)
            return 0;
    }
    for(i=0;row+i<8&&col-i>=0;i++)//判断右上 
    {
        if(chess[row+i][col-i]==1)
            return 0;
    }
    for(i=0;row-i>=0&&col+i<8;i++)//判断左下 
    {
        if(chess[row-i][col+i]==1)
            return 0;
    }
    for(i=0;row+i<8&&col+i<8;i++)//判断右下 
    {
        if(chess[row+i][col+i]==1)
            return 0;
    }
    return 1; 
}
void EightQueen(int row,int (*chess)[8])
{
    int chess0[8][8];
    int i,j;
    for(i=0;i<8;i++)
        for(j=0;j<8;j++)
            chess0[i][j]=chess[i][j];
    if(row==8)         //row=8证明8行都已放置了一个皇后。
    {
        count++;
        printf("第%d个摆法\n",count);
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
                printf("%d ",chess2[i][j]);
            printf("\n");
        }
    }
    else
    {
        for(j=0;j<8;j++)                        //j遍历一行中每个位置。
        {
            if(judge(row,j,chess2))         //判断(row,j)位置是否危险,不危险则放置皇后。
            {
                for(i=0;i<8;i++)              //这里非常重要,把一行的棋盘更新,
                    chess0[row][i]=0;         //如果不更新,此行仍保留上次的1,便会出错。
                chess0[row][j]=1;
                EightQueen(row+1,chess0);     //递归查找下一行中皇后位置。
            }                
        }
        
    }
}
int main()
{
    int chess[8][8];
    int i,j;
    for(i=0;i<8;i++)    //对棋盘初始化。
        for(j=0;j<8;j++)
            chess[i][j]=0;
    EightQueen(0,chess);//从0行开始
    return 0;
}
添加一个八皇后棋盘的可视化界面

@threenewbee

#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
int count = 0;//用于计数,共有几种摆法。
int judge(int row,int col,int (*chess)[8])    //同一列、同一行、同一斜线上有1便是危险地带
{
    int i,j;
    for(i=0;i<8;i++)//判断列 
    {
        if(chess[i][col]==1)
            return 0;
    }
    for(i=0;row-i>=0&&col-i>=0;i++)//判断左上 
    {
        if(chess[row-i][col-i]==1)
            return 0;
    }
    for(i=0;row+i<8&&col-i>=0;i++)//判断右上 
    {
        if(chess[row+i][col-i]==1)
            return 0;
    }
    for(i=0;row-i>=0&&col+i<8;i++)//判断左下 
    {
        if(chess[row-i][col+i]==1)
            return 0;
    }
    for(i=0;row+i<8&&col+i<8;i++)//判断右下 
    {
        if(chess[row+i][col+i]==1)
            return 0;
    }
    return 1; 
}
void EightQueen(int row,int (*chess)[8])
{
    initgraph(700,700);
    setbkcolor(WHITE);
    cleardevice();
    int chess0[8][8];
    int i,j;
    for(i=0;i<8;i++)
        for(j=0;j<8;j++)
            chess0[i][j]=chess[i][j];
    if(row==8)         //row=8证明8行都已放置了一个皇后。
    {
        count++;
        printf("第%d个摆法\n",count);
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
            {
                printf("%d ",chess0[i][j]);
                if(chess0[i][j] == 1)
                    setfillcolor(BLACK);
                else
                    setfillcolor(WHITE);
                setfillcolor(BLACK);    
                fillrectangle(i * 40, j * 40, i * 40 + 40, j * 40 + 40);            
            }                           
        }
    }
    else
    {
        for(j=0;j<8;j++)                        //j遍历一行中每个位置。
        {
            if(judge(row,j,chess0))         //判断(row,j)位置是否危险,不危险则放置皇后。
            {
                for(i=0;i<8;i++)              //这里非常重要,把一行的棋盘更新,
                    chess0[row][i]=0;         //如果不更新,此行仍保留上次的1,便会出错。
                chess0[row][j]=1;
                EightQueen(row+1,chess0);     //递归查找下一行中皇后位置。
            }                
        }
    }
    _getch();
    closegraph();
}

int main()
{
    int chess[8][8];
    int i,j;
    for(i=0;i<8;i++)    //对棋盘初始化。
        for(j=0;j<8;j++)
            chess[i][j]=0;
    EightQueen(0,chess);//从0行开始
    return 0;
}
这个哪里错了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7465679
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言面试常见问题总结
  • 你还可以看下c语言参考手册中的 c语言-成员访问与间接
  • 除此之外, 这篇博客: C语言常考面试基础问题中的 全局变量 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 实例:

    #include <stdio.h>
    //全局变量声明
    int c;
    
    int main(int argc, char const *argv[])
    {
    	//局部变量声明
    	int a,b;
    
    	//局部变量的初始化
    	a = 10;
    	b = 20;
    
    	//全局变量初始化
    	c = a + b;
    
    	printf("c is %d. \n",c);
    	printf("Hello World!\n");
    	return 0;
    }
    

    在程序中,局部变量全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。下面是一个实例:

    #include <stdio.h>
     
    /* 全局变量声明 */
    int g = 20;
     
    int main ()
    {
      /* 局部变量声明 */
      int g = 10;
     
      printf ("value of g = %d\n",  g);// g的值是10
     
      return 0;
    }
    
  • 您还可以看一下 包东华老师的C语言俄罗斯方块课程中的 游戏界面输出小节, 巩固相关知识点

这个你可以用easyx,无非就是绘制一个9x9的网格(从格子看是8x8

参考:

#include <graphics.h>
#include <conio.h>
#define HIGH 400
#define WIDTH 400
int main(void)
{
    initgraph(WIDTH, HIGH);
    setbkcolor(WHITE);
    cleardevice();
    for (int i = 1; i <= 8; i++)
    {
        for (int j = 1; j <= 8; j++)
        {
            if (((i % 2 == 1) && (j % 2 == 0)) || ((i % 2 == 0) && (j % 2 == 1)))
            {
                setfillcolor(BLACK);
                
            }
            else
            {
                setfillcolor(WHITE);
            }
            setcolor(BLACK);
            fillrectangle(i * 40, j * 40, i * 40 + 40, j * 40 + 40);

        }
    }
    _getch();
    closegraph();
    return 0;
}



```)