玩家落子
考虑问题
1.作为玩家的思维坐标从1开始,而电脑规定标码从0开始,所以玩家落子坐标还需-1处理
2.落子范围
3.落子位置是否已经覆盖
参考代码
void Player(char board[ROW][COL], int row, int col) { printf("player:输入坐标>\n"); int i, j; while (1) { scanf("%d%d", &i, &j); if (i > 0 && i <= col && j > 0 && j <= row)//范围 { if (board[i - 1][j - 1] == ' ')//减一处理 { board[i - 1][j - 1] = '*'; break; } else printf("已经被走过了,请重新输入坐标>\n");//重复 } else printf("超出范围啦,请重新输入坐标>\n"); } }
电脑实现落子
简单落子(实现随机数)
1.主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机
2.包含对应头文件
3.实现随机数还应符合范围(直接取余)
#include<time.h> #include<stdlib.h>
参考代码
void Compter(char board[ROW][COL], int row, int col) { printf("Compter:输入坐标>\n"); while (1) { int i = rand() % col; int j = rand() % row;//范围 if (i >= 0 && i <col && j >= 0 && j < row) { if (board[i][j] == ' ')//是否覆盖 { board[i][j] = '#'; break; } } } }
判断
采取返回值
1.返回‘*’ 表示玩家获胜
2.返回‘#’ 表示电脑获胜
3.返回’g’ 表示胜负未分
4.返回‘s’ 表示和棋
胜负:判定所有的行,列,对角线
继续游戏:如果数组中有元素为’ ‘,那么没下完,返回‘g’,游戏继续,不跳出
平局:如果以上条件都未实现返回值,既是无胜负,也无继续游戏,那就是平局则返回‘s’
参考代码
char Iswin(char board[ROW][COL], int row, int col)//判断输赢 { for (int i = 0; i < row; i++)//横排 { if (board[i][0] == board[i][1]&& board[i][0] == board[i][2] && board[i][0] == '*') { return '*'; } if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] == '#') { return '#'; } } for (int j = 0; j < col; j++)//判断竖排 { if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '*') { return '*'; } if (board[0][j] == board[1][j] && board[0][j] == board[2][j] && board[0][j] == '#') { return '#'; } } //判断对角线 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '*')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '*')) { return '*'; } if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] == '#')|| (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] == '#')) { return '#'; } for (int i = 0; i < row; i++) { for (int n = 0; n < col; n++) { if (board[i][n] == ' ') return 'g';//继续游戏 } } return 's';//平局 }
整体游戏流程代码
void game()//进入游戏 { srand((unsigned int)time(NULL)); char ret = { 0 }; char board[ROW][COL] = { 0 }; Initboard(board, ROW, COL);//初始化棋盘 Displayboard(board, ROW, COL);//展示打印棋盘 while (1) { Player(board, ROW, COL);//玩家落子 Displayboard(board, ROW, COL);//打印落子后棋盘 ret=Iswin(board, ROW, COL);//返回判断结果 if (ret != 'g')//不是继续的返回值就退出 break; Compter(board, ROW, COL);//电脑落子 Displayboard(board, ROW, COL);//打印落子后棋盘 ret=Iswin(board, ROW, COL);//返回判断结果 if (ret != 'g')//不是继续的返回值就退出 break; } if (ret == '*')//进一步选择游戏结果 printf("恭喜你赢了!\n"); else if (ret == '#') printf("别灰心,下次再来\n"); else printf("平局\n"); }
效果示意
****************************** 请开始你的选择:>>> 1 即将开始游戏 | | ---|---|--- | | ---|---|--- | | player:输入坐标> 11 11 超出范围啦,请重新输入坐标> 1 1 * | | ---|---|--- | | ---|---|--- | | Compter:输入坐标> * | | ---|---|--- | | # ---|---|--- | | player:输入坐标> 1 2 * | * | ---|---|--- | | # ---|---|--- | | Compter:输入坐标> * | * | # ---|---|--- | | # ---|---|--- | | player:输入坐标> 2 1 * | * | # ---|---|--- * | | # ---|---|--- | | Compter:输入坐标> * | * | # ---|---|--- * | | # ---|---|--- | | # 别灰心,下次再来 ****************************** ********** 1.play ********** ********** 0.exit ********** ****************************** 请开始你的选择:>>>
赶紧试试吧,锻炼代码能力!
下附源码
game.h
#pragma once #define _CRT_SECURE_NO_WARNINGS #define ROW 3 #define COL 3 #include<stdio.h> #include<time.h> #include<stdlib.h> extern void Initboard(char board[ROW][COL], int row, int col); extern void Displayboard(char board[ROW][COL], int row, int col); extern void Player(char board[ROW][COL], int row, int col); extern void Compter(char board[ROW][COL], int row, int col); extern char Iswin(char board[ROW][COL], int row, int col);
test.c
#include"game.h" void menu()//游戏菜单 { printf("******************************\n"); printf("********** 1.play **********\n"); printf("********** 0.exit **********\n"); printf("******************************\n"); } void game()//进入游戏 { srand((unsigned int)time(NULL)); char ret = { 0 }; char board[ROW][COL] = { 0 }; Initboard(board, ROW, COL); Displayboard(board, ROW, COL); while (1) { Player(board, ROW, COL); Displayboard(board, ROW, COL); ret=Iswin(board, ROW, COL); if (ret != 'g')//不是继续就退出 break; Compter(board, ROW, COL); Displayboard(board, ROW, COL); ret=Iswin(board, ROW, COL); if (ret != 'g')//不是继续就退出 break; } if (ret == '*') printf("恭喜你赢了!\n"); else if (ret == '#') printf("别灰心,下次再来\n"); else printf("平局\n"); } int main() { int input = 0; do { menu(); printf("请开始你的选择:>>>\n"); scanf("%d", &input); switch (input) { case 0: printf("退出游戏成功\n"); break; case 1: printf("即将开始游戏\n"); game(); break; default: printf("输入错误:please input your number again!\n"); break; } } while (input); return 0; }