赞
踩
《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
int main()
{
test();
return 0;
}
从主函数中的test();进入游戏内部
#pragma once
#define ROW 3
#define COL 3
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void menu();
void print_diff();
void init_Board(char Board[ROW][COL], int row, int col);
void Print_Board(char Board[ROW][COL], int row, int col);
void player_move(char Board[ROW][COL], int row, int col);
void computer_move(char Board[ROW][COL], int row, int col);
char Is_win(char Board[ROW][COL], int row, int col);
进入游戏内部后打印出菜单,需要给玩家提供两种选择 play和exit
并为了保证玩家在输入错误后,可以重新选择,以及游戏结束后,可以选择再来一局,因此,我们这里应该把整个test函数设计成一个循环。
void menu()
{
printf("*****************\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
printf("*****************\n");
}
void test() { srand(time(NULL)); int input; do { menu(); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); play(); break; case 0: printf("退出游戏\n"); break; default: printf("选择错误\n"); break; } } while (input); }
void play() { char ret, Board[ROW][COL];//创建棋盘 init_Board(Board, ROW, COL);//初始化棋盘 Print_Board(Board, ROW, COL);//打印棋盘 while (1) { player_move(Board, ROW, COL);//玩家落子 system("cls"); Print_Board(Board, ROW, COL);//打印棋盘 ret = Is_win(Board, ROW, COL);//判断输赢 if (ret != 'C') break; computer_move(Board, ROW, COL);//电脑落子 system("cls"); Print_Board(Board, ROW, COL);//打印棋盘 ret = Is_win(Board, ROW, COL);//判断输赢 if (ret != 'C') break; } if (ret == '*') printf("玩家胜利\n"); else if (ret == '$') printf("电脑胜利\n"); else printf("平局\n"); }
三子棋的棋盘本质上可以看作一个多行多列的二维数组
将二维数组全部初始化为空格‘ ’
void init_Board(char Board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < row; i++)
{
int j;
for (j = 0; j < col; j++)
Board[i][j] = ' ';
}
}
预期结果:
void Print_Board(char Board[ROW][COL], int row, int col) { int i; for (i = 0; i < row; i++) { int j; for (j = 0; j < col; j++) { printf(" %c ", Board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } }
棋盘设置完成后,就该正式进入游戏了,玩三子棋最重要的就是下棋了。
想要实现下棋,需要先找到相应的坐标,找到坐标后,将其所在位置的元素改为‘*’,表示玩家落子,其中我们需要做到以下几点(1)判断坐标的合法性
(2)判断目标元素是否被占用
void player_move(char Board[ROW][COL], int row, int col) { printf("玩家下棋\n"); printf("请输入合法坐标\n"); int x, y; while (1) { 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"); } }
符号 | result |
---|---|
* | 玩家胜利 |
# | 电脑胜利 |
Q | 平局 |
C | 游戏继续 |
int Is_full(char Board[ROW][COL], int row, int col)//判断棋盘是否被占满
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (Board[i][j] == ' ')
return 0;
}
}
return 1;
}
char Is_win(char Board[ROW][COL], int row, int col)//判断游戏进度 { for (int i = 1; i < row; i++) { for (int j = 1; j < col; j++) { if (j < col - 1) { if (Board[i][j - 1] == Board[i][j] && Board[i][j] == Board[i][j + 1] && Board[i][j] != ' ') return Board[i][j]; } if (i < row - 1) { if (Board[i - 1][j] == Board[i][j] && Board[i][j] == Board[i + 1][j] && Board[i][j] != ' ') return Board[i][j]; } if (i < row - 1 && j < col - 1) { if (Board[i - 1][j - 1] == Board[i][j] && Board[i][j] == Board[i + 1][j + 1] && Board[i][j] != ' ') return Board[i][j]; } if (i < row - 1 && j < col - 1) { if (Board[i - 1][j + 1] == Board[i][j] && Board[i][j] == Board[i + 1][j - 1] && Board[i][j] != ' ') return Board[i][j]; } } } if (Is_full(Board, row, col) == 1) return 'Q'; else return 'C'; }
电脑下棋的时候,坐标是通过生成随机值产生的,将生成的随机值转化为合法的坐标,因此,我们只判断目标元素是否被占用即可
void computer_move(char Board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
Sleep(2000);
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (Board[x][y] == ' ')
{
Board[x][y] = '$';
break;
}
}
}
以上就是三子棋游戏的具体实现,还有许多地方可以进行优化,甚至可以将三子棋改为五子棋,将棋盘改成十行十列等等,如果大家对游戏的优化有更多有趣的想法,欢迎来找我交流,大家一起进步呀
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。