[英]Reversi Game – Board Configuration and Move Legality Checking in C programming
在下面的程序中輸入應該是這樣的形式:U-為未占用,B-由黑色占用,W-由白色占用。 程序在初始化電路板后應要求用戶配置,然后使用用戶配置打印電路板。 然后它相應地打印 'W' 和 'B' 的可用移動。 最后一步是要求使用的棋步,如果它與之前打印的可用棋步匹配,則打印棋步有效的消息,然后使用有效棋步最后一次打印棋盤。 打印配置的電路板后,我在這里得到了一些奇怪的輸出。 請在這里幫忙,謝謝。 這是一個示例輸入和預期輸出:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void boardInitialize(char board[26][26], int n);
void printBoard(char board[26][26], int n);
bool checkLegalMovesAvailable(char board[26][26], int N, char colour);
bool positionInBounds(int N, char row, char col);
void printMove(char board[26][26], int n);
bool checkLegalInDirection(char board[26][26],int N,char row,char col,char colour,int deltaRow,int deltaCol);
bool checkLegalInMove(char board[26][26], int N, char row, char col, char colour);
int main(void){
int n;
char board[26][26];
printf("Enter the board dimension: ");
scanf("%d",&n);
boardInitialize(board,n);
printBoard(board,n);
if(checkLegalMovesAvailable(board,n,'W'))
checkLegalMovesAvailable(board,n,'B');
printMove(board,n);
return (EXIT_SUCCESS);
}
//Function to initialize board
void boardInitialize(char board[26][26], int n){
printf(" ");
for(int i=0;i<n;i++){
printf("%c",97+i);
}
printf("\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
board[i][j]='U';
}
}
board[(n/2)-1][(n/2)-1]='W';
board[n/2][n/2]='W';
board[(n/2)-1][n/2]='B';
board[n/2][(n/2)-1]='B';
for(int i=0;i<n;i++){
printf("%c ",97+i);
for(int j=0;j<n;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
}
//Function to print board after configuration
void printBoard(char board[26][26], int n){
printf("Enter board configuration:");
printf("\n");
char color,row,col;
for(int i=0;(color!='!' && row!='!' && col!='!');i++){
scanf(" %c%c%c",&color,&row,&col);
board[row-'a'][col-'a']=color;
}
printf(" ");
for(int i=0;i<n;i++){
printf("%c",97+i);
}
printf("\n");
for(int i=0;i<n;i++){
printf("%c ",97+i);
for(int j=0;j<n;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
}
//function to print available moves after configuration
bool checkLegalMovesAvailable(char board[26][26], int N, char colour){
int done=1;
printf("Available moves for %c:\n",colour);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(board[i][j]==colour){
for(int deltaRow=-1;deltaRow<=1;deltaRow++){
for(int deltaCol=-1;deltaCol<=1 && done!=0;deltaCol++){
if((positionInBounds(N,('a'+deltaRow), ('a'+deltaCol))) && (checkLegalInDirection(board,N,('a'+deltaRow),('a'+deltaCol),colour,deltaRow,deltaCol)))
done++;
}
}
}
}
}
return true;
}
//function to check if any move is legal in a specific direction
bool checkLegalInDirection(char board[26][26],int N,char row,char col,char colour,int deltaRow,int deltaCol){
int r=row-'a', c=col-'a',count=2;
if((board[r+deltaRow][c+deltaCol]!=colour) && (board[r+deltaRow][c+deltaCol]!='U')){
for(int i=0;i<N;i++){
if((board[r+(count*deltaRow)][c+(count*deltaCol)]!=colour) &&(board[r+(count*deltaRow)][c+(count*deltaCol)]!='U'))
count++;
else
count--;
printf("%c%c\n",(row+(count*deltaRow)),(col+(count*deltaCol)));
}
return true;
}
else
if(board[r+deltaRow][c+deltaCol]==colour || board[r+deltaRow][c+deltaCol]=='U')
return false;
}
//function to check if the specified row,col lies within the board dimensions
bool positionInBounds(int N, char row, char col){
int p=row-'a',q=col-'a';
if(p>=0 && p<=N){
if(q>=0 && q<=N)
return true;
else
return false;
}
else
return false;
}
//function to print board after a legal move
void printMove(char board[26][26], int n){
char color,row,col;
printf("Enter a move:\n");
scanf(" %c%c%c",&color,&row,&col);
board[row-'a'][col-'a']=color;
if(checkLegalInMove(board,n,row,col,color)){
printf(" ");
for(int i=0;i<n;i++){
printf("%c",97+i);
}
printf("\n");
for(int i=0;i<n;i++){
printf("%c ",97+i);
for(int j=0;j<n;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
}
}
//function to check if any specific move is legal
bool checkLegalInMove(char board[26][26], int N, char row, char col, char colour){
int r=row-'a',c=col-'a';
for(int deltaRow=-1;deltaRow<=1;deltaRow++){
for(int deltaCol=-1;deltaCol<=1;deltaCol++){
if((positionInBounds(N,row,col)) && (checkLegalInDirection(board,N,('a'+r),('a'+c),colour,deltaRow,deltaCol))){
printf("Valid move.\n");
return true;
}
else{
printf("Invalid move.\n");
return true;
}
}
}
}
這里有很多問題。 以下是一些:
(1) 在您的scanf
調用之一中,您忘記獲取要存儲結果的變量的地址。 gcc
對此發出警告:
scanf(" %c%c%c",color,row,col);
嘗試將其更改為:
scanf(" %c%c%c",&color,&row,&col);
(2) 在checkLegalInDirection
,在打印移動時,您正在減去“a”,這當然是錯誤的,因為您嘗試打印的是字符,而不是偏移量。 所以改變:
printf("%c%c\n",(row+(count*deltaRow)-'a'),(col+(count*deltaCol)-'a'));
到:
printf("%c%c\n",(row+(count*deltaRow)),(col+(count*deltaCol)));
(3) checkLegalMovesAvailable
應該返回一個bool
,但函數中的任何地方都沒有return
語句。 這意味着如果調用者嘗試檢查返回值,它將獲取一些隨機值。 向函數添加一個return
語句,並讓它返回一個bool
值。
我不相信這些是唯一的問題,但我真的認為你需要花一些時間來解決這個問題,所以我會讓你從這個開始。 希望這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.