#子棋的规则非常简单,就是在3*3的9个格子内双方交替落子,谁先连成三个谁就赢,无论是斜着的还是横竖。今天就用C语言写一个与电脑下的三子棋。
1.游戏的开始
先创建main函数
int main()
{
test()
return 0;
}
然后创建在main函数中的test函数(用switch函数来判断是否进入游戏)
void caidan()
{
printf("--------------------------\n");
printf("|------输1开始游戏-------|\n");
printf("|------输0结束游戏-------|\n");
printf("--------------------------\n");
}
void test()
{
int i = 0;
do
{
srand((unsigned int)time(NULL));
caidan();
printf("请输入--》:");
scanf("%d", &i);
switch(i)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (i);
2.创建游戏
game()的创建。
首先,这个3*3的棋盘下子的地方我们可以采用二维数组来实现,然后人与玩家每落一子,就打印一次棋盘与判断一次是否有一方获胜,如果有一方获胜或棋盘下满就跳出下棋的循环。跳出后,判断是何种情况
void game()
{
char board[HANG][LIE] = { 0 };
InitBoard(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
char ret = 0;
while (1)
{
Player_move(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
ret = is_win(board, HANG, LIE);
if (ret != 'c')
{
break;
}
Computer_move(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
ret = is_win(board, HANG, LIE);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢了!\n");
}
else if (ret == 'o')
{
printf("电脑赢了!\n");
}
else
{
printf("平局\n");
}
}
3.细说game函数中调用的函数
1)initboard 初始化棋盘使底色为空
void InitBoard(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
board[i][j] = ' ';
}
}
}
2)displayboard 打印棋盘,为了美观,加上了格子
void DisplayBoard(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
printf(" %c ", board[i][j]);
if (j < lie - 1)
printf("|");
}
printf("\n");
if (i < hang - 1)
{
for (k = 0; k < lie; k++)
{
printf("---");
if (k < lie - 1)
printf("|");
}
}
printf("\n");
}
}
3)playmove 玩家下棋,需要判断玩家下的地方是否合法,不合法的重下
void Player_move(char board[HANG][LIE], int hang, int lie)
{
int x = 0, y = 0;
printf("请玩家下子:");
while (1)
{
scanf("%d %d", &x, &y);
if (x <= hang && x >= 1 && y <= lie && y >= 1)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("此处已有子\n");
}
else
printf("未下在棋盘内\n");
}
}
4)computermove 电脑下棋,因为我们没有高级智能的机器,所以只能采用随机数
srand((unsigned int)time(NULL));\\需在test中写下
x = rand() % hang;
y = rand() % lie;\\这是电脑下的坐标xy,并且限制了随机数的范围
--------------
void Computer_move(char board[HANG][LIE], int hang, int lie)
{
int x = 0, y = 0;
while (1)
{
x = rand() % hang;
y = rand() % lie;
if (board[x][y]==' ')
{
board[x][y] = 'o';
break;
}
}
}
5)iswin 判断游戏输赢,因为三子棋逻辑比较简单,所以采用穷举,来判断是用那种方式赢的,再用返回值判断是谁赢了 isfull函数就是判断棋盘是否在分出输赢之前下满
这就是各种情况的显示的棋盘
char is_win(char board[HANG][LIE], int hang, int lie)
{
int i;
for (i = 0; i < hang; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < lie; i++)
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (1 == is_full(board, hang, lie))
{
return 'q';
}
return 'c';
}
int is_full(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
4.函数声明
在game.h中声明
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define HANG 3
#define LIE 3
void InitBoard(char board[HANG][LIE], int hang, int lie);
void DisplayBoard(char board[HANG][LIE],int hang,int lie);
void Player_move(char board[HANG][LIE], int row, int col);
void Computer_move(char board[HANG][LIE], int row, int col);
char is_win(char board[HANG][LIE], int row, int col);
int is_full(char board[HANG][LIE], int row, int col);
5.函数块
game.c
#include"game.h"
void InitBoard(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0, k = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
printf(" %c ", board[i][j]);
if (j < lie - 1)
printf("|");
}
printf("\n");
if (i < hang - 1)
{
for (k = 0; k < lie; k++)
{
printf("---");
if (k < lie - 1)
printf("|");
}
}
printf("\n");
}
}
void Player_move(char board[HANG][LIE], int hang, int lie)
{
int x = 0, y = 0;
printf("请玩家下子:");
while (1)
{
scanf("%d %d", &x, &y);
if (x <= hang && x >= 1 && y <= lie && y >= 1)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("此处已有子\n");
}
else
printf("未下在棋盘内\n");
}
}
void Computer_move(char board[HANG][LIE], int hang, int lie)
{
int x = 0, y = 0;
while (1)
{
x = rand() % hang;
y = rand() % lie;
if (board[x][y]==' ')
{
board[x][y] = 'o';
break;
}
}
}
char is_win(char board[HANG][LIE], int hang, int lie)
{
int i;
for (i = 0; i < hang; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for (i = 0; i < lie; i++)
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (1 == is_full(board, hang, lie))
{
return 'q';
}
return 'c';
}
int is_full(char board[HANG][LIE], int hang, int lie)
{
int i = 0, j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
6.函数主体
test.c
#include"game.h"
void caidan()
{
printf("--------------------------\n");
printf("|------输1开始游戏-------|\n");
printf("|------输0结束游戏-------|\n");
printf("--------------------------\n");
}
void game()
{
char board[HANG][LIE] = { 0 };
InitBoard(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
char ret = 0;
while (1)
{
Player_move(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
ret = is_win(board, HANG, LIE);
if (ret != 'c')
{
break;
}
Computer_move(board, HANG, LIE);
DisplayBoard(board, HANG, LIE);
ret = is_win(board, HANG, LIE);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢了!\n");
}
else if (ret == 'o')
{
printf("电脑赢了!\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int i = 0;
do
{
srand((unsigned int)time(NULL));
caidan();
printf("请输入--》:");
scanf("%d", &i);
switch(i)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (i);
}
int main()
{
test()
return 0;
}