三子棋
三子棋介绍
三子棋又叫井字棋,只要将自己的三个棋子走成一条线,对方就算输了。但是,很多时候会出现和棋的情况。
代码设计的基本思路
一.创建一个用户选择菜单
二.创建主函数
三.游戏具体实现
1.创建棋盘并初始化棋盘
2.打印一个棋盘
3.玩家落子
4.判断本局游戏状态
5.电脑落子
6.判断本局游戏状态
7.结果演示
(1)玩家胜利
(2)电脑胜利
(3)和棋
代码具体实现
注:首先我们对常用的字符和变量进行宏定义,提高扩展性,以便我们后期根据不同的要求来维护和修改。
#define ROW 3
#define COL 3
#define WHITE 'x'//person落棋子
#define BLACK 'O'//computer落子
#define INIT ' '//空格表示棋盘上的空白区域
#define NEXT 'N' //继续
#define DRAW 'D'//平局
1.菜单界面
1.开始游戏 0.退出游戏
void Menu()
{
printf("+--------------------------+\n");
printf("| 1.play 0.Exit |\n");
printf("+--------------------------+\n");
}
2.创建并初始化棋盘
static void InitBoard(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
board[i][j] = INIT;
}
}
}
采用两重循环初始化,将棋盘一开始的每个格子中的元素都置为空格。
3.打印棋盘
static void ShowBoard(char board[][COL], int row, int col)
{
system("cls");//清屏,让落子始终在一个棋盘里
printf(" ");
for (int i = 0; i < row; i++)
{
printf("%4d ",i+1);
}
printf("\n---------------\n");
for (int i = 0; i < row; i++){
printf("%-2d", i+1);
for (int j = 0; j < col; j++){
printf("| %c ", board[i][j]);
}
printf("\n---------------\n");
}
}
结果:
4.玩家落子
玩家输入行列坐标表示要落子的具体位置,使用‘X’代表玩家。
static void PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1){
printf("Please Enter Position<x,y># ");
scanf("%d %d", &x, &y);
if (x<1 || y<1 || x>3 || y>3){//判断输入位置是否在棋盘范围内
printf("Enter Position Error!\n");
continue;//如果输入坐标不满足则要重新输入
}
if (board[x - 1][y - 1] == INIT){
board[x - 1][y - 1] = WHITE;
break;
}
else
{
printf("Position is not Empty!\n");//输入坐标已有子
}
}
}
5.电脑落子
电脑随机产生行列坐标进行落子,‘O’表示电脑落子。
1.要在Game()这个函数中使用srand((unsigned long)time(NULL))
表示将时间作为颗随机数种子,确保得到的行列坐标是真随机值
static void ComputerMove(char board[][COL], int row, int col)
{
while (1){
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == INIT)
{
board[x][y] = BLACK;
break;
}
}
}
6.判断状态
约定最后返回结果的含义;
(1)‘X’表示玩家获胜
(2)‘O’表示电脑获胜
(3) ‘NEXT’表示胜负未分,继续下棋
(4)‘DRAW’表示和棋
判定电脑玩家是否胜利:
1.判定所有的行是否相等
2.判定所有的列是否相等
3.判定两条对角线
判定和棋
如果判定不了电脑赢或是人赢,也不是双方一方继续下棋的状态,那么最后便是和棋。
static char IsEnd(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++){
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != INIT)
{
return board[i][0];
}
}
for (int j = 0; j < col; j++){
if (board[0][j] == board[1][j]&&board[1][j] == board[2][j] && board[0][j] != INIT)
{
return board[0][j];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != INIT)
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != INIT)
{
return board[1][1];
}
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == INIT)
{
return NEXT;
}
}
}
return DRAW;
}
Game()函数
void Game()
{
char board[ROW][COL];//定义二维数组存储棋盘
InitBoard(board, ROW, COL);//初始化棋盘
srand((unsigned long)time(NULL));//种一颗随机数种子
char result = '\0';
while (1)
{
ShowBoard(board, ROW, COL);//显示棋盘
PlayerMove(board, ROW, COL);//人走
result = IsEnd(board, ROW, COL);
if (result != NEXT){
break;
}
ShowBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);//电脑走
result = IsEnd(board, ROW, COL);
if (result != NEXT){
break;
}
}
switch (result){
case WHITE:
printf("You Win!\n");
break;
case BLACK:
printf("YOU Lose!\n");
case DRAW:
printf("You==Computer!\n");
break;
default:
printf("BUG!\n");
}
}
注意:
在Game()函数里,我们要引用以上的棋盘初始化,显示棋盘,人走,电脑走,判定胜负关系等函数。
在玩家和电脑落子时,我们都要对其结果进行判定。
本游戏代码采用多文件实现,别为main.c ,game.c , game.h。
game.h里面包含了各种声明,game.h又包含在main.c和game.c里面。
game.c为以上各种具体游戏函数的实现。
game.h:
#ifndef __GAME_H_
#define __GAME_H_
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define WHITE 'x'//person执棋子
#define BLACK 'O'//computer
#define INIT ' '//空格
#define NEXT 'N' //继续
#define DRAW 'D'//平局
extern void Game();
#endif
main.c:
#include "game.h"
void Menu()
{
printf("+--------------------------+\n");
printf("| 1.play 0.Exit |\n");
printf("+--------------------------+\n");
}
int main()
{
int select = 0;
int quit = 0;
while (!quit)
{
Menu();
printf("Please Select# ");
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 0:
quit = 1;
break;
default:
printf("Enter Error,Try Again!\n");
break;
}
}
printf("ByeBye!\n");
system("pause");
return 0;
}
最后显示一下其中的一个结果状态:
OK,文章到此就结束了了!