c语言实现三子棋小游戏
2018-05-24 11:11
459 查看
思路和实现步骤:
- 打印游戏选择界面
玩家输入1开始游戏,输入0结束游戏 - 初始化棋盘和打印棋盘
在屏幕上打印一个3*3的棋盘,棋盘的每一小格初始化为空格;为了让这个游戏更有趣一点,棋盘部分可以扩展成为5*5,还可以扩展成任意大小的棋盘。 - 玩家选择谁先走
- 实现玩家走和电脑走
玩家通过输入坐标把棋下在棋盘里,电脑是由系统生成随机数组成坐标下棋。 - 判断输赢
判断棋盘满了,是平局;如果没有,判断输赢。 - 输出结果并打印结束时的棋盘
1.打印游戏菜单
void menu() { printf("***********************\n"); printf("****1.paly 0.exit****\n"); printf("***********************\n"); }2.初始化棋盘和打印棋盘
void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; memset(board,' ', row*col*sizeof(board[0][0])); } void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { 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"); } }
3.玩家选择谁先走
int input = 0; printf("1.电脑先走 2.玩家先走\n"); printf("请选择谁先走:>"); scanf("%d", &input); InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); switch (input) { case 1: while (1) { ComeputerMove(board, ROW, COL); //Sleep(1000); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); PlayerMove(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); } break; case 2: while (1) { PlayerMove(board, ROW, COL); //Sleep(1000); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); ComeputerMove(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); } break; default: break; }
判断谁先走并不是难点,所以我用了switch语句,放在game函数里一起实现,没有单独分装一个函数。
4.玩家走
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走:>\n"); while (1) { printf("请输入坐标:>"); 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] = 'x'; break; } else { printf("该坐标已经被占用\n"); } } else { printf("坐标非法\n"); } } }
电脑走
void ComeputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '0'; break; } } }
5.判断输赢
int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } char IsWin(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 1; j < col - 1; j++) { if ((board[i][j - 1] == board[i][j]) && (board[i][j] == board[i][j + 1]) && board[i][j] != ' ') { return board[i][j]; } } } for (j = 0; j < col; j++) { for (i = 1; i < row-1; i++) { if ((board[i-1][j] == board[i + 1][j]) && (board[i][j] == board[i + 1][j]) &&board[i][j] != ' ') { return board[i][j]; } } } for (i = 1; i < row-1; i++) { for (j = 1; j < col-1; j++) { if ((board[i - 1][i - 1] == board[i][i]) && (board[i][i] == board[i + 1][i + 1]) && board[i][j] != ' ') { return board[i][j]; } } } for (i = row-1; i >0;i--) { for (j = 1; j < col - 1; j++) { 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 (IsFull(board, row, col)) { return 'p'; } //游戏继续 return ' '; }
这个判断输赢的函数是三子棋的规则,不管棋盘是多大的,都是三子棋的玩法。
下面写一个棋盘是几乘几,就是几子棋。
char IsWin(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; int tmp = 0; //判断输赢 for (i = 0; i < row; i++) { tmp = 0; for (j = 0; j < col - 1; j++) { if ((board[i][j] == board[i][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } } for (j = 0; j < col; j++) { tmp = 0; for (i = 0; i < row - 1; i++) { if ((board[i][j] == board[i + 1][j]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } } for (i = 0, j = 0; i < row - 1, j < col - 1; i++, j++) { tmp = 0; if ((tmp == 0) && (board[i][j] == board[i + 1][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } for (i = row, j = 0; i > 0, j < col - 1; i--, j++) { tmp = 0; if ((tmp == 0) && (board[i][j] == board[i - 1][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; }//判断平局 if (IsFull(board, row, col)) { return 'p'; } //游戏继续 return ' '; }
6.输出结果并打印结束时的棋盘
ret = IsWin(board, ROW, COL); if (ret == ' ') { printf("平局\n"); DisplayBoard(board, ROW, COL); } else if (ret == 'x') { printf("玩家赢!!!\n"); DisplayBoard(board, ROW, COL); } else if (ret == '0') { printf("电脑赢!!!\n"); DisplayBoard(board, ROW, COL); }
附完整代码
1.game.h
#ifndef _GAME_H__ #define _GAME_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void ComeputerMove(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); #endif //_GAME_H__
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; memset(board,' ', row*col*sizeof(board[0][0])); } void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { 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"); } } void ComeputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑走:>\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '0'; break; } } } int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') return 0; } } return 1; } void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走:>\n"); while (1) { printf("请输入坐标:>"); 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] = 'x'; break; } else { printf("该坐标已经被占用\n"); } } else { printf("坐标非法\n"); } } } char IsWin(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; //几子棋 //int tmp = 0; //判断输赢 /*for (i = 0; i < row; i++) { tmp = 0; for (j = 0; j < col - 1; j++) { if ((board[i][j] == board[i][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } } for (j = 0; j < col; j++) { tmp = 0; for (i = 0; i < row - 1; i++) { if ((board[i][j] == board[i + 1][j]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } } for (i = 0, j = 0; i < row - 1, j < col - 1; i++, j++) { tmp = 0; if ((tmp == 0) && (board[i][j] == board[i + 1][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } for (i = row, j = 0; i > 0, j < col - 1; i--, j++) { tmp = 0; if ((tmp == 0) && (board[i][j] == board[i - 1][j + 1]) && board[i][j] != ' ') { ; } else { tmp = 1; break; } } if (tmp == 0) { return board[i][j]; } */ //三子棋 for (i = 0; i < row; i++) { for (j = 1; j < col - 1; j++) { if ((board[i][j - 1] == board[i][j]) && (board[i][j] == board[i][j + 1]) && board[i][j] != ' ') { return board[i][j]; } } } for (j = 0; j < col; j++) { for (i = 1; i < row - 1; i++) { if ((board[i - 1][j] == board[i + 1][j]) && (board[i][j] == board[i + 1][j]) && board[i][j] != ' ') { return board[i][j]; } } } for (i = 1; i < row - 1; i++) { for (j = 1; j < col - 1; j++) { if ((board[i - 1][i - 1] == board[i][i]) && (board[i][i] == board[i + 1][i + 1]) && board[i][j] != ' ') { return board[i][j]; } } } for (i = row - 1; i >0; i--) { for (j = 1; j < col - 1; j++) { 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 (IsFull(board, row, col)) { return 'p'; } //游戏继续 return ' '; }
3.test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void game() { char board[ROW][COL] = {0}; char ret = '0'; int input = 0; printf("1.电脑先走 2.玩家先走\n"); printf("请选择谁先走:>"); scanf("%d", &input); InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); switch (input) { case 1: while (1) { ComeputerMove(board, ROW, COL); //Sleep(1000); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); PlayerMove(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); } break; case 2: while (1) { PlayerMove(board, ROW, COL); //Sleep(1000); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); ComeputerMove(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != ' ') { break; } DisplayBoard(board, ROW, COL); } break; default: break; } if (ret == ' ') { printf("平局\n"); DisplayBoard(board, ROW, COL); } else if (ret == 'x') { printf("玩家赢!!!\n"); DisplayBoard(board, ROW, COL); } else if (ret == '0') { printf("电脑赢!!!\n"); DisplayBoard(board, ROW, COL); } } void menu() { printf("***********************\n"); printf("****1.paly 0.exit****\n"); printf("***********************\n"); } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误\n"); break; } } while(input); } int main() { test(); system("pause"); return 0; }阅读更多
相关文章推荐
- 用C语言实现简单的三子棋小游戏
- C语言实现小游戏——三子棋(Three Peices Chess)
- 用c语言实现三子棋小游戏
- 小项目 : C语言实现三子棋小游戏[拓展为多子棋]
- 小游戏——三子棋(C语言实现)
- 小游戏 | 井字棋(三子棋)的C语言实现
- C语言实现小游戏---三子棋
- C语言实现简单的三子棋小游戏
- 小游戏三子棋的C语言代码实现
- C语言实现简单的三子棋小游戏
- 用C语言实现简单 三子棋(井字棋)小游戏
- c语言小程序之三子棋小游戏的实现
- 小游戏——三子棋(C语言实现)
- C语言实现三子棋小游戏
- 用C语言实现三子棋小游戏
- 利用C语言实现2048小游戏的方法
- C语言实现三子棋
- C语言小游戏----三子棋
- C语言实现猜数字小游戏
- C语言实现三子棋