user-0 提问: 正在用c语言写个简单实用的象棋程序

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:将前面的#define全部注释掉再试试。 您的程序运行后是乱的，而且对于我个初学者来说太复杂了，根本看不懂。不过也谢啦

user: user-0
content: 引用 1 楼 user-3 的回复:你调用qipan_init函数并没有初始化main中的qipan啊，初始化的只是该函数内部的qipan 谢谢啦，你修改的内容解决了我的问题，不过原因我要再想想。非常感谢

user: user-1
content: 象棋程序，进来一看，貌似控制台界面

user: user-2
content: 仅供参考：#include <windows.h> #include <stdio.h>  void ConPrint(char *CharBuffer, int len); void ConPrintAt(int x, int y, char *CharBuffer, int len); void gotoXY(int x, int y); void ClearConsole(void); void ClearConsoleToColors(int ForgC, int BackC); void SetColorAndBackground(int ForgC, int BackC); void SetColor(int ForgC); void HideTheCursor(void); void ShowTheCursor(void);  int main(int argc, char* argv[]) {    HideTheCursor();    ClearConsoleToColors(15, 1);    ClearConsole();    gotoXY(1, 1);    SetColor(14);    printf("This is a test...\n");    Sleep(5000);    ShowTheCursor();    SetColorAndBackground(15, 12);    ConPrint("This is also a test...\n", 23);    SetColorAndBackground(1, 7);    ConPrintAt(22, 15, "This is also a test...\n", 23);    gotoXY(0, 24);    SetColorAndBackground(7, 1);    return 0; }  //This will clear the console while setting the forground and //background colors. void ClearConsoleToColors(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //not used but we need to capture this since it will be    //written anyway (passing NULL causes an access violation).    DWORD count;     //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    SetConsoleTextAttribute(hStdOut, wColor);    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);        FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will clear the console. void ClearConsole() {    //Get the handle to the current output buffer...    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    //This is used to reset the carat/cursor to the top left.    COORD coord = {0, 0};    //A return value... indicating how many chars were written    //   not used but we need to capture this since it will be    //   written anyway (passing NULL causes an access violation).    DWORD count;    //This is a structure containing all of the console info    // it is used here to find the size of the console.    CONSOLE_SCREEN_BUFFER_INFO csbi;    //Here we will set the current color    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //This fills the buffer with a given character (in this case 32=space).       FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);       //This will set our cursor position for the next print statement.       SetConsoleCursorPosition(hStdOut, coord);    } }  //This will set the position of the cursor void gotoXY(int x, int y) {    //Initialize the coordinates    COORD coord = {x, y};    //Set the position    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }  //This will set the forground color for printing in a console window. void SetColor(int ForgC) {    WORD wColor;    //We will need this handle to get the current background attribute    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    CONSOLE_SCREEN_BUFFER_INFO csbi;     //We use csbi for the wAttributes word.    if(GetConsoleScreenBufferInfo(hStdOut, &csbi))    {       //Mask out all but the background attribute, and add in the forgournd color       wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);       SetConsoleTextAttribute(hStdOut, wColor);    } }  //This will set the forground and background color for printing in a console window. void SetColorAndBackground(int ForgC, int BackC) {    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor); }  //Direct console output void ConPrint(char *CharBuffer, int len) {    DWORD count;    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL); }  //Direct Console output at a particular coordinate. void ConPrintAt(int x, int y, char *CharBuffer, int len) {    DWORD count;    COORD coord = {x, y};    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    SetConsoleCursorPosition(hStdOut, coord);    WriteConsole(hStdOut, CharBuffer, len, &count, NULL); }  //Hides the console cursor void HideTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = FALSE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }  //Shows the console cursor void ShowTheCursor() {    CONSOLE_CURSOR_INFO cciCursor;    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if(GetConsoleCursorInfo(hStdOut, &cciCursor))    {       cciCursor.bVisible = TRUE; 	  SetConsoleCursorInfo(hStdOut, &cciCursor);    } }

user: user-3
content: 这样试下：   #include<stdio.h> #define 车 a #define 马 b #define 相 c #define 士 d #define 帅 e #define 炮 f #define 兵 g #define 車 A #define 馬 B #define 象 C #define 仕 D #define 将 E #define 泡 F #define 卒 G int i,j; char a,b,c,d,e,f,g,A,B,C,D,E,F,G; char qipan[10][9]={{'A','B','C','D','E','D','C','B','A'},{'+','+','+','+','+','+','+','+','+'},{'+','F','+','+','+','+','+','F','+'},{'G','+','G','+','G','+','G','+','G'},{'+','+','+','+','+','+','+','+','+'},{'+','+','+','+','+','+','+','+','+'},{'g','+','g','+','g','+','g','+','g'},{'+','f','+','+','+','+','+','f','+'},{'+','+','+','+','+','+','+','+','+'},{'a','b','c','d','e','d','c','b','a'}}; char** qipan_init() {  	for(i=0;i<10;i++) 	{ 		for(j=0;j<9;j++) 			printf("%4c",qipan[i][j]); 		printf("\n\n"); 	} 	return (char**)qipan; } void print(int M,int N,int X,int Y) { 	qipan[10][9]; 	qipan[X][Y]=qipan[M][N]; 	qipan[M][N]='+'; 	for(i=0;i<10;i++) 	{ 		for(j=0;j<9;j++) 			printf("%4c",qipan[i][j]); 		printf("\n\n"); 	} } int main() {  	qipan_init(); 	int m,n,x,y,flag; 	int step=0;  	for(;;) 	{ 		do 		{ 			printf("请红方走子："); 			scanf("%d%d%d%d",&m,&n,&x,&y); 			if((m<10)&&(m>=0)&&(n<9)&&(n>=0)&&(x<10)&&(x>=0)&&(y<9)&&(y>=0)) 			{ 				switch(qipan[m][n]) 				{ 				case'a':printf("红方走车");flag=1;break; 				case'b':printf("红方走马");flag=1;break; 				case'c':printf("红方走相");flag=1;break; 				case'd':printf("红方走士");flag=1;break; 				case'e':printf("红方走帅");flag=1;break; 				case'f':printf("红方走炮");flag=1;break; 				case'g':printf("红方走兵");flag=1;break; 				default:flag=0;printf("走错子啦！\n"); 				} 				if(flag==1) 				{ 					print(m,n,x,y); 					step++; 				} 			} 			else  				printf("走错啦，重新走\n"); 		} 		while (step%2==0); 		do{ 			printf("请黑方走子："); 			scanf("%d%d%d%d",&m,&n,&x,&y); 			if((m<10)&&(m>=0)&&(n<9)&&(n>=0)&&(x<10)&&(x>=0)&&(y<9)&&(y>=0)) 			{ 				switch(qipan[m][n]) 				{ 				case'A':printf("黑方走车");flag=1;break; 				case'B':printf("黑方走马");flag=1;break; 				case'C':printf("黑方走相");flag=1;break; 				case'D':printf("黑方走士");flag=1;break; 				case'E':printf("黑方走帅");flag=1;break; 				case'F':printf("黑方走炮");flag=1;break; 				case'G':printf("黑方走兵");flag=1;break; 				default:flag=0;printf("走错子啦！\n"); 				} 				if(flag==1) 				{ 					print(m,n,x,y); 					step++; 				} 			} 			else 				printf("走错啦!重新走\n"); 		} 		while(step%2==1); 	} }

user: user-2
content: 将前面的#define全部注释掉再试试。

user: user-3
content: 你调用qipan_init函数并没有初始化main中的qipan啊，初始化的只是该函数内部的qipan