1. 程式人生 > >簡單的三子棋

簡單的三子棋

要實現一個簡單的三子棋遊戲,大體思路為:列印選單、選擇遊戲、列印初始棋盤、玩家下棋、電腦下棋、判斷勝負、遊戲結束。

以下為遊戲程式碼:

標頭檔案game.h
#ifndef __GAME_H__ #define __GAME_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #define ROWS 3 #define COLS 3 void init_board(char board[ROWS][COLS], int row, int col); void display_board(char board[ROWS][COLS], int row, int col); void player_move(char board[ROWS][COLS], int row, int col); void computer_move(char board[ROWS][COLS], int row, int col); char check_win(char board[ROWS][COLS], int row, int col); #endif

原始檔game.c

#include "game.h"
void init_board(char board[ROWS][COLS], int row, int col)
{
 memset(board,' ',row*col*sizeof(char));
}
void display_board(char board[ROWS][COLS], int row, int col)
{
 int i = 0; 
 for(i=0;i<row;i++)
 { 
  printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]); 
  if(i!=2) 
   printf("---|---|---\n"); 
 }
}
void player_move(char board[ROWS][COLS], int row, int col)
{
 while(1) 
 { int x,y;
 printf("請輸入座標\n"); 
 scanf_s("%d%d",&x,&y); 
 x-=1; 
 y-=1; 
 if(((x>=0)&&(x<=2))&&((y>=0)&&(y<=2))) 
 {
  if(board[x][y]==' ') 
  {  
   board[x][y]='X';  
   break;  
  }  
  else   
   printf("下標錯誤,請重新輸入\n"); 
 } 
 else  
  printf("下標錯誤,請重新輸入\n"); 
 }
}
void computer_move(char board[ROWS][COLS], int row, int col)
{
 while(1)
 {
  int x = rand()%3;
  int y = rand()%3;
  if(board[x][y]==' ') 
  {
   board[x][y]='0';
   break; 
  } 
 }
}
static int is_full(char board[ROWS][COLS], int row, int col)
{
 int i = 0; 
 int j = 0;
 for(i=0;i<row;i++) 
 {
  for(j=0;j<col;j++)
  {  
   if(board[i][j]==' ')  
    return 0; 
  }
 } 
 return 1;
}
char check_win(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 for(i=0;i<row;i++)
 {
  if((board[i][0]==board[i][1])  &&(board[i][1]==board[i][2])  &&(board[i][1]!=' ')) 
   return board[i][1];
 }
 for(i=0;i<col;i++)
 {
  if((board[0][i]==board[1][i])  &&(board[1][i]==board[2][i])  &&(board[1][i]!=' ')) 
   return board[1][i];
 }
 if((board[0][0]==board[1][1])   &&(board[1][1]==board[2][2])   &&(board[1][1]!=' ')) 
  return board[1][1];
 if((board[0][2]==board[1][1])   &&(board[1][1]==board[2][0])   &&(board[1][1]!=' ')) 
  return board[1][1];
 if(is_full(board,row,col)) return 'q';
 return ' ';
}
測試模組test.c
#include "game.h"
void init_board(char board[ROWS][COLS], int row, int col)
{
	memset(board,' ',row*col*sizeof(char));
}
void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;	
	for(i=0;i<row;i++)
	{	
		printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);	
		if(i!=2)	
			printf("---|---|---\n");	
	}
}
void player_move(char board[ROWS][COLS], int row, int col)
{
	while(1)	
	{	int x,y;
	printf("請輸入座標\n");	
	scanf_s("%d%d",&x,&y);	
	x-=1;	
	y-=1;	
	if(((x>=0)&&(x<=2))&&((y>=0)&&(y<=2)))	
	{
		if(board[x][y]==' ')	
		{		
			board[x][y]='X';		
			break;		
		}		
		else			
			printf("下標錯誤,請重新輸入\n");	
	}	
	else		
		printf("下標錯誤,請重新輸入\n");	
	}
}
void computer_move(char board[ROWS][COLS], int row, int col)
{
	while(1)
	{
		int x = rand()%3;
		int y = rand()%3;
		if(board[x][y]==' ')	
		{
			board[x][y]='0';
			break;	
		}	
	}
}
static int is_full(char board[ROWS][COLS], int row, int col)
{
	int i = 0;	
	int j = 0;
	for(i=0;i<row;i++)	
	{
		for(j=0;j<col;j++)
		{		
			if(board[i][j]==' ')		
				return 0;	
		}
	}	
	return 1;
}
char check_win(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for(i=0;i<row;i++)
	{
		if((board[i][0]==board[i][1])		&&(board[i][1]==board[i][2])		&&(board[i][1]!=' '))	
			return board[i][1];
	}
	for(i=0;i<col;i++)
	{
		if((board[0][i]==board[1][i])		&&(board[1][i]==board[2][i])		&&(board[1][i]!=' '))	
			return board[1][i];
	}
	if((board[0][0]==board[1][1])   &&(board[1][1]==board[2][2])   &&(board[1][1]!=' ')) 
		return board[1][1];
	if((board[0][2]==board[1][1])   &&(board[1][1]==board[2][0])   &&(board[1][1]!=' ')) 
		return board[1][1];
	if(is_full(board,row,col))	return 'q';
	return ' ';
}