** 三子棋**
在写三子棋的程序之前首先整理思路,棋盘是怎样的,下棋的过程可能出现的情况等大概有以下几步:
一、功能菜单
二、选择功能
三、棋盘初始化
四、下棋过程:1、玩家下棋:输入下棋位置,判断是否有子,无子则落子,有则重新输入位置
2、电脑下棋:如果智能一点的话需要考虑自身所下棋子这一步是否可以获胜,判断对手下一步棋子是否取胜,采取阻止措施(情况较为复杂以下代码尚未体现)。另外一种就是笨拙的下棋,随机生成位置,位置未被占用就填子,否则重新寻找位置。
3、判断输赢,当玩家或对手走完一步就判断棋盘情况,当有赢家产生,游戏结束。当棋盘已满,则平局。否则继续游戏。
main函数
#define _CRT_SECURE_NO_WARNINGS 1
//打印菜单
//选择功能
//棋盘初始化
//下棋:判断位置是否有棋子 /显示下棋后棋子位置
// 让电脑变得聪明些:
//判断输赢
#include "game.h"
void Menu()
{
printf("*********************\n");
printf("*********************\n");
printf("** >>1.PlayGame **\n");
printf("** **\n");
printf("** >>0.ExitGame **\n");
printf("*********************\n");
printf("*********************\n");
}
void Game()
{
char ret = ' ';
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL); //初始化棋盘
PrintBoard(board, ROW, COL); //打印棋盘
while (1)
{
Player(board, ROW, COL); //玩家走
PrintBoard(board, ROW, COL); //打印棋盘
ret = JudgeWin(board, ROW, COL); //判断输赢
if (ret != 'c')
{
break;
}
PC_Plus(board, ROW, COL);
//PC(board, ROW, COL);//电脑走
PrintBoard(board, ROW, COL); //打印棋盘
ret = JudgeWin(board, ROW, COL); //判断输赢
if (ret != 'c')
{
break;
}
/*
'#'电脑赢
'*'玩家赢
'c'未产生赢家
'e'平局
*/
}
if (ret == '#')
printf("电脑赢\n");
if (ret == '*')
printf("玩家赢\n");
if (ret == 'e')
printf("平局\n");
}
int main()
{
int select = 0;
srand((unsigned int) time(NULL));
do{
Menu();//菜单
printf("请选择:\n");
scanf("%d", &select);
switch (select)
{
case 0:
printf("退出游戏\n"); break;
case 1:
printf("%d子棋\n",ROW);
printf("\n");
Game();
break;
default:
printf("选择错误,重新选择!\n"); break;
}
} while (select);
return 0;
}
函数实现过程
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
char JudgeWin(char board[ROW][COL], int row, int col)
{
int i = 0,j = 0,flag = 0;
//行判断
for (i = 0; i < row; i++)
{
int index = col-1;
while (index > 0)
{
if (board[i][index] == board[i][index - 1] && board[i][index] != ' ')
{
if (index == 1)
return board[i][index - 1];
else
index = index - 1;
}
else
break;
}
}
//列判断
for (i = 0; i < col; i++)
{
int index = row - 1;
while (index > 0)
{
if (board[index][i] == board[index - 1][i] && board[index][i] != ' ')
{
if (index == 1)
return board[i][index - 1];
else
index = index - 1;
}
else
break;
}
}
//主对角线
int r = row - 1;
int c = col - 1;
while(1)
{
if (r >= 1 && c >= 1)
{
if (board[r][c] == board[r - 1][c - 1] && board[r - 1][r - 1] != ' ')
{
if (r - 1 == 0)
flag = 1;//产生赢家
else
{
r = r - 1;
c = c - 1;
}
}
else
break;
if (flag)
return board[r - 1][c - 1];
}
}
//副对角线
int h = 0,l = col-1;
while (h < row - 1)
{
if (board[h][l] == board[h + 1][l - 1] && board[h][l] != ' ')
{
if (h+1 == row-1)
flag = 1;
else
{
h++;
l--;
}
}
else
break;
if (flag)
return board[h + 1][l - 1];
}
//判断是否下满
if (Full(board, ROW, COL))
return 'e';//棋盘下满 没有赢家
else
return 'c';
}
//棋盘没有满,返回0
int Full(char board[ROW][COL], int row, int col)
{
int flag = 1;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
flag = 0;
return flag;
}
}
}
}
void PC_Plus(char board[ROW][COL], int row, int col)
{
int x = row/2, y = col/2;
int cnt = row-1;
printf("电脑下棋中>");
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
x = rand() % row;
y = rand() % col;
//判断检测范围不越界
if (x+1 < row && y+1 < col && x - 1 >= 0 && y-1 >= 0)
{
//检测对手下一步是否会取得胜利
//检测周围是否存在自己的棋子
if(board[x][y] == ' ')
if (board[x - 1][y - 1] == '#' || board[x - 1][y] == '#' ||
board[x - 1][y + 1] == '#' || board[x][y + 1] == '#' ||
board[x + 1][y + 1] == '#' || board[x + 1][y] == '#' ||
board[x + 1][y] == '#' || board[x + 1][y - 1] == '#' ||
board[x][y - 1] == '#')
{
board[x][y] = '#';
break;
}
}
}
printf("\n");
}
//void PC(char board[ROW][COL], int row, int col)
//{
// int x = 0, y = 0;
//
// while (1)
// {
// printf("电脑下棋中>");
// x = rand() % row;
// y = rand() % col;
// if (board[x][y] == ' ')
// {
// board[x][y] = '#';
// break;
// }
// }
// printf("\n");
//}
//玩家下棋
void Player(char board[ROW][COL],int row,int col)
{
int x = 0,y = 0;
while (1)
{
printf("请输入所下棋子位置:\n");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("此处有棋子,请重新选择位置:\n");
}
}
else
{
printf("位置选择有误,请重新选择:\n");
}
}
}
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col)
{
int i = 0,j = 0;
for ( i = 0; i < row; i++)
{
for ( j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0,j = 0;
for ( i = 0; i < row; i++)
{
if (i < row - 1)
{
for ( j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j <= col - 1)
printf("|");
}
printf("\n");
for ( j = 0; j < col; j++)
{
printf("---");
if (j <= col - 1)
printf("|");
}
printf("\n");
}
if(i == row - 1)
{
for ( j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (j <= col - 1)
printf("|");
}
printf("\n");
}
}
}
.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL]);
void Player(char board[ROW][COL], int row, int col);
void PC(char board[ROW][COL], int row, int col);
char JudgeWin(char board[ROW][COL], int row, int col);
void PC_Plus(char board[ROW][COL], int row, int col);//会思考的电脑,还未实现