C语言编程实现三子棋
首先先简单谈一下我对编三子棋这个小项目的理解,首先三子棋游戏是我第一次用c语言编程的一个小项目,总共大概写了200多行代码 ,对于学好编程我认为还是要大量的练习,多敲才是王道,希望各位喜欢编程的老铁,不要心疼自己的键盘,敲它就对了! 我简单介绍一下这个游戏的思路,首先把这个游戏分为三个部分第一部分为test.c文件,文件主要包括主函数
#define _CRT_SECURE_NO_WARNINGS 1
//三子棋游戏
#include<stdio.h>
#include"game.h"
void menu(){
printf("*****************\n");
printf("**1.play 0.exit**\n");
printf("*****************\n");
}
void game(){
char ret = 0;
//数组--存放走出的棋盘信息
char board[ROW][COL] = { 0 };//全部空格
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);
//下棋
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断玩家是否赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
//判断电脑是否赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else{
printf("平局\n");
}
}
void test(){
int input = 0;
srand((unsigned int)time(NULL));
do{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input){
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main(){
test();
return 0;
}
第二个文件是game.h头文件,该文件主要是对棋盘的行列确定以及包括棋盘的初始化,棋盘的显示以及玩家和电脑的下旗动作规则函数,还有游戏规则
#define ROW 3
#define COL 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void InitBoard ( char board[ ROW] [ COL] , int row, int col) ;
void DisplayBoard ( char board[ ROW] [ COL] , int row, int col) ;
void PlayerMove ( char board[ ROW] [ COL] , int row, int col) ;
void ComputerMove ( char board[ ROW] [ COL] , int row, int col) ;
int IsFull ( char board[ ROW] [ COL] , int row, int col) ;
char IsWin ( char board[ ROW] [ COL] , int row, int col) ;
最后一个函数是game.c函数,这个是重头戏,讲述了在game.h中每个函数如何实现,这个文件是本游戏的核心,109行代码!!!作为一个编码小新来说的确是一个挑战
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard ( char board[ ROW] [ COL] , int row, int col) {
int i = 0 ;
int j = 0 ;
for ( i = 0 ; i < row; i++ ) {
for ( j = 0 ; j < col; j++ ) {
board[ i] [ j] = ' ' ;
}
}
}
void DisplayBoard ( char board[ ROW] [ COL] , 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< row- 1 )
printf ( "---|---|---\n" ) ;
}
}
void PlayerMove ( char board[ ROW] [ COL] , int row, int col) {
int x = 0 ;
int y = 0 ;
printf ( "玩家走:" ) ;
while ( 1 ) {
printf ( "请输入要下的坐标:\n" ) ;
scanf ( "%d%d" , & x, & y) ;
if ( x >= 1 && x <= row&& y >= 1 && y <= col) {
if ( board[ x - 1 ] [ y - 1 ] == ' ' ) {
board[ x - 1 ] [ y - 1 ] = '*' ;
break ;
}
else {
printf ( "该坐标被占用!\n" ) ;
}
}
else {
printf ( "坐标非法,请重新输入!\n" ) ;
}
}
}
void ComputerMove ( char board[ ROW] [ COL] , int row, int col) {
int x = 0 ;
int y = 0 ;
printf ( "电脑走: \n" ) ;
while ( 1 ) {
x = rand ( ) % row;
y = rand ( ) % col;
if ( board[ x] [ y] == ' ' ) {
board[ x] [ y] = '#' ;
break ;
}
else {
printf ( "" ) ;
}
}
}
int IsFull ( char board[ ROW] [ COL] , 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 IsWin ( char board[ ROW] [ COL] , 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 ( 1 == IsFull ( board, ROW, COL) )
{
return 'Q' ;
}
return 'C' ;
}
接下来是关于每一部分函数的介绍首先是test.c函数
主函数是由一个test函数组成
int main ( ) {
test ( ) ;
return 0 ;
}
之后就是menu函数了,在这个menu函数中,显示的是我们运行程序之后的界面,这个根据大家的喜好,我是这样定义的,其中选择1代表游戏开始,选择0代表游戏退出。
void menu ( ) {
printf ( "*****************\n" ) ;
printf ( "**1.play 0.exit**\n" ) ;
printf ( "*****************\n" ) ;
}
在这个test函数中首先包含一个menu自定义界面函数,其次srand是一个随机数生成函数为之后让电脑下棋能生成一个随机数。
void test ( ) {
int input = 0 ;
srand ( ( unsigned int ) time ( NULL ) ) ;
do {
menu ( ) ;
printf ( "请选择:" ) ;
scanf ( "%d" , & input) ;
switch ( input) {
case 1 :
game ( ) ;
break ;
case 0 :
printf ( "退出游戏\n" ) ;
break ;
default :
printf ( "选择错误,请重新选择\n" ) ;
break ;
}
} while ( input) ;
}
最后在test.c中最重要的就是game函数了,game函数中,介绍了游戏的整个思想
void game ( ) {
char ret = 0 ;
char board[ ROW] [ COL] = { 0 } ;
InitBoard ( board, ROW, COL) ;
DisplayBoard ( board, ROW, COL) ;
while ( 1 )
{
PlayerMove ( board, ROW, COL) ;
DisplayBoard ( board, ROW, COL) ;
ret = IsWin ( board, ROW, COL) ;
if ( ret != 'C' )
{
break ;
}
ComputerMove ( board, ROW, COL) ;
DisplayBoard ( board, ROW, COL) ;
ret = IsWin ( board, ROW, COL) ;
if ( ret != 'C' )
{
break ;
}
}
if ( ret == '*' )
{
printf ( "玩家赢\n" ) ;
}
else if ( ret == '#' )
{
printf ( "电脑赢\n" ) ;
}
else {
printf ( "平局\n" ) ;
}
}
接下来是关于game.h头函数
#define ROW 3
#define COL 3
define定义棋盘的大小为3*3的棋盘
需要用到的函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
InitBoard函数是棋盘初始化函数,DisplayBoard函数是棋盘显示函数,PlayerMove函数是玩家下棋动作函数,ComputerMove函数是电脑下棋动作函数
void InitBoard ( char board[ ROW] [ COL] , int row, int col) ;
void DisplayBoard ( char board[ ROW] [ COL] , int row, int col) ;
void PlayerMove ( char board[ ROW] [ COL] , int row, int col) ;
void ComputerMove ( char board[ ROW] [ COL] , int row, int col) ;
IsFull函数是判断棋盘是不是已经下满函数,IsWin函数是判断谁赢函数
int IsFull ( char board[ ROW] [ COL] , int row, int col) ;
char IsWin ( char board[ ROW] [ COL] , int row, int col) ;
接下来是关于game.c文件函数
通过两个for循环来实现对每个旗格子的置空
void InitBoard ( char board[ ROW] [ COL] , int row, int col) {
int i = 0 ;
int j = 0 ;
for ( i = 0 ; i < row; i++ ) {
for ( j = 0 ; j < col; j++ ) {
board[ i] [ j] = ' ' ;
}
}
}
这个函数是用来显示棋盘的排布
void DisplayBoard ( char board[ ROW] [ COL] , 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< row- 1 )
printf ( "---|---|---\n" ) ;
}
}
这个函数是显示玩家下棋的动作
void PlayerMove ( char board[ ROW] [ COL] , int row, int col) {
int x = 0 ;
int y = 0 ;
printf ( "玩家走:" ) ;
while ( 1 ) {
printf ( "请输入要下的坐标:\n" ) ;
scanf ( "%d%d" , & x, & y) ;
if ( x >= 1 && x <= row&& y >= 1 && y <= col) {
if ( board[ x - 1 ] [ y - 1 ] == ' ' ) {
board[ x - 1 ] [ y - 1 ] = '*' ;
break ;
}
else {
printf ( "该坐标被占用!\n" ) ;
}
}
else {
printf ( "坐标非法,请重新输入!\n" ) ;
}
}
}
这个函数显示电脑下棋的动作
void ComputerMove ( char board[ ROW] [ COL] , int row, int col) {
int x = 0 ;
int y = 0 ;
printf ( "电脑走: \n" ) ;
while ( 1 ) {
x = rand ( ) % row;
y = rand ( ) % col;
if ( board[ x] [ y] == ' ' ) {
board[ x] [ y] = '#' ;
break ;
}
else {
printf ( "" ) ;
}
}
}
这个函数判断棋盘的溢满情况
int IsFull ( char board[ ROW] [ COL] , 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 IsWin ( char board[ ROW] [ COL] , 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 ( 1 == IsFull ( board, ROW, COL) )
{
return 'Q' ;
}
return 'C' ;
}
总结:文章写到这里就已将介绍完了,如果有不清楚的地方,欢迎各位老铁私信我,由于这是本人第一次写一个小小的游戏,所以一定有很多不足和缺点,欢迎各位老铁多多指点!