c++ 怎么从键盘上获取方向键

本人小白 想编一个简单的贪吃蛇游戏 但不知道怎么从键盘获取方向键 求教 最好有列子

2个回答

C++可以使用如下方式输入字符串:
1、使用cin>>操作符:

1 2 3 4 5 6 7 8

#include

using namespace std;

void main(){

char s[50];//字符数组,用于存放字符串的每一个字符 

cout<<"Please input a string"<<endl; 

cin>>s; //输入字符串 

cout<<"The string you input is"<<s<<endl; 

}

2、使用cin.get函数:

1 2 3 4 5 6 7 8

#include

using namespace std;

void main(){

char s[50];//字符数组,用于存放字符串的每一个字符 

cout<<"Please input a string"<<endl; 

cin.get(s,50);//输入字符串,当输入是Enter键时结束输入 

cout<<"The string you input is:"<<s<<endl; 

}

获得键盘信息的话,需要调用库的。一般做这种东西都话,C++在QT或者VS上都是可以做的。这些都是有自己的关于键盘和鼠标的各种函数库的。要是不知道的话,还是用楼上的方法,通过字符串或者是数字来控制移动

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++ 怎么从键盘上获取方向键

本人小白 想编一个简单的贪吃蛇游戏 但不知道怎么从键盘获取方向键 求教 最好有列子

Golang中的按键事件

<div class="post-text" itemprop="text"> <p>My purpose is to print string sequentially and when the user enter some character, we pause the process and read stdin content. I know it's possible to catch os.Interrupt signal but I don't how to catch event in stdin. I don't want to scan and wait user to enter text. The process is stopped when there is a keypress event. </p> <p>My question : How detect event on stdin ? </p> <p>Thanks ! </p> <p>Here is current solution with your advice. Go routines not constitue an optimal solution because you can't manage them as threads. I currently continue working on this and keep you udpated. Edit :</p> <pre><code>func main() { quit := make(chan bool) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) fmt.Println("-----------------") fmt.Println("Go routine running :", runtime.NumGoroutine()) go func() { select { case &lt;-quit: return default: fmt.Println("Text received and changed") fmt.Println("-----------------") for { timer := time.NewTimer(time.Second * 1) &lt;-timer.C fmt.Println(scanner.Text()) } } fmt.Println("Routine closed") }() } if scanner.Err() != nil { quit &lt;- false } } </code></pre> <p>Otherwise if I follow your solution @varius :</p> <pre><code>func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { for { timer := time.NewTimer(time.Second * 1) &lt;-timer.C fmt.Println(scanner.Text()) } } if scanner.Err() != nil { /*handle error*/ } } </code></pre> <p>But I can't change the scan content while program running.</p> </div>

JVAV写贪吃蛇小游戏,用线程实现窗口重绘,然后用键盘指令改变小蛇的方向,请问怎么让小蛇只根据指令移动?

![图片说明](https://img-ask.csdn.net/upload/201906/05/1559710703_639058.png) 现在的程序能够实现通每隔200ms小蛇自动往前跑一格,通过键盘指令能够改变方向,但是我不想让它自动跑,只想实现给它指令它才移动,请问怎么实现? 这是蛇的活动类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Timer; /** * 这个类代表贪吃蛇的活动场所 * @author * @version */ public class Yard extends Frame { /* * 画图的线程 * */ Timer timer = new Timer(); PaintThread paintThread = new PaintThread(); private boolean gameOver = false; //游戏是否结束 /** * 行数 */ public static final int ROWS = 30; /* * 列数 * */ public static final int COLS = 30; /* * 活动区域大小 * */ public static final int BLOCK_SIZE = 15; //设置显示字属性 private Font fontGameOver = new Font("宋体", Font.BOLD, 50); //分数 private int score = 0; /* * 记录开始时候的时间 * */ private long beginTime=0; /* *实例化Snake和Egg的对象 * */ Snake s = new Snake(this); Egg e = new Egg(); /* * 抽象类 Image 是表示图形图像的所有类的超类。 * 必须以特定于平台的方式获取图像。 * */ Image offScreenImage = null; /* * 此函数的功能是:设置窗口的大小、位置、可见,以及点击事件和键盘事件,最后开启了绘图线程 * */ public void launch() { /* * 指定窗口的位置,窗口的左上角的位置为(90,10).是相对父窗口的相对位置 * */ this.setLocation(90, 10); /* * 设定窗口的大小 * 宽度width:COLS*BLOCK_SIZE * 高度hight:ROWS*BLOCK_SIZE * */ this.setSize(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 为窗口添加监听器 * */ this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); /* * 将窗口设置可见 * */ this.setVisible(true); /* * 为窗口添加键盘事件 * */ this.addKeyListener(new KeyMonitor()); new Thread(paintThread).start(); } public static void main(String[] args) { Yard y=new Yard(); y.beginTime=System.currentTimeMillis(); y.launch(); } /* * 将变量gameOver设置为true,使得在paint()函数中将使得线程停止 * */ public void stop() { gameOver = true; } @Override public void paint(Graphics g) { /* * 获取此图形上下文的颜色 * */ Color c = g.getColor(); /* * 指定图形上下文的颜色 * */ g.setColor(Color.GRAY); /* * 用当前的颜色来填充指定的区域 * */ g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); /* * 再一次的指定颜色为:黑灰色???????为什么要再一次的设定??? * 原因在于:我们想将绘图的颜色与文字显示的不一样 * */ g.setColor(Color.DARK_GRAY); //画出横线 /* * drawLine(int x1, int y1, int x2, int y2) * 函数的功能为: * 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 * 通过下面的两个for循环就会在图形化对象上画出表格 * */ for(int i=1; i<ROWS; i++) { g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i); } for(int i=1; i<COLS; i++) { g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS); } g.setColor(Color.YELLOW);//设定颜色,为下面显示文字信息做准备 /* * drawString(String str, int x, int y) *使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。 * */ g.drawString("使用说明:使用方向键控制方向,F1--停止,F2--停止后恢复,F5--重新开始" , 10, 40); g.drawString("目前分数:" + score, 10, 60); g.drawString("加分规则:每吃一个加5分,加油!" , 10, 80); g.drawString("已经使用的时间:"+(System.currentTimeMillis()-beginTime)/1000 , 10, 100); /* * 检测游戏是否结束,当游戏结束时,则提示游戏“game over”,而且将界面恢复到初始界面的状态,且终止绘图线程 * */ if(gameOver) { g.setFont(fontGameOver); g.drawString("game over!", 90, 170); g.drawString("在玩一次,请按F5", 10, 250); g.drawString(" ", 200, 230);//???这个用意何在?? paintThread.pause(); } if(score>100) { g.drawString("好棒!!!", 90, 170); g.drawString("你已经超过"+score+",继续加油", 10, 230); } /* * 将图形界面设置为刚开始的颜色 * */ g.setColor(c); s.eat(e); e.draw(g); s.draw(g); } @Override public void update(Graphics g) { if(offScreenImage == null) { /* * public Image createImage(int width, * int height) * 创建一幅用于双缓冲的、可在屏幕外绘制的图像 * */ offScreenImage = this.createImage(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); } /* * getGraphics() *创建供绘制闭屏图像(off-screen image)使用的图形上下文。 * */ Graphics gOff = offScreenImage.getGraphics(); paint(gOff); /* * drawImage(Image img, int x, int y, ImageObserver observer) * 绘制指定图像中当前可用的图像。 * */ g.drawImage(offScreenImage, 0, 0, null); } private class PaintThread implements Runnable { private boolean running = true; private boolean pause = false; public void run() { while(running) {//线程将一直处于运行当中,只有在游戏结束的时候 if(pause) continue; else repaint();//如果组件是轻量级组件,则会尽快调用paint()方法或者是调用update() try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } public void pause() { this.pause = true; } public void reStart() { this.pause = false; s = new Snake(Yard.this); gameOver = false; score=0; } public void gameOver() { running = false; } } /* * 此函数的功能为:检测我们是否按下F2,若按下,则重新启动线程,即重新开始游戏 * */ private class KeyMonitor extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if(key == KeyEvent.VK_F5) { paintThread.reStart();//重新开始游戏 } else if(key==KeyEvent.VK_F1){ paintThread.pause=true;//暂停 } else if(key==KeyEvent.VK_F2){ paintThread.pause=false;//从暂停中恢复 } s.keyPressed(e); } } /** * 拿到所得的分数 * @return 分数 */ public int getScore() { return score; } /** * 设置所得的分数 * @param score 分数 */ public void setScore(int score) { this.score = score; } } ``` 这是小蛇类 ``` package com.tcs.cn; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; /** * 代表蛇 * @author * */ public class Snake { /* * 头结点 * */ private Node head = null; /* * 尾结点 * */ private Node tail = null; /* * 大小 * */ private int size = 0; /* * 开始游戏时: * 初始位置:(20,30) * 初始运动方向:Dir.L * */ private Node n = new Node(20, 30, Dir.L); /* * Yard的对象属性; * */ private Yard y; /* * 构造函数 * */ public Snake(Yard y) { /* * 将初始结点给头结点和尾结点,size初始化为 1, * */ head = n; tail = n; size = 1; this.y = y; } /* * 节点类 * */ private class Node { int w = Yard.BLOCK_SIZE; int h = Yard.BLOCK_SIZE; int row , col; Dir dir = Dir.L; Node next = null; Node prev = null; Node(int row, int col, Dir dir) { this.row = row; this.col = col; this.dir = dir; } void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLACK); g.fillRect(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h); g.setColor(c); } } // 从尾加,代码与下面一个函数的代码功能相似,这里不再分析 public void addToTail() { Node node = null; switch(tail.dir) { case L : node = new Node(tail.row, tail.col + 1, tail.dir); break; case U : node = new Node(tail.row + 1, tail.col, tail.dir); break; case R : node = new Node(tail.row, tail.col - 1, tail.dir); break; case D : node = new Node(tail.row - 1, tail.col, tail.dir); break; } tail.next = node; node.prev = tail; tail = node; size ++; } // 从头加,下面的代码比较简单,相信大家应该都能理解 public void addToHead() { Node node = null; switch(head.dir) { case L : node = new Node(head.row, head.col - 1, head.dir); break; case U : node = new Node(head.row - 1, head.col, head.dir); break; case R : node = new Node(head.row, head.col + 1, head.dir); break; case D : node = new Node(head.row + 1, head.col, head.dir); break; } // node.next = head; // head.prev = node; // head = node; /* * 上面这种写法与下面这种写法一致,不过下面这种写法我更容易理解 * */ head.prev=node; node.next=head; head=node; size ++; } public void draw(Graphics g) { if(size <= 0) return; move(); for(Node n = head; n != null; n = n.next) { n.draw(g); } } /* * 移动过程所要做的操作:在运动方向增加一个节点,在尾部减去一个节点,并且检测是否已经死亡 * */ private void move() { addToHead(); deleteFromTail(); checkDead(); } private void checkDead() { if(head.row < 2 || head.col < 0 || head.row > Yard.ROWS || head.col > Yard.COLS) { y.stop(); } /* * 头节点与身体的某一个节点相撞,也标志着结束 * */ for(Node n = head.next; n != null; n = n.next) { if(head.row == n.row && head.col == n.col) { y.stop(); } } } /* * 删除尾节点 * */ private void deleteFromTail() { if(size == 0) return; tail = tail.prev; tail.next = null; } public void eat(Egg e) { /* * boolean intersects(Rectangle r) * 确定此 Rectangle 是否与指定的 Rectangle 相交。 * 若相交,表示我们吃到了一个点 ,则导致蛇的长度变长并且在出现一个点,并且加5分,否则什么也不做 * */ if(this.getRect().intersects(e.getRect())) { e.reAppear(); this.addToHead(); //吃了加5分 y.setScore(y.getScore() + 5); } } private Rectangle getRect() { /* * 构造了一个格子大小的区域 * */ return new Rectangle(Yard.BLOCK_SIZE * head.col, Yard.BLOCK_SIZE * head.row, head.w, head.h); } /* * 接收从键盘的按键事件,然后采取相应的解决方案 * */ public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key) { case KeyEvent.VK_LEFT : /* * 当按键为左的时候,只要前进方向不是右,即可转向 * */ if(head.dir != Dir.R) head.dir = Dir.L; break; case KeyEvent.VK_UP : /* * 当按键为"上",只要前进方向不是"下",就可以转向 * */ if(head.dir != Dir.D) head.dir = Dir.U; break; case KeyEvent.VK_RIGHT : /* * 当按键为"右"的时候,只要前进方向不是"左",就可以转向 * */ if(head.dir != Dir.L) head.dir = Dir.R; break; case KeyEvent.VK_DOWN : /* * 当按键为"下"的时候,只要前进方向不是"上",就可以转向 * */ if(head.dir != Dir.U) head.dir = Dir.D; break; } } } ``` 求大神解答 hen'ji

求助改写一个c语言程序

我的编译环境是vs2013,我有一个五子棋代码,想要改一下棋盘和落子方式。但每次改动都会报错,求大佬帮我改成要求的形式,要求棋盘如下 ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576915117_449851.png)棋盘的输入只能以键盘输入,建议统一以字母为先,如G2.且棋子必须下在棋盘格的交点上,不可下在格子里。 ``` #include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> #define N 65 int status[N][N] = { { 0 }, { 0 } };//记录棋盘情况,0无,1红棋/玩家,2为白棋/电脑 int flag = 0;//判断输赢 int direct[2];//方向 int Value1[N][N] = { { 0 }, { 0 } };//计算权值 int Value2[N][N] = { { 0 }, { 0 } };//计算权值 int regrex, regrey, regrex1, regrey1; int count = 0;//计算棋子数量 void chess_board();//打印棋盘 void red_movexy();//红子棋移动光标 void white_movexy();//白棋移动光标 void red_chess(int x, int y);//红棋 void white_chess(int x, int y);//白棋 void man_man(); void man_machine();//人机对战 int judge_chess(int x, int y);//判断这个位置是否下过 int judge_winner(int x, int y, int temp);//判断输赢 void machine_attack();//电脑进攻权值 void machine_defend();//电脑防守权值 void find_position();//寻找最佳权值 void Regret();//悔棋函数 void BackGround(unsigned int ForeColor, unsigned int BackGroundColor) //颜色 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台的句柄 SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色 } void gotoxy(int x, int y) //光标函数 { HANDLE handle; COORD coord; //获取坐标轴结构体 coord.X = x; coord.Y = y; handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄,值为-11 SetConsoleCursorPosition(handle, coord); //移动光标到x,y处 } void chess_board()//打印棋盘 { int i, j; for (i = 0; i <= 30; i++) for (j = 0; j <= 60; j += 4) { gotoxy(j, i); printf("|"); } for (i = 0; i <= 30; i += 2) for (j = 1; j <= 57; j += 4) { gotoxy(j, i); printf("---"); } } void chess_menu()//打印棋盘旁的菜单 { int i, j; for (i = 1; i <= 29; i++) { gotoxy(67, i); printf("||"); } for (i = 1; i <= 29; i++) { gotoxy(89, i); printf("||"); } gotoxy(69, 1); printf("--------------------"); gotoxy(69, 29); printf("--------------------"); gotoxy(75, 3); printf("模 式"); gotoxy(75, 20); printf("提 示"); } void red_movexy()//红棋移动光标 { loop2: gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != ' ') { key = _getch(); switch (key) { case 'W': case 'w': direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 's': case 'S': direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 'a': case 'A': direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 'd': case 'D': direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'q': case 'Q': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop2; } } void white_movexy()//白棋移动光标 { loop1:gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != '0') { key = _getch(); switch (key) { case 72: direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 80: direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 75: direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 77: direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'B': case 'b': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop1; } } void red_chess(int x, int y)//打印红棋 { BackGround(4, 0); regrex = x;//记录上一落子的位置 ,方便悔棋 regrey = y; count++; printf("●"); status[x][y] = 1; } void white_chess(int x, int y)//打印白棋 { BackGround(7, 0); regrex1 = x; regrey1 = y; printf("●"); count++; status[x][y] = 2; } void machine_chess(int x, int y)//电脑落子 { BackGround(7, 0); status[x][y] = 2; regrex1 = x; regrey1 = y; count++; gotoxy(y, x); printf("●"); } int judge_chess(int x, int y)//判断这个地方是否有棋子 { if (status[x][y] == 0) return 0; else return 1; } int judge_winner(int x, int y, int temp)//判断输赢 { int i, j, n1, n2; n1 = n2 = 0; for (i = x, j = y + 4; j <= 58; j += 4)//右 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; j >= 2; j -= 4)//左 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 1; i -= 2)//上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y; i <= 30; i += 2)//下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x - 2, j = y + 4; i >= 1 && j <= 58; i -= 2, j += 4)//右上 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; i <= 30 && j >= 2; i += 2, j -= 4)//左下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 0 && j >= 0; i -= 2, j -= 4)//左上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y + 4; i <= 30 && j <= 58; i += 2, j += 4)//右下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; return 0; } void machine_attack()//电脑进攻权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value1[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 0 && j1 >= 0; i1 -= 2, j1 -= 4)//往左上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value1[i][j] = 15; break; case 4: Value1[i][j] = 25; break; default: Value1[i][j] = 3 + 2 * k; break; } } } } } void machine_defend()//防守权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value2[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 1 && j1 >= 2; i1 -= 2, j1 -= 4)//往左上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value2[i][j] = 10; break; case 4: Value2[i][j] = 20; break; default: Value2[i][j] = 2 + k * 2; } } } } } void find_position()//找到最有价值的位置 { int k1 = 0, k2 = 0; int i, j, max = 0; for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value1[i][j]) { max = Value1[i][j]; k1 = i; k2 = j; } } for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value2[i][j]) { max = Value2[i][j]; k1 = i; k2 = j; } } direct[1] = k1; //将找到的位置传给光标 direct[0] = k2; } void man_man()//人人对战模式 { loop5:system("cls"); char key; int control; gotoxy(2, 3); printf("1.红 子 先 手"); gotoxy(2, 5); printf("2.白 子 先 手"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') control = -1; else goto loop5; gotoxy(70, 5); printf(" 人 人 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 红 子 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 白 子 执 手 "); white_movexy(); white_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "游戏结束,红子胜利", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,白子胜利", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "游戏结束,平局", "五子棋游戏", MB_OK); } } void man_machine()//人机对战模式 { loop6:system("cls"); char key; int control; gotoxy(2, 3); printf("1.玩 家 先 手(玩家为红子)"); gotoxy(2, 5); printf("2.电 脑 先 手(电脑为白子)"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') { control = 1; machine_chess(13, 26); } else goto loop6; gotoxy(70, 5); printf(" 人 机 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 玩 家 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 电 脑 执 手 "); machine_defend(); machine_attack(); find_position(); machine_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } gotoxy(8, 18); if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "太厉害了,您竟然战胜了电脑!", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,您输给了电脑", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "平局", "五子棋游戏", MB_OK); } } void Regret()//悔棋函数 { gotoxy(regrey, regrex); BackGround(0, 0); printf(" "); status[regrex][regrey] = 0; gotoxy(regrey1, regrex1); BackGround(0, 0); printf(" "); status[regrex1][regrey1] = 0; count -= 2; } void welcome()//游戏菜单 { int k; char choose; system("cls"); for (k = 2; k <= 16; k += 2)//游戏菜单 { gotoxy(5, k); printf("|-----------------|"); } gotoxy(5, 3); printf("| 五 子 棋 游 戏 |"); gotoxy(5, 5); printf("| 菜 单 |"); gotoxy(5, 7); printf("| 1.人 人 对 战 |"); gotoxy(5, 9); printf("| 2.人 机 对 战 |"); gotoxy(5, 11); printf("| 3.游 戏 帮 助 |"); gotoxy(5, 13); printf("| 4.作 者 信 息 |"); gotoxy(5, 15); printf("| 5.退 出 游 戏 |"); gotoxy(5, 18); printf("输入菜单对应序号进行操作"); gotoxy(5, 20); printf("祝您游戏愉快!"); gotoxy(30, 18); } char Gametips()//游戏帮助 { char choose; int key; system("cls"); gotoxy(2, 3); printf("游戏操作:"); gotoxy(4, 5); printf("① 红色棋子WASD移动光标选择下棋位置,按空格键确认,按Q悔棋"); gotoxy(4, 7); printf("② 白色棋子↑↓←→移动光标选择下棋位置,按0确认,按B悔棋"); gotoxy(2, 19); printf("(按E键返回,按其它任意键退出)"); return _getch(); } char Auther()//作者信息 { system("cls"); gotoxy(2, 3); printf("作者:张洪浩"); gotoxy(2, 5); printf("(按E键返回,按其它任意键退出)"); return _getch(); } int main(void) { system("title 五子棋"); system("mode con cols=92 lines=33"); char choose, temp; loop: welcome(); choose = _getch(); switch (choose){ case '1': man_man(); break; case '2': man_machine(); break; case '3': temp = Gametips(); if (temp == 'E' || temp == 'e') goto loop; break; case '4': temp = Auther(); if (temp == 'E' || temp == 'e') goto loop; break; //case '5': //int message=MessageBox(NULL,"是否退出?","友情提示",MB_OKCANCEL); //if(IDCANCEL==message) // goto loop; //if(IDOK==message) break; } } ```

如何使用C语言,编写贪吃蛇游戏程序(不使用函数和结构体,只使用数组)

要求:至少有墙、蛇和食物3种对象,用键盘控制蛇头的前进方向,每吃到一个食物蛇身增长一节,食物被吃掉后随机在另外的位置产生新的食物,蛇头碰到蛇身或墙壁后死亡,游戏结束! ``` #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> main() { char map[12][12] ={{'|','|','|','|','|','|','|','|','|','|','|','|'},{'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'}, {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},{'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'}, {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},{'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'}, {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},{'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'}, {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},{'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'}, {'|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},{'|','|','|','|','|','|','|','|','|','|','|','|'}}; int bodyx[10]; int bodyy[10]; //存储蛇头和蛇身坐标 int speed; //速度 int life; //life为1时死,life为0时活 int longth; //蛇长度 int direction; //运动方向 int x; int y; //食物坐标 int eat;//eat为0时有食物,eat为1时无食物 int i; int a, b, m, n, q, p, j, k; char c; char head='@'; char body='#'; char food='*'; bodyx[0]=6; bodyy[0]=6; //蛇头 bodyx[1]=6; bodyx[1]=5; //蛇身 speed=500; longth=3; life=0; eat=1; direction='d'; if(bodyx[0]==x&&bodyy[0]==y) longth++,eat=1; //蛇吃到食物,蛇身加长 for(i=longth-1;i>0;i--) { bodyx[i]=bodyx[i-1]; bodyy[i]=bodyy[i-1]; } switch (direction) { case 'a':bodyy[0]-=1;break; case 'w':bodyx[0]-=1;break; case 'd':bodyy[0]+=1;break; case 's':bodyx[0]+=1;break; }//蛇头方向 begin: while(1) { system("cls"); //清屏 if(kbhit()) //判断是否有按键按下 { c=getch(); //获取按键ASCII码值 { if(c=='w'&&direction!='s') direction='w'; //条件判断 else if(c=='a'&&direction!='d') direction='a'; else if(c=='s'&&direction!='w') direction='s'; else if(c=='d'&&direction!='a') direction='d'; else if(c=='q') //暂停功能 { printf("\n按下回车键继续游戏"); getchar(); } else if(c=='e') speed=speed-50; //调速功能 } } } if(life==0&&eat==1) { x=(rand()%10)+1; y=(rand()%10)+1; for(i=1;i<longth;i++) { for(;x==bodyx[i]&&y==bodyy[i];) { x=(rand()%10)+1; y=(rand()%10)+1; } } eat=0; }//刷新食物 a=bodyx[0]; //a,b是蛇头坐标 b=bodyy[0]; for(i=longth-1;i>0;i--) { m=bodyx[i]; //m,n是蛇身坐标 n=bodyy[i]; map[m][n]=body; //改写地图数组 } map[x][y]=food; map[p][q]=' '; map[a][b]=head; //改写地图数组 for(j=0;j<12;j++) { for(k=0;k<12;k++) { printf("%c",map[j][k]); printf("\n"); } } printf("长度: %d\n速度 %d\n按q键暂停\n按e键加速",longth-1,11-(speed/50)); Sleep(speed); if(longth>3) { for(i=3;i<longth-1;i++) { if(bodyx[i]==bodyx[0]&&bodyy[i]==bodyy[0]) life=1; } }//判断蛇是否咬到自己 if(bodyx[0]>=11||bodyx[0]<=11||bodyy[0]>=11||bodyy[0]<=11) life=1;//判断蛇是否撞墙 if(life==1) { system("cls"); printf("\tGAME OVER"); system("cls"); printf("Click the enter to reply"); getchar(); goto begin; }//游戏结束 } ``` 以上是大部分代码(老师给的),剩下的不会补了,求大佬指教

java简易计算器实现,添加能够切换简易计算器和科学计算器的按键。

![图片说明](https://img-ask.csdn.net/upload/201810/27/1540655964_202901.png) 现已有完整计算器框架和实现,但是需求有一条是: 能 通过菜单可以切换简易计算器和科学计算器。 如今就这个功能未实现,简易计算器就是只包含+、-、*、/的状态,而科学计算器则包括开方、平方、幂运算、1/n等操作。各运算已实现,但就是不知道怎么切换界面。求大神添加一个能够让其变化界面的按钮函数来实现。 附上代码: ``` import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener { /** 计算器上的键的显示名字 */ private final String[] KEYS = { "7", "8", "9", "÷", "sqrt", "4", "5", "6", "x", "%", "1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" }; /** 计算器上的功能键的显示名字 */ private final String[] COMMAND = { "Backspace", "CE", "C" }; /** 计算器左边的M的显示名字 */ private final String[] M = { " ", "MC", "MR", "MS", "M+" }; /** 计算器上键的按钮 */ private JButton keys[] = new JButton[KEYS.length]; /** 计算器上的功能键的按钮 */ private JButton commands[] = new JButton[COMMAND.length]; /** 计算器左边的M的按钮 */ private JButton m[] = new JButton[M.length]; /** 计算结果文本框 */ private JTextField resultText = new JTextField("0"); // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; /** * 构造函数 */ public Calculator() { super(); // 初始化计算器 init(); // 设置计算器的背景颜色 this.setBackground(Color.BLACK); this.setTitle("计算器"); // 在屏幕(500, 300)坐标处显示计算器 this.setLocation(500, 300); // 不许修改计算器的大小 this.setResizable(false); // 使计算器中各组件大小合适 this.pack(); } /** * 初始化计算器 */ private void init() { // 文本框中的内容采用右对齐方式 resultText.setHorizontalAlignment(JTextField.RIGHT); // 不允许修改结果文本框 resultText.setEditable(false); // 设置文本框背景颜色为白色 resultText.setBackground(Color.WHITE); // 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel(); // 用网格布局器,4行,5列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calckeysPanel.setLayout(new GridLayout(4, 5, 3, 3)); for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(KEYS[i]); calckeysPanel.add(keys[i]); keys[i].setForeground(Color.blue); } // 运算符键用红色标示,其他键用蓝色表示 keys[3].setForeground(Color.red); keys[8].setForeground(Color.red); keys[13].setForeground(Color.red); keys[18].setForeground(Color.red); keys[19].setForeground(Color.red); // 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel(); // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 commandsPanel.setLayout(new GridLayout(1, 3, 3, 3)); for (int i = 0; i < COMMAND.length; i++) { commands[i] = new JButton(COMMAND[i]); commandsPanel.add(commands[i]); commands[i].setForeground(Color.red); } // 初始化M键,用红色标示,将M键放在一个画板内 JPanel calmsPanel = new JPanel(); // 用网格布局管理器,5行,1列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calmsPanel.setLayout(new GridLayout(5, 1, 3, 3)); for (int i = 0; i < M.length; i++) { m[i] = new JButton(M[i]); calmsPanel.add(m[i]); m[i].setForeground(Color.red); } // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部, // 将文本框放在北部,将calms画板放在计算器的西部。 // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内 JPanel panel1 = new JPanel(); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel); // 建立一个画板放文本框 JPanel top = new JPanel(); top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局 getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); getContentPane().add("West", calmsPanel); // 为各按钮添加事件侦听器 // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < KEYS.length; i++) { keys[i].addActionListener(this); } for (int i = 0; i < COMMAND.length; i++) { commands[i].addActionListener(this); } for (int i = 0; i < M.length; i++) { m[i].addActionListener(this); } } /** * 处理事件 */ public void actionPerformed(ActionEvent e) { // 获取事件源的标签 String label = e.getActionCommand(); if (label.equals(COMMAND[0])) { // 用户按了"Backspace"键 handleBackspace(); } else if (label.equals(COMMAND[1])) { // 用户按了"CE"键 resultText.setText("0"); } else if (label.equals(COMMAND[2])) { // 用户按了"C"键 handleC(); } else if ("0123456789.".indexOf(label) >= 0) { // 用户按了数字键或者小数点键 handleNumber(label); // handlezero(zero); } else { // 用户按了运算符键 handleOperator(label); } } /** * 处理Backspace键被按下的事件 */ private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 resultText.setText(text); } } } private void handleNumber(String key) { if (firstDigit) { // 输入的第一个数字 resultText.setText(key); } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) { // 如果输入的不是小数点,则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); } // 以后输入的肯定不是第一个数字了 firstDigit = false; } private void handleC() { // 初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } private void handleOperator(String key) { if (operator.equals("÷")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("除数不能为零"); } else { resultNum /= getNumberFromText(); } } else if (operator.equals("1/x")) { // 倒数运算 if (resultNum == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("零没有倒数"); } else { resultNum = 1 / resultNum; } } else if (operator.equals("+")) { // 加法运算 resultNum += getNumberFromText(); } else if (operator.equals("-")) { // 减法运算 resultNum -= getNumberFromText(); } else if (operator.equals("x")) { // 乘法运算 resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { // 平方根运算 resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { // 百分号运算,除以100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { } return result; } public static void main(String args[]) { Calculator calculator1 = new Calculator(); calculator1.setVisible(true); calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ```

Java 自制的计算器菜单键无法复制

代码如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; /** * 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。 */ public class Calculator extends JFrame implements ActionListener { /** 计算器上的键的显示名字 */ private final String[] KEYS = { "7", "8", "9", "/", "4", "5", "6", "*" , "1", "2", "3","-", "0","+/-",".","+", "1/x", "%", "sqrt", "=" }; /** 计算器上的功能键的显示名字 */ private final String[] COMMAND = { "Backspace", "C" }; /** 计算器上键的按钮 */ private JButton keys[] = new JButton[KEYS.length]; /** 计算器上的功能键的按钮 */ private JButton commands[] = new JButton[COMMAND.length]; /** 计算结果文本框 */ private JTextField resultText = new JTextField("0"); // private JMenuBar mb=new JMenuBar(); //编辑 private JMenu mEdit = new JMenu("编辑(E)"); //复制黏贴 private JMenuItem mCopy = new JMenuItem("复制(C)"); private JMenuItem mPaste = new JMenuItem("黏贴(V)"); //剪切板 private StringBuffer copyBoard=new StringBuffer(20); // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字 private boolean firstDigit = true; // 计算的中间结果。 private double resultNum = 0.0; // 当前运算的运算符 private String operator = "="; // 操作是否合法 private boolean operateValidFlag = true; /** * 构造函数 */ public Calculator() { super(); // 初始化计算器 init(); // 设置计算器的背景颜色 this.setBackground(Color.LIGHT_GRAY); this.setTitle("计算器"); // 在屏幕(500, 300)坐标处显示计算器 this.setLocation(500, 300); // 许修改计算器的大小 this.setResizable(true); // 使计算器中各组件大小合适 this.pack(); //添加菜单与目录 this.setJMenuBar(mb); mb.add(mEdit); mEdit.setMnemonic(KeyEvent.VK_E); mEdit.add(mCopy); mEdit.add(mPaste); } /** * 初始化计算器 */ private void init() { // 文本框中的内容采用右对齐方式 resultText.setHorizontalAlignment(JTextField.RIGHT); // 允许修改结果文本框 resultText.setEditable(true); // 设置文本框背景颜色为白色 resultText.setBackground(Color.white); // 初始化计算器上键的按钮,将键放在一个画板内 JPanel calckeysPanel = new JPanel(); // 用网格布局器,5行,4列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 calckeysPanel.setLayout(new GridLayout(5, 4, 0, 0)); for (int i = 0; i < KEYS.length; i++) { keys[i] = new JButton(KEYS[i]); calckeysPanel.add(keys[i]); keys[i].setForeground(Color.black); } // 初始化功能键,都用红色标示。将功能键放在一个画板内 JPanel commandsPanel = new JPanel(); // 用网格布局器,1行,3列的网格,网格之间的水平方向间隔为3个象素,垂直方向间隔为3个象素 commandsPanel.setLayout(new GridLayout(1, 3, 0, 0)); for (int i = 0; i < COMMAND.length; i++) { commands[i] = new JButton(COMMAND[i]); commandsPanel.add(commands[i]); } // 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部, // 将文本框放在北部,将calms画板放在计算器的西部。 // 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内 JPanel panel1 = new JPanel(); // 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素 panel1.setLayout(new BorderLayout(3, 3)); panel1.add("North", commandsPanel); panel1.add("Center", calckeysPanel); // 建立一个画板放文本框 JPanel top = new JPanel(); top.setLayout(new BorderLayout()); top.add("Center", resultText); // 整体布局 getContentPane().setLayout(new BorderLayout(3, 5)); getContentPane().add("North", top); getContentPane().add("Center", panel1); // 为各按钮添加事件侦听器 // 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener for (int i = 0; i < KEYS.length; i++) { keys[i].addActionListener(this); } for (int i = 0; i < COMMAND.length; i++) { commands[i].addActionListener(this); } } /** * 处理事件 */ public void actionPerformed(ActionEvent e) { // 获取事件源的标签 String label = e.getActionCommand(); if(label.equals("复制(C)")) { String temp = resultText.getText().trim(); copyBoard.replace(0, copyBoard.length(), temp); } else if(label.equals("黏贴(V)")) { resultText.setText(copyBoard.toString()); }else if (label.equals(COMMAND[0])) { // 用户按了"Backspace"键 handleBackspace(); }else if (label.equals(COMMAND[1])) { // 用户按了"C"键 handleC(); } else if ("0123456789.".indexOf(label) >= 0) { // 用户按了数字键或者小数点键 handleNumber(label); // handlezero(zero); } else { // 用户按了运算符键 handleOperator(label); } } /** * 处理Backspace键被按下的事件 */ private void handleBackspace() { String text = resultText.getText(); int i = text.length(); if (i > 0) { // 退格,将文本最后一个字符去掉 text = text.substring(0, i - 1); if (text.length() == 0) { // 如果文本没有了内容,则初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } else { // 显示新的文本 resultText.setText(text); } } } /** * 处理数字键被按下的事件 * * @param key */ private void handleNumber(String key) { if (firstDigit) { // 输入的第一个数字 resultText.setText(key); } else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) { // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面 resultText.setText(resultText.getText() + "."); } else if (!key.equals(".")) { // 如果输入的不是小数点,则将数字附在结果文本框的后面 resultText.setText(resultText.getText() + key); } // 以后输入的肯定不是第一个数字了 firstDigit = false; } /** * 处理C键被按下的事件 */ private void handleC() { // 初始化计算器的各种值 resultText.setText("0"); firstDigit = true; operator = "="; } /** * 处理运算符键被按下的事件 * * @param key */ private void handleOperator(String key) { if (operator.equals("/")) { // 除法运算 // 如果当前结果文本框中的值等于0 if (getNumberFromText() == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("除数不能为零"); } else { resultNum /= getNumberFromText(); } } else if (operator.equals("1/x")) { // 倒数运算 if (resultNum == 0.0) { // 操作不合法 operateValidFlag = false; resultText.setText("零没有倒数"); } else { resultNum = 1 / resultNum; } } else if (operator.equals("+")) { // 加法运算 resultNum += getNumberFromText(); } else if (operator.equals("-")) { // 减法运算 resultNum -= getNumberFromText(); } else if (operator.equals("*")) { // 乘法运算 resultNum *= getNumberFromText(); } else if (operator.equals("sqrt")) { // 平方根运算 resultNum = Math.sqrt(resultNum); } else if (operator.equals("%")) { // 百分号运算,除以100 resultNum = resultNum / 100; } else if (operator.equals("+/-")) { // 正数负数运算 resultNum = resultNum * (-1); } else if (operator.equals("=")) { // 赋值运算 resultNum = getNumberFromText(); } if (operateValidFlag) { // 双精度浮点数的运算 long t1; double t2; t1 = (long) resultNum; t2 = resultNum - t1; if (t2 == 0) { resultText.setText(String.valueOf(t1)); } else { resultText.setText(String.valueOf(resultNum)); } } // 运算符等于用户按的按钮 operator = key; firstDigit = true; operateValidFlag = true; } /** * 从结果文本框中获取数字 * * @return */ private double getNumberFromText() { double result = 0; try { result = Double.valueOf(resultText.getText()).doubleValue(); } catch (NumberFormatException e) { } return result; } public static void main(String args[]) { Calculator calculator1 = new Calculator(); calculator1.setVisible(true); calculator1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

如何设计一个a到z的26个字母的无限循环

如何设计一个a到z的26个字母的无限循环,类似于数字相加一样,当从a循环到z的时候,下一个就是aa循环到zz,然后就是aaa到zzz,依此类推,无限循环下去

汇编语言的代码在dosboxs上出了点问题,有大神帮忙解决一下吗?

初学汇编,小白一枚,不知道错在哪里了,求大神带飞,代码是在源码中国下载的,在dosbox显示这样, ``` ;*********************************************************************************************************************** ;程序功能: ;完成小车的自动和手动沿轨道行驶的过程,并具有计时功能 ;*********************************************************************************************************************** ;运行说明: ;程序运行之后,即显示出轨道和小车; ;按键‘a’或‘m’选择自动还是手动(a为自动,m为手动),按‘s’键启动小车; ;手动时,按方向键控制小车方向,撞到轨道时,小车会停止并闪动; ;小车到达终点后会自动停车,之后按‘r’键可使小车回到起点,然后重新选择小车的运行得方式; ;小车行驶过程中,计时器计时,到达终点则停止计时; ;手动时,按‘t’暂停,‘c’键继续,此间计时不停止; ;小车回到起点位置后,按下‘s’键计时清零,并重新进行下一次的计时; ;小车处于未选定模式和手动运行时可按Esc键退出运行。 ;*********************************************************************************************************************** stack segment 'stack' db 256 dup(0) stack ends data segment count dw 0 sec dw 0 min dw 0 save_lc dw 2 dup(?) car db 0,7,0,0,0,0,0,0,7,0 ;车的图案,10行10列 db 7,0,7,0,0,0,0,7,0,7 db 0,7,9,9,9,9,9,9,7,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,7,9,9,9,9,9,9,7,0 db 7,0,7,0,0,0,0,7,0,7 db 0,7,0,0,0,0,0,0,7,0 x dw 180 ;起始位置 y dw 83 start_flag_1 db 0 ;启动标志1 start_flag_2 db 0 ;启动标志2 direc_flag db 0 ;方向标志 touch_flag db 0 ;触轨标志 arrive_flag db 0 ;到达标志 turn_x1 dw 138 ;拐弯点 turn_y1 dw 28 turn_x2 dw 203 turn_y2 dw 133 turn_x3 dw 135 es_save dw 0 ;用于保存图形缓冲区的首地址 mode db ? ;用于保存显示之前显示器的模式 x1 dw ? ;9型轨道的坐标 y1 dw ? x2 dw ? y2 dw ? x3 dw ? y3 dw ? x4 dw ? x_d dw 15 ;轨道的宽度 data ends code segment ;段设置 assume cs:code,ds:data start: mov ax,data mov ds,ax mov es,ax mov ax,0a000h ;图形缓冲区的首地址 mov es,ax mov es_save,ax ;把图形缓冲区的首地址保存在es_save mov ah,0fh int 10h ;获取显示器显示图形之前的显示模式 mov mode,al ;把显示模式保存在mode中 mov ah,35h mov al,1ch int 21h ;取中段号为1ch(定时中断)的中段向量(即中断程序的入口地址),并把它放在ES:BX中 mov save_lc,bx mov save_lc+2,es ;保存中断向量 push ds ;保存ds mov dx,seg clint ;定时中断服务程序的段地址 mov ds,dx mov dx,offset clint ;定时中断的中断服务程序的偏移地址 mov al,1ch mov ah,25h int 21h ;设置中断向量,入口:DS:DX=中断向量,al=中断类型号。 ;即把定时中断的中断服务程序的入口地址放在4*n(其中n为中断类型号)中 pop ds ;ds出栈 in al,21h ;允许键盘和定时器中断 and al,11111100b out 21h,al sti ;开中断 mov ax,13h int 10h ;设置显示器的模式为13h,320×200,256色 call guidao_9 ;画轨道 call picture ;显示小车 input: mov ah,0 int 16h ;等待按键输入 cmp ax,011bh ;Esc键退出 jz b4 cmp ax,326dh ;选m,则为手动 jne b1 call xiaoche_shou jmp b2 b1: cmp ax,1e61h ;选a,则为自动 jne input ;都没有选,则重新选择输入 call xiaoche_move b2: mov ah,0 ;等待按下r键 int 16h cmp ax,1372h ;r键的扫描码 jnz b2 ;不是r键,则等待至按下r mov start_flag_1,0 ;是r键,则将起始标志位清零 mov start_flag_2,0 mov arrive_flag,0 b3: call clearpicture ;擦除终点的小车 mov x,180 ;小车回到起始位置 mov y,83 call picture ;显示小车 jmp input b4: push ds mov dx,save_lc mov ax,save_lc+2 mov ds,ax mov al,1ch mov ah,25h int 21h ;重置之前的中断向量,调用lch pop ds mov ah,0 mov al,mode int 10h ;把显示器的模式设置为显示图形之前的模式 mov ax,4c00h ;返回dos int 21h ;*********************************************************************************************************************** ;显示9字型轨道 ;*********************************************************************************************************************** guidao_9 proc mov x1,190 mov y1,95 mov x2,135 mov y2,25 mov x3,215 mov y3,145 mov x4,135 call draw_9_line ;外轨道 mov x1,190 mov y1,80 ;轨道的入口 mov x2,150 mov y2,40 mov x3,200 mov y3,130 mov x4,135 ;轨道的出口 call draw_9_line ;内轨道 ret guidao_9 endp ;******************************画9字********************************** draw_9_line proc mov cx,x1 mov dx,y1 mov di,y2 mov si,x2 call hline call sline mov di,y3 mov si,x3 call hline call sline mov si,x4 call hline draw_9_line endp ;*********************画竖线********************** sline proc mov al,03h ;设置直线的颜色为青 mov bh,0 ;0页 mov ah,0ch cmp dx,di jg a1line aline: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) inc dx cmp dx,di ;判断是否到di行 jng aline ;没到,则画线 dec dx ;使下一个点与这一个点重合 jmp e3 a1line: int 10h dec dx cmp dx,di jnl a1line inc dx e3: ret ;到了,则退出 sline endp ;*********************画横线********************** hline proc mov al,03h ;设置直线的颜色为青 mov bh,0 ;0页 mov ah,0ch cmp cx,si jg b1line bline: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) inc cx ;画第一点,并让横坐标加一 cmp cx,si ;判断是否到si列 jng bline ;没到,则画线 dec cx ;使下一条线的起点与这一个点重合 jmp e2 b1line: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) dec cx cmp cx,si jnl b1line ;没到,则画线 inc cx ;使下一条线的起点与这一个点重合 e2: ret ;到了,则退出 hline endp ;*********************************************************************************************************************** ;显示小车(通过向图形显示缓冲区写点) ;*********************************************************************************************************************** picture proc near mov ax,es_save mov es,ax mov dx,y mov bx,0 again: cmp dx,0 je over add bx,320 dec dx jmp again ;找到小车第一个点所在行 over: mov dx,10 lea si,car next1: mov cx,10 mov di,x ;找到小车第一个点 next: mov al,[si] mov es:[bx+di],al ;往空位填写数据 inc si ;指向下一个待填入的数据 inc di ;指向下一个等待填写的空位 loop next add bx,320 ;转到下一行 dec dx jne next1 ret picture endp ;*********************************************************************************************************************** ;计时器(中断号为1ch的中断为计时器中断,每55ms中断一次,每秒发生18.2次中断) ;*********************************************************************************************************************** clint proc far push ax ;保护寄存器 push bx push cx push dx push si push di push bp push sp push ds push es mov bx,data mov ds,bx ;设置数据段 assume ds:data cmp arrive_flag,1 ;判断小车是否到达终点 jne e6 ;没到,则跳至e7 call disptime ;到达,则显示时间 jmp return ;返回 e6: lea bx,count inc word ptr[bx] ;每产生一次定时中断,count加1 cmp word ptr[bx],18 ;判断是否到1秒 jne e7 ;没到,则跳至e6 call inct ;调整时间 e7: mov al,start_flag_1 and al,start_flag_2 jnz e8 mov al,start_flag_1 or al,start_flag_2 jz return jmp e9 e8: mov count,0 mov sec,0 mov min,0 mov start_flag_2,0 e9: call disptime ;显示小车 return: pop es pop ds pop sp pop bp pop di pop si pop dx pop cx pop bx pop ax iret clint endp ;******************判断是否进位******************* inct proc near mov word ptr[bx],0 add bx,2 inc word ptr[bx] cmp word ptr[bx],60 jne exit call inct exit: ret inct endp ;*****************************显示时间******************************** disptime proc near mov ax,min call bindec mov dl,':' mov ah,02h int 21h mov ax,sec call bindec mov dl,':' mov ah,02h int 21h mov bx,count mov al,55d mul bl call bindec mov dl,0dh ;输出回车,让光标回到起点 mov ah,02h int 21h ret disptime endp ;************把一个三位十进制数显示出来*********** bindec proc near mov cx,100d call decdiv mov cx,10d call decdiv mov cx,1 call decdiv ret bindec endp ;********************显示高位********************* decdiv proc near mov dx,0 div cx push dx mov dl,al add dl,30h mov ah,02h int 21h ;显示一位 pop ax ret decdiv endp ;************************************************************************************************************************ ;擦除 ;************************************************************************************************************************ clearpicture proc near mov dx,y mov bx,0 again2: cmp dx,0 je over2 add bx,320 dec dx jmp again2 over2: mov dx,10 next12: mov cx,10 mov di,x next2: mov al,0 ;把该点置为0,即用黑色擦除该点 mov es:[bx+di],al inc di loop next2 add bx,320 dec dx jne next12 ret clearpicture endp ;*********************************************************************************************************************** ;延时程序 ;*********************************************************************************************************************** delay proc near push bx push cx mov bx,1234 back: mov cx,66 push ax wait1: in al,61h and al,10h cmp al,ah je wait1 mov ah,al loop wait1 pop ax dec bx jne back pop cx pop bx ret delay endp ;*********************************************************************************************************************** ;小车自动运行 ;*********************************************************************************************************************** xiaoche_move proc call picture ;转移至picture程序段 ag: mov ah,7 ;中断 int 21h cmp al,'s' ;设置开始键s jne ag ;判断是否为s,不是则转至ag中断 mov start_flag_1,1 mov start_flag_2,1 start1: call clearpicture dec x call picture call delay mov si,x cmp si,turn_x1 ;遇到第一个拐弯 jg start1 start2: call clearpicture dec y call picture call delay mov si,y cmp si,turn_y1 ;遇到第二个拐弯 jg start2 start3: call clearpicture inc x call picture call delay mov si,x cmp si,turn_x2 ;遇到第三个拐弯 jl start3 start4: call clearpicture inc y call picture call delay mov si,y cmp si,turn_y2 ;遇到第四个拐弯 jl start4 start5: call clearpicture dec x call picture call delay mov si,x cmp si,turn_x3 ;遇到第五个拐弯,即终点 jg start5 mov arrive_flag,1 ret xiaoche_move endp ;*********************************************************************************************************************** ;小车手动运行 ;*********************************************************************************************************************** xiaoche_shou proc j0: call clearpicture ;擦除小车 call saomiao ;键盘扫描 cmp start_flag_1,1 ;判断小车是否启动 jne a8 ;没有,则呆在原地不动 ;判断小车运动的方向 cmp direc_flag,1 ;上 jne a1 dec y a1: cmp direc_flag,2 ;下 jne a2 inc y a2: cmp direc_flag,3 ;左 jne a3 dec x a3: cmp direc_flag,4 ;右 jne a4 inc x a4: call ya_line_do ;检测是否碰到轨道 cmp touch_flag,1 jne a8 ;没有碰到轨道,则继续前进 call guidao_9 ;碰到则重新显示轨道 mov touch_flag,0 ;将触轨标志清零 call back_step ;小车后退一步,回到轨道 a8: call picture call delay cmp arrive_flag,1 ;判断小车是否到达终点,到了则退出 jne j0 a9: ret xiaoche_shou endp ;*********************************************************************************************************************** ;键盘扫描程序 ;*********************************************************************************************************************** saomiao proc near mov ah,01h ;从键盘读一个字符,读到的结果为键的扫描码,存放在AH中 int 16h jz f ;如果无键按下,则退出 mov ah,00h ;若有键按下则中断当前 int 16h cmp ax,1f73h ;s的扫描码 jne h mov start_flag_1,1 mov start_flag_2,1 mov direc_flag,0 mov arrive_flag,0 h: cmp ax,1474h ;t的扫描码 jne j mov start_flag_1,0 mov start_flag_2,1 k: call picture mov ah,0 int 16h cmp ax, 2e63h ;c的扫描码 jne k mov start_flag_1,1 mov start_flag_2,0 call clearpicture j: cmp ax,4800h ;上键的扫描码 jne a mov direc_flag,1 a: cmp ax,5000h ;下键的扫描码 jne b mov direc_flag,2 b: cmp ax,4b00h ;左键的扫描码 jne g mov direc_flag,3 g: cmp ax,4d00h ;右键的扫描码 jne f mov direc_flag,4 jmp f e1: mov al,mode ;一旦有按键输入,则把显示器的模式设置为画直线之前的模式 mov ah,0 int 10h mov ax,4c00h int 21h f: ret saomiao endp ;*********************************************************************************************************************** ;小车触轨判断及处理 ;*********************************************************************************************************************** ya_line_do proc mov ax,y2 mov bx,y1 mov cx,x2 call ya_y_line sub ax,x_d add bx,x_d sub cx,x_d call ya_y_line mov ax,y2 mov bx,y3 mov cx,x3 call ya_y_line sub ax,x_d add bx,x_d add cx,x_d call ya_y_line mov ax,x2 mov bx,x1 mov cx,y1 call ya_x_line sub ax,x_d add cx,x_d call ya_x_line mov ax,x2 mov bx,x3 mov cx,y2 call ya_x_line sub ax,x_d add bx,x_d sub cx,x_d call ya_x_line mov ax,x4 mov bx,x3 mov cx,y3 call ya_x_line add bx,x_d add cx,x_d call ya_x_line cmp touch_flag,1 je e4 mov ax,y3 ;判断是否到终点 mov bx,ax add bx,x_d mov cx,x4 call ya_y_line mov al,touch_flag mov arrive_flag,al e4: ret ya_line_do endp ;*****************判断是否触到y线***************** ya_y_line proc ;ax为y1(起点),bx为y2(终点),cx为x1 cmp x,cx je n3 mov dx,cx ;注意cx不能变化 sub dx,9 cmp x,dx jnz n1 n3: mov dx,ax sub dx,9 cmp y,dx jl n1 cmp y,bx jg n1 mov touch_flag,1 n1: ret ya_y_line endp ;*****************判断是否触到x线***************** ya_x_line proc ;ax为x1(起点),bx为x2(终点),cx为y1 cmp y,cx je n5 mov dx,cx ;注意cx不能变化 sub dx,9 cmp y,dx jnz n2 n5: mov dx,ax sub dx,9 cmp x,dx jl n2 cmp x,bx jg n2 mov touch_flag,1 n2: ret ya_x_line endp ;************************小车触轨则后退一步*************************** back_step proc cmp direc_flag,1 ;如果碰到轨道,则后退一步 jne a5 inc y a5: cmp direc_flag,2 jne a6 dec y a6: cmp direc_flag,3 jne a7 inc x a7: cmp direc_flag,4 jne a8 dec x ret back_step endp ;*********************************************************************************************************************** ;*********************************************************************************************************************** code ends end start ```

《疯狂java讲义》课后题五子棋程序的一些疑问!!!

以下是标准答案源程序: Chessboard类 package org.crazyit.gobang; /** * 棋盘对象 * * @author yangenxiong yangenxiong2009@gmail.com * @author Kelvin Mak kelvin.mak125@gmail.com * @version 1.0 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java*</a> * <br>Copyright (C), 2009-2010, yangenxiong * <br>This program is protected by copyright laws. */ public class Chessboard { // 定义一个二维数组来充当棋盘 private String[][] board; // 定义棋盘的大小 public static final int BOARD_SIZE = 22; /** * 初始化棋盘 * * @return void */ public void initBoard() { // 初始化棋盘数组 board = new String[BOARD_SIZE][BOARD_SIZE]; // 把每个元素赋值为“十”,用于控制台输出棋盘 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { board[i][j] = "十"; } } } public void test() { Object[][] array = new Object[10][10]; for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { array[i][j] = new Object(); } } } /** * 在控制台输出棋盘的方法 */ public void printBoard() { // 打印每个数组元素 for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { // 打印后不换行 System.out.print(board[i][j]); } // 每打印完一行数组元素就换行一次 System.out.print("\n"); } } /** * 给棋盘位置赋值 * * @param posX * X坐标 * @param posY * Y坐标 * @param chessman * 棋子 */ public void setBoard(int posX, int posY, String chessman) { this.board[posX][posY] = chessman; } /** * 返回棋盘 * * @return 返回棋盘 */ public String[][] getBoard() { return this.board; } } 回帖列表回帖(6) | 浏览(8) Scott Smith 2012-04-06 13:14:38 删除 1楼 Chessman类: package org.crazyit.gobang; /** * 棋子枚举类 * * @author yangenxiong yangenxiong2009@gmail.com * @author Kelvin Mak kelvin.mak125@gmail.com * @version 1.0 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java*</a> * <br>Copyright (C), 2009-2010, yangenxiong * <br>This program is protected by copyright laws. */ public enum Chessman { BLACK("●"), WHITE("○"); //public static final Chessman = new Chessman(""); private String chessman; /** * 私有构造器 */ private Chessman(String chessman) { this.chessman = chessman; } /** * @return String 黑棋或者白棋 */ public String getChessman() { return this.chessman; } } Scott Smith 2012-04-06 13:16:20 删除 2楼 GobangGame类: package org.crazyit.gobang; import java.io.BufferedReader; import java.io.InputStreamReader; /** * 五子棋游戏类 * * @author yangenxiong yangenxiong2009@gmail.com * @author Kelvin Mak kelvin.mak125@gmail.com * @version 1.0 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java*</a> * <br>Copyright (C), 2009-2010, yangenxiong * <br>This program is protected by copyright laws. */ public class GobangGame { // 定义达到赢条件的棋子数目 private final int WIN_COUNT = 5; // 定义用户输入的X坐标 private int posX = 0; // 定义用户输入的X坐标 private int posY = 0; // 定义棋盘 private Chessboard chessboard; /** * 空构造器 */ public GobangGame() { } /** * 构造器,初始化棋盘和棋子属性 * * @param chessboard * 棋盘类 */ public GobangGame(Chessboard chessboard) { this.chessboard = chessboard; } /** * 检查输入是否合法。 * * @param inputStr * 由控制台输入的字符串。 * @return 字符串合法返回true,反则返回false。 */ public boolean isValid(String inputStr) { // 将用户输入的字符串以逗号(,)作为分隔,分隔成两个字符串 String[] posStrArr = inputStr.split(","); try { posX = Integer.parseInt(posStrArr[0]) - 1; posY = Integer.parseInt(posStrArr[1]) - 1; } catch (NumberFormatException e) { chessboard.printBoard(); System.out.println("请以(数字,数字)的格式输入:"); return false; } // 检查输入数值是否在范围之内 if (posX < 0 || posX >= Chessboard.BOARD_SIZE || posY < 0 || posY >= Chessboard.BOARD_SIZE) { chessboard.printBoard(); System.out.println("X与Y坐标只能大于等于1,与小于等于" + Chessboard.BOARD_SIZE + ",请重新输入:"); return false; } // 检查输入的位置是否已经有棋子 Scott Smith 2012-04-06 13:16:47 删除 3楼 String[][] board = chessboard.getBoard(); if (board[posX][posY] != "十") { chessboard.printBoard(); System.out.println("此位置已经有棋子,请重新输入:"); return false; } return true; } /** * 开始下棋 */ public void start() throw*ception { // true为游戏结束 boolean isOver = false; chessboard.initBoard(); chessboard.printBoard(); // 获取键盘的输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputStr = null; // br.readLine:每当键盘输入一行内容按回车键,则输入的内容被br读取到 while ((inputStr = br.readLine()) != null) { isOver = false; if (!isValid(inputStr)) { // 如果不合法,要求重新输入,再继续 continue; } // 把对应的数组元素赋为"●" String chessman = Chessman.BLACK.getChessman(); chessboard.setBoard(posX, posY, chessman); // 判断用户是否赢了 if (isWon(posX, posY, chessman)) { isOver = true; } else { // 计算机随机选择位置坐标 int[] computerPosArr = computerDo(); chessman = Chessman.WHITE.getChessman(); chessboard.setBoard(computerPosArr[0], computerPosArr[1], chessman); // 判断计算机是否赢了 if (isWon(computerPosArr[0], computerPosArr[1], chessman)) { isOver = true; } } // 如果产生胜者,询问用户是否继续游戏 if (isOver) { // 如果继续,重新初始化棋盘,继续游戏 if (isReplay(chessman)) { chessboard.initBoard(); chessboard.printBoard(); continue; } // 如果不继续,退出程序 break; } chessboard.printBoard(); System.out.println("请输入您下棋的坐标,应以x,y的格式输入:"); } } /** * 是否重新开始下棋。 * * @param chessman * "●"为用户,"○"为计算机。 * @return 开始返回true,反则返回false。 */ public boolean isReplay(String chessman) throw*ception { chessboard.printBoard(); String message = chessman.equals(Chessman.BLACK.getChessman()) ? "恭喜您,您赢了," : "很遗憾,您输了,"; System.out.println(message + "再下一局?(y/n)"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Scott Smith 2012-04-06 13:17:17 删除 4楼 if (br.readLine().equals("y")) { // 开始新一局 return true; } return false; } /** * 计算机随机下棋 */ public int[] computerDo() { int posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1)); int posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1)); String[][] board = chessboard.getBoard(); while (board[posX][posY] != "十") { posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1)); posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1)); } int[] result = { posX, posY }; return result; } /** * 判断输赢 * * @param posX * 棋子的X坐标。 * @param posY * 棋子的Y坐标 * @param ico * 棋子类型 * @return 如果有五颗相邻棋子连成一条直接,返回真,否则相反。 */ public boolean isWon(int posX, int posY, String ico) { // 直线起点的X坐标 int startX = 0; // 直线起点Y坐标 int startY = 0; // 直线结束X坐标 int endX = Chessboard.BOARD_SIZE - 1; // 直线结束Y坐标 int endY = endX; // 同条直线上相邻棋子累积数 int sameCount = 0; int temp = 0; // 计算起点的最小X坐标与Y坐标 temp = posX - WIN_COUNT + 1; startX = temp < 0 ? 0 : temp; temp = posY - WIN_COUNT + 1; startY = temp < 0 ? 0 : temp; // 计算终点的最大X坐标与Y坐标 temp = posX + WIN_COUNT - 1; endX = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE - 1 : temp; temp = posY + WIN_COUNT - 1; endY = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE - 1 : temp; // 从左到右方向计算相同相邻棋子的数目 String[][] board = chessboard.getBoard(); for (int i = startY; i < endY; i++) { if (board[posX][i] == ico && board[posX][i + 1] == ico) { sameCount++; } else if (sameCount != WIN_COUNT - 1) { sameCount = 0; } } if (sameCount == 0) { // 从上到下计算相同相邻棋子的数目 for (int i = startX; i < endX; i++) { if (board[i][posY] == ico && board[i + 1][posY] == ico) { sameCount++; } else if (sameCount != WIN_COUNT - 1) { sameCount = 0; Scott Smith 2012-04-06 13:19:50 删除 5楼 } j++; } } } return sameCount == WIN_COUNT - 1 ? true : false; } public static void main(String[] args) throw*ception { GobangGame gb = new GobangGame(new Chessboard()); gb.start(); } } 疑问1:上述第一处红色部分,为什么要保留那个空构造器,虽然书中139页也提示建议为java类保留无参数的默认构造器,可是还是不明白这样做有什么实际的意义!希望知道的朋友明示!!! 疑问2:第二处红色部分,为什么是string值等于ico,难道黑子的某种值等于ico??? Scott Smith 2012-04-06 13:21:10 删除 6楼 该死!红色部分字体不显示了!我直接说把! 第一处红色部分:/** * 空构造器 */ public GobangGame() { } 第二处红色部分:if (board[i][posY] == ico && board[i + 1][posY] == ico)

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

你期望月薪4万,出门右拐,不送,这几个点,你也就是个初级的水平

先来看几个问题通过注解的方式注入依赖对象,介绍一下你知道的几种方式@Autowired和@Resource有何区别说一下@Autowired查找候选者的...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《Oracle Java SE编程自学与面试指南》最佳学习路线图2020年最新版(进大厂必备)

正确选择比瞎努力更重要!

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

字节跳动面试官竟然问了我JDBC?

轻松等回家通知

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

自学编程的 6 个致命误区

嗨,小伙伴们大家好,我是沉默王二。本篇文章来和大家聊聊自学编程中的一些误区——这是我在 B 站上看了羊哥的一期视频后有感而发的文章。因为确实有很多读者也曾私信问过我这些方面的问题,很有代表性,所以我就结合自己的亲身体会来谈一谈,希望对小伙伴们有所启发。 01、追求时髦 所谓基础不牢,地动山摇啊。可很多小伙伴压根就没注意过这个问题,市面上出什么新鲜的技术就想去尝试,结果把自己学的乱七八糟,心灰意冷...

祝贺玄姐,创业两个月,估值近亿,融资几千万,奈学教育,太牛逼了!!!...

玄姐,男,前58同城技术委员会主席,前转转首席架构师,我的10年好友。一月下旬,玄姐找到我,说,哥们我准备创业了。画外音:详见《最好的朋友创业了,我必须为他站台》。番外篇《为何大家都叫...

你看,公司状告员工不加班,居然还告赢了

loonggg读完需要3分钟速读仅需 1 分钟今天跟大家聊一聊加班文化这个话题。今天微博热搜榜上有一个话题就是:#员工拒绝加班被判赔公司 1.8 万# 。具体什么情况呢?扬州某公司员工王...

在北京,我遇上每天必须挣1000元的出租车司机!

在北漂的那段时间几乎天天加班,只要加班必然晚上回家会坐出租车,北漂7年大概遇上了近1000个出租车司机。大家都知道,在北京住的的地方和公司一般距离都很远,就算是晚上10点或者11点的时候...

立即提问
相关内容推荐